// Code generated by protoc-gen-go. DO NOT EDIT.
// source: prototype/device_project.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 DeviceBrandId struct {
	Value                string   `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_DeviceBrandId proto.InternalMessageInfo

func (m *DeviceBrandId) GetValue() string {
	if m != nil {
		return m.Value
	}
	return ""
}

type DeviceBrand struct {
	Id                   *DeviceBrandId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	DesignId             *DesignId      `protobuf:"bytes,2,opt,name=design_id,json=designId,proto3" json:"design_id,omitempty"`
	OemId                *PartnerId     `protobuf:"bytes,3,opt,name=oem_id,json=oemId,proto3" json:"oem_id,omitempty"`
	BrandCode            string         `protobuf:"bytes,4,opt,name=brand_code,json=brandCode,proto3" json:"brand_code,omitempty"`
	BrandName            string         `protobuf:"bytes,5,opt,name=brand_name,json=brandName,proto3" json:"brand_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *DeviceBrand) Reset()         { *m = DeviceBrand{} }
func (m *DeviceBrand) String() string { return proto.CompactTextString(m) }
func (*DeviceBrand) ProtoMessage()    {}
func (*DeviceBrand) Descriptor() ([]byte, []int) {
	return fileDescriptor_25cfb5d8af6fe022, []int{1}
}

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

var xxx_messageInfo_DeviceBrand proto.InternalMessageInfo

func (m *DeviceBrand) GetId() *DeviceBrandId {
	if m != nil {
		return m.Id
	}
	return nil
}

func (m *DeviceBrand) GetDesignId() *DesignId {
	if m != nil {
		return m.DesignId
	}
	return nil
}

func (m *DeviceBrand) GetOemId() *PartnerId {
	if m != nil {
		return m.OemId
	}
	return nil
}

func (m *DeviceBrand) GetBrandCode() string {
	if m != nil {
		return m.BrandCode
	}
	return ""
}

func (m *DeviceBrand) GetBrandName() string {
	if m != nil {
		return m.BrandName
	}
	return ""
}

type DeviceBrandList struct {
	Value                []*DeviceBrand `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *DeviceBrandList) Reset()         { *m = DeviceBrandList{} }
func (m *DeviceBrandList) String() string { return proto.CompactTextString(m) }
func (*DeviceBrandList) ProtoMessage()    {}
func (*DeviceBrandList) Descriptor() ([]byte, []int) {
	return fileDescriptor_25cfb5d8af6fe022, []int{2}
}

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

var xxx_messageInfo_DeviceBrandList proto.InternalMessageInfo

func (m *DeviceBrandList) GetValue() []*DeviceBrand {
	if m != nil {
		return m.Value
	}
	return nil
}

// Metadata around all of the logistics for the project
type DeviceProject struct {
	Id                   *DeviceBrandId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	Name                 string         `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
	BugComponentId       string         `protobuf:"bytes,3,opt,name=bug_component_id,json=bugComponentId,proto3" json:"bug_component_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *DeviceProject) Reset()         { *m = DeviceProject{} }
func (m *DeviceProject) String() string { return proto.CompactTextString(m) }
func (*DeviceProject) ProtoMessage()    {}
func (*DeviceProject) Descriptor() ([]byte, []int) {
	return fileDescriptor_25cfb5d8af6fe022, []int{3}
}

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

var xxx_messageInfo_DeviceProject proto.InternalMessageInfo

func (m *DeviceProject) GetId() *DeviceBrandId {
	if m != nil {
		return m.Id
	}
	return nil
}

func (m *DeviceProject) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *DeviceProject) GetBugComponentId() string {
	if m != nil {
		return m.BugComponentId
	}
	return ""
}

type DeviceProjectList struct {
	Value                []*DeviceProject `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *DeviceProjectList) Reset()         { *m = DeviceProjectList{} }
func (m *DeviceProjectList) String() string { return proto.CompactTextString(m) }
func (*DeviceProjectList) ProtoMessage()    {}
func (*DeviceProjectList) Descriptor() ([]byte, []int) {
	return fileDescriptor_25cfb5d8af6fe022, []int{4}
}

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

var xxx_messageInfo_DeviceProjectList proto.InternalMessageInfo

func (m *DeviceProjectList) GetValue() []*DeviceProject {
	if m != nil {
		return m.Value
	}
	return nil
}

func init() {
	proto.RegisterType((*DeviceBrandId)(nil), "prototype.DeviceBrandId")
	proto.RegisterType((*DeviceBrand)(nil), "prototype.DeviceBrand")
	proto.RegisterType((*DeviceBrandList)(nil), "prototype.DeviceBrandList")
	proto.RegisterType((*DeviceProject)(nil), "prototype.DeviceProject")
	proto.RegisterType((*DeviceProjectList)(nil), "prototype.DeviceProjectList")
}

