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

package chromiumos

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

// The types of images that can be built.
// These correspond to support types in lib/constants.py such
// as IMAGE_TYPE_BASE, IMAGE_TYPE_RECOVERY, and so on.
type ImageType int32

const (
	ImageType_IMAGE_TYPE_UNDEFINED ImageType = 0
	ImageType_BASE                 ImageType = 1
	ImageType_DEV                  ImageType = 2
	ImageType_TEST                 ImageType = 3
	ImageType_BASE_VM              ImageType = 4
	ImageType_TEST_VM              ImageType = 5
	ImageType_RECOVERY             ImageType = 6
	ImageType_FACTORY              ImageType = 7
	ImageType_FIRMWARE             ImageType = 8
	ImageType_CR50_FIRMWARE        ImageType = 9
	ImageType_BASE_GUEST_VM        ImageType = 10
	ImageType_TEST_GUEST_VM        ImageType = 11
)

var ImageType_name = map[int32]string{
	0:  "IMAGE_TYPE_UNDEFINED",
	1:  "BASE",
	2:  "DEV",
	3:  "TEST",
	4:  "BASE_VM",
	5:  "TEST_VM",
	6:  "RECOVERY",
	7:  "FACTORY",
	8:  "FIRMWARE",
	9:  "CR50_FIRMWARE",
	10: "BASE_GUEST_VM",
	11: "TEST_GUEST_VM",
}

var ImageType_value = map[string]int32{
	"IMAGE_TYPE_UNDEFINED": 0,
	"BASE":                 1,
	"DEV":                  2,
	"TEST":                 3,
	"BASE_VM":              4,
	"TEST_VM":              5,
	"RECOVERY":             6,
	"FACTORY":              7,
	"FIRMWARE":             8,
	"CR50_FIRMWARE":        9,
	"BASE_GUEST_VM":        10,
	"TEST_GUEST_VM":        11,
}

func (x ImageType) String() string {
	return proto.EnumName(ImageType_name, int32(x))
}

func (ImageType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{0}
}

// The various channels that we release through.
type Channel int32

const (
	Channel_CHANNEL_UNSPECIFIED Channel = 0
	Channel_CHANNEL_STABLE      Channel = 1
	Channel_CHANNEL_BETA        Channel = 2
	Channel_CHANNEL_DEV         Channel = 3
	Channel_CHANNEL_CANARY      Channel = 4
)

var Channel_name = map[int32]string{
	0: "CHANNEL_UNSPECIFIED",
	1: "CHANNEL_STABLE",
	2: "CHANNEL_BETA",
	3: "CHANNEL_DEV",
	4: "CHANNEL_CANARY",
}

var Channel_value = map[string]int32{
	"CHANNEL_UNSPECIFIED": 0,
	"CHANNEL_STABLE":      1,
	"CHANNEL_BETA":        2,
	"CHANNEL_DEV":         3,
	"CHANNEL_CANARY":      4,
}

func (x Channel) String() string {
	return proto.EnumName(Channel_name, int32(x))
}

func (Channel) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{1}
}

// The available delta types.
type DeltaType int32

const (
	DeltaType_DELTA_UNKNOWN  DeltaType = 0
	DeltaType_NO_DELTA       DeltaType = 1
	DeltaType_FSI            DeltaType = 2
	DeltaType_MILESTONE      DeltaType = 3
	DeltaType_OMAHA          DeltaType = 4
	DeltaType_STEPPING_STONE DeltaType = 5
)

var DeltaType_name = map[int32]string{
	0: "DELTA_UNKNOWN",
	1: "NO_DELTA",
	2: "FSI",
	3: "MILESTONE",
	4: "OMAHA",
	5: "STEPPING_STONE",
}

var DeltaType_value = map[string]int32{
	"DELTA_UNKNOWN":  0,
	"NO_DELTA":       1,
	"FSI":            2,
	"MILESTONE":      3,
	"OMAHA":          4,
	"STEPPING_STONE": 5,
}

func (x DeltaType) String() string {
	return proto.EnumName(DeltaType_name, int32(x))
}

func (DeltaType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{2}
}

// TODO(crbug.com/1020615): Drop this from chromite/api/toolchain.proto (and
// here) once usage has migrated to BuilderConfig.Artifacts.ArtifactType.
// Meanwhile, keep this in sync with chromite/api/toolchain.proto.  The various
// toolchain optimization artifact types.
type AFDOArtifactType int32

const (
	// No AFDO artifact type specified.
	AFDOArtifactType_NONE_TYPE AFDOArtifactType = 0
	// The type is orderfile.
	AFDOArtifactType_ORDERFILE AFDOArtifactType = 1
	// The type is Chrome AFDO files generated by benchmarks.
	AFDOArtifactType_BENCHMARK_AFDO AFDOArtifactType = 2
	// The type is kernel AFDO files.
	AFDOArtifactType_KERNEL_AFDO AFDOArtifactType = 3
	// The type is Chrome AFDO used in release builders.
	AFDOArtifactType_CHROME_AFDO AFDOArtifactType = 4
)

var AFDOArtifactType_name = map[int32]string{
	0: "NONE_TYPE",
	1: "ORDERFILE",
	2: "BENCHMARK_AFDO",
	3: "KERNEL_AFDO",
	4: "CHROME_AFDO",
}

var AFDOArtifactType_value = map[string]int32{
	"NONE_TYPE":      0,
	"ORDERFILE":      1,
	"BENCHMARK_AFDO": 2,
	"KERNEL_AFDO":    3,
	"CHROME_AFDO":    4,
}

func (x AFDOArtifactType) String() string {
	return proto.EnumName(AFDOArtifactType_name, int32(x))
}

func (AFDOArtifactType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{3}
}

// Facilitates testing new Goma approaches before rolling them out
// more widely.
type GomaConfig_GomaApproach int32

const (
	GomaConfig_GOMA_APPROACH_UNSPECIFIED GomaConfig_GomaApproach = 0
	GomaConfig_DEFAULT                   GomaConfig_GomaApproach = 1
	GomaConfig_RBE_PROD                  GomaConfig_GomaApproach = 2
	GomaConfig_RBE_STAGING               GomaConfig_GomaApproach = 3
)

var GomaConfig_GomaApproach_name = map[int32]string{
	0: "GOMA_APPROACH_UNSPECIFIED",
	1: "DEFAULT",
	2: "RBE_PROD",
	3: "RBE_STAGING",
}

var GomaConfig_GomaApproach_value = map[string]int32{
	"GOMA_APPROACH_UNSPECIFIED": 0,
	"DEFAULT":                   1,
	"RBE_PROD":                  2,
	"RBE_STAGING":               3,
}

func (x GomaConfig_GomaApproach) String() string {
	return proto.EnumName(GomaConfig_GomaApproach_name, int32(x))
}

func (GomaConfig_GomaApproach) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{3, 0}
}

// Location enum; whether the resource is inside or outside of the chroot.
type Path_Location int32

const (
	Path_NO_LOCATION Path_Location = 0
	Path_INSIDE      Path_Location = 1
	Path_OUTSIDE     Path_Location = 2
)

var Path_Location_name = map[int32]string{
	0: "NO_LOCATION",
	1: "INSIDE",
	2: "OUTSIDE",
}

var Path_Location_value = map[string]int32{
	"NO_LOCATION": 0,
	"INSIDE":      1,
	"OUTSIDE":     2,
}

func (x Path_Location) String() string {
	return proto.EnumName(Path_Location_name, int32(x))
}

func (Path_Location) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{8, 0}
}

// Legacy artifacts, handled in cros_artifacts.  DO NOT ADD TO THIS.
type ArtifactsByService_Legacy_ArtifactType int32

const (
	ArtifactsByService_Legacy_UNSPECIFIED ArtifactsByService_Legacy_ArtifactType = 0
	// Indicates wanting a zip file of everything in the image directory.
	// TODO(crbug/1034529): moves to ArtifactsByService.Image
	ArtifactsByService_Legacy_IMAGE_ZIP ArtifactsByService_Legacy_ArtifactType = 1
	// Indicates wanting update payloads.
	// TODO(crbug/1034529): moves to ArtifactsByService.Test
	ArtifactsByService_Legacy_TEST_UPDATE_PAYLOAD ArtifactsByService_Legacy_ArtifactType = 2
	// Indicates wanting the autotest tarballs.
	// TODO(crbug/1034529): moves to ArtifactsByService.Test
	ArtifactsByService_Legacy_AUTOTEST_FILES ArtifactsByService_Legacy_ArtifactType = 3
	// Indicates wanting a tarball containing private TAST test bundles.
	// TODO(crbug/1034529): moves to ArtifactsByService.Test
	ArtifactsByService_Legacy_TAST_FILES ArtifactsByService_Legacy_ArtifactType = 4
	// Indicates wanting a tarball containing guest images and test bundles.
	// TODO(crbug/1034529): moves to ArtifactsByService.Test
	ArtifactsByService_Legacy_PINNED_GUEST_IMAGES ArtifactsByService_Legacy_ArtifactType = 5
	// Indicates wanting an archive of firmware images built from source.
	// TODO(crbug/1034529): moves to ArtifactsByService.Package
	ArtifactsByService_Legacy_FIRMWARE ArtifactsByService_Legacy_ArtifactType = 6
	// Indicates wanting a tarball of the Ebuilds logs.
	// TODO(crbug/1034529): moves to ArtifactsByService.Sysroot
	ArtifactsByService_Legacy_EBUILD_LOGS ArtifactsByService_Legacy_ArtifactType = 7
	// Indicates wanting an archive of the ChromeOS Config.
	// TODO(crbug/1034529): moves to ArtifactsByService.Sysroot
	ArtifactsByService_Legacy_CHROMEOS_CONFIG ArtifactsByService_Legacy_ArtifactType = 8
	// Indicates wanting the CPE report.
	// TODO(crbug/1034529): moves to ArtifactsByService.Package
	ArtifactsByService_Legacy_CPE_REPORT ArtifactsByService_Legacy_ArtifactType = 9
	// Indicates wanting a tar.xz archive for each image created.
	// TODO(crbug/1034529): moves to ArtifactsByService.Image
	ArtifactsByService_Legacy_IMAGE_ARCHIVES ArtifactsByService_Legacy_ArtifactType = 10
	// Indicates wanting a tarball containing fingerprint MCU test binaries.
	// TODO(crbug/1034529): moves to ArtifactsByService.Test
	ArtifactsByService_Legacy_FPMCU_UNITTESTS ArtifactsByService_Legacy_ArtifactType = 27
	// Indicates wanting a test image tarball suitable for importing into GCE.
	// TODO(crbug/1034529): moves to ArtifactsByService.Image
	ArtifactsByService_Legacy_GCE_TARBALL ArtifactsByService_Legacy_ArtifactType = 28
)

var ArtifactsByService_Legacy_ArtifactType_name = map[int32]string{
	0:  "UNSPECIFIED",
	1:  "IMAGE_ZIP",
	2:  "TEST_UPDATE_PAYLOAD",
	3:  "AUTOTEST_FILES",
	4:  "TAST_FILES",
	5:  "PINNED_GUEST_IMAGES",
	6:  "FIRMWARE",
	7:  "EBUILD_LOGS",
	8:  "CHROMEOS_CONFIG",
	9:  "CPE_REPORT",
	10: "IMAGE_ARCHIVES",
	27: "FPMCU_UNITTESTS",
	28: "GCE_TARBALL",
}

var ArtifactsByService_Legacy_ArtifactType_value = map[string]int32{
	"UNSPECIFIED":         0,
	"IMAGE_ZIP":           1,
	"TEST_UPDATE_PAYLOAD": 2,
	"AUTOTEST_FILES":      3,
	"TAST_FILES":          4,
	"PINNED_GUEST_IMAGES": 5,
	"FIRMWARE":            6,
	"EBUILD_LOGS":         7,
	"CHROMEOS_CONFIG":     8,
	"CPE_REPORT":          9,
	"IMAGE_ARCHIVES":      10,
	"FPMCU_UNITTESTS":     27,
	"GCE_TARBALL":         28,
}

func (x ArtifactsByService_Legacy_ArtifactType) String() string {
	return proto.EnumName(ArtifactsByService_Legacy_ArtifactType_name, int32(x))
}

func (ArtifactsByService_Legacy_ArtifactType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 0, 0}
}

// Artifacts which the ArtifactsService endpoints pass to ToolchainService.
type ArtifactsByService_Toolchain_ArtifactType int32

const (
	ArtifactsByService_Toolchain_UNSPECIFIED ArtifactsByService_Toolchain_ArtifactType = 0
	// Indicates an unvetted orderfile for Chrome.
	ArtifactsByService_Toolchain_UNVERIFIED_CHROME_LLVM_ORDERFILE ArtifactsByService_Toolchain_ArtifactType = 11
	// Indicates a vetted orderfile for Chrome.
	ArtifactsByService_Toolchain_VERIFIED_CHROME_LLVM_ORDERFILE ArtifactsByService_Toolchain_ArtifactType = 12
	// Indicates a clang-tidy artifact.
	ArtifactsByService_Toolchain_CHROME_CLANG_WARNINGS_FILE ArtifactsByService_Toolchain_ArtifactType = 13
	// Indicates a PGO artifact for the compiler.
	ArtifactsByService_Toolchain_UNVERIFIED_LLVM_PGO_FILE ArtifactsByService_Toolchain_ArtifactType = 14
	// Indicates an unvetted AFDO Chrome profile.  (Generated by HW Tests in
	// the benchmark-afdo-generate builder.)
	ArtifactsByService_Toolchain_UNVERIFIED_CHROME_BENCHMARK_AFDO_FILE ArtifactsByService_Toolchain_ArtifactType = 15
	// Indicates a vetted AFDO Chrome profile.
	ArtifactsByService_Toolchain_VERIFIED_CHROME_BENCHMARK_AFDO_FILE ArtifactsByService_Toolchain_ArtifactType = 16
	// Indicates a vetted AFDO Kernel profile.
	ArtifactsByService_Toolchain_VERIFIED_KERNEL_CWP_AFDO_FILE ArtifactsByService_Toolchain_ArtifactType = 17
	// Indicates an unvetted AFDO Kernel CWP profile.
	ArtifactsByService_Toolchain_UNVERIFIED_KERNEL_CWP_AFDO_FILE ArtifactsByService_Toolchain_ArtifactType = 18
	// Indicates an unvetted AFDO Chrome CWP profile.
	ArtifactsByService_Toolchain_UNVERIFIED_CHROME_CWP_AFDO_FILE ArtifactsByService_Toolchain_ArtifactType = 19
	// Indicates a vetted AFDO Chrome CWP profile.
	ArtifactsByService_Toolchain_VERIFIED_CHROME_CWP_AFDO_FILE ArtifactsByService_Toolchain_ArtifactType = 20
	// Indicates a vetted AFDO profile for release.
	ArtifactsByService_Toolchain_VERIFIED_RELEASE_AFDO_FILE ArtifactsByService_Toolchain_ArtifactType = 21
	// Indicates an unvetted AFDO perf data file (from HW Test).
	ArtifactsByService_Toolchain_UNVERIFIED_CHROME_BENCHMARK_PERF_FILE ArtifactsByService_Toolchain_ArtifactType = 22
	// Indicates an unstripped Chrome binary.
	ArtifactsByService_Toolchain_CHROME_DEBUG_BINARY ArtifactsByService_Toolchain_ArtifactType = 23
	// Indicates toolchain logs for the compiler warnings for werror monitor
	ArtifactsByService_Toolchain_TOOLCHAIN_WARNING_LOGS ArtifactsByService_Toolchain_ArtifactType = 24
	// Indicates a prod Chrome AFDO profile for Android/Linux.
	ArtifactsByService_Toolchain_CHROME_AFDO_PROFILE_FOR_ANDROID_LINUX ArtifactsByService_Toolchain_ArtifactType = 25
	// Indicates diagnoses for Clang crashes
	ArtifactsByService_Toolchain_CLANG_CRASH_DIAGNOSES ArtifactsByService_Toolchain_ArtifactType = 26
)

