// Code generated by protoc-gen-go. DO NOT EDIT.
// source: prototype/config_bundle.proto

package prototype

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

type ConfigBundle struct {
	Clients              []*Client        `protobuf:"bytes,1,rep,name=clients,proto3" json:"clients,omitempty"`
	ClientProfiles       []*ClientProfile `protobuf:"bytes,2,rep,name=client_profiles,json=clientProfiles,proto3" json:"client_profiles,omitempty"`
	Milestones           []*Milestone     `protobuf:"bytes,3,rep,name=milestones,proto3" json:"milestones,omitempty"`
	DesignProjects       []*DesignProject `protobuf:"bytes,4,rep,name=design_projects,json=designProjects,proto3" json:"design_projects,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *ConfigBundle) Reset()         { *m = ConfigBundle{} }
func (m *ConfigBundle) String() string { return proto.CompactTextString(m) }
func (*ConfigBundle) ProtoMessage()    {}
func (*ConfigBundle) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa31c70b5e51112b, []int{0}
}

func (m *ConfigBundle) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ConfigBundle.Unmarshal(m, b)
}
func (m *ConfigBundle) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ConfigBundle.Marshal(b, m, deterministic)
}
func (m *ConfigBundle) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ConfigBundle.Merge(m, src)
}
func (m *ConfigBundle) XXX_Size() int {
	return xxx_messageInfo_ConfigBundle.Size(m)
}
func (m *ConfigBundle) XXX_DiscardUnknown() {
	xxx_messageInfo_ConfigBundle.DiscardUnknown(m)
}

var xxx_messageInfo_ConfigBundle proto.InternalMessageInfo

func (m *ConfigBundle) GetClients() []*Client {
	if m != nil {
		return m.Clients
	}
	return nil
}

func (m *ConfigBundle) GetClientProfiles() []*ClientProfile {
	if m != nil {
		return m.ClientProfiles
	}
	return nil
}

func (m *ConfigBundle) GetMilestones() []*Milestone {
	if m != nil {
		return m.Milestones
	}
	return nil
}

func (m *ConfigBundle) GetDesignProjects() []*DesignProject {
	if m != nil {
		return m.DesignProjects
	}
	return nil
}

func init() {
	proto.RegisterType((*ConfigBundle)(nil), "prototype.ConfigBundle")
}

func init() { proto.RegisterFile("prototype/config_bundle.proto", fileDescriptor_fa31c70b5e51112b) }

var fileDescriptor_fa31c70b5e51112b = []byte{
	// 251 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x8f, 0x41, 0x4b, 0xc4, 0x30,
	0x10, 0x85, 0x59, 0x57, 0x14, 0xa3, 0xac, 0x58, 0x44, 0x62, 0x41, 0x11, 0x4f, 0x82, 0x90, 0x80,
	0xab, 0x3f, 0xc0, 0x5d, 0xaf, 0xc2, 0xd2, 0xa3, 0x97, 0xc5, 0x6d, 0xd3, 0x18, 0x69, 0x33, 0x25,
	0xd3, 0x3d, 0xf8, 0xcb, 0xbd, 0xca, 0x4e, 0x4c, 0x4c, 0xed, 0x2d, 0x33, 0xef, 0x7b, 0x6f, 0x5e,
	0xd8, 0x55, 0xe7, 0xa0, 0x87, 0xfe, 0xab, 0x53, 0xb2, 0x04, 0x5b, 0x1b, 0xbd, 0xde, 0x6c, 0x6d,
	0xd5, 0x28, 0x41, 0xfb, 0xec, 0x28, 0xca, 0xf9, 0x45, 0x42, 0x36, 0x46, 0xd9, 0xde, 0x23, 0xf9,
	0xf5, 0xff, 0xfd, 0xba, 0x73, 0x50, 0x9b, 0x10, 0x91, 0x5f, 0xfe, 0xe9, 0xad, 0x69, 0x14, 0xf6,
	0x60, 0xd5, 0xd8, 0x5a, 0x29, 0x34, 0xda, 0xee, 0xac, 0x9f, 0xaa, 0xfc, 0x8d, 0xbe, 0xfd, 0x9e,
	0xb0, 0x93, 0x25, 0xb5, 0x5a, 0x50, 0xa9, 0xec, 0x9e, 0x1d, 0xfa, 0x1b, 0xc8, 0x27, 0x37, 0xd3,
	0xbb, 0xe3, 0x87, 0x33, 0x11, 0x23, 0xc4, 0x92, 0x94, 0x22, 0x10, 0xd9, 0x33, 0x3b, 0x1d, 0x16,
	0x42, 0xbe, 0x47, 0x26, 0x3e, 0x32, 0xad, 0x3c, 0x50, 0xcc, 0xca, 0x74, 0xc4, 0xec, 0x91, 0xb1,
	0xd8, 0x19, 0xf9, 0x94, 0xdc, 0xe7, 0x89, 0xfb, 0x35, 0x88, 0x45, 0xc2, 0xed, 0x0e, 0x0f, 0xbf,
	0x83, 0x7c, 0x7f, 0x74, 0xf8, 0x85, 0x88, 0x95, 0x07, 0x8a, 0x59, 0x95, 0x8e, 0xb8, 0x78, 0x7a,
	0x9b, 0x6b, 0x10, 0xe5, 0x87, 0x83, 0xd6, 0x6c, 0x5b, 0x01, 0x4e, 0xcb, 0x30, 0x00, 0x4a, 0x63,
	0x6b, 0xf7, 0x2e, 0x29, 0x4b, 0x6a, 0x90, 0x31, 0x74, 0x73, 0x40, 0xcf, 0xf9, 0x4f, 0x00, 0x00,
	0x00, 0xff, 0xff, 0x9c, 0x00, 0xbc, 0x3a, 0xd6, 0x01, 0x00, 0x00,
}