func init() { proto.RegisterFile("prototype/device_project.proto", fileDescriptor_25cfb5d8af6fe022) }

var fileDescriptor_25cfb5d8af6fe022 = []byte{
	// 345 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x51, 0x4d, 0x4b, 0xc3, 0x40,
	0x10, 0xa5, 0xe9, 0x07, 0x66, 0x8b, 0x5f, 0x6b, 0xa9, 0xa1, 0xa0, 0x48, 0x40, 0x08, 0x28, 0x89,
	0xb4, 0x78, 0x16, 0x5a, 0x2f, 0x01, 0x91, 0x92, 0xa3, 0x97, 0x90, 0x64, 0xc7, 0xb8, 0x62, 0x76,
	0xc2, 0x36, 0xa9, 0xf8, 0x3f, 0xfd, 0x41, 0xd2, 0x49, 0xd3, 0x26, 0xe8, 0xc5, 0xdb, 0xec, 0xbc,
	0x37, 0x6f, 0xde, 0xbc, 0x65, 0x97, 0xb9, 0xc6, 0x02, 0x8b, 0xaf, 0x1c, 0x3c, 0x01, 0x6b, 0x99,
	0x40, 0x98, 0x6b, 0x7c, 0x87, 0xa4, 0x70, 0x09, 0xe0, 0xe6, 0x0e, 0x9f, 0x9c, 0xef, 0xa9, 0x79,
	0xa4, 0x0b, 0x05, 0xba, 0xe2, 0x4c, 0xc6, 0x4d, 0x8d, 0x95, 0x4c, 0x55, 0xd5, 0xb7, 0xaf, 0xd9,
	0xe1, 0x23, 0x69, 0xce, 0x75, 0xa4, 0x84, 0x2f, 0xf8, 0x88, 0xf5, 0xd7, 0xd1, 0x47, 0x09, 0x56,
	0xe7, 0xaa, 0xe3, 0x98, 0x41, 0xf5, 0xb0, 0xbf, 0x3b, 0x6c, 0xd8, 0xe0, 0x71, 0x87, 0x19, 0x52,
	0x10, 0x65, 0x38, 0xb5, 0xdc, 0x9d, 0xb6, 0xdb, 0xd2, 0x0a, 0x0c, 0x29, 0xf8, 0x1d, 0x33, 0xab,
	0x85, 0xa1, 0x14, 0x96, 0x41, 0x03, 0x67, 0xad, 0x81, 0x0d, 0xe6, 0x8b, 0xe0, 0x40, 0x6c, 0x2b,
	0x7e, 0xc3, 0x06, 0x08, 0xd9, 0x86, 0xde, 0x25, 0xfa, 0xa8, 0x41, 0x5f, 0x56, 0x47, 0xf9, 0x22,
	0xe8, 0x23, 0x64, 0xbe, 0xe0, 0x17, 0x8c, 0xc5, 0x9b, 0x6d, 0x61, 0x82, 0x02, 0xac, 0x1e, 0x79,
	0x36, 0xa9, 0xb3, 0x40, 0x01, 0x7b, 0x58, 0x45, 0x19, 0x58, 0xfd, 0x06, 0xfc, 0x1c, 0x65, 0x60,
	0x3f, 0xb0, 0xe3, 0x86, 0xe3, 0x27, 0xb9, 0x2a, 0xf8, 0xed, 0xfe, 0xfe, 0xae, 0x33, 0x9c, 0x8e,
	0xff, 0x3e, 0xae, 0xce, 0xe5, 0xb3, 0x8e, 0x6f, 0x59, 0xfd, 0xc8, 0x3f, 0x82, 0xe1, 0xac, 0x47,
	0xa6, 0x0c, 0x32, 0x45, 0x35, 0x77, 0xd8, 0x49, 0x5c, 0xa6, 0x61, 0x82, 0x59, 0x8e, 0x0a, 0x54,
	0x51, 0x87, 0x60, 0x06, 0x47, 0x71, 0x99, 0x2e, 0xea, 0xb6, 0x2f, 0xec, 0x05, 0x3b, 0x6d, 0x2d,
	0x26, 0xef, 0x6e, 0xdb, 0xfb, 0xef, 0xfd, 0x5b, 0xf2, 0xd6, 0xfd, 0xfc, 0xfe, 0x65, 0x96, 0xa2,
	0x9b, 0xbc, 0x69, 0xcc, 0x64, 0x99, 0xb9, 0xa8, 0x53, 0xaf, 0x7e, 0xe0, 0xca, 0x93, 0xea, 0x55,
	0x47, 0x1e, 0x49, 0x78, 0x29, 0x7a, 0x3b, 0xad, 0x78, 0x40, 0xe5, 0xec, 0x27, 0x00, 0x00, 0xff,
	0xff, 0x2f, 0x38, 0x8d, 0x42, 0x98, 0x02, 0x00, 0x00,
}