var ArtifactsByService_Toolchain_ArtifactType_name = map[int32]string{
	0:  "UNSPECIFIED",
	11: "UNVERIFIED_CHROME_LLVM_ORDERFILE",
	12: "VERIFIED_CHROME_LLVM_ORDERFILE",
	13: "CHROME_CLANG_WARNINGS_FILE",
	14: "UNVERIFIED_LLVM_PGO_FILE",
	15: "UNVERIFIED_CHROME_BENCHMARK_AFDO_FILE",
	16: "VERIFIED_CHROME_BENCHMARK_AFDO_FILE",
	17: "VERIFIED_KERNEL_CWP_AFDO_FILE",
	18: "UNVERIFIED_KERNEL_CWP_AFDO_FILE",
	19: "UNVERIFIED_CHROME_CWP_AFDO_FILE",
	20: "VERIFIED_CHROME_CWP_AFDO_FILE",
	21: "VERIFIED_RELEASE_AFDO_FILE",
	22: "UNVERIFIED_CHROME_BENCHMARK_PERF_FILE",
	23: "CHROME_DEBUG_BINARY",
	24: "TOOLCHAIN_WARNING_LOGS",
	25: "CHROME_AFDO_PROFILE_FOR_ANDROID_LINUX",
	26: "CLANG_CRASH_DIAGNOSES",
}

var ArtifactsByService_Toolchain_ArtifactType_value = map[string]int32{
	"UNSPECIFIED":                           0,
	"UNVERIFIED_CHROME_LLVM_ORDERFILE":      11,
	"VERIFIED_CHROME_LLVM_ORDERFILE":        12,
	"CHROME_CLANG_WARNINGS_FILE":            13,
	"UNVERIFIED_LLVM_PGO_FILE":              14,
	"UNVERIFIED_CHROME_BENCHMARK_AFDO_FILE": 15,
	"VERIFIED_CHROME_BENCHMARK_AFDO_FILE":   16,
	"VERIFIED_KERNEL_CWP_AFDO_FILE":         17,
	"UNVERIFIED_KERNEL_CWP_AFDO_FILE":       18,
	"UNVERIFIED_CHROME_CWP_AFDO_FILE":       19,
	"VERIFIED_CHROME_CWP_AFDO_FILE":         20,
	"VERIFIED_RELEASE_AFDO_FILE":            21,
	"UNVERIFIED_CHROME_BENCHMARK_PERF_FILE": 22,
	"CHROME_DEBUG_BINARY":                   23,
	"TOOLCHAIN_WARNING_LOGS":                24,
	"CHROME_AFDO_PROFILE_FOR_ANDROID_LINUX": 25,
	"CLANG_CRASH_DIAGNOSES":                 26,
}

func (x ArtifactsByService_Toolchain_ArtifactType) String() string {
	return proto.EnumName(ArtifactsByService_Toolchain_ArtifactType_name, int32(x))
}

func (ArtifactsByService_Toolchain_ArtifactType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 1, 0}
}

// Artifacts which the ArtifactsService endpoints pass to ImageService.
type ArtifactsByService_Image_ArtifactType int32

const (
	ArtifactsByService_Image_UNSPECIFIED ArtifactsByService_Image_ArtifactType = 0
)

var ArtifactsByService_Image_ArtifactType_name = map[int32]string{
	0: "UNSPECIFIED",
}

var ArtifactsByService_Image_ArtifactType_value = map[string]int32{
	"UNSPECIFIED": 0,
}

func (x ArtifactsByService_Image_ArtifactType) String() string {
	return proto.EnumName(ArtifactsByService_Image_ArtifactType_name, int32(x))
}

func (ArtifactsByService_Image_ArtifactType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 2, 0}
}

// Artifacts which the ArtifactsService endpoints pass to PackageService.
type ArtifactsByService_Package_ArtifactType int32

const (
	ArtifactsByService_Package_UNSPECIFIED ArtifactsByService_Package_ArtifactType = 0
)

var ArtifactsByService_Package_ArtifactType_name = map[int32]string{
	0: "UNSPECIFIED",
}

var ArtifactsByService_Package_ArtifactType_value = map[string]int32{
	"UNSPECIFIED": 0,
}

func (x ArtifactsByService_Package_ArtifactType) String() string {
	return proto.EnumName(ArtifactsByService_Package_ArtifactType_name, int32(x))
}

func (ArtifactsByService_Package_ArtifactType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 3, 0}
}

// Artifacts which the ArtifactsService endpoints pass to SysrootService.
type ArtifactsByService_Sysroot_ArtifactType int32

const (
	ArtifactsByService_Sysroot_UNSPECIFIED ArtifactsByService_Sysroot_ArtifactType = 0
)

var ArtifactsByService_Sysroot_ArtifactType_name = map[int32]string{
	0: "UNSPECIFIED",
}

var ArtifactsByService_Sysroot_ArtifactType_value = map[string]int32{
	"UNSPECIFIED": 0,
}

func (x ArtifactsByService_Sysroot_ArtifactType) String() string {
	return proto.EnumName(ArtifactsByService_Sysroot_ArtifactType_name, int32(x))
}

func (ArtifactsByService_Sysroot_ArtifactType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 4, 0}
}

// Artifacts which the ArtifactsService endpoints pass to TestService.
type ArtifactsByService_Test_ArtifactType int32

const (
	ArtifactsByService_Test_UNSPECIFIED ArtifactsByService_Test_ArtifactType = 0
)

var ArtifactsByService_Test_ArtifactType_name = map[int32]string{
	0: "UNSPECIFIED",
}

var ArtifactsByService_Test_ArtifactType_value = map[string]int32{
	"UNSPECIFIED": 0,
}

func (x ArtifactsByService_Test_ArtifactType) String() string {
	return proto.EnumName(ArtifactsByService_Test_ArtifactType_name, int32(x))
}

func (ArtifactsByService_Test_ArtifactType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 5, 0}
}

