// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromiumos/config/api/program_id.proto

package api

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

// Uniquely identifies a Chromium OS program, which defines a set of constraints
// that govern all design projects developed under the respective program.
type ProgramId 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 *ProgramId) Reset()         { *m = ProgramId{} }
func (m *ProgramId) String() string { return proto.CompactTextString(m) }
func (*ProgramId) ProtoMessage()    {}
func (*ProgramId) Descriptor() ([]byte, []int) {
	return fileDescriptor_8113b3b83b0936f5, []int{0}
}

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

var xxx_messageInfo_ProgramId proto.InternalMessageInfo

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

func init() {
	proto.RegisterType((*ProgramId)(nil), "chromiumos.config.api.ProgramId")
}

func init() {
	proto.RegisterFile("chromiumos/config/api/program_id.proto", fileDescriptor_8113b3b83b0936f5)
}

var fileDescriptor_8113b3b83b0936f5 = []byte{
	// 127 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4b, 0xce, 0x28, 0xca,
	0xcf, 0xcd, 0x2c, 0xcd, 0xcd, 0x2f, 0xd6, 0x4f, 0xce, 0xcf, 0x4b, 0xcb, 0x4c, 0xd7, 0x4f, 0x2c,
	0xc8, 0xd4, 0x2f, 0x28, 0xca, 0x4f, 0x2f, 0x4a, 0xcc, 0x8d, 0xcf, 0x4c, 0xd1, 0x2b, 0x28, 0xca,
	0x2f, 0xc9, 0x17, 0x12, 0x45, 0xa8, 0xd3, 0x83, 0xa8, 0xd3, 0x4b, 0x2c, 0xc8, 0x54, 0x52, 0xe4,
	0xe2, 0x0c, 0x80, 0x28, 0xf5, 0x4c, 0x11, 0x12, 0xe1, 0x62, 0x2d, 0x4b, 0xcc, 0x29, 0x4d, 0x95,
	0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0c, 0x82, 0x70, 0x9c, 0xb4, 0xa2, 0x34, 0xd2, 0xf3, 0xf5, 0x60,
	0xda, 0xf5, 0xf2, 0x8b, 0xd2, 0xf5, 0x31, 0xed, 0x4c, 0xcf, 0x07, 0x59, 0x9b, 0xc4, 0x06, 0xb6,
	0xcc, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0xb5, 0x94, 0xc5, 0xf0, 0x96, 0x00, 0x00, 0x00,
}