// BuildTarget encapsulates a number of related arguments. At the moment, the
// usage of specific arguments is on a per endpoint basis, but will converge
// to support a standard set as time goes on.
// BuildTarget is a more appropriate name going forward for what we currently
// call "board".
type BuildTarget struct {
	// The name of the build target (a.k.a. board name).
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuildTarget proto.InternalMessageInfo

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

// Chroot is used to define how to enter a chroot.
type Chroot struct {
	// The directory containing the chroot.
	Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	// The cache directory override.
	CacheDir string `protobuf:"bytes,2,opt,name=cache_dir,json=cacheDir,proto3" json:"cache_dir,omitempty"`
	// Environment configuration.
	Env *Chroot_ChrootEnv `protobuf:"bytes,3,opt,name=env,proto3" json:"env,omitempty"`
	// The directory where the chrome source should be mounted.
	ChromeDir            string   `protobuf:"bytes,4,opt,name=chrome_dir,json=chromeDir,proto3" json:"chrome_dir,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Chroot proto.InternalMessageInfo

func (m *Chroot) GetPath() string {
	if m != nil {
		return m.Path
	}
	return ""
}

func (m *Chroot) GetCacheDir() string {
	if m != nil {
		return m.CacheDir
	}
	return ""
}

func (m *Chroot) GetEnv() *Chroot_ChrootEnv {
	if m != nil {
		return m.Env
	}
	return nil
}

func (m *Chroot) GetChromeDir() string {
	if m != nil {
		return m.ChromeDir
	}
	return ""
}

type Chroot_ChrootEnv struct {
	// USE flags to set.
	UseFlags []*UseFlag `protobuf:"bytes,1,rep,name=use_flags,json=useFlags,proto3" json:"use_flags,omitempty"`
	// FEATURES flags to set.
	Features             []*Feature `protobuf:"bytes,2,rep,name=features,proto3" json:"features,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

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

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

var xxx_messageInfo_Chroot_ChrootEnv proto.InternalMessageInfo

func (m *Chroot_ChrootEnv) GetUseFlags() []*UseFlag {
	if m != nil {
		return m.UseFlags
	}
	return nil
}

func (m *Chroot_ChrootEnv) GetFeatures() []*Feature {
	if m != nil {
		return m.Features
	}
	return nil
}

// FEATURES environment variable component message.
type Feature struct {
	Feature              string   `protobuf:"bytes,1,opt,name=feature,proto3" json:"feature,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Feature proto.InternalMessageInfo

func (m *Feature) GetFeature() string {
	if m != nil {
		return m.Feature
	}
	return ""
}

type GomaConfig struct {
	// The goma install location.
	// Required.
	GomaDir string `protobuf:"bytes,1,opt,name=goma_dir,json=gomaDir,proto3" json:"goma_dir,omitempty"`
	// The goma client credentials file.
	GomaClientJson string `protobuf:"bytes,2,opt,name=goma_client_json,json=gomaClientJson,proto3" json:"goma_client_json,omitempty"`
	// Path to the Goma client used for build package.
	// If None, goma_dir will be used instead.
	ChromeosGomaDir string                  `protobuf:"bytes,3,opt,name=chromeos_goma_dir,json=chromeosGomaDir,proto3" json:"chromeos_goma_dir,omitempty"`
	GomaApproach    GomaConfig_GomaApproach `protobuf:"varint,4,opt,name=goma_approach,json=gomaApproach,proto3,enum=chromiumos.GomaConfig_GomaApproach" json:"goma_approach,omitempty"`
	// The directory where the goma logs will be extracted.
	LogDir *SyncedDir `protobuf:"bytes,5,opt,name=log_dir,json=logDir,proto3" json:"log_dir,omitempty"`
	// The name of the goma stats file. It will be dumped inside log_dir.
	StatsFile string `protobuf:"bytes,6,opt,name=stats_file,json=statsFile,proto3" json:"stats_file,omitempty"`
	// The name of the goma counterz file. It will be dumped inside log_dir.
	CounterzFile         string   `protobuf:"bytes,7,opt,name=counterz_file,json=counterzFile,proto3" json:"counterz_file,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GomaConfig proto.InternalMessageInfo

func (m *GomaConfig) GetGomaDir() string {
	if m != nil {
		return m.GomaDir
	}
	return ""
}

func (m *GomaConfig) GetGomaClientJson() string {
	if m != nil {
		return m.GomaClientJson
	}
	return ""
}

func (m *GomaConfig) GetChromeosGomaDir() string {
	if m != nil {
		return m.ChromeosGomaDir
	}
	return ""
}

func (m *GomaConfig) GetGomaApproach() GomaConfig_GomaApproach {
	if m != nil {
		return m.GomaApproach
	}
	return GomaConfig_GOMA_APPROACH_UNSPECIFIED
}

func (m *GomaConfig) GetLogDir() *SyncedDir {
	if m != nil {
		return m.LogDir
	}
	return nil
}

func (m *GomaConfig) GetStatsFile() string {
	if m != nil {
		return m.StatsFile
	}
	return ""
}

func (m *GomaConfig) GetCounterzFile() string {
	if m != nil {
		return m.CounterzFile
	}
	return ""
}

type GomaArtifacts struct {
	// Goma stats file.
	StatsFile string `protobuf:"bytes,1,opt,name=stats_file,json=statsFile,proto3" json:"stats_file,omitempty"`
	// Goma counterz file.
	CounterzFile string `protobuf:"bytes,2,opt,name=counterz_file,json=counterzFile,proto3" json:"counterz_file,omitempty"`
	// Goma log files.
	LogFiles             []string `protobuf:"bytes,3,rep,name=log_files,json=logFiles,proto3" json:"log_files,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GomaArtifacts proto.InternalMessageInfo

func (m *GomaArtifacts) GetStatsFile() string {
	if m != nil {
		return m.StatsFile
	}
	return ""
}

func (m *GomaArtifacts) GetCounterzFile() string {
	if m != nil {
		return m.CounterzFile
	}
	return ""
}

func (m *GomaArtifacts) GetLogFiles() []string {
	if m != nil {
		return m.LogFiles
	}
	return nil
}

// Message describing a package, The corresponding variable names are from
// https://devmanual.gentoo.org/ebuild-writing/variables/index.html
type PackageInfo struct {
	// The package name (PN variable).
	PackageName string `protobuf:"bytes,1,opt,name=package_name,json=packageName,proto3" json:"package_name,omitempty"`
	// The package category (CATEGORY variable).
	Category string `protobuf:"bytes,2,opt,name=category,proto3" json:"category,omitempty"`
	// The package version and revision (PVR variable).
	Version              string   `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *PackageInfo) Reset()         { *m = PackageInfo{} }
func (m *PackageInfo) String() string { return proto.CompactTextString(m) }
func (*PackageInfo) ProtoMessage()    {}
func (*PackageInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{5}
}

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

var xxx_messageInfo_PackageInfo proto.InternalMessageInfo

func (m *PackageInfo) GetPackageName() string {
	if m != nil {
		return m.PackageName
	}
	return ""
}

func (m *PackageInfo) GetCategory() string {
	if m != nil {
		return m.Category
	}
	return ""
}

func (m *PackageInfo) GetVersion() string {
	if m != nil {
		return m.Version
	}
	return ""
}

// Information about the sysroot's profile.
type Profile struct {
	// The name of the profile.
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Profile) Reset()         { *m = Profile{} }
func (m *Profile) String() string { return proto.CompactTextString(m) }
func (*Profile) ProtoMessage()    {}
func (*Profile) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{6}
}

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

var xxx_messageInfo_Profile proto.InternalMessageInfo

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

// Message describing a package index (binhost) file.
type PackageIndexInfo struct {
	// The snapshot SHA
	SnapshotSha string `protobuf:"bytes,1,opt,name=snapshot_sha,json=snapshotSha,proto3" json:"snapshot_sha,omitempty"`
	// The snapshot number.  Higher is newer.
	SnapshotNumber int32 `protobuf:"varint,2,opt,name=snapshot_number,json=snapshotNumber,proto3" json:"snapshot_number,omitempty"`
	// The build target.
	BuildTarget *BuildTarget `protobuf:"bytes,3,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// The full URI of the package index file.
	Location string `protobuf:"bytes,4,opt,name=location,proto3" json:"location,omitempty"`
	// The sysroot profile.
	Profile              *Profile `protobuf:"bytes,5,opt,name=profile,proto3" json:"profile,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *PackageIndexInfo) Reset()         { *m = PackageIndexInfo{} }
func (m *PackageIndexInfo) String() string { return proto.CompactTextString(m) }
func (*PackageIndexInfo) ProtoMessage()    {}
func (*PackageIndexInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{7}
}

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

var xxx_messageInfo_PackageIndexInfo proto.InternalMessageInfo

func (m *PackageIndexInfo) GetSnapshotSha() string {
	if m != nil {
		return m.SnapshotSha
	}
	return ""
}

func (m *PackageIndexInfo) GetSnapshotNumber() int32 {
	if m != nil {
		return m.SnapshotNumber
	}
	return 0
}

func (m *PackageIndexInfo) GetBuildTarget() *BuildTarget {
	if m != nil {
		return m.BuildTarget
	}
	return nil
}

func (m *PackageIndexInfo) GetLocation() string {
	if m != nil {
		return m.Location
	}
	return ""
}

func (m *PackageIndexInfo) GetProfile() *Profile {
	if m != nil {
		return m.Profile
	}
	return nil
}

// A message to clarify inside/outside chroot paths.
type Path struct {
	// The path to the resource.
	Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	// The path location.
	Location             Path_Location `protobuf:"varint,2,opt,name=location,proto3,enum=chromiumos.Path_Location" json:"location,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *Path) Reset()         { *m = Path{} }
func (m *Path) String() string { return proto.CompactTextString(m) }
func (*Path) ProtoMessage()    {}
func (*Path) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{8}
}

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

var xxx_messageInfo_Path proto.InternalMessageInfo

func (m *Path) GetPath() string {
	if m != nil {
		return m.Path
	}
	return ""
}

func (m *Path) GetLocation() Path_Location {
	if m != nil {
		return m.Location
	}
	return Path_NO_LOCATION
}

// A message used to indicate an output location for results. Specifically,
// this is used to automatically transfer files out of the chroot when needed.
// Note: No more than one ResultPath per message can be supported.
type ResultPath struct {
	// Required.
	// The result directory information.
	Path                 *Path    `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ResultPath) Reset()         { *m = ResultPath{} }
func (m *ResultPath) String() string { return proto.CompactTextString(m) }
func (*ResultPath) ProtoMessage()    {}
func (*ResultPath) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{9}
}

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

var xxx_messageInfo_ResultPath proto.InternalMessageInfo

func (m *ResultPath) GetPath() *Path {
	if m != nil {
		return m.Path
	}
	return nil
}

// A SyncedDir will have all of its contents transferred into a tmp directory
// in the chroot before the endpoint is called, and afterwords its contents
// will be exactly what was in the tmp directory when the endpoint completed.
type SyncedDir struct {
	// Required.
	// The directory being synced.
	Dir                  string   `protobuf:"bytes,1,opt,name=dir,proto3" json:"dir,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *SyncedDir) Reset()         { *m = SyncedDir{} }
func (m *SyncedDir) String() string { return proto.CompactTextString(m) }
func (*SyncedDir) ProtoMessage()    {}
func (*SyncedDir) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{10}
}

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

var xxx_messageInfo_SyncedDir proto.InternalMessageInfo

func (m *SyncedDir) GetDir() string {
	if m != nil {
		return m.Dir
	}
	return ""
}

// See also crrev.com/c/1929452 and:
//   https://cs.corp.google.com/piper///depot/google3/third_party/luci/buildbucket/proto/common.proto?l=147-176&rcl=257714215
// A Gerrit patchset.
type GerritChange struct {
	// Gerrit hostname, e.g. "chromium-review.googlesource.com".
	Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"`
	// Gerrit project, e.g. "chromium/src".
	Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"`
	// Change number, e.g. 12345.
	Change int64 `protobuf:"varint,3,opt,name=change,proto3" json:"change,omitempty"`
	// Patch set number, e.g. 1.
	Patchset             int64    `protobuf:"varint,4,opt,name=patchset,proto3" json:"patchset,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GerritChange) Reset()         { *m = GerritChange{} }
func (m *GerritChange) String() string { return proto.CompactTextString(m) }
func (*GerritChange) ProtoMessage()    {}
func (*GerritChange) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{11}
}

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

var xxx_messageInfo_GerritChange proto.InternalMessageInfo

func (m *GerritChange) GetHost() string {
	if m != nil {
		return m.Host
	}
	return ""
}

func (m *GerritChange) GetProject() string {
	if m != nil {
		return m.Project
	}
	return ""
}

func (m *GerritChange) GetChange() int64 {
	if m != nil {
		return m.Change
	}
	return 0
}

func (m *GerritChange) GetPatchset() int64 {
	if m != nil {
		return m.Patchset
	}
	return 0
}

type GitilesCommit struct {
	// Gitiles hostname, e.g. "chromium.googlesource.com".
	Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"`
	// Repository name on the host, e.g. "chromium/src".
	Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"`
	// Commit HEX SHA1.
	Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"`
	// Commit ref, e.g. "refs/heads/master".
	// NOT a branch name: if specified, must start with "refs/".
	Ref string `protobuf:"bytes,4,opt,name=ref,proto3" json:"ref,omitempty"`
	// Defines a total order of commits on the ref. Requires ref field.
	Position             uint32   `protobuf:"varint,5,opt,name=position,proto3" json:"position,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GitilesCommit) Reset()         { *m = GitilesCommit{} }
func (m *GitilesCommit) String() string { return proto.CompactTextString(m) }
func (*GitilesCommit) ProtoMessage()    {}
func (*GitilesCommit) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{12}
}

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

var xxx_messageInfo_GitilesCommit proto.InternalMessageInfo

func (m *GitilesCommit) GetHost() string {
	if m != nil {
		return m.Host
	}
	return ""
}

func (m *GitilesCommit) GetProject() string {
	if m != nil {
		return m.Project
	}
	return ""
}

func (m *GitilesCommit) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *GitilesCommit) GetRef() string {
	if m != nil {
		return m.Ref
	}
	return ""
}

func (m *GitilesCommit) GetPosition() uint32 {
	if m != nil {
		return m.Position
	}
	return 0
}

// Message for USE flags.
type UseFlag struct {
	// The use flag.
	Flag                 string   `protobuf:"bytes,1,opt,name=flag,proto3" json:"flag,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UseFlag) Reset()         { *m = UseFlag{} }
func (m *UseFlag) String() string { return proto.CompactTextString(m) }
func (*UseFlag) ProtoMessage()    {}
func (*UseFlag) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{13}
}

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

var xxx_messageInfo_UseFlag proto.InternalMessageInfo

func (m *UseFlag) GetFlag() string {
	if m != nil {
		return m.Flag
	}
	return ""
}

// A wrapper around a serialized protocol buffer.
type ProtoBytes struct {
	SerializedProto      []byte   `protobuf:"bytes,1,opt,name=serialized_proto,json=serializedProto,proto3" json:"serialized_proto,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ProtoBytes) Reset()         { *m = ProtoBytes{} }
func (m *ProtoBytes) String() string { return proto.CompactTextString(m) }
func (*ProtoBytes) ProtoMessage()    {}
func (*ProtoBytes) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{14}
}

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

var xxx_messageInfo_ProtoBytes proto.InternalMessageInfo

func (m *ProtoBytes) GetSerializedProto() []byte {
	if m != nil {
		return m.SerializedProto
	}
	return nil
}

// Additional information about artifacts used by PrepareForBuild endpoints.
// TODO(crbug/1019868): This is migrating to ArtifactProfileInfo.
type PrepareForBuildAdditionalArgs struct {
	// Types that are valid to be assigned to PrepareForBuildArgs:
	//	*PrepareForBuildAdditionalArgs_ChromeCwpProfile
	//	*PrepareForBuildAdditionalArgs_KernelVersion
	PrepareForBuildArgs  isPrepareForBuildAdditionalArgs_PrepareForBuildArgs `protobuf_oneof:"prepare_for_build_args"`
	XXX_NoUnkeyedLiteral struct{}                                            `json:"-"`
	XXX_unrecognized     []byte                                              `json:"-"`
	XXX_sizecache        int32                                               `json:"-"`
}

func (m *PrepareForBuildAdditionalArgs) Reset()         { *m = PrepareForBuildAdditionalArgs{} }
func (m *PrepareForBuildAdditionalArgs) String() string { return proto.CompactTextString(m) }
func (*PrepareForBuildAdditionalArgs) ProtoMessage()    {}
func (*PrepareForBuildAdditionalArgs) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{15}
}

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

var xxx_messageInfo_PrepareForBuildAdditionalArgs proto.InternalMessageInfo

type isPrepareForBuildAdditionalArgs_PrepareForBuildArgs interface {
	isPrepareForBuildAdditionalArgs_PrepareForBuildArgs()
}

type PrepareForBuildAdditionalArgs_ChromeCwpProfile struct {
	ChromeCwpProfile string `protobuf:"bytes,1,opt,name=chrome_cwp_profile,json=chromeCwpProfile,proto3,oneof"`
}

type PrepareForBuildAdditionalArgs_KernelVersion struct {
	KernelVersion string `protobuf:"bytes,2,opt,name=kernel_version,json=kernelVersion,proto3,oneof"`
}

func (*PrepareForBuildAdditionalArgs_ChromeCwpProfile) isPrepareForBuildAdditionalArgs_PrepareForBuildArgs() {
}

func (*PrepareForBuildAdditionalArgs_KernelVersion) isPrepareForBuildAdditionalArgs_PrepareForBuildArgs() {
}

func (m *PrepareForBuildAdditionalArgs) GetPrepareForBuildArgs() isPrepareForBuildAdditionalArgs_PrepareForBuildArgs {
	if m != nil {
		return m.PrepareForBuildArgs
	}
	return nil
}

func (m *PrepareForBuildAdditionalArgs) GetChromeCwpProfile() string {
	if x, ok := m.GetPrepareForBuildArgs().(*PrepareForBuildAdditionalArgs_ChromeCwpProfile); ok {
		return x.ChromeCwpProfile
	}
	return ""
}

func (m *PrepareForBuildAdditionalArgs) GetKernelVersion() string {
	if x, ok := m.GetPrepareForBuildArgs().(*PrepareForBuildAdditionalArgs_KernelVersion); ok {
		return x.KernelVersion
	}
	return ""
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*PrepareForBuildAdditionalArgs) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*PrepareForBuildAdditionalArgs_ChromeCwpProfile)(nil),
		(*PrepareForBuildAdditionalArgs_KernelVersion)(nil),
	}
}

// ToolchainService Unverified Release AFDO artifacts require information
// about the builder that created the image used to generate the unverified
// chrome benchmark perf file.
type AfdoRelease struct {
	// ToolchainService Chrome AFDO artifacts require profile name.
	ChromeCwpProfile string `protobuf:"bytes,1,opt,name=chrome_cwp_profile,json=chromeCwpProfile,proto3" json:"chrome_cwp_profile,omitempty"`
	// The build id of the image_build.  Used to generate the location for the
	// image archive.
	ImageBuildId         int64    `protobuf:"varint,2,opt,name=image_build_id,json=imageBuildId,proto3" json:"image_build_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *AfdoRelease) Reset()         { *m = AfdoRelease{} }
func (m *AfdoRelease) String() string { return proto.CompactTextString(m) }
func (*AfdoRelease) ProtoMessage()    {}
func (*AfdoRelease) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{16}
}

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

var xxx_messageInfo_AfdoRelease proto.InternalMessageInfo

func (m *AfdoRelease) GetChromeCwpProfile() string {
	if m != nil {
		return m.ChromeCwpProfile
	}
	return ""
}

func (m *AfdoRelease) GetImageBuildId() int64 {
	if m != nil {
		return m.ImageBuildId
	}
	return 0
}

// Artifact profile information used by artifact prepare/bundle endpoints in
// addition to input_artifacts.
type ArtifactProfileInfo struct {
	// Types that are valid to be assigned to ArtifactProfileInfo:
	//	*ArtifactProfileInfo_ChromeCwpProfile
	//	*ArtifactProfileInfo_KernelVersion
	//	*ArtifactProfileInfo_AfdoRelease
	ArtifactProfileInfo  isArtifactProfileInfo_ArtifactProfileInfo `protobuf_oneof:"artifact_profile_info"`
	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
	XXX_unrecognized     []byte                                    `json:"-"`
	XXX_sizecache        int32                                     `json:"-"`
}

func (m *ArtifactProfileInfo) Reset()         { *m = ArtifactProfileInfo{} }
func (m *ArtifactProfileInfo) String() string { return proto.CompactTextString(m) }
func (*ArtifactProfileInfo) ProtoMessage()    {}
func (*ArtifactProfileInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{17}
}

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

var xxx_messageInfo_ArtifactProfileInfo proto.InternalMessageInfo

type isArtifactProfileInfo_ArtifactProfileInfo interface {
	isArtifactProfileInfo_ArtifactProfileInfo()
}

type ArtifactProfileInfo_ChromeCwpProfile struct {
	ChromeCwpProfile string `protobuf:"bytes,1,opt,name=chrome_cwp_profile,json=chromeCwpProfile,proto3,oneof"`
}

type ArtifactProfileInfo_KernelVersion struct {
	KernelVersion string `protobuf:"bytes,2,opt,name=kernel_version,json=kernelVersion,proto3,oneof"`
}

type ArtifactProfileInfo_AfdoRelease struct {
	AfdoRelease *AfdoRelease `protobuf:"bytes,3,opt,name=afdo_release,json=afdoRelease,proto3,oneof"`
}

func (*ArtifactProfileInfo_ChromeCwpProfile) isArtifactProfileInfo_ArtifactProfileInfo() {}

func (*ArtifactProfileInfo_KernelVersion) isArtifactProfileInfo_ArtifactProfileInfo() {}

func (*ArtifactProfileInfo_AfdoRelease) isArtifactProfileInfo_ArtifactProfileInfo() {}

func (m *ArtifactProfileInfo) GetArtifactProfileInfo() isArtifactProfileInfo_ArtifactProfileInfo {
	if m != nil {
		return m.ArtifactProfileInfo
	}
	return nil
}

func (m *ArtifactProfileInfo) GetChromeCwpProfile() string {
	if x, ok := m.GetArtifactProfileInfo().(*ArtifactProfileInfo_ChromeCwpProfile); ok {
		return x.ChromeCwpProfile
	}
	return ""
}

func (m *ArtifactProfileInfo) GetKernelVersion() string {
	if x, ok := m.GetArtifactProfileInfo().(*ArtifactProfileInfo_KernelVersion); ok {
		return x.KernelVersion
	}
	return ""
}

func (m *ArtifactProfileInfo) GetAfdoRelease() *AfdoRelease {
	if x, ok := m.GetArtifactProfileInfo().(*ArtifactProfileInfo_AfdoRelease); ok {
		return x.AfdoRelease
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*ArtifactProfileInfo) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*ArtifactProfileInfo_ChromeCwpProfile)(nil),
		(*ArtifactProfileInfo_KernelVersion)(nil),
		(*ArtifactProfileInfo_AfdoRelease)(nil),
	}
}

// Artifact information. Used bythe  ArtifactsService.PrepareForBuild and
// BundleArtifacts endpoints to dispatch the appropriate service routines to
// prepare or bundle as a batch.
type ArtifactsByService struct {
	Legacy    *ArtifactsByService_Legacy    `protobuf:"bytes,1,opt,name=legacy,proto3" json:"legacy,omitempty"`
	Toolchain *ArtifactsByService_Toolchain `protobuf:"bytes,2,opt,name=toolchain,proto3" json:"toolchain,omitempty"`
	Image     *ArtifactsByService_Image     `protobuf:"bytes,3,opt,name=image,proto3" json:"image,omitempty"`
	Package   *ArtifactsByService_Package   `protobuf:"bytes,4,opt,name=package,proto3" json:"package,omitempty"`
	Sysroot   *ArtifactsByService_Sysroot   `protobuf:"bytes,5,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	Test      *ArtifactsByService_Test      `protobuf:"bytes,6,opt,name=test,proto3" json:"test,omitempty"`
	// Profile information needed by the artifact handler, if any.
	ProfileInfo          *ArtifactProfileInfo `protobuf:"bytes,7,opt,name=profile_info,json=profileInfo,proto3" json:"profile_info,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (m *ArtifactsByService) Reset()         { *m = ArtifactsByService{} }
func (m *ArtifactsByService) String() string { return proto.CompactTextString(m) }
func (*ArtifactsByService) ProtoMessage()    {}
func (*ArtifactsByService) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18}
}

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

var xxx_messageInfo_ArtifactsByService proto.InternalMessageInfo

func (m *ArtifactsByService) GetLegacy() *ArtifactsByService_Legacy {
	if m != nil {
		return m.Legacy
	}
	return nil
}

func (m *ArtifactsByService) GetToolchain() *ArtifactsByService_Toolchain {
	if m != nil {
		return m.Toolchain
	}
	return nil
}

func (m *ArtifactsByService) GetImage() *ArtifactsByService_Image {
	if m != nil {
		return m.Image
	}
	return nil
}

func (m *ArtifactsByService) GetPackage() *ArtifactsByService_Package {
	if m != nil {
		return m.Package
	}
	return nil
}

func (m *ArtifactsByService) GetSysroot() *ArtifactsByService_Sysroot {
	if m != nil {
		return m.Sysroot
	}
	return nil
}

func (m *ArtifactsByService) GetTest() *ArtifactsByService_Test {
	if m != nil {
		return m.Test
	}
	return nil
}

func (m *ArtifactsByService) GetProfileInfo() *ArtifactProfileInfo {
	if m != nil {
		return m.ProfileInfo
	}
	return nil
}

// TODO(crbug/1034529): Drop this message.
// Artifacts handled within the ArtifactsService endpoints directly.
type ArtifactsByService_Legacy struct {
	// Input artifact information
	InputArtifacts []*ArtifactsByService_Legacy_ArtifactInfo `protobuf:"bytes,1,rep,name=input_artifacts,json=inputArtifacts,proto3" json:"input_artifacts,omitempty"`
	// Output artifact information
	OutputArtifacts      []*ArtifactsByService_Legacy_ArtifactInfo `protobuf:"bytes,2,rep,name=output_artifacts,json=outputArtifacts,proto3" json:"output_artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
	XXX_unrecognized     []byte                                    `json:"-"`
	XXX_sizecache        int32                                     `json:"-"`
}

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

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

var xxx_messageInfo_ArtifactsByService_Legacy proto.InternalMessageInfo

func (m *ArtifactsByService_Legacy) GetInputArtifacts() []*ArtifactsByService_Legacy_ArtifactInfo {
	if m != nil {
		return m.InputArtifacts
	}
	return nil
}

func (m *ArtifactsByService_Legacy) GetOutputArtifacts() []*ArtifactsByService_Legacy_ArtifactInfo {
	if m != nil {
		return m.OutputArtifacts
	}
	return nil
}

// Information about one or more artifacts.
type ArtifactsByService_Legacy_ArtifactInfo struct {
	// The ArtifactType.  One or more types to which the rest of the fields
	// apply.
	ArtifactTypes []ArtifactsByService_Legacy_ArtifactType `protobuf:"varint,1,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.ArtifactsByService_Legacy_ArtifactType" json:"artifact_types,omitempty"`
	// GS location in which to upload artifacts ("gs://" is prepended).
	// Several fields can be logically specified:
	//   %(kind)s: BuilderConfig.Id.Type with underscores turned into hyphens.
	//   %(version)s: Chromeos version (e.g., R81-12813.0.0)
	//   %(build_id)s: Buildbucket job ID.
	//   %(target)s: build target name.
	//   %(builder_name)s: The builder name (e.g. octopus-cq), lowercase with
	//       underscores turned into hyphens.
	//   %(gs_path)s: "%(builder_name)s/%(version)s-%(build_id)s".
	//   %(artifact_name)s: The name of the artifact being published.
	//
	// BuilderConfig.Artifacts.artifacts_gs_location is used for all
	// artifacts.  Artifact can be published to additional locations by
	// specifying those here.  Examples: include AFDO artifacts and Release
	// images.
	GsLocations []string `protobuf:"bytes,2,rep,name=gs_locations,json=gsLocations,proto3" json:"gs_locations,omitempty"`
	// Any acl to apply, such as "public-read".
	AclName              string   `protobuf:"bytes,4,opt,name=acl_name,json=aclName,proto3" json:"acl_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ArtifactsByService_Legacy_ArtifactInfo proto.InternalMessageInfo

func (m *ArtifactsByService_Legacy_ArtifactInfo) GetArtifactTypes() []ArtifactsByService_Legacy_ArtifactType {
	if m != nil {
		return m.ArtifactTypes
	}
	return nil
}

func (m *ArtifactsByService_Legacy_ArtifactInfo) GetGsLocations() []string {
	if m != nil {
		return m.GsLocations
	}
	return nil
}

func (m *ArtifactsByService_Legacy_ArtifactInfo) GetAclName() string {
	if m != nil {
		return m.AclName
	}
	return ""
}

type ArtifactsByService_Toolchain struct {
	// Input artifact information
	InputArtifacts []*ArtifactsByService_Toolchain_ArtifactInfo `protobuf:"bytes,1,rep,name=input_artifacts,json=inputArtifacts,proto3" json:"input_artifacts,omitempty"`
	// Output artifact information
	OutputArtifacts      []*ArtifactsByService_Toolchain_ArtifactInfo `protobuf:"bytes,2,rep,name=output_artifacts,json=outputArtifacts,proto3" json:"output_artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                     `json:"-"`
	XXX_unrecognized     []byte                                       `json:"-"`
	XXX_sizecache        int32                                        `json:"-"`
}

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

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

var xxx_messageInfo_ArtifactsByService_Toolchain proto.InternalMessageInfo

func (m *ArtifactsByService_Toolchain) GetInputArtifacts() []*ArtifactsByService_Toolchain_ArtifactInfo {
	if m != nil {
		return m.InputArtifacts
	}
	return nil
}

func (m *ArtifactsByService_Toolchain) GetOutputArtifacts() []*ArtifactsByService_Toolchain_ArtifactInfo {
	if m != nil {
		return m.OutputArtifacts
	}
	return nil
}

// Information about one or more artifacts.  This should match the rest of
// the ArtifactInfo definitions in ArtifactsByService, other than having
// it's own (service-specific) definition for ArtifactType.
type ArtifactsByService_Toolchain_ArtifactInfo struct {
	// The ArtifactType.  One or more types to which the rest of the fields
	// apply.
	ArtifactTypes []ArtifactsByService_Toolchain_ArtifactType `protobuf:"varint,1,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.ArtifactsByService_Toolchain_ArtifactType" json:"artifact_types,omitempty"`
	// GS location in which to upload artifacts ("gs://" is prepended).
	// Several fields can be logically specified:
	//   %(kind)s: BuilderConfig.Id.Type with underscores turned into hyphens.
	//   %(version)s: Chromeos version (e.g., R81-12813.0.0)
	//   %(build_id)s: Buildbucket job ID.
	//   %(target)s: build target name.
	//   %(builder_name)s: The builder name (e.g. octopus-cq), lowercase with
	//       underscores turned into hyphens.
	// specifying those here.  Examples include AFDO artifacts and release
	//   %(artifact_name)s: The name of the artifact being published.
	//
	// BuilderConfig.Artifacts.artifacts_gs_location is used for all
	// artifacts.  Artifact can be published to additional locations by
	// specifying those here.  Examples: include AFDO artifacts and Release
	// images.
	GsLocations []string `protobuf:"bytes,2,rep,name=gs_locations,json=gsLocations,proto3" json:"gs_locations,omitempty"`
	// Any acl to apply, such as "public-read".
	AclName              string   `protobuf:"bytes,4,opt,name=acl_name,json=aclName,proto3" json:"acl_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ArtifactsByService_Toolchain_ArtifactInfo) Reset() {
	*m = ArtifactsByService_Toolchain_ArtifactInfo{}
}
func (m *ArtifactsByService_Toolchain_ArtifactInfo) String() string { return proto.CompactTextString(m) }
func (*ArtifactsByService_Toolchain_ArtifactInfo) ProtoMessage()    {}
func (*ArtifactsByService_Toolchain_ArtifactInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 1, 0}
}

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

var xxx_messageInfo_ArtifactsByService_Toolchain_ArtifactInfo proto.InternalMessageInfo

func (m *ArtifactsByService_Toolchain_ArtifactInfo) GetArtifactTypes() []ArtifactsByService_Toolchain_ArtifactType {
	if m != nil {
		return m.ArtifactTypes
	}
	return nil
}

func (m *ArtifactsByService_Toolchain_ArtifactInfo) GetGsLocations() []string {
	if m != nil {
		return m.GsLocations
	}
	return nil
}

func (m *ArtifactsByService_Toolchain_ArtifactInfo) GetAclName() string {
	if m != nil {
		return m.AclName
	}
	return ""
}

type ArtifactsByService_Image struct {
	// Input artifact information
	InputArtifacts []*ArtifactsByService_Image_ArtifactInfo `protobuf:"bytes,1,rep,name=input_artifacts,json=inputArtifacts,proto3" json:"input_artifacts,omitempty"`
	// Output artifact information
	OutputArtifacts      []*ArtifactsByService_Image_ArtifactInfo `protobuf:"bytes,2,rep,name=output_artifacts,json=outputArtifacts,proto3" json:"output_artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                 `json:"-"`
	XXX_unrecognized     []byte                                   `json:"-"`
	XXX_sizecache        int32                                    `json:"-"`
}

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

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

var xxx_messageInfo_ArtifactsByService_Image proto.InternalMessageInfo

func (m *ArtifactsByService_Image) GetInputArtifacts() []*ArtifactsByService_Image_ArtifactInfo {
	if m != nil {
		return m.InputArtifacts
	}
	return nil
}

func (m *ArtifactsByService_Image) GetOutputArtifacts() []*ArtifactsByService_Image_ArtifactInfo {
	if m != nil {
		return m.OutputArtifacts
	}
	return nil
}

// Information about one or more artifacts.  This should match the rest of
// the ArtifactInfo definitions in ArtifactsByService, other than having
// it's own (service-specific) definition for ArtifactType.
type ArtifactsByService_Image_ArtifactInfo struct {
	// The ArtifactType.  One or more types to which the rest of the fields
	// apply.
	ArtifactTypes []ArtifactsByService_Image_ArtifactType `protobuf:"varint,1,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.ArtifactsByService_Image_ArtifactType" json:"artifact_types,omitempty"`
	// GS location in which to upload artifacts ("gs://" is prepended).
	// Several fields can be logically specified:
	//   %(kind)s: BuilderConfig.Id.Type with underscores turned into hyphens.
	//   %(version)s: Chromeos version (e.g., R81-12813.0.0)
	//   %(build_id)s: Buildbucket job ID.
	//   %(target)s: build target name.
	//   %(builder_name)s: The builder name (e.g. octopus-cq), lowercase with
	//       underscores turned into hyphens.
	//   %(gs_path)s: "%(builder_name)s/%(version)s-%(build_id)s".
	//   %(artifact_name)s: The name of the artifact being published.
	//
	// BuilderConfig.Artifacts.artifacts_gs_location is used for all
	// artifacts.  Artifact can be published to additional locations by
	// specifying those here.  Examples: include AFDO artifacts and Release
	// images.
	GsLocations []string `protobuf:"bytes,2,rep,name=gs_locations,json=gsLocations,proto3" json:"gs_locations,omitempty"`
	// Any acl to apply, such as "public-read".
	AclName              string   `protobuf:"bytes,4,opt,name=acl_name,json=aclName,proto3" json:"acl_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ArtifactsByService_Image_ArtifactInfo) Reset()         { *m = ArtifactsByService_Image_ArtifactInfo{} }
func (m *ArtifactsByService_Image_ArtifactInfo) String() string { return proto.CompactTextString(m) }
func (*ArtifactsByService_Image_ArtifactInfo) ProtoMessage()    {}
func (*ArtifactsByService_Image_ArtifactInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 2, 0}
}

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

var xxx_messageInfo_ArtifactsByService_Image_ArtifactInfo proto.InternalMessageInfo

func (m *ArtifactsByService_Image_ArtifactInfo) GetArtifactTypes() []ArtifactsByService_Image_ArtifactType {
	if m != nil {
		return m.ArtifactTypes
	}
	return nil
}

func (m *ArtifactsByService_Image_ArtifactInfo) GetGsLocations() []string {
	if m != nil {
		return m.GsLocations
	}
	return nil
}

func (m *ArtifactsByService_Image_ArtifactInfo) GetAclName() string {
	if m != nil {
		return m.AclName
	}
	return ""
}

type ArtifactsByService_Package struct {
	// Input artifact information
	InputArtifacts []*ArtifactsByService_Package_ArtifactInfo `protobuf:"bytes,1,rep,name=input_artifacts,json=inputArtifacts,proto3" json:"input_artifacts,omitempty"`
	// Output artifact information
	OutputArtifacts      []*ArtifactsByService_Package_ArtifactInfo `protobuf:"bytes,2,rep,name=output_artifacts,json=outputArtifacts,proto3" json:"output_artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                   `json:"-"`
	XXX_unrecognized     []byte                                     `json:"-"`
	XXX_sizecache        int32                                      `json:"-"`
}

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

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

var xxx_messageInfo_ArtifactsByService_Package proto.InternalMessageInfo

func (m *ArtifactsByService_Package) GetInputArtifacts() []*ArtifactsByService_Package_ArtifactInfo {
	if m != nil {
		return m.InputArtifacts
	}
	return nil
}

func (m *ArtifactsByService_Package) GetOutputArtifacts() []*ArtifactsByService_Package_ArtifactInfo {
	if m != nil {
		return m.OutputArtifacts
	}
	return nil
}

// Information about one or more artifacts.  This should match the rest of
// the ArtifactInfo definitions in ArtifactsByService, other than having
// it's own (service-specific) definition for ArtifactType.
type ArtifactsByService_Package_ArtifactInfo struct {
	// The ArtifactType.  One or more types to which the rest of the fields
	// apply.
	ArtifactTypes []ArtifactsByService_Package_ArtifactType `protobuf:"varint,1,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.ArtifactsByService_Package_ArtifactType" json:"artifact_types,omitempty"`
	// GS location in which to upload artifacts ("gs://" is prepended).
	// Several fields can be logically specified:
	//   %(kind)s: BuilderConfig.Id.Type with underscores turned into hyphens.
	//   %(version)s: Chromeos version (e.g., R81-12813.0.0)
	//   %(build_id)s: Buildbucket job ID.
	//   %(target)s: build target name.
	//   %(builder_name)s: The builder name (e.g. octopus-cq), lowercase with
	//       underscores turned into hyphens.
	//   %(gs_path)s: "%(builder_name)s/%(version)s-%(build_id)s".
	//   %(artifact_name)s: The name of the artifact being published.
	//
	// BuilderConfig.Artifacts.artifacts_gs_location is used for all
	// artifacts.  Artifact can be published to additional locations by
	// specifying those here.  Examples: include AFDO artifacts and Release
	// images.
	GsLocations []string `protobuf:"bytes,2,rep,name=gs_locations,json=gsLocations,proto3" json:"gs_locations,omitempty"`
	// Any acl to apply, such as "public-read".
	AclName              string   `protobuf:"bytes,4,opt,name=acl_name,json=aclName,proto3" json:"acl_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ArtifactsByService_Package_ArtifactInfo) Reset() {
	*m = ArtifactsByService_Package_ArtifactInfo{}
}
func (m *ArtifactsByService_Package_ArtifactInfo) String() string { return proto.CompactTextString(m) }
func (*ArtifactsByService_Package_ArtifactInfo) ProtoMessage()    {}
func (*ArtifactsByService_Package_ArtifactInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 3, 0}
}

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

var xxx_messageInfo_ArtifactsByService_Package_ArtifactInfo proto.InternalMessageInfo

func (m *ArtifactsByService_Package_ArtifactInfo) GetArtifactTypes() []ArtifactsByService_Package_ArtifactType {
	if m != nil {
		return m.ArtifactTypes
	}
	return nil
}

func (m *ArtifactsByService_Package_ArtifactInfo) GetGsLocations() []string {
	if m != nil {
		return m.GsLocations
	}
	return nil
}

func (m *ArtifactsByService_Package_ArtifactInfo) GetAclName() string {
	if m != nil {
		return m.AclName
	}
	return ""
}

type ArtifactsByService_Sysroot struct {
	// Input artifact information
	InputArtifacts []*ArtifactsByService_Sysroot_ArtifactInfo `protobuf:"bytes,1,rep,name=input_artifacts,json=inputArtifacts,proto3" json:"input_artifacts,omitempty"`
	// Output artifact information
	OutputArtifacts      []*ArtifactsByService_Sysroot_ArtifactInfo `protobuf:"bytes,2,rep,name=output_artifacts,json=outputArtifacts,proto3" json:"output_artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                   `json:"-"`
	XXX_unrecognized     []byte                                     `json:"-"`
	XXX_sizecache        int32                                      `json:"-"`
}

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

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

var xxx_messageInfo_ArtifactsByService_Sysroot proto.InternalMessageInfo

func (m *ArtifactsByService_Sysroot) GetInputArtifacts() []*ArtifactsByService_Sysroot_ArtifactInfo {
	if m != nil {
		return m.InputArtifacts
	}
	return nil
}

func (m *ArtifactsByService_Sysroot) GetOutputArtifacts() []*ArtifactsByService_Sysroot_ArtifactInfo {
	if m != nil {
		return m.OutputArtifacts
	}
	return nil
}

// Information about one or more artifacts.  This should match the rest of
// the ArtifactInfo definitions in ArtifactsByService, other than having
// it's own (service-specific) definition for ArtifactType.
type ArtifactsByService_Sysroot_ArtifactInfo struct {
	// The ArtifactType.  One or more types to which the rest of the fields
	// apply.
	ArtifactTypes []ArtifactsByService_Sysroot_ArtifactType `protobuf:"varint,1,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.ArtifactsByService_Sysroot_ArtifactType" json:"artifact_types,omitempty"`
	// GS location in which to upload artifacts ("gs://" is prepended).
	// Several fields can be logically specified:
	//   %(kind)s: BuilderConfig.Id.Type with underscores turned into hyphens.
	//   %(version)s: Chromeos version (e.g., R81-12813.0.0)
	//   %(build_id)s: Buildbucket job ID.
	//   %(target)s: build target name.
	//   %(builder_name)s: The builder name (e.g. octopus-cq), lowercase with
	//       underscores turned into hyphens.
	//   %(gs_path)s: "%(builder_name)s/%(version)s-%(build_id)s".
	//   %(artifact_name)s: The name of the artifact being published.
	//
	// BuilderConfig.Artifacts.artifacts_gs_location is used for all
	// artifacts.  Artifact can be published to additional locations by
	// specifying those here.  Examples: include AFDO artifacts and Release
	// images.
	GsLocations []string `protobuf:"bytes,2,rep,name=gs_locations,json=gsLocations,proto3" json:"gs_locations,omitempty"`
	// Any acl to apply, such as "public-read".
	AclName              string   `protobuf:"bytes,4,opt,name=acl_name,json=aclName,proto3" json:"acl_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ArtifactsByService_Sysroot_ArtifactInfo) Reset() {
	*m = ArtifactsByService_Sysroot_ArtifactInfo{}
}
func (m *ArtifactsByService_Sysroot_ArtifactInfo) String() string { return proto.CompactTextString(m) }
func (*ArtifactsByService_Sysroot_ArtifactInfo) ProtoMessage()    {}
func (*ArtifactsByService_Sysroot_ArtifactInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 4, 0}
}

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

var xxx_messageInfo_ArtifactsByService_Sysroot_ArtifactInfo proto.InternalMessageInfo

func (m *ArtifactsByService_Sysroot_ArtifactInfo) GetArtifactTypes() []ArtifactsByService_Sysroot_ArtifactType {
	if m != nil {
		return m.ArtifactTypes
	}
	return nil
}

func (m *ArtifactsByService_Sysroot_ArtifactInfo) GetGsLocations() []string {
	if m != nil {
		return m.GsLocations
	}
	return nil
}

func (m *ArtifactsByService_Sysroot_ArtifactInfo) GetAclName() string {
	if m != nil {
		return m.AclName
	}
	return ""
}

type ArtifactsByService_Test struct {
	// Input artifact information
	InputArtifacts []*ArtifactsByService_Test_ArtifactInfo `protobuf:"bytes,1,rep,name=input_artifacts,json=inputArtifacts,proto3" json:"input_artifacts,omitempty"`
	// Output artifact information
	OutputArtifacts      []*ArtifactsByService_Test_ArtifactInfo `protobuf:"bytes,2,rep,name=output_artifacts,json=outputArtifacts,proto3" json:"output_artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
	XXX_unrecognized     []byte                                  `json:"-"`
	XXX_sizecache        int32                                   `json:"-"`
}

func (m *ArtifactsByService_Test) Reset()         { *m = ArtifactsByService_Test{} }
func (m *ArtifactsByService_Test) String() string { return proto.CompactTextString(m) }
func (*ArtifactsByService_Test) ProtoMessage()    {}
func (*ArtifactsByService_Test) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 5}
}

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

var xxx_messageInfo_ArtifactsByService_Test proto.InternalMessageInfo

func (m *ArtifactsByService_Test) GetInputArtifacts() []*ArtifactsByService_Test_ArtifactInfo {
	if m != nil {
		return m.InputArtifacts
	}
	return nil
}

func (m *ArtifactsByService_Test) GetOutputArtifacts() []*ArtifactsByService_Test_ArtifactInfo {
	if m != nil {
		return m.OutputArtifacts
	}
	return nil
}

// Information about one or more artifacts.  This should match the rest of
// the ArtifactInfo definitions in ArtifactsByService, other than having
// it's own (service-specific) definition for ArtifactType.
type ArtifactsByService_Test_ArtifactInfo struct {
	// The ArtifactType.  One or more types to which the rest of the fields
	// apply.
	ArtifactTypes []ArtifactsByService_Test_ArtifactType `protobuf:"varint,1,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.ArtifactsByService_Test_ArtifactType" json:"artifact_types,omitempty"`
	// GS location in which to upload artifacts ("gs://" is prepended).
	// Several fields can be logically specified:
	//   %(kind)s: BuilderConfig.Id.Type with underscores turned into hyphens.
	//   %(version)s: Chromeos version (e.g., R81-12813.0.0)
	//   %(build_id)s: Buildbucket job ID.
	//   %(target)s: build target name.
	//   %(builder_name)s: The builder name (e.g. octopus-cq), lowercase with
	//       underscores turned into hyphens.
	//   %(gs_path)s: "%(builder_name)s/%(version)s-%(build_id)s".
	//   %(artifact_name)s: The name of the artifact being published.
	//
	// BuilderConfig.Artifacts.artifacts_gs_location is used for all
	// artifacts.  Artifact can be published to additional locations by
	// specifying those here.  Examples: include AFDO artifacts and Release
	// images.
	GsLocations []string `protobuf:"bytes,2,rep,name=gs_locations,json=gsLocations,proto3" json:"gs_locations,omitempty"`
	// Any acl to apply, such as "public-read".
	AclName              string   `protobuf:"bytes,4,opt,name=acl_name,json=aclName,proto3" json:"acl_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ArtifactsByService_Test_ArtifactInfo) Reset()         { *m = ArtifactsByService_Test_ArtifactInfo{} }
func (m *ArtifactsByService_Test_ArtifactInfo) String() string { return proto.CompactTextString(m) }
func (*ArtifactsByService_Test_ArtifactInfo) ProtoMessage()    {}
func (*ArtifactsByService_Test_ArtifactInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 5, 0}
}

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

var xxx_messageInfo_ArtifactsByService_Test_ArtifactInfo proto.InternalMessageInfo

func (m *ArtifactsByService_Test_ArtifactInfo) GetArtifactTypes() []ArtifactsByService_Test_ArtifactType {
	if m != nil {
		return m.ArtifactTypes
	}
	return nil
}

func (m *ArtifactsByService_Test_ArtifactInfo) GetGsLocations() []string {
	if m != nil {
		return m.GsLocations
	}
	return nil
}

func (m *ArtifactsByService_Test_ArtifactInfo) GetAclName() string {
	if m != nil {
		return m.AclName
	}
	return ""
}

// Artifact information. Used bythe  ArtifactsService.PrepareForBuild and
// BundleArtifacts endpoints Response messages.
type UploadedArtifactsByService struct {
	Legacy               *UploadedArtifactsByService_Legacy    `protobuf:"bytes,1,opt,name=legacy,proto3" json:"legacy,omitempty"`
	Toolchain            *UploadedArtifactsByService_Toolchain `protobuf:"bytes,2,opt,name=toolchain,proto3" json:"toolchain,omitempty"`
	Image                *UploadedArtifactsByService_Image     `protobuf:"bytes,3,opt,name=image,proto3" json:"image,omitempty"`
	Package              *UploadedArtifactsByService_Package   `protobuf:"bytes,4,opt,name=package,proto3" json:"package,omitempty"`
	Sysroot              *UploadedArtifactsByService_Sysroot   `protobuf:"bytes,5,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	Test                 *UploadedArtifactsByService_Test      `protobuf:"bytes,6,opt,name=test,proto3" json:"test,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                              `json:"-"`
	XXX_unrecognized     []byte                                `json:"-"`
	XXX_sizecache        int32                                 `json:"-"`
}

func (m *UploadedArtifactsByService) Reset()         { *m = UploadedArtifactsByService{} }
func (m *UploadedArtifactsByService) String() string { return proto.CompactTextString(m) }
func (*UploadedArtifactsByService) ProtoMessage()    {}
func (*UploadedArtifactsByService) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{19}
}

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

var xxx_messageInfo_UploadedArtifactsByService proto.InternalMessageInfo

func (m *UploadedArtifactsByService) GetLegacy() *UploadedArtifactsByService_Legacy {
	if m != nil {
		return m.Legacy
	}
	return nil
}

func (m *UploadedArtifactsByService) GetToolchain() *UploadedArtifactsByService_Toolchain {
	if m != nil {
		return m.Toolchain
	}
	return nil
}

func (m *UploadedArtifactsByService) GetImage() *UploadedArtifactsByService_Image {
	if m != nil {
		return m.Image
	}
	return nil
}

func (m *UploadedArtifactsByService) GetPackage() *UploadedArtifactsByService_Package {
	if m != nil {
		return m.Package
	}
	return nil
}

func (m *UploadedArtifactsByService) GetSysroot() *UploadedArtifactsByService_Sysroot {
	if m != nil {
		return m.Sysroot
	}
	return nil
}

func (m *UploadedArtifactsByService) GetTest() *UploadedArtifactsByService_Test {
	if m != nil {
		return m.Test
	}
	return nil
}

// Legacy artifacts, handled directly ArtifactsService.
// Artifacts handled within the ArtifactsService endpoints directly.
// TODO(crbug/1034529): Drop this message.
type UploadedArtifactsByService_Legacy struct {
	Artifacts            []*UploadedArtifactsByService_Legacy_ArtifactPaths `protobuf:"bytes,1,rep,name=artifacts,proto3" json:"artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                           `json:"-"`
	XXX_unrecognized     []byte                                             `json:"-"`
	XXX_sizecache        int32                                              `json:"-"`
}

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

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

var xxx_messageInfo_UploadedArtifactsByService_Legacy proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Legacy) GetArtifacts() []*UploadedArtifactsByService_Legacy_ArtifactPaths {
	if m != nil {
		return m.Artifacts
	}
	return nil
}

type UploadedArtifactsByService_Legacy_ArtifactPaths struct {
	// The ArtifactType.
	ArtifactType ArtifactsByService_Legacy_ArtifactType `protobuf:"varint,1,opt,name=artifact_type,json=artifactType,proto3,enum=chromiumos.ArtifactsByService_Legacy_ArtifactType" json:"artifact_type,omitempty"`
	// Absolute path to the artifact file.
	Paths                []string `protobuf:"bytes,2,rep,name=paths,proto3" json:"paths,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UploadedArtifactsByService_Legacy_ArtifactPaths proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Legacy_ArtifactPaths) GetArtifactType() ArtifactsByService_Legacy_ArtifactType {
	if m != nil {
		return m.ArtifactType
	}
	return ArtifactsByService_Legacy_UNSPECIFIED
}

func (m *UploadedArtifactsByService_Legacy_ArtifactPaths) GetPaths() []string {
	if m != nil {
		return m.Paths
	}
	return nil
}

type UploadedArtifactsByService_Toolchain struct {
	Artifacts            []*UploadedArtifactsByService_Toolchain_ArtifactPaths `protobuf:"bytes,1,rep,name=artifacts,proto3" json:"artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                              `json:"-"`
	XXX_unrecognized     []byte                                                `json:"-"`
	XXX_sizecache        int32                                                 `json:"-"`
}

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

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

var xxx_messageInfo_UploadedArtifactsByService_Toolchain proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Toolchain) GetArtifacts() []*UploadedArtifactsByService_Toolchain_ArtifactPaths {
	if m != nil {
		return m.Artifacts
	}
	return nil
}

type UploadedArtifactsByService_Toolchain_ArtifactPaths struct {
	// The ArtifactType.
	ArtifactType ArtifactsByService_Toolchain_ArtifactType `protobuf:"varint,1,opt,name=artifact_type,json=artifactType,proto3,enum=chromiumos.ArtifactsByService_Toolchain_ArtifactType" json:"artifact_type,omitempty"`
	// Absolute path to the artifact file.
	Paths                []string `protobuf:"bytes,2,rep,name=paths,proto3" json:"paths,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UploadedArtifactsByService_Toolchain_ArtifactPaths) Reset() {
	*m = UploadedArtifactsByService_Toolchain_ArtifactPaths{}
}
func (m *UploadedArtifactsByService_Toolchain_ArtifactPaths) String() string {
	return proto.CompactTextString(m)
}
func (*UploadedArtifactsByService_Toolchain_ArtifactPaths) ProtoMessage() {}
func (*UploadedArtifactsByService_Toolchain_ArtifactPaths) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{19, 1, 0}
}

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

var xxx_messageInfo_UploadedArtifactsByService_Toolchain_ArtifactPaths proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Toolchain_ArtifactPaths) GetArtifactType() ArtifactsByService_Toolchain_ArtifactType {
	if m != nil {
		return m.ArtifactType
	}
	return ArtifactsByService_Toolchain_UNSPECIFIED
}

func (m *UploadedArtifactsByService_Toolchain_ArtifactPaths) GetPaths() []string {
	if m != nil {
		return m.Paths
	}
	return nil
}

type UploadedArtifactsByService_Image struct {
	Artifacts            []*UploadedArtifactsByService_Image_ArtifactPaths `protobuf:"bytes,1,rep,name=artifacts,proto3" json:"artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                          `json:"-"`
	XXX_unrecognized     []byte                                            `json:"-"`
	XXX_sizecache        int32                                             `json:"-"`
}

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

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

var xxx_messageInfo_UploadedArtifactsByService_Image proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Image) GetArtifacts() []*UploadedArtifactsByService_Image_ArtifactPaths {
	if m != nil {
		return m.Artifacts
	}
	return nil
}

type UploadedArtifactsByService_Image_ArtifactPaths struct {
	// The ArtifactType.
	ArtifactType ArtifactsByService_Image_ArtifactType `protobuf:"varint,1,opt,name=artifact_type,json=artifactType,proto3,enum=chromiumos.ArtifactsByService_Image_ArtifactType" json:"artifact_type,omitempty"`
	// Absolute path to the artifact file.
	Paths                []string `protobuf:"bytes,2,rep,name=paths,proto3" json:"paths,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UploadedArtifactsByService_Image_ArtifactPaths) Reset() {
	*m = UploadedArtifactsByService_Image_ArtifactPaths{}
}
func (m *UploadedArtifactsByService_Image_ArtifactPaths) String() string {
	return proto.CompactTextString(m)
}
func (*UploadedArtifactsByService_Image_ArtifactPaths) ProtoMessage() {}
func (*UploadedArtifactsByService_Image_ArtifactPaths) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{19, 2, 0}
}

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

var xxx_messageInfo_UploadedArtifactsByService_Image_ArtifactPaths proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Image_ArtifactPaths) GetArtifactType() ArtifactsByService_Image_ArtifactType {
	if m != nil {
		return m.ArtifactType
	}
	return ArtifactsByService_Image_UNSPECIFIED
}

func (m *UploadedArtifactsByService_Image_ArtifactPaths) GetPaths() []string {
	if m != nil {
		return m.Paths
	}
	return nil
}

type UploadedArtifactsByService_Package struct {
	Artifacts            []*UploadedArtifactsByService_Package_ArtifactPaths `protobuf:"bytes,1,rep,name=artifacts,proto3" json:"artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                            `json:"-"`
	XXX_unrecognized     []byte                                              `json:"-"`
	XXX_sizecache        int32                                               `json:"-"`
}

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

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

var xxx_messageInfo_UploadedArtifactsByService_Package proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Package) GetArtifacts() []*UploadedArtifactsByService_Package_ArtifactPaths {
	if m != nil {
		return m.Artifacts
	}
	return nil
}

type UploadedArtifactsByService_Package_ArtifactPaths struct {
	// The ArtifactType.
	ArtifactType ArtifactsByService_Package_ArtifactType `protobuf:"varint,1,opt,name=artifact_type,json=artifactType,proto3,enum=chromiumos.ArtifactsByService_Package_ArtifactType" json:"artifact_type,omitempty"`
	// Absolute path to the artifact file.
	Paths                []string `protobuf:"bytes,2,rep,name=paths,proto3" json:"paths,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UploadedArtifactsByService_Package_ArtifactPaths) Reset() {
	*m = UploadedArtifactsByService_Package_ArtifactPaths{}
}
func (m *UploadedArtifactsByService_Package_ArtifactPaths) String() string {
	return proto.CompactTextString(m)
}
func (*UploadedArtifactsByService_Package_ArtifactPaths) ProtoMessage() {}
func (*UploadedArtifactsByService_Package_ArtifactPaths) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{19, 3, 0}
}

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

var xxx_messageInfo_UploadedArtifactsByService_Package_ArtifactPaths proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Package_ArtifactPaths) GetArtifactType() ArtifactsByService_Package_ArtifactType {
	if m != nil {
		return m.ArtifactType
	}
	return ArtifactsByService_Package_UNSPECIFIED
}

func (m *UploadedArtifactsByService_Package_ArtifactPaths) GetPaths() []string {
	if m != nil {
		return m.Paths
	}
	return nil
}

type UploadedArtifactsByService_Sysroot struct {
	Artifacts            []*UploadedArtifactsByService_Sysroot_ArtifactPaths `protobuf:"bytes,1,rep,name=artifacts,proto3" json:"artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                            `json:"-"`
	XXX_unrecognized     []byte                                              `json:"-"`
	XXX_sizecache        int32                                               `json:"-"`
}

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

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

var xxx_messageInfo_UploadedArtifactsByService_Sysroot proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Sysroot) GetArtifacts() []*UploadedArtifactsByService_Sysroot_ArtifactPaths {
	if m != nil {
		return m.Artifacts
	}
	return nil
}

type UploadedArtifactsByService_Sysroot_ArtifactPaths struct {
	// The ArtifactType.
	ArtifactType ArtifactsByService_Sysroot_ArtifactType `protobuf:"varint,1,opt,name=artifact_type,json=artifactType,proto3,enum=chromiumos.ArtifactsByService_Sysroot_ArtifactType" json:"artifact_type,omitempty"`
	// Absolute path to the artifact file.
	Paths                []string `protobuf:"bytes,2,rep,name=paths,proto3" json:"paths,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UploadedArtifactsByService_Sysroot_ArtifactPaths) Reset() {
	*m = UploadedArtifactsByService_Sysroot_ArtifactPaths{}
}
func (m *UploadedArtifactsByService_Sysroot_ArtifactPaths) String() string {
	return proto.CompactTextString(m)
}
func (*UploadedArtifactsByService_Sysroot_ArtifactPaths) ProtoMessage() {}
func (*UploadedArtifactsByService_Sysroot_ArtifactPaths) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{19, 4, 0}
}

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

var xxx_messageInfo_UploadedArtifactsByService_Sysroot_ArtifactPaths proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Sysroot_ArtifactPaths) GetArtifactType() ArtifactsByService_Sysroot_ArtifactType {
	if m != nil {
		return m.ArtifactType
	}
	return ArtifactsByService_Sysroot_UNSPECIFIED
}

func (m *UploadedArtifactsByService_Sysroot_ArtifactPaths) GetPaths() []string {
	if m != nil {
		return m.Paths
	}
	return nil
}

type UploadedArtifactsByService_Test struct {
	Artifacts            []*UploadedArtifactsByService_Test_ArtifactPaths `protobuf:"bytes,1,rep,name=artifacts,proto3" json:"artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                         `json:"-"`
	XXX_unrecognized     []byte                                           `json:"-"`
	XXX_sizecache        int32                                            `json:"-"`
}

func (m *UploadedArtifactsByService_Test) Reset()         { *m = UploadedArtifactsByService_Test{} }
func (m *UploadedArtifactsByService_Test) String() string { return proto.CompactTextString(m) }
func (*UploadedArtifactsByService_Test) ProtoMessage()    {}
func (*UploadedArtifactsByService_Test) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{19, 5}
}

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

var xxx_messageInfo_UploadedArtifactsByService_Test proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Test) GetArtifacts() []*UploadedArtifactsByService_Test_ArtifactPaths {
	if m != nil {
		return m.Artifacts
	}
	return nil
}

type UploadedArtifactsByService_Test_ArtifactPaths struct {
	// The ArtifactType.
	ArtifactType ArtifactsByService_Test_ArtifactType `protobuf:"varint,1,opt,name=artifact_type,json=artifactType,proto3,enum=chromiumos.ArtifactsByService_Test_ArtifactType" json:"artifact_type,omitempty"`
	// Absolute path to the artifact file.
	Paths                []string `protobuf:"bytes,2,rep,name=paths,proto3" json:"paths,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UploadedArtifactsByService_Test_ArtifactPaths) Reset() {
	*m = UploadedArtifactsByService_Test_ArtifactPaths{}
}
func (m *UploadedArtifactsByService_Test_ArtifactPaths) String() string {
	return proto.CompactTextString(m)
}
func (*UploadedArtifactsByService_Test_ArtifactPaths) ProtoMessage() {}
func (*UploadedArtifactsByService_Test_ArtifactPaths) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{19, 5, 0}
}

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

var xxx_messageInfo_UploadedArtifactsByService_Test_ArtifactPaths proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Test_ArtifactPaths) GetArtifactType() ArtifactsByService_Test_ArtifactType {
	if m != nil {
		return m.ArtifactType
	}
	return ArtifactsByService_Test_UNSPECIFIED
}

func (m *UploadedArtifactsByService_Test_ArtifactPaths) GetPaths() []string {
	if m != nil {
		return m.Paths
	}
	return nil
}

func init() {
	proto.RegisterEnum("chromiumos.ImageType", ImageType_name, ImageType_value)
	proto.RegisterEnum("chromiumos.Channel", Channel_name, Channel_value)
	proto.RegisterEnum("chromiumos.DeltaType", DeltaType_name, DeltaType_value)
	proto.RegisterEnum("chromiumos.AFDOArtifactType", AFDOArtifactType_name, AFDOArtifactType_value)
	proto.RegisterEnum("chromiumos.GomaConfig_GomaApproach", GomaConfig_GomaApproach_name, GomaConfig_GomaApproach_value)
	proto.RegisterEnum("chromiumos.Path_Location", Path_Location_name, Path_Location_value)
	proto.RegisterEnum("chromiumos.ArtifactsByService_Legacy_ArtifactType", ArtifactsByService_Legacy_ArtifactType_name, ArtifactsByService_Legacy_ArtifactType_value)
	proto.RegisterEnum("chromiumos.ArtifactsByService_Toolchain_ArtifactType", ArtifactsByService_Toolchain_ArtifactType_name, ArtifactsByService_Toolchain_ArtifactType_value)
	proto.RegisterEnum("chromiumos.ArtifactsByService_Image_ArtifactType", ArtifactsByService_Image_ArtifactType_name, ArtifactsByService_Image_ArtifactType_value)
	proto.RegisterEnum("chromiumos.ArtifactsByService_Package_ArtifactType", ArtifactsByService_Package_ArtifactType_name, ArtifactsByService_Package_ArtifactType_value)
	proto.RegisterEnum("chromiumos.ArtifactsByService_Sysroot_ArtifactType", ArtifactsByService_Sysroot_ArtifactType_name, ArtifactsByService_Sysroot_ArtifactType_value)
	proto.RegisterEnum("chromiumos.ArtifactsByService_Test_ArtifactType", ArtifactsByService_Test_ArtifactType_name, ArtifactsByService_Test_ArtifactType_value)
	proto.RegisterType((*BuildTarget)(nil), "chromiumos.BuildTarget")
	proto.RegisterType((*Chroot)(nil), "chromiumos.Chroot")
	proto.RegisterType((*Chroot_ChrootEnv)(nil), "chromiumos.Chroot.ChrootEnv")
	proto.RegisterType((*Feature)(nil), "chromiumos.Feature")
	proto.RegisterType((*GomaConfig)(nil), "chromiumos.GomaConfig")
	proto.RegisterType((*GomaArtifacts)(nil), "chromiumos.GomaArtifacts")
	proto.RegisterType((*PackageInfo)(nil), "chromiumos.PackageInfo")
	proto.RegisterType((*Profile)(nil), "chromiumos.Profile")
	proto.RegisterType((*PackageIndexInfo)(nil), "chromiumos.PackageIndexInfo")
	proto.RegisterType((*Path)(nil), "chromiumos.Path")
	proto.RegisterType((*ResultPath)(nil), "chromiumos.ResultPath")
	proto.RegisterType((*SyncedDir)(nil), "chromiumos.SyncedDir")
	proto.RegisterType((*GerritChange)(nil), "chromiumos.GerritChange")
	proto.RegisterType((*GitilesCommit)(nil), "chromiumos.GitilesCommit")
	proto.RegisterType((*UseFlag)(nil), "chromiumos.UseFlag")
	proto.RegisterType((*ProtoBytes)(nil), "chromiumos.ProtoBytes")
	proto.RegisterType((*PrepareForBuildAdditionalArgs)(nil), "chromiumos.PrepareForBuildAdditionalArgs")
	proto.RegisterType((*AfdoRelease)(nil), "chromiumos.AfdoRelease")
	proto.RegisterType((*ArtifactProfileInfo)(nil), "chromiumos.ArtifactProfileInfo")
	proto.RegisterType((*ArtifactsByService)(nil), "chromiumos.ArtifactsByService")
	proto.RegisterType((*ArtifactsByService_Legacy)(nil), "chromiumos.ArtifactsByService.Legacy")
	proto.RegisterType((*ArtifactsByService_Legacy_ArtifactInfo)(nil), "chromiumos.ArtifactsByService.Legacy.ArtifactInfo")
	proto.RegisterType((*ArtifactsByService_Toolchain)(nil), "chromiumos.ArtifactsByService.Toolchain")
	proto.RegisterType((*ArtifactsByService_Toolchain_ArtifactInfo)(nil), "chromiumos.ArtifactsByService.Toolchain.ArtifactInfo")
	proto.RegisterType((*ArtifactsByService_Image)(nil), "chromiumos.ArtifactsByService.Image")
	proto.RegisterType((*ArtifactsByService_Image_ArtifactInfo)(nil), "chromiumos.ArtifactsByService.Image.ArtifactInfo")
	proto.RegisterType((*ArtifactsByService_Package)(nil), "chromiumos.ArtifactsByService.Package")
	proto.RegisterType((*ArtifactsByService_Package_ArtifactInfo)(nil), "chromiumos.ArtifactsByService.Package.ArtifactInfo")
	proto.RegisterType((*ArtifactsByService_Sysroot)(nil), "chromiumos.ArtifactsByService.Sysroot")
	proto.RegisterType((*ArtifactsByService_Sysroot_ArtifactInfo)(nil), "chromiumos.ArtifactsByService.Sysroot.ArtifactInfo")
	proto.RegisterType((*ArtifactsByService_Test)(nil), "chromiumos.ArtifactsByService.Test")
	proto.RegisterType((*ArtifactsByService_Test_ArtifactInfo)(nil), "chromiumos.ArtifactsByService.Test.ArtifactInfo")
	proto.RegisterType((*UploadedArtifactsByService)(nil), "chromiumos.UploadedArtifactsByService")
	proto.RegisterType((*UploadedArtifactsByService_Legacy)(nil), "chromiumos.UploadedArtifactsByService.Legacy")
	proto.RegisterType((*UploadedArtifactsByService_Legacy_ArtifactPaths)(nil), "chromiumos.UploadedArtifactsByService.Legacy.ArtifactPaths")
	proto.RegisterType((*UploadedArtifactsByService_Toolchain)(nil), "chromiumos.UploadedArtifactsByService.Toolchain")
	proto.RegisterType((*UploadedArtifactsByService_Toolchain_ArtifactPaths)(nil), "chromiumos.UploadedArtifactsByService.Toolchain.ArtifactPaths")
	proto.RegisterType((*UploadedArtifactsByService_Image)(nil), "chromiumos.UploadedArtifactsByService.Image")
	proto.RegisterType((*UploadedArtifactsByService_Image_ArtifactPaths)(nil), "chromiumos.UploadedArtifactsByService.Image.ArtifactPaths")
	proto.RegisterType((*UploadedArtifactsByService_Package)(nil), "chromiumos.UploadedArtifactsByService.Package")
	proto.RegisterType((*UploadedArtifactsByService_Package_ArtifactPaths)(nil), "chromiumos.UploadedArtifactsByService.Package.ArtifactPaths")
	proto.RegisterType((*UploadedArtifactsByService_Sysroot)(nil), "chromiumos.UploadedArtifactsByService.Sysroot")
	proto.RegisterType((*UploadedArtifactsByService_Sysroot_ArtifactPaths)(nil), "chromiumos.UploadedArtifactsByService.Sysroot.ArtifactPaths")
	proto.RegisterType((*UploadedArtifactsByService_Test)(nil), "chromiumos.UploadedArtifactsByService.Test")
	proto.RegisterType((*UploadedArtifactsByService_Test_ArtifactPaths)(nil), "chromiumos.UploadedArtifactsByService.Test.ArtifactPaths")
}

func init() { proto.RegisterFile("chromiumos/common.proto", fileDescriptor_fa0b57c3d7d4c63b) }

var fileDescriptor_fa0b57c3d7d4c63b = []byte{
	// 2553 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0xdf, 0x8f, 0xdb, 0xc6,
	0xf1, 0x37, 0x25, 0xdd, 0x49, 0x1a, 0xfd, 0x38, 0x7a, 0x1d, 0xdb, 0x67, 0xc5, 0x97, 0x38, 0xb4,
	0xf3, 0x8d, 0xe3, 0x6f, 0x72, 0x76, 0x2f, 0x49, 0x83, 0xa6, 0xe9, 0x0f, 0x8a, 0xa2, 0x74, 0x4c,
	0x74, 0xa4, 0xb0, 0xa4, 0xee, 0x7c, 0x17, 0x37, 0x2c, 0x2d, 0x51, 0x12, 0x13, 0x49, 0x14, 0x48,
	0x9e, 0xd3, 0x4b, 0x7f, 0xa1, 0x4f, 0xed, 0x4b, 0x1f, 0xda, 0x02, 0x05, 0xfa, 0x07, 0xb4, 0x28,
	0x0a, 0xf4, 0xb9, 0x6f, 0x7d, 0xeb, 0x3f, 0x51, 0x20, 0x40, 0x81, 0xa2, 0x7d, 0xeb, 0xbf, 0xd0,
	0x16, 0xbb, 0x4b, 0x4a, 0xd4, 0x2f, 0x9f, 0x74, 0x8d, 0xe1, 0xa7, 0xe3, 0xce, 0xcc, 0xce, 0xcc,
	0x67, 0x67, 0x66, 0x77, 0x67, 0x75, 0x70, 0xbd, 0xd5, 0xf3, 0xdc, 0x81, 0x73, 0x3a, 0x70, 0xfd,
	0xfb, 0x2d, 0x77, 0x30, 0x70, 0x87, 0xbb, 0x23, 0xcf, 0x0d, 0x5c, 0x04, 0x13, 0x86, 0xf0, 0x0a,
	0xe4, 0xca, 0xa7, 0x4e, 0xbf, 0x6d, 0x58, 0x5e, 0xd7, 0x0e, 0x10, 0x82, 0xd4, 0xd0, 0x1a, 0xd8,
	0xdb, 0xdc, 0x2d, 0xee, 0x6e, 0x16, 0xd3, 0x6f, 0xe1, 0xdf, 0x1c, 0x6c, 0x4a, 0x3d, 0xcf, 0x75,
	0x29, 0x7b, 0x64, 0x05, 0xbd, 0x88, 0x4d, 0xbe, 0xd1, 0x8b, 0x90, 0x6d, 0x59, 0xad, 0x9e, 0x6d,
	0xb6, 0x1d, 0x6f, 0x3b, 0x41, 0x19, 0x19, 0x4a, 0xa8, 0x38, 0x1e, 0xda, 0x85, 0xa4, 0x3d, 0x7c,
	0xb2, 0x9d, 0xbc, 0xc5, 0xdd, 0xcd, 0xed, 0xdd, 0xdc, 0x9d, 0x18, 0xde, 0x65, 0x1a, 0xc3, 0x3f,
	0xf2, 0xf0, 0x09, 0x26, 0x82, 0x68, 0x07, 0x98, 0x73, 0x4c, 0x5b, 0x8a, 0x6a, 0xcb, 0x32, 0x4a,
	0xc5, 0xf1, 0x4a, 0x43, 0xc8, 0x8e, 0x27, 0xa0, 0x07, 0x90, 0x3d, 0xf5, 0x6d, 0xb3, 0xd3, 0xb7,
	0xba, 0xfe, 0x36, 0x77, 0x2b, 0x79, 0x37, 0xb7, 0x77, 0x25, 0x6e, 0xa1, 0xe9, 0xdb, 0xd5, 0xbe,
	0xd5, 0xc5, 0x99, 0x53, 0xf6, 0xe1, 0xa3, 0xfb, 0x90, 0xe9, 0xd8, 0x56, 0x70, 0xea, 0xd9, 0xfe,
	0x76, 0x62, 0x7e, 0x42, 0x95, 0xf1, 0xf0, 0x58, 0xe8, 0x83, 0x54, 0x66, 0x83, 0xdf, 0x14, 0x6e,
	0x43, 0x3a, 0x64, 0xa1, 0x6d, 0x48, 0x87, 0xcc, 0x70, 0x0d, 0xa2, 0xa1, 0xf0, 0xeb, 0x24, 0x40,
	0xcd, 0x1d, 0x58, 0x92, 0x3b, 0xec, 0x38, 0x5d, 0x74, 0x03, 0x32, 0x5d, 0x77, 0x60, 0x51, 0x18,
	0xa1, 0x24, 0x19, 0x93, 0x35, 0xb9, 0x0b, 0x3c, 0x65, 0xb5, 0xfa, 0x8e, 0x3d, 0x0c, 0xcc, 0x4f,
	0x7c, 0x77, 0x18, 0xae, 0x5b, 0x91, 0xd0, 0x25, 0x4a, 0xfe, 0xc0, 0x77, 0x87, 0xe8, 0x1e, 0x5c,
	0x66, 0xd8, 0x5d, 0xdf, 0x1c, 0x6b, 0x4b, 0x52, 0xd1, 0xad, 0x88, 0x51, 0x0b, 0xb5, 0xee, 0x43,
	0x81, 0x8a, 0x58, 0xa3, 0x91, 0xe7, 0x5a, 0xad, 0x1e, 0x5d, 0xbc, 0xe2, 0xde, 0xed, 0x38, 0xc0,
	0x89, 0x7f, 0xf4, 0x53, 0x0c, 0x45, 0x71, 0xbe, 0x1b, 0x1b, 0xa1, 0x5d, 0x48, 0xf7, 0xdd, 0x2e,
	0xb5, 0xb5, 0x41, 0xe3, 0x76, 0x35, 0xae, 0x43, 0x3f, 0x1b, 0xb6, 0xec, 0x76, 0xc5, 0xf1, 0xf0,
	0x66, 0xdf, 0xed, 0x12, 0xcb, 0x3b, 0x00, 0x7e, 0x60, 0x05, 0xbe, 0xd9, 0x71, 0xfa, 0xf6, 0xf6,
	0x26, 0x8b, 0x19, 0xa5, 0x54, 0x9d, 0xbe, 0x8d, 0x6e, 0x43, 0xa1, 0xe5, 0x9e, 0x0e, 0x03, 0xdb,
	0xfb, 0x9c, 0x49, 0xa4, 0xa9, 0x44, 0x3e, 0x22, 0x12, 0x21, 0xe1, 0x18, 0xf2, 0x71, 0x8f, 0xd0,
	0x0e, 0xdc, 0xa8, 0x69, 0x07, 0xa2, 0x29, 0x36, 0x1a, 0x58, 0x13, 0xa5, 0x7d, 0xb3, 0xa9, 0xea,
	0x0d, 0x59, 0x52, 0xaa, 0x8a, 0x5c, 0xe1, 0x2f, 0xa1, 0x1c, 0xa4, 0x2b, 0x72, 0x55, 0x6c, 0xd6,
	0x0d, 0x9e, 0x43, 0x79, 0xc8, 0xe0, 0xb2, 0x6c, 0x36, 0xb0, 0x56, 0xe1, 0x13, 0x68, 0x0b, 0x72,
	0x64, 0xa4, 0x1b, 0x62, 0x4d, 0x51, 0x6b, 0x7c, 0x52, 0x18, 0x41, 0x81, 0xaa, 0xf6, 0x02, 0xa7,
	0x63, 0xb5, 0x02, 0x7f, 0xc6, 0x5f, 0xee, 0x5c, 0x7f, 0x13, 0xf3, 0xfe, 0x92, 0xa4, 0x27, 0x6b,
	0x44, 0xf8, 0xfe, 0x76, 0xf2, 0x56, 0x92, 0x24, 0x7d, 0xdf, 0xed, 0x12, 0x9e, 0x2f, 0x74, 0x20,
	0xd7, 0xb0, 0x5a, 0x9f, 0x5a, 0x5d, 0x5b, 0x19, 0x76, 0x5c, 0xf4, 0x0a, 0xe4, 0x47, 0x6c, 0x68,
	0xc6, 0x6a, 0x2b, 0x17, 0xd2, 0x54, 0x6b, 0x60, 0xa3, 0x12, 0x64, 0x5a, 0x56, 0x60, 0x77, 0x5d,
	0xef, 0x6c, 0x52, 0x42, 0x6c, 0x4c, 0x52, 0xee, 0x89, 0xed, 0xf9, 0x8e, 0x3b, 0x0c, 0x43, 0x1f,
	0x0d, 0x85, 0x1d, 0x48, 0x37, 0x3c, 0x97, 0xf8, 0xb0, 0xb0, 0x6e, 0xff, 0xc1, 0x01, 0x3f, 0xf6,
	0xa3, 0x6d, 0x7f, 0x2f, 0x72, 0xc6, 0x1f, 0x5a, 0x23, 0xbf, 0xe7, 0x06, 0xa6, 0xdf, 0xb3, 0x22,
	0x67, 0x22, 0x9a, 0xde, 0xb3, 0xd0, 0x6b, 0xb0, 0x35, 0x16, 0x19, 0x9e, 0x0e, 0x1e, 0xdb, 0xac,
	0xac, 0x37, 0x70, 0x31, 0x22, 0xab, 0x94, 0x8a, 0xde, 0x83, 0xfc, 0x63, 0xb2, 0x77, 0x98, 0x01,
	0xdd, 0x3c, 0xc2, 0x2a, 0xbf, 0x1e, 0xcf, 0x96, 0xd8, 0xde, 0x82, 0x73, 0x8f, 0x63, 0x1b, 0x4d,
	0x09, 0x32, 0x7d, 0xb7, 0x65, 0x05, 0x04, 0x16, 0x2b, 0xf3, 0xf1, 0x18, 0xbd, 0x09, 0xe9, 0x11,
	0xc3, 0x15, 0x26, 0xe0, 0x54, 0x95, 0x86, 0x90, 0x71, 0x24, 0x23, 0xfc, 0x94, 0x83, 0x54, 0x83,
	0xec, 0x44, 0x8b, 0x76, 0xa7, 0x77, 0x62, 0x76, 0x12, 0xb4, 0x22, 0x6e, 0x4c, 0x29, 0xb3, 0x82,
	0xde, 0x6e, 0x3d, 0x14, 0x98, 0xb8, 0x20, 0xbc, 0x0d, 0x99, 0x88, 0x4a, 0x32, 0x4a, 0xd5, 0xcc,
	0xba, 0x26, 0x89, 0x86, 0xa2, 0xa9, 0xfc, 0x25, 0x04, 0xb0, 0xa9, 0xa8, 0xba, 0x52, 0x91, 0x79,
	0x8e, 0x64, 0xa2, 0xd6, 0x34, 0xe8, 0x20, 0x21, 0xec, 0x01, 0x60, 0xdb, 0x3f, 0xed, 0x07, 0xd4,
	0x9d, 0x3b, 0x31, 0x77, 0x72, 0x7b, 0xfc, 0xac, 0x59, 0xe6, 0xa0, 0xb0, 0x03, 0xd9, 0x71, 0x49,
	0x21, 0x1e, 0x92, 0x93, 0x0d, 0x83, 0x7c, 0x0a, 0x23, 0xc8, 0xd7, 0x6c, 0xcf, 0x73, 0x02, 0xa9,
	0x67, 0x0d, 0xbb, 0x34, 0xd0, 0x3d, 0xd7, 0x0f, 0x22, 0x8c, 0xe4, 0x9b, 0x64, 0xc8, 0xc8, 0x73,
	0x3f, 0xb1, 0x5b, 0x41, 0x98, 0x3c, 0xd1, 0x10, 0x5d, 0x83, 0xcd, 0x16, 0x9d, 0x47, 0x63, 0x93,
	0xc4, 0xe1, 0x88, 0xac, 0xfe, 0xc8, 0x0a, 0x5a, 0x3d, 0xdf, 0x0e, 0xe8, 0xea, 0x27, 0xf1, 0x78,
	0x2c, 0x7c, 0x1f, 0x0a, 0x35, 0x27, 0x20, 0x89, 0x2c, 0xb9, 0x83, 0x81, 0x13, 0xac, 0x69, 0xb2,
	0x08, 0x09, 0xa7, 0x1d, 0x66, 0x6a, 0xc2, 0x69, 0x13, 0x48, 0x9e, 0xdd, 0x09, 0x63, 0x4c, 0x3e,
	0xa9, 0x71, 0xd7, 0x77, 0x68, 0x48, 0x48, 0x7c, 0x0b, 0x78, 0x3c, 0x26, 0x29, 0x1d, 0x6e, 0xdb,
	0xc4, 0x2c, 0xd9, 0xda, 0x23, 0xb3, 0xe4, 0x5b, 0x78, 0x17, 0xa0, 0x41, 0x8e, 0xb0, 0xf2, 0x59,
	0x60, 0xfb, 0xe8, 0x75, 0xe0, 0x7d, 0xdb, 0x73, 0xac, 0xbe, 0xf3, 0xb9, 0xdd, 0x36, 0xe9, 0xd9,
	0x46, 0xa5, 0xf3, 0x78, 0x6b, 0x42, 0xa7, 0xf2, 0xc2, 0x2f, 0x39, 0xd8, 0x69, 0x78, 0xf6, 0xc8,
	0xf2, 0xec, 0xaa, 0xeb, 0xd1, 0xac, 0x14, 0xdb, 0x6d, 0x6a, 0xd3, 0xea, 0x8b, 0x5e, 0xd7, 0x47,
	0xbb, 0x80, 0xc2, 0x93, 0xa7, 0xf5, 0xd9, 0xc8, 0x8c, 0xf2, 0x8f, 0x1a, 0xdf, 0xbf, 0x84, 0x79,
	0xc6, 0x93, 0x3e, 0x1b, 0x45, 0x15, 0xf7, 0x1a, 0x14, 0x3f, 0xb5, 0xbd, 0xa1, 0xdd, 0x37, 0xa3,
	0xea, 0x4c, 0x84, 0xb2, 0x05, 0x46, 0x3f, 0x64, 0xe4, 0xf2, 0x36, 0x5c, 0x1b, 0x31, 0xcb, 0x66,
	0xc7, 0xf5, 0x4c, 0x56, 0x31, 0x96, 0xd7, 0xf5, 0x05, 0x0b, 0x72, 0x62, 0xa7, 0xed, 0x62, 0xbb,
	0x6f, 0x5b, 0xbe, 0x8d, 0xde, 0x58, 0xee, 0xc1, 0x02, 0xfb, 0x77, 0xa0, 0xe8, 0x0c, 0xc8, 0x9e,
	0xc2, 0x14, 0x3a, 0x6d, 0x6a, 0x3f, 0x89, 0xf3, 0x94, 0x4a, 0x11, 0x2a, 0x6d, 0xe1, 0x2f, 0x1c,
	0x5c, 0x89, 0x76, 0xbe, 0x70, 0x26, 0xdd, 0x06, 0x9e, 0x15, 0x5a, 0xf4, 0x3e, 0xe4, 0xad, 0x4e,
	0xdb, 0x35, 0x3d, 0x06, 0x6a, 0xd1, 0x9e, 0x10, 0xc3, 0xbc, 0x7f, 0x09, 0xe7, 0xac, 0xc9, 0xb0,
	0x7c, 0x1d, 0xae, 0x5a, 0xa1, 0xb7, 0x91, 0x53, 0xa6, 0x33, 0xec, 0xb8, 0xc2, 0xaf, 0x76, 0x00,
	0x8d, 0x77, 0xf0, 0xf2, 0x99, 0x6e, 0x7b, 0x4f, 0x9c, 0x96, 0x8d, 0xbe, 0x01, 0x9b, 0x7d, 0xbb,
	0x6b, 0xb5, 0xce, 0xc2, 0x22, 0x7b, 0x75, 0xca, 0xce, 0x9c, 0xfc, 0x6e, 0x9d, 0x0a, 0xe3, 0x70,
	0x12, 0xaa, 0x42, 0x36, 0x70, 0xdd, 0x7e, 0xab, 0x67, 0x39, 0x0c, 0x50, 0x6e, 0xef, 0xee, 0x39,
	0x1a, 0x8c, 0x48, 0x1e, 0x4f, 0xa6, 0xa2, 0xf7, 0x60, 0x83, 0xae, 0x7a, 0x88, 0xf6, 0xce, 0x39,
	0x3a, 0x14, 0x22, 0x8b, 0xd9, 0x14, 0xf4, 0x6d, 0x48, 0x87, 0x27, 0x01, 0xad, 0x91, 0xdc, 0xde,
	0xff, 0x9d, 0x33, 0x3b, 0xdc, 0xd2, 0x71, 0x34, 0x8d, 0x68, 0xf0, 0xcf, 0x7c, 0x72, 0x2b, 0x0a,
	0xb7, 0xcb, 0xf3, 0x34, 0xe8, 0x4c, 0x1a, 0x47, 0xd3, 0xd0, 0xbb, 0x90, 0x0a, 0x6c, 0x3f, 0xa0,
	0x67, 0x77, 0x6e, 0xfa, 0xca, 0xb0, 0x68, 0x09, 0x6c, 0x3f, 0xc0, 0x74, 0x02, 0x2a, 0x43, 0x3e,
	0x1e, 0x26, 0x7a, 0xb4, 0xe7, 0xf6, 0x5e, 0x5e, 0xa4, 0x20, 0x96, 0x7d, 0x38, 0x37, 0x9a, 0x0c,
	0x4a, 0xff, 0x49, 0xc1, 0x26, 0x8b, 0x0b, 0xfa, 0x08, 0xb6, 0x9c, 0xe1, 0xe8, 0x34, 0x30, 0xa3,
	0x24, 0x88, 0xee, 0x75, 0x7b, 0x2b, 0xc5, 0x75, 0xcc, 0xa1, 0x46, 0x8a, 0x54, 0xd5, 0xe4, 0xd8,
	0xff, 0x0e, 0xf0, 0xee, 0x69, 0x30, 0xad, 0x3d, 0x71, 0x61, 0xed, 0x5b, 0x4c, 0xd7, 0x58, 0xba,
	0xf4, 0x47, 0x0e, 0xf2, 0x71, 0x09, 0x74, 0x0c, 0xc5, 0x71, 0x2e, 0x07, 0x67, 0x23, 0x9b, 0x61,
	0x29, 0xae, 0x6b, 0xcd, 0x38, 0x1b, 0xd9, 0xb8, 0x60, 0xc5, 0x46, 0x3e, 0x39, 0xc4, 0xbb, 0xbe,
	0x19, 0x1d, 0x56, 0x0c, 0x46, 0x16, 0xe7, 0xba, 0x7e, 0x74, 0x66, 0xf9, 0xe4, 0xfe, 0x69, 0xb5,
	0xfa, 0xec, 0xc2, 0xc1, 0xf6, 0xde, 0xb4, 0xd5, 0xea, 0x93, 0xcb, 0xc6, 0x07, 0xa9, 0x4c, 0x92,
	0x4f, 0x09, 0x3f, 0x4b, 0x4c, 0xfc, 0x25, 0x5a, 0xc9, 0x31, 0x37, 0x7d, 0xc9, 0x2a, 0x40, 0x56,
	0x39, 0x10, 0x6b, 0xb2, 0x79, 0xa2, 0x34, 0x78, 0x0e, 0x5d, 0x87, 0x2b, 0x86, 0xac, 0x1b, 0x66,
	0xb3, 0x51, 0x11, 0x0d, 0xd9, 0x6c, 0x88, 0xc7, 0x75, 0x4d, 0x24, 0x37, 0x2e, 0x04, 0x45, 0xb1,
	0x69, 0x68, 0x94, 0x59, 0x55, 0xea, 0xb2, 0xce, 0x27, 0x51, 0x11, 0xc0, 0x10, 0xc7, 0xe3, 0x14,
	0x99, 0xdc, 0x50, 0x54, 0x55, 0xae, 0x98, 0xb5, 0x26, 0x91, 0xa3, 0x8a, 0x75, 0x7e, 0x83, 0x5c,
	0xde, 0xaa, 0x0a, 0x3e, 0x38, 0x12, 0xb1, 0xcc, 0x6f, 0x12, 0x1f, 0xe4, 0x72, 0x53, 0xa9, 0x57,
	0xcc, 0xba, 0x56, 0xd3, 0xf9, 0x34, 0xba, 0x02, 0x5b, 0xd2, 0x3e, 0xd6, 0x0e, 0x64, 0x4d, 0x37,
	0x25, 0x4d, 0xad, 0x2a, 0x35, 0x3e, 0x43, 0x94, 0x4b, 0x0d, 0xd9, 0xc4, 0x72, 0x43, 0xc3, 0x06,
	0x9f, 0x25, 0x0e, 0x30, 0x47, 0x45, 0x2c, 0xed, 0x2b, 0x87, 0xb2, 0xce, 0x03, 0x99, 0x58, 0x6d,
	0x1c, 0x48, 0x4d, 0xb3, 0xa9, 0x2a, 0x06, 0x71, 0x4d, 0xe7, 0x5f, 0x24, 0xea, 0x6b, 0x92, 0x6c,
	0x1a, 0x22, 0x2e, 0x8b, 0xf5, 0x3a, 0x7f, 0x53, 0x48, 0x65, 0x72, 0x7c, 0xa9, 0xf4, 0xd7, 0x34,
	0x64, 0xc7, 0x75, 0x8d, 0x3e, 0x5e, 0x96, 0x84, 0xef, 0xac, 0xba, 0x35, 0x3c, 0x3d, 0x0f, 0xbf,
	0xbb, 0x34, 0x0f, 0x2f, 0x68, 0x60, 0x2e, 0x15, 0xff, 0x30, 0x9b, 0x8a, 0x8f, 0x96, 0xa4, 0xe2,
	0xfa, 0x06, 0xbf, 0xf4, 0x6c, 0x14, 0xbe, 0x48, 0x9d, 0x97, 0x87, 0x77, 0xe0, 0x56, 0x53, 0x3d,
	0x94, 0x31, 0x1d, 0x9b, 0x2c, 0x1d, 0xcc, 0x7a, 0xfd, 0xf0, 0xc0, 0xd4, 0x70, 0x45, 0xc6, 0x24,
	0xc5, 0xf8, 0x1c, 0x12, 0xe0, 0xa5, 0x73, 0x64, 0xf2, 0xe8, 0x25, 0x28, 0x85, 0x2c, 0xa9, 0x2e,
	0xaa, 0x35, 0xf3, 0x48, 0xc4, 0xaa, 0xa2, 0xd6, 0x74, 0x9a, 0xa6, 0x7c, 0x01, 0xdd, 0x84, 0xed,
	0x98, 0x25, 0x3a, 0xbd, 0x51, 0xd3, 0x18, 0xb7, 0x88, 0x5e, 0x87, 0x57, 0xe7, 0xfd, 0x28, 0xcb,
	0xaa, 0xb4, 0x7f, 0x20, 0xe2, 0x0f, 0x4d, 0xb1, 0x5a, 0x09, 0x45, 0xb7, 0xd0, 0x6b, 0x70, 0x7b,
	0x15, 0x41, 0x1e, 0xbd, 0x02, 0x3b, 0x63, 0xc1, 0x0f, 0x65, 0xac, 0xca, 0x75, 0x53, 0x3a, 0x6a,
	0xc4, 0x44, 0x2e, 0xa3, 0xdb, 0xf0, 0x72, 0xcc, 0xec, 0x42, 0x21, 0x34, 0x23, 0x14, 0x81, 0x9c,
	0x12, 0xba, 0x32, 0x65, 0x6c, 0xa1, 0xc8, 0x0b, 0x64, 0x85, 0xc6, 0x22, 0x58, 0xae, 0xcb, 0xa2,
	0x2e, 0xc7, 0xf8, 0x57, 0xcf, 0x5b, 0x83, 0x86, 0x8c, 0xab, 0x4c, 0xf4, 0x1a, 0x29, 0xf9, 0x90,
	0x5f, 0x91, 0xcb, 0xcd, 0x9a, 0x59, 0x56, 0x54, 0x11, 0x1f, 0xf3, 0xd7, 0x51, 0x09, 0xae, 0x19,
	0x9a, 0x56, 0x97, 0xf6, 0x45, 0x45, 0x8d, 0x42, 0xc0, 0xea, 0x7d, 0x9b, 0xe8, 0x0f, 0x27, 0x51,
	0xab, 0x0d, 0xac, 0x11, 0x6d, 0x66, 0x55, 0xc3, 0xa6, 0xa8, 0x56, 0xb0, 0xa6, 0x54, 0xcc, 0xba,
	0xa2, 0x36, 0x1f, 0xf2, 0x37, 0xd0, 0x0d, 0xb8, 0xca, 0xa2, 0x28, 0x61, 0x51, 0xdf, 0x37, 0x2b,
	0x8a, 0x58, 0x53, 0x35, 0x5d, 0xd6, 0xf9, 0x92, 0x90, 0xca, 0x70, 0x3c, 0x08, 0xa9, 0xcc, 0x8b,
	0xfc, 0xcd, 0xd2, 0x2f, 0x92, 0xb0, 0x41, 0x0f, 0x5c, 0x74, 0xb2, 0xac, 0xb0, 0xbf, 0xb2, 0xca,
	0x79, 0xfd, 0xf4, 0xa2, 0x7e, 0xb4, 0xb4, 0xa8, 0x2f, 0xa0, 0x7c, 0xae, 0xa0, 0x7f, 0x37, 0x5b,
	0xd0, 0x0f, 0x97, 0x14, 0xf4, 0x7a, 0xc6, 0xbe, 0xfc, 0x62, 0x7e, 0xf5, 0x9c, 0x5a, 0xa6, 0x91,
	0xb9, 0x59, 0xfa, 0x4d, 0x12, 0xd2, 0xe1, 0x35, 0x06, 0x3d, 0x5a, 0x16, 0x95, 0xb7, 0x56, 0xbb,
	0x07, 0x3d, 0x3d, 0x2e, 0x1f, 0x2f, 0x8d, 0xcb, 0x85, 0xd4, 0xcf, 0x45, 0xe6, 0xf7, 0xb3, 0x91,
	0x39, 0x59, 0x12, 0x99, 0x75, 0xcd, 0x3d, 0xd7, 0xd8, 0x84, 0x17, 0xc4, 0x8b, 0xc7, 0x26, 0x54,
	0xf0, 0xac, 0x62, 0xb3, 0x50, 0xfd, 0xb3, 0x8b, 0xcd, 0xac, 0xb9, 0xe7, 0x16, 0x9b, 0x9f, 0x27,
	0x21, 0x45, 0x6e, 0xdf, 0xe8, 0x78, 0x59, 0x60, 0x1e, 0xac, 0x70, 0x77, 0x7f, 0x7a, 0x54, 0x3e,
	0x5a, 0x1a, 0x95, 0xf5, 0x75, 0xcf, 0x85, 0xe4, 0xb7, 0xb3, 0x21, 0x39, 0x5a, 0x12, 0x92, 0xb5,
	0x6c, 0x3d, 0xaf, 0x78, 0x08, 0x7f, 0x2a, 0x42, 0xa9, 0x39, 0xea, 0xbb, 0x56, 0xdb, 0x6e, 0x2f,
	0xe8, 0x4e, 0xe5, 0x99, 0xee, 0xf4, 0xcd, 0xa9, 0xd7, 0xe9, 0xa5, 0xf3, 0x66, 0xbb, 0x54, 0x75,
	0xbe, 0x4b, 0x7d, 0xb0, 0xa2, 0xa6, 0x85, 0xdd, 0x6a, 0x79, 0xba, 0x5b, 0x7d, 0x63, 0x45, 0x5d,
	0x53, 0x5d, 0xeb, 0xfe, 0x6c, 0xd7, 0xba, 0xbb, 0xa2, 0x96, 0xb9, 0xee, 0x75, 0x7f, 0xb6, 0x7b,
	0x5d, 0x55, 0xd3, 0x5c, 0x17, 0xfb, 0xad, 0xa9, 0x2e, 0xf6, 0xff, 0x57, 0x5d, 0xa2, 0x71, 0x37,
	0x5b, 0xfa, 0x3b, 0x37, 0xee, 0x44, 0x8f, 0x21, 0x3b, 0x5b, 0x5a, 0x5f, 0x5f, 0x2b, 0x7a, 0x93,
	0xbe, 0xd7, 0x0a, 0x7a, 0x3e, 0x9e, 0x68, 0x2b, 0xfd, 0x08, 0x0a, 0x53, 0x3c, 0x74, 0x04, 0x85,
	0xa9, 0x1a, 0xa0, 0xd9, 0x72, 0xb1, 0x3e, 0x31, 0x1f, 0x2f, 0x02, 0xf4, 0x02, 0x6c, 0x8c, 0x88,
	0x85, 0x30, 0xf9, 0xd9, 0xa0, 0xf4, 0x2f, 0x2e, 0xde, 0xed, 0x3c, 0x9a, 0x07, 0xfa, 0xcd, 0x75,
	0x93, 0x6b, 0x39, 0xd6, 0x9f, 0x70, 0xb3, 0x60, 0x4f, 0x16, 0x83, 0xbd, 0x60, 0x27, 0xb2, 0x0a,
	0xde, 0xbf, 0x71, 0xd1, 0x05, 0xf0, 0xe1, 0x3c, 0xd6, 0xf7, 0xd6, 0x49, 0xfe, 0xe5, 0x38, 0x7f,
	0x38, 0x0b, 0xf3, 0x70, 0x31, 0xcc, 0x0b, 0xdc, 0xcf, 0x56, 0x81, 0xf8, 0x4f, 0x6e, 0x72, 0x9f,
	0x3a, 0x99, 0x07, 0xf9, 0xfe, 0x7a, 0xb5, 0xb9, 0x1c, 0xe6, 0x8f, 0x67, 0x61, 0x3e, 0x5c, 0x0c,
	0xf3, 0x42, 0x97, 0x9d, 0x55, 0x81, 0x46, 0x97, 0x93, 0xff, 0x01, 0xe8, 0xec, 0x81, 0xfe, 0xcc,
	0x80, 0x2e, 0xbc, 0x39, 0xac, 0x02, 0xf4, 0x0b, 0x2e, 0x3c, 0xe9, 0x8f, 0xe6, 0x51, 0x7e, 0x6d,
	0x8d, 0x9d, 0x6d, 0x39, 0xc4, 0x1f, 0xcc, 0x42, 0x6c, 0x2e, 0x86, 0xb8, 0xfe, 0x49, 0xbc, 0x02,
	0xbe, 0x7b, 0x7f, 0xe6, 0x20, 0x4b, 0x93, 0x9d, 0xca, 0x6c, 0xc3, 0x0b, 0xec, 0x01, 0xc7, 0x38,
	0x6e, 0xc8, 0x66, 0x53, 0xad, 0xc8, 0x55, 0x45, 0xa5, 0xbd, 0x7f, 0x06, 0x52, 0x65, 0x51, 0x97,
	0x79, 0x0e, 0xa5, 0x21, 0x59, 0x91, 0x0f, 0xf9, 0x04, 0x21, 0x19, 0xb2, 0x6e, 0xf0, 0x49, 0x94,
	0x83, 0x34, 0x61, 0x9a, 0x87, 0x07, 0x7c, 0x8a, 0x0c, 0xe8, 0x0b, 0xd4, 0xe1, 0x01, 0x7b, 0x55,
	0xc2, 0xb2, 0xa4, 0x1d, 0xca, 0xf8, 0x98, 0xdf, 0x24, 0xac, 0xaa, 0x28, 0x19, 0x1a, 0x3e, 0xe6,
	0xd3, 0x53, 0x0f, 0x4e, 0x19, 0x74, 0x19, 0x0a, 0x12, 0x7e, 0xe7, 0x81, 0x39, 0x26, 0x65, 0x09,
	0x89, 0x6a, 0x65, 0x0f, 0x55, 0x87, 0x07, 0x3c, 0x10, 0x12, 0xd5, 0x3d, 0x26, 0xe5, 0xee, 0x0d,
	0x20, 0x2d, 0xf5, 0xac, 0xe1, 0xd0, 0xee, 0xb3, 0x46, 0x57, 0x54, 0x49, 0x5b, 0x3e, 0xfd, 0x70,
	0x81, 0xa0, 0x18, 0x31, 0x74, 0x43, 0x2c, 0xd7, 0x09, 0x0c, 0x1e, 0xf2, 0x11, 0xad, 0x2c, 0x1b,
	0x22, 0xfb, 0xc1, 0x32, 0xa2, 0x10, 0x80, 0xc9, 0xf8, 0x34, 0x49, 0xa4, 0x3d, 0x73, 0xea, 0x5e,
	0x0b, 0xb2, 0x15, 0xbb, 0x1f, 0x58, 0x74, 0xb9, 0x2e, 0x43, 0xa1, 0x22, 0xd7, 0x0d, 0xd1, 0x6c,
	0xaa, 0x1f, 0xaa, 0xda, 0x91, 0xca, 0x5f, 0x22, 0xa8, 0x54, 0xcd, 0xa4, 0x54, 0xb6, 0x56, 0x55,
	0x5d, 0xe1, 0x13, 0xa8, 0x00, 0xd9, 0x03, 0xa5, 0x2e, 0xeb, 0x86, 0xa6, 0xca, 0x7c, 0x12, 0x65,
	0x61, 0x43, 0x3b, 0x10, 0xf7, 0x45, 0x3e, 0x45, 0x8c, 0xe8, 0x86, 0xdc, 0x68, 0x90, 0xde, 0x9b,
	0xb1, 0x37, 0xee, 0x75, 0x80, 0x27, 0x5d, 0xf7, 0xd4, 0xcd, 0xa7, 0x00, 0x59, 0x55, 0x53, 0x59,
	0x64, 0xd8, 0x9b, 0xe0, 0xe4, 0x41, 0x85, 0x23, 0x5a, 0xa6, 0xdf, 0x35, 0x18, 0x9e, 0xf0, 0x91,
	0x82, 0x12, 0x92, 0x0c, 0xe0, 0xb8, 0xa7, 0xe7, 0x53, 0xe5, 0xaf, 0x9e, 0xbc, 0xdd, 0x75, 0xc7,
	0x69, 0xb5, 0xeb, 0x7a, 0xdd, 0xfb, 0xb1, 0x7f, 0x55, 0x70, 0x86, 0x1d, 0xcf, 0xba, 0x4f, 0x7f,
	0xcd, 0xb9, 0xdf, 0x75, 0x63, 0x9c, 0xc7, 0x9b, 0x94, 0xf8, 0xd6, 0x7f, 0x03, 0x00, 0x00, 0xff,
	0xff, 0xb0, 0xfd, 0x90, 0xad, 0xd9, 0x20, 0x00, 0x00,
}
