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

package chromiumos

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	timestamp "github.com/golang/protobuf/ptypes/timestamp"
	wrappers "github.com/golang/protobuf/ptypes/wrappers"
	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

// Used to control running of special steps.
type BuilderConfig_RunSpec int32

const (
	BuilderConfig_RUN_SPEC_UNSPECIFIED BuilderConfig_RunSpec = 0
	// Do not run.
	BuilderConfig_NO_RUN BuilderConfig_RunSpec = 1
	// Run.
	BuilderConfig_RUN BuilderConfig_RunSpec = 2
	// Run and then exit.
	BuilderConfig_RUN_EXIT BuilderConfig_RunSpec = 3
)

var BuilderConfig_RunSpec_name = map[int32]string{
	0: "RUN_SPEC_UNSPECIFIED",
	1: "NO_RUN",
	2: "RUN",
	3: "RUN_EXIT",
}

var BuilderConfig_RunSpec_value = map[string]int32{
	"RUN_SPEC_UNSPECIFIED": 0,
	"NO_RUN":               1,
	"RUN":                  2,
	"RUN_EXIT":             3,
}

func (x BuilderConfig_RunSpec) String() string {
	return proto.EnumName(BuilderConfig_RunSpec_name, int32(x))
}

func (BuilderConfig_RunSpec) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6fe67302c16003fb, []int{0, 0}
}

// Type of build.
type BuilderConfig_Id_Type int32

const (
	BuilderConfig_Id_TYPE_UNSPECIFIED BuilderConfig_Id_Type = 0
	// Commit queue build.
	BuilderConfig_Id_CQ BuilderConfig_Id_Type = 1
	// Postsubmit build.
	BuilderConfig_Id_POSTSUBMIT BuilderConfig_Id_Type = 2
	// Toolchain build.
	BuilderConfig_Id_TOOLCHAIN BuilderConfig_Id_Type = 3
	// Informational build.
	BuilderConfig_Id_INFORMATIONAL BuilderConfig_Id_Type = 4
)

var BuilderConfig_Id_Type_name = map[int32]string{
	0: "TYPE_UNSPECIFIED",
	1: "CQ",
	2: "POSTSUBMIT",
	3: "TOOLCHAIN",
	4: "INFORMATIONAL",
}

var BuilderConfig_Id_Type_value = map[string]int32{
	"TYPE_UNSPECIFIED": 0,
	"CQ":               1,
	"POSTSUBMIT":       2,
	"TOOLCHAIN":        3,
	"INFORMATIONAL":    4,
}

func (x BuilderConfig_Id_Type) String() string {
	return proto.EnumName(BuilderConfig_Id_Type_name, int32(x))
}

func (BuilderConfig_Id_Type) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6fe67302c16003fb, []int{0, 0, 0}
}

type BuilderConfig_General_Environment int32

const (
	BuilderConfig_General_ENVIRONMENT_UNSPECIFIED BuilderConfig_General_Environment = 0
	BuilderConfig_General_PRODUCTION              BuilderConfig_General_Environment = 1
	BuilderConfig_General_STAGING                 BuilderConfig_General_Environment = 2
)

var BuilderConfig_General_Environment_name = map[int32]string{
	0: "ENVIRONMENT_UNSPECIFIED",
	1: "PRODUCTION",
	2: "STAGING",
}

var BuilderConfig_General_Environment_value = map[string]int32{
	"ENVIRONMENT_UNSPECIFIED": 0,
	"PRODUCTION":              1,
	"STAGING":                 2,
}

func (x BuilderConfig_General_Environment) String() string {
	return proto.EnumName(BuilderConfig_General_Environment_name, int32(x))
}

func (BuilderConfig_General_Environment) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6fe67302c16003fb, []int{0, 1, 0}
}

type BuilderConfig_General_RunWhen_Mode int32

const (
	BuilderConfig_General_RunWhen_MODE_UNSPECIFIED BuilderConfig_General_RunWhen_Mode = 0
	// Always run this builder. The file_patterns field will be ignored
	// when this mode is selected.
	BuilderConfig_General_RunWhen_ALWAYS_RUN BuilderConfig_General_RunWhen_Mode = 1
	// Only run this builder if any file in the input gerrit_changes
	// matches any file_pattern specified below. If file_patterns is empty,
	// this option implies the builder will never run.
	BuilderConfig_General_RunWhen_ONLY_RUN_ON_FILE_MATCH BuilderConfig_General_RunWhen_Mode = 2
	// Do not run the builder if all files in the input gerrit_changes
	// match any file_attern speicifed below. If file_patterns is empty,
	// this option implies the builder will always run.
	BuilderConfig_General_RunWhen_NO_RUN_ON_FILE_MATCH BuilderConfig_General_RunWhen_Mode = 3
)

var BuilderConfig_General_RunWhen_Mode_name = map[int32]string{
	0: "MODE_UNSPECIFIED",
	1: "ALWAYS_RUN",
	2: "ONLY_RUN_ON_FILE_MATCH",
	3: "NO_RUN_ON_FILE_MATCH",
}

var BuilderConfig_General_RunWhen_Mode_value = map[string]int32{
	"MODE_UNSPECIFIED":       0,
	"ALWAYS_RUN":             1,
	"ONLY_RUN_ON_FILE_MATCH": 2,
	"NO_RUN_ON_FILE_MATCH":   3,
}

func (x BuilderConfig_General_RunWhen_Mode) String() string {
	return proto.EnumName(BuilderConfig_General_RunWhen_Mode_name, int32(x))
}

func (BuilderConfig_General_RunWhen_Mode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6fe67302c16003fb, []int{0, 1, 0, 0}
}

type BuilderConfig_Orchestrator_ChildSpec_CollectHandling int32

const (
	BuilderConfig_Orchestrator_ChildSpec_COLLECT_HANDLING_UNSPECIFIED BuilderConfig_Orchestrator_ChildSpec_CollectHandling = 0
	// Indicates the result should be collected. Currently also indicates
	// that should the orchestrator terminate before this child finishes
	// the child will be killed.
	BuilderConfig_Orchestrator_ChildSpec_COLLECT BuilderConfig_Orchestrator_ChildSpec_CollectHandling = 1
	// Indicates the result should not be collected. Currently also
	// indicates that should the orchestrator terminate before this child
	// finishes this child is allowed to continue.
	BuilderConfig_Orchestrator_ChildSpec_NO_COLLECT BuilderConfig_Orchestrator_ChildSpec_CollectHandling = 2
)

var BuilderConfig_Orchestrator_ChildSpec_CollectHandling_name = map[int32]string{
	0: "COLLECT_HANDLING_UNSPECIFIED",
	1: "COLLECT",
	2: "NO_COLLECT",
}

var BuilderConfig_Orchestrator_ChildSpec_CollectHandling_value = map[string]int32{
	"COLLECT_HANDLING_UNSPECIFIED": 0,
	"COLLECT":                      1,
	"NO_COLLECT":                   2,
}

func (x BuilderConfig_Orchestrator_ChildSpec_CollectHandling) String() string {
	return proto.EnumName(BuilderConfig_Orchestrator_ChildSpec_CollectHandling_name, int32(x))
}

func (BuilderConfig_Orchestrator_ChildSpec_CollectHandling) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6fe67302c16003fb, []int{0, 2, 0, 0}
}

// How to handle the uploading of prebuilts.
type BuilderConfig_Artifacts_Prebuilts int32

const (
	BuilderConfig_Artifacts_PREBUILTS_UNSPECIFIED BuilderConfig_Artifacts_Prebuilts = 0
	BuilderConfig_Artifacts_PUBLIC                BuilderConfig_Artifacts_Prebuilts = 1
	BuilderConfig_Artifacts_PRIVATE               BuilderConfig_Artifacts_Prebuilts = 2
	BuilderConfig_Artifacts_NONE                  BuilderConfig_Artifacts_Prebuilts = 3
)

var BuilderConfig_Artifacts_Prebuilts_name = map[int32]string{
	0: "PREBUILTS_UNSPECIFIED",
	1: "PUBLIC",
	2: "PRIVATE",
	3: "NONE",
}

var BuilderConfig_Artifacts_Prebuilts_value = map[string]int32{
	"PREBUILTS_UNSPECIFIED": 0,
	"PUBLIC":                1,
	"PRIVATE":               2,
	"NONE":                  3,
}

func (x BuilderConfig_Artifacts_Prebuilts) String() string {
	return proto.EnumName(BuilderConfig_Artifacts_Prebuilts_name, int32(x))
}

func (BuilderConfig_Artifacts_Prebuilts) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6fe67302c16003fb, []int{0, 3, 0}
}

// Used to indicate artifact types that should be uploaded by the builder.
// Must be kept in sync with the dictionary in:
// https://chromium.googlesource.com/chromiumos/infra/recipes/+/refs/heads/master/recipe_modules/cros_artifacts/api.py
// TODO(crbug/1027720): Migrate this to common.proto
type BuilderConfig_Artifacts_ArtifactTypes int32

const (
	BuilderConfig_Artifacts_ARTIFACT_TYPES_UNSPECIFIED BuilderConfig_Artifacts_ArtifactTypes = 0
	// Indicates wanting a zip file of everything in the image directory.
	BuilderConfig_Artifacts_IMAGE_ZIP BuilderConfig_Artifacts_ArtifactTypes = 1
	// Indicates wanting update payloads.
	BuilderConfig_Artifacts_TEST_UPDATE_PAYLOAD BuilderConfig_Artifacts_ArtifactTypes = 2
	// Indicates wanting the autotest tarballs.
	BuilderConfig_Artifacts_AUTOTEST_FILES BuilderConfig_Artifacts_ArtifactTypes = 3
	// Indicates wanting a tarball containing private TAST test bundles.
	BuilderConfig_Artifacts_TAST_FILES BuilderConfig_Artifacts_ArtifactTypes = 4
	// Indicates wanting a tarball containing guest images and test bundles.
	BuilderConfig_Artifacts_PINNED_GUEST_IMAGES BuilderConfig_Artifacts_ArtifactTypes = 5
	// Indicates wanting an archive of firmware images built from source.
	BuilderConfig_Artifacts_FIRMWARE BuilderConfig_Artifacts_ArtifactTypes = 6
	// Indicates wanting a tarball of the Ebuilds logs.
	BuilderConfig_Artifacts_EBUILD_LOGS BuilderConfig_Artifacts_ArtifactTypes = 7
	// Indicates wanting an archive of the ChromeOS Config.
	BuilderConfig_Artifacts_CHROMEOS_CONFIG BuilderConfig_Artifacts_ArtifactTypes = 8
	// Indicates wanting the CPE report.
	BuilderConfig_Artifacts_CPE_REPORT BuilderConfig_Artifacts_ArtifactTypes = 9
	// Indicates wanting a tar.xz archive for each image that has been created.
	BuilderConfig_Artifacts_IMAGE_ARCHIVES BuilderConfig_Artifacts_ArtifactTypes = 10
	// Artifacts used by the toolchain.
	//
	// Indicates an unvetted orderfile for Chrome.
	BuilderConfig_Artifacts_UNVERIFIED_CHROME_LLVM_ORDERFILE BuilderConfig_Artifacts_ArtifactTypes = 11
	// Indicates a vetted orderfile for Chrome.
	BuilderConfig_Artifacts_VERIFIED_CHROME_LLVM_ORDERFILE BuilderConfig_Artifacts_ArtifactTypes = 12
	// Indicates a clang-tidy artifact.
	BuilderConfig_Artifacts_CHROME_CLANG_WARNINGS_FILE BuilderConfig_Artifacts_ArtifactTypes = 13
	// Indicates a PGO artifact for the compiler.
	BuilderConfig_Artifacts_UNVERIFIED_LLVM_PGO_FILE BuilderConfig_Artifacts_ArtifactTypes = 14
	// Indicates an unvetted AFDO Chrome profile.  (Generated by HW Tests in
	// the benchmark-afdo-generate builder.)
	BuilderConfig_Artifacts_UNVERIFIED_CHROME_BENCHMARK_AFDO_FILE BuilderConfig_Artifacts_ArtifactTypes = 15
	// Indicates a vetted AFDO Chrome profile.
	BuilderConfig_Artifacts_VERIFIED_CHROME_BENCHMARK_AFDO_FILE BuilderConfig_Artifacts_ArtifactTypes = 16
	// Indicates a vetted AFDO Kernel profile.
	BuilderConfig_Artifacts_VERIFIED_KERNEL_CWP_AFDO_FILE BuilderConfig_Artifacts_ArtifactTypes = 17
	// Indicates an unvetted AFDO Kernel CWP profile.
	BuilderConfig_Artifacts_UNVERIFIED_KERNEL_CWP_AFDO_FILE BuilderConfig_Artifacts_ArtifactTypes = 18
	// Indicates an unvetted AFDO Chrome CWP profile.
	BuilderConfig_Artifacts_UNVERIFIED_CHROME_CWP_AFDO_FILE BuilderConfig_Artifacts_ArtifactTypes = 19
	// Indicates a vetted AFDO Chrome CWP profile.
	BuilderConfig_Artifacts_VERIFIED_CHROME_CWP_AFDO_FILE BuilderConfig_Artifacts_ArtifactTypes = 20
	// Indicates a vetted AFDO profile for release.
	BuilderConfig_Artifacts_VERIFIED_RELEASE_AFDO_FILE BuilderConfig_Artifacts_ArtifactTypes = 21
	// Indicates an unvetted AFDO perf data file (from HW Test).
	BuilderConfig_Artifacts_UNVERIFIED_CHROME_BENCHMARK_PERF_FILE BuilderConfig_Artifacts_ArtifactTypes = 22
)

var BuilderConfig_Artifacts_ArtifactTypes_name = map[int32]string{
	0:  "ARTIFACT_TYPES_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",
	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",
}

var BuilderConfig_Artifacts_ArtifactTypes_value = map[string]int32{
	"ARTIFACT_TYPES_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,
	"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,
}

func (x BuilderConfig_Artifacts_ArtifactTypes) String() string {
	return proto.EnumName(BuilderConfig_Artifacts_ArtifactTypes_name, int32(x))
}

func (BuilderConfig_Artifacts_ArtifactTypes) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6fe67302c16003fb, []int{0, 3, 1}
}

// Configuration used by a builder during execution.
type BuilderConfig struct {
	Id                   *BuilderConfig_Id           `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	General              *BuilderConfig_General      `protobuf:"bytes,2,opt,name=general,proto3" json:"general,omitempty"`
	Orchestrator         *BuilderConfig_Orchestrator `protobuf:"bytes,3,opt,name=orchestrator,proto3" json:"orchestrator,omitempty"`
	Artifacts            *BuilderConfig_Artifacts    `protobuf:"bytes,4,opt,name=artifacts,proto3" json:"artifacts,omitempty"`
	Chrome               *BuilderConfig_Chrome       `protobuf:"bytes,5,opt,name=chrome,proto3" json:"chrome,omitempty"`
	Build                *BuilderConfig_Build        `protobuf:"bytes,6,opt,name=build,proto3" json:"build,omitempty"`
	UnitTests            *BuilderConfig_UnitTests    `protobuf:"bytes,7,opt,name=unit_tests,json=unitTests,proto3" json:"unit_tests,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
	XXX_unrecognized     []byte                      `json:"-"`
	XXX_sizecache        int32                       `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig proto.InternalMessageInfo

func (m *BuilderConfig) GetId() *BuilderConfig_Id {
	if m != nil {
		return m.Id
	}
	return nil
}

func (m *BuilderConfig) GetGeneral() *BuilderConfig_General {
	if m != nil {
		return m.General
	}
	return nil
}

func (m *BuilderConfig) GetOrchestrator() *BuilderConfig_Orchestrator {
	if m != nil {
		return m.Orchestrator
	}
	return nil
}

func (m *BuilderConfig) GetArtifacts() *BuilderConfig_Artifacts {
	if m != nil {
		return m.Artifacts
	}
	return nil
}

func (m *BuilderConfig) GetChrome() *BuilderConfig_Chrome {
	if m != nil {
		return m.Chrome
	}
	return nil
}

func (m *BuilderConfig) GetBuild() *BuilderConfig_Build {
	if m != nil {
		return m.Build
	}
	return nil
}

func (m *BuilderConfig) GetUnitTests() *BuilderConfig_UnitTests {
	if m != nil {
		return m.UnitTests
	}
	return nil
}

// Unique identifier of the builder configuration.
type BuilderConfig_Id struct {
	// The name of the configuration such as "arm-generic-postsubmit".
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Branch the configuration applies to such as "release-R73-11647.B".
	Branch               string                `protobuf:"bytes,2,opt,name=branch,proto3" json:"branch,omitempty"`
	Type                 BuilderConfig_Id_Type `protobuf:"varint,3,opt,name=type,proto3,enum=chromiumos.BuilderConfig_Id_Type" json:"type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Id proto.InternalMessageInfo

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

func (m *BuilderConfig_Id) GetBranch() string {
	if m != nil {
		return m.Branch
	}
	return ""
}

func (m *BuilderConfig_Id) GetType() BuilderConfig_Id_Type {
	if m != nil {
		return m.Type
	}
	return BuilderConfig_Id_TYPE_UNSPECIFIED
}

// General configuration for the builder.
type BuilderConfig_General struct {
	// Whether or not the build is considered critical. A failure in a critical
	// build for a CQ builder may, for example, prevent submission of the CL.
	Critical    *wrappers.BoolValue               `protobuf:"bytes,1,opt,name=critical,proto3" json:"critical,omitempty"`
	Environment BuilderConfig_General_Environment `protobuf:"varint,2,opt,name=environment,proto3,enum=chromiumos.BuilderConfig_General_Environment" json:"environment,omitempty"`
	// A rule describing conditions under which this builder should be launched.
	RunWhen *BuilderConfig_General_RunWhen `protobuf:"bytes,3,opt,name=run_when,json=runWhen,proto3" json:"run_when,omitempty"`
	// Time before which ToT had a bug that would not manifest at the
	// build stage. The CQ orchestrator should NOT reuse successful builds
	// of the build_config before this.
	BrokenBefore *timestamp.Timestamp `protobuf:"bytes,4,opt,name=broken_before,json=brokenBefore,proto3" json:"broken_before,omitempty"`
	// If present, this version number will be written to a version file
	// alongside a bot's SDK Cache (chroot). On subsequent bot-run where an SDK
	// Cache already exists, the version number in config will be compared to
	// the number present in the version file, and the SDK Cache will be
	// invalidated if there is a mismatch.
	SdkCacheVersion      int32    `protobuf:"varint,5,opt,name=sdk_cache_version,json=sdkCacheVersion,proto3" json:"sdk_cache_version,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_General proto.InternalMessageInfo

func (m *BuilderConfig_General) GetCritical() *wrappers.BoolValue {
	if m != nil {
		return m.Critical
	}
	return nil
}

func (m *BuilderConfig_General) GetEnvironment() BuilderConfig_General_Environment {
	if m != nil {
		return m.Environment
	}
	return BuilderConfig_General_ENVIRONMENT_UNSPECIFIED
}

func (m *BuilderConfig_General) GetRunWhen() *BuilderConfig_General_RunWhen {
	if m != nil {
		return m.RunWhen
	}
	return nil
}

func (m *BuilderConfig_General) GetBrokenBefore() *timestamp.Timestamp {
	if m != nil {
		return m.BrokenBefore
	}
	return nil
}

func (m *BuilderConfig_General) GetSdkCacheVersion() int32 {
	if m != nil {
		return m.SdkCacheVersion
	}
	return 0
}

// Rule describing conditions under which a builder should be launched.
type BuilderConfig_General_RunWhen struct {
	Mode BuilderConfig_General_RunWhen_Mode `protobuf:"varint,1,opt,name=mode,proto3,enum=chromiumos.BuilderConfig_General_RunWhen_Mode" json:"mode,omitempty"`
	// chromiumos code file patterns, relative to chromiumos root, which may
	// use * or ** for globbing.
	// e.g.
	// chromite/myfile.txt
	// chromite/config/*
	// **/*.md
	FilePatterns         []string `protobuf:"bytes,2,rep,name=file_patterns,json=filePatterns,proto3" json:"file_patterns,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_General_RunWhen proto.InternalMessageInfo

func (m *BuilderConfig_General_RunWhen) GetMode() BuilderConfig_General_RunWhen_Mode {
	if m != nil {
		return m.Mode
	}
	return BuilderConfig_General_RunWhen_MODE_UNSPECIFIED
}

func (m *BuilderConfig_General_RunWhen) GetFilePatterns() []string {
	if m != nil {
		return m.FilePatterns
	}
	return nil
}

// Configuration pertaining to builders operating as "orchestrators".
// Orchestrators orchestrate the running of other child builders.
type BuilderConfig_Orchestrator struct {
	ChildSpecs []*BuilderConfig_Orchestrator_ChildSpec `protobuf:"bytes,5,rep,name=child_specs,json=childSpecs,proto3" json:"child_specs,omitempty"`
	// GitilesCommit to use if not provided.
	GitilesCommit *GitilesCommit `protobuf:"bytes,2,opt,name=gitiles_commit,json=gitilesCommit,proto3" json:"gitiles_commit,omitempty"`
	// GerritChanges to use if not provided.
	GerritChanges        []*GerritChange                                  `protobuf:"bytes,3,rep,name=gerrit_changes,json=gerritChanges,proto3" json:"gerrit_changes,omitempty"`
	FollowOnOrchestrator *BuilderConfig_Orchestrator_FollowOnOrchestrator `protobuf:"bytes,4,opt,name=follow_on_orchestrator,json=followOnOrchestrator,proto3" json:"follow_on_orchestrator,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                         `json:"-"`
	XXX_unrecognized     []byte                                           `json:"-"`
	XXX_sizecache        int32                                            `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Orchestrator proto.InternalMessageInfo

func (m *BuilderConfig_Orchestrator) GetChildSpecs() []*BuilderConfig_Orchestrator_ChildSpec {
	if m != nil {
		return m.ChildSpecs
	}
	return nil
}

func (m *BuilderConfig_Orchestrator) GetGitilesCommit() *GitilesCommit {
	if m != nil {
		return m.GitilesCommit
	}
	return nil
}

func (m *BuilderConfig_Orchestrator) GetGerritChanges() []*GerritChange {
	if m != nil {
		return m.GerritChanges
	}
	return nil
}

func (m *BuilderConfig_Orchestrator) GetFollowOnOrchestrator() *BuilderConfig_Orchestrator_FollowOnOrchestrator {
	if m != nil {
		return m.FollowOnOrchestrator
	}
	return nil
}

// Defines a child the orchestrator spawns and how it is handled.
type BuilderConfig_Orchestrator_ChildSpec struct {
	// BuilderConfig.Id.name of the child build. Would be expected to match
	// this name and the BuilderConfig.Id.branch and BuilderConfig.Id.type of
	// this parent orchestrator builder.
	Name                 string                                               `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	CollectHandling      BuilderConfig_Orchestrator_ChildSpec_CollectHandling `protobuf:"varint,2,opt,name=collect_handling,json=collectHandling,proto3,enum=chromiumos.BuilderConfig_Orchestrator_ChildSpec_CollectHandling" json:"collect_handling,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                             `json:"-"`
	XXX_unrecognized     []byte                                               `json:"-"`
	XXX_sizecache        int32                                                `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Orchestrator_ChildSpec proto.InternalMessageInfo

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

func (m *BuilderConfig_Orchestrator_ChildSpec) GetCollectHandling() BuilderConfig_Orchestrator_ChildSpec_CollectHandling {
	if m != nil {
		return m.CollectHandling
	}
	return BuilderConfig_Orchestrator_ChildSpec_COLLECT_HANDLING_UNSPECIFIED
}

// Follow on orchestrator to launch, and possibly wait for.
type BuilderConfig_Orchestrator_FollowOnOrchestrator struct {
	// BuilderConfig.Id.name of the follow on orchestrator.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Whether to wait for the follow on orchestrator to finish.
	AwaitCompletion      bool     `protobuf:"varint,2,opt,name=await_completion,json=awaitCompletion,proto3" json:"await_completion,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Orchestrator_FollowOnOrchestrator proto.InternalMessageInfo

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

func (m *BuilderConfig_Orchestrator_FollowOnOrchestrator) GetAwaitCompletion() bool {
	if m != nil {
		return m.AwaitCompletion
	}
	return false
}

// Configuration pertaining to artifacts produced during a build.
type BuilderConfig_Artifacts struct {
	Prebuilts     BuilderConfig_Artifacts_Prebuilts       `protobuf:"varint,1,opt,name=prebuilts,proto3,enum=chromiumos.BuilderConfig_Artifacts_Prebuilts" json:"prebuilts,omitempty"`
	ArtifactTypes []BuilderConfig_Artifacts_ArtifactTypes `protobuf:"varint,2,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.BuilderConfig_Artifacts_ArtifactTypes" json:"artifact_types,omitempty"`
	// Google storage bucket to upload prebuilts to.
	PrebuiltsGsBucket string `protobuf:"bytes,3,opt,name=prebuilts_gs_bucket,json=prebuiltsGsBucket,proto3" json:"prebuilts_gs_bucket,omitempty"`
	// Google storage bucket to upload artifacts to.
	ArtifactsGsBucket string `protobuf:"bytes,4,opt,name=artifacts_gs_bucket,json=artifactsGsBucket,proto3" json:"artifacts_gs_bucket,omitempty"`
	// There may be more than one set of publishing instructions.
	PublishArtifacts []*BuilderConfig_Artifacts_PublishInfo `protobuf:"bytes,5,rep,name=publish_artifacts,json=publishArtifacts,proto3" json:"publish_artifacts,omitempty"`
	// There may be more than one set of consumable artifacts.
	InputArtifacts       []*BuilderConfig_Artifacts_InputArtifactInfo `protobuf:"bytes,6,rep,name=input_artifacts,json=inputArtifacts,proto3" json:"input_artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                     `json:"-"`
	XXX_unrecognized     []byte                                       `json:"-"`
	XXX_sizecache        int32                                        `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Artifacts proto.InternalMessageInfo

func (m *BuilderConfig_Artifacts) GetPrebuilts() BuilderConfig_Artifacts_Prebuilts {
	if m != nil {
		return m.Prebuilts
	}
	return BuilderConfig_Artifacts_PREBUILTS_UNSPECIFIED
}

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

func (m *BuilderConfig_Artifacts) GetPrebuiltsGsBucket() string {
	if m != nil {
		return m.PrebuiltsGsBucket
	}
	return ""
}

func (m *BuilderConfig_Artifacts) GetArtifactsGsBucket() string {
	if m != nil {
		return m.ArtifactsGsBucket
	}
	return ""
}

func (m *BuilderConfig_Artifacts) GetPublishArtifacts() []*BuilderConfig_Artifacts_PublishInfo {
	if m != nil {
		return m.PublishArtifacts
	}
	return nil
}

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

type BuilderConfig_Artifacts_PublishInfo struct {
	// Artifact types to publish to this bucket.
	PublishTypes []BuilderConfig_Artifacts_ArtifactTypes `protobuf:"varint,2,rep,packed,name=publish_types,json=publishTypes,proto3,enum=chromiumos.BuilderConfig_Artifacts_ArtifactTypes" json:"publish_types,omitempty"`
	// GS location in which to publish 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.
	PublishGsLocation    string   `protobuf:"bytes,3,opt,name=publish_gs_location,json=publishGsLocation,proto3" json:"publish_gs_location,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Artifacts_PublishInfo proto.InternalMessageInfo

func (m *BuilderConfig_Artifacts_PublishInfo) GetPublishTypes() []BuilderConfig_Artifacts_ArtifactTypes {
	if m != nil {
		return m.PublishTypes
	}
	return nil
}

func (m *BuilderConfig_Artifacts_PublishInfo) GetPublishGsLocation() string {
	if m != nil {
		return m.PublishGsLocation
	}
	return ""
}

type BuilderConfig_Artifacts_InputArtifactInfo struct {
	// Artifact type to seek in these buckets.  Use the first instance of the
	// artifact found in the list of locations.
	InputArtifactType BuilderConfig_Artifacts_ArtifactTypes `protobuf:"varint,1,opt,name=input_artifact_type,json=inputArtifactType,proto3,enum=chromiumos.BuilderConfig_Artifacts_ArtifactTypes" json:"input_artifact_type,omitempty"`
	// Google storage locations containing these artifacts.
	InputArtifactGsLocations []string `protobuf:"bytes,2,rep,name=input_artifact_gs_locations,json=inputArtifactGsLocations,proto3" json:"input_artifact_gs_locations,omitempty"`
	XXX_NoUnkeyedLiteral     struct{} `json:"-"`
	XXX_unrecognized         []byte   `json:"-"`
	XXX_sizecache            int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Artifacts_InputArtifactInfo proto.InternalMessageInfo

func (m *BuilderConfig_Artifacts_InputArtifactInfo) GetInputArtifactType() BuilderConfig_Artifacts_ArtifactTypes {
	if m != nil {
		return m.InputArtifactType
	}
	return BuilderConfig_Artifacts_ARTIFACT_TYPES_UNSPECIFIED
}

func (m *BuilderConfig_Artifacts_InputArtifactInfo) GetInputArtifactGsLocations() []string {
	if m != nil {
		return m.InputArtifactGsLocations
	}
	return nil
}

// Configuration pertaining to Chrome.
type BuilderConfig_Chrome struct {
	// Whether to build internal or external Chrome. Internal chrome adds
	// Chrome branding.
	Internal             bool     `protobuf:"varint,1,opt,name=internal,proto3" json:"internal,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Chrome proto.InternalMessageInfo

func (m *BuilderConfig_Chrome) GetInternal() bool {
	if m != nil {
		return m.Internal
	}
	return false
}

// Build specific configuration.
type BuilderConfig_Build struct {
	// USE flags to use with the build.
	UseFlags       []*UseFlag                          `protobuf:"bytes,1,rep,name=use_flags,json=useFlags,proto3" json:"use_flags,omitempty"`
	PortageProfile *BuilderConfig_Build_PortageProfile `protobuf:"bytes,2,opt,name=portage_profile,json=portageProfile,proto3" json:"portage_profile,omitempty"`
	// Whether to apply gerrit changes, if any. Use case is to build without
	// changes after failure to identify the changes as the culprit.
	ApplyGerritChanges   bool                                  `protobuf:"varint,6,opt,name=apply_gerrit_changes,json=applyGerritChanges,proto3" json:"apply_gerrit_changes,omitempty"`
	PrepareForBuild      *BuilderConfig_Build_PrepareForBuild  `protobuf:"bytes,17,opt,name=prepare_for_build,json=prepareForBuild,proto3" json:"prepare_for_build,omitempty"`
	SdkUpdate            *BuilderConfig_Build_SdkUpdate        `protobuf:"bytes,12,opt,name=sdk_update,json=sdkUpdate,proto3" json:"sdk_update,omitempty"`
	InstallToolchain     *BuilderConfig_Build_InstallToolchain `protobuf:"bytes,13,opt,name=install_toolchain,json=installToolchain,proto3" json:"install_toolchain,omitempty"`
	InstallPackages      *BuilderConfig_Build_InstallPackages  `protobuf:"bytes,16,opt,name=install_packages,json=installPackages,proto3" json:"install_packages,omitempty"`
	BuildImages          *BuilderConfig_Build_BuildImages      `protobuf:"bytes,15,opt,name=build_images,json=buildImages,proto3" json:"build_images,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                              `json:"-"`
	XXX_unrecognized     []byte                                `json:"-"`
	XXX_sizecache        int32                                 `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Build proto.InternalMessageInfo

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

func (m *BuilderConfig_Build) GetPortageProfile() *BuilderConfig_Build_PortageProfile {
	if m != nil {
		return m.PortageProfile
	}
	return nil
}

func (m *BuilderConfig_Build) GetApplyGerritChanges() bool {
	if m != nil {
		return m.ApplyGerritChanges
	}
	return false
}

func (m *BuilderConfig_Build) GetPrepareForBuild() *BuilderConfig_Build_PrepareForBuild {
	if m != nil {
		return m.PrepareForBuild
	}
	return nil
}

func (m *BuilderConfig_Build) GetSdkUpdate() *BuilderConfig_Build_SdkUpdate {
	if m != nil {
		return m.SdkUpdate
	}
	return nil
}

func (m *BuilderConfig_Build) GetInstallToolchain() *BuilderConfig_Build_InstallToolchain {
	if m != nil {
		return m.InstallToolchain
	}
	return nil
}

func (m *BuilderConfig_Build) GetInstallPackages() *BuilderConfig_Build_InstallPackages {
	if m != nil {
		return m.InstallPackages
	}
	return nil
}

func (m *BuilderConfig_Build) GetBuildImages() *BuilderConfig_Build_BuildImages {
	if m != nil {
		return m.BuildImages
	}
	return nil
}

// The profile of the variant to set up and build.
type BuilderConfig_Build_PortageProfile struct {
	Profile              string   `protobuf:"bytes,1,opt,name=profile,proto3" json:"profile,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Build_PortageProfile proto.InternalMessageInfo

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

// Controls for the call to cros_artifacts.prepare_for_build.
type BuilderConfig_Build_PrepareForBuild struct {
	// Additional arguments from common.proto, passed into any
	// PrepareFor*Build endpoint.
	AdditionalArgs       *PrepareForBuildAdditionalArgs `protobuf:"bytes,1,opt,name=additional_args,json=additionalArgs,proto3" json:"additional_args,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                       `json:"-"`
	XXX_unrecognized     []byte                         `json:"-"`
	XXX_sizecache        int32                          `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Build_PrepareForBuild proto.InternalMessageInfo

func (m *BuilderConfig_Build_PrepareForBuild) GetAdditionalArgs() *PrepareForBuildAdditionalArgs {
	if m != nil {
		return m.AdditionalArgs
	}
	return nil
}

// Controls for the call to SdkService.Update.
type BuilderConfig_Build_SdkUpdate struct {
	// Whether to compile from source (vs using prebuilts when able.)
	CompileSource        bool     `protobuf:"varint,1,opt,name=compile_source,json=compileSource,proto3" json:"compile_source,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Build_SdkUpdate proto.InternalMessageInfo

func (m *BuilderConfig_Build_SdkUpdate) GetCompileSource() bool {
	if m != nil {
		return m.CompileSource
	}
	return false
}

// Controls for the call to SysrootService.InstallToolchain.
type BuilderConfig_Build_InstallToolchain struct {
	// Whether to compile from source (vs using prebuilts when able.)
	CompileSource        bool     `protobuf:"varint,1,opt,name=compile_source,json=compileSource,proto3" json:"compile_source,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Build_InstallToolchain proto.InternalMessageInfo

func (m *BuilderConfig_Build_InstallToolchain) GetCompileSource() bool {
	if m != nil {
		return m.CompileSource
	}
	return false
}

// Controls for the call to InstallPackages.
type BuilderConfig_Build_InstallPackages struct {
	// Whether to compile from source (vs using prebuilts when able.)
	CompileSource bool `protobuf:"varint,1,opt,name=compile_source,json=compileSource,proto3" json:"compile_source,omitempty"`
	// Controls the running of the install packages step.
	RunSpec BuilderConfig_RunSpec `protobuf:"varint,2,opt,name=run_spec,json=runSpec,proto3,enum=chromiumos.BuilderConfig_RunSpec" json:"run_spec,omitempty"`
	// Packages to build, or empty to build all packages.
	Packages []*PackageInfo `protobuf:"bytes,3,rep,name=packages,proto3" json:"packages,omitempty"`
	// Certain builders (e.g., clang-tidy-toolchain) need to build Chrome with
	// goma disabled.
	DisableGoma          bool     `protobuf:"varint,4,opt,name=disable_goma,json=disableGoma,proto3" json:"disable_goma,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Build_InstallPackages proto.InternalMessageInfo

func (m *BuilderConfig_Build_InstallPackages) GetCompileSource() bool {
	if m != nil {
		return m.CompileSource
	}
	return false
}

func (m *BuilderConfig_Build_InstallPackages) GetRunSpec() BuilderConfig_RunSpec {
	if m != nil {
		return m.RunSpec
	}
	return BuilderConfig_RUN_SPEC_UNSPECIFIED
}

func (m *BuilderConfig_Build_InstallPackages) GetPackages() []*PackageInfo {
	if m != nil {
		return m.Packages
	}
	return nil
}

func (m *BuilderConfig_Build_InstallPackages) GetDisableGoma() bool {
	if m != nil {
		return m.DisableGoma
	}
	return false
}

type BuilderConfig_Build_BuildImages struct {
	// Image types to build.
	ImageTypes           []ImageType `protobuf:"varint,1,rep,packed,name=image_types,json=imageTypes,proto3,enum=chromiumos.ImageType" json:"image_types,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Build_BuildImages proto.InternalMessageInfo

func (m *BuilderConfig_Build_BuildImages) GetImageTypes() []ImageType {
	if m != nil {
		return m.ImageTypes
	}
	return nil
}

type BuilderConfig_UnitTests struct {
	// Skipped packages.
	PackageBlacklist []*PackageInfo `protobuf:"bytes,4,rep,name=package_blacklist,json=packageBlacklist,proto3" json:"package_blacklist,omitempty"`
	// Controls the running of ebuild tests with possible early exit.
	EbuildsRunSpec BuilderConfig_RunSpec `protobuf:"varint,5,opt,name=ebuilds_run_spec,json=ebuildsRunSpec,proto3,enum=chromiumos.BuilderConfig_RunSpec" json:"ebuilds_run_spec,omitempty"`
	// Whether to assume the sysroot is empty.
	EmptySysroot         bool     `protobuf:"varint,6,opt,name=empty_sysroot,json=emptySysroot,proto3" json:"empty_sysroot,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_UnitTests proto.InternalMessageInfo

func (m *BuilderConfig_UnitTests) GetPackageBlacklist() []*PackageInfo {
	if m != nil {
		return m.PackageBlacklist
	}
	return nil
}

func (m *BuilderConfig_UnitTests) GetEbuildsRunSpec() BuilderConfig_RunSpec {
	if m != nil {
		return m.EbuildsRunSpec
	}
	return BuilderConfig_RUN_SPEC_UNSPECIFIED
}

func (m *BuilderConfig_UnitTests) GetEmptySysroot() bool {
	if m != nil {
		return m.EmptySysroot
	}
	return false
}

// List of builder configs. Intended to be serialized to / from disk.
type BuilderConfigs struct {
	BuilderConfigs       []*BuilderConfig `protobuf:"bytes,1,rep,name=builder_configs,json=builderConfigs,proto3" json:"builder_configs,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfigs proto.InternalMessageInfo

func (m *BuilderConfigs) GetBuilderConfigs() []*BuilderConfig {
	if m != nil {
		return m.BuilderConfigs
	}
	return nil
}

func init() {
	proto.RegisterEnum("chromiumos.BuilderConfig_RunSpec", BuilderConfig_RunSpec_name, BuilderConfig_RunSpec_value)
	proto.RegisterEnum("chromiumos.BuilderConfig_Id_Type", BuilderConfig_Id_Type_name, BuilderConfig_Id_Type_value)
	proto.RegisterEnum("chromiumos.BuilderConfig_General_Environment", BuilderConfig_General_Environment_name, BuilderConfig_General_Environment_value)
	proto.RegisterEnum("chromiumos.BuilderConfig_General_RunWhen_Mode", BuilderConfig_General_RunWhen_Mode_name, BuilderConfig_General_RunWhen_Mode_value)
	proto.RegisterEnum("chromiumos.BuilderConfig_Orchestrator_ChildSpec_CollectHandling", BuilderConfig_Orchestrator_ChildSpec_CollectHandling_name, BuilderConfig_Orchestrator_ChildSpec_CollectHandling_value)
	proto.RegisterEnum("chromiumos.BuilderConfig_Artifacts_Prebuilts", BuilderConfig_Artifacts_Prebuilts_name, BuilderConfig_Artifacts_Prebuilts_value)
	proto.RegisterEnum("chromiumos.BuilderConfig_Artifacts_ArtifactTypes", BuilderConfig_Artifacts_ArtifactTypes_name, BuilderConfig_Artifacts_ArtifactTypes_value)
	proto.RegisterType((*BuilderConfig)(nil), "chromiumos.BuilderConfig")
	proto.RegisterType((*BuilderConfig_Id)(nil), "chromiumos.BuilderConfig.Id")
	proto.RegisterType((*BuilderConfig_General)(nil), "chromiumos.BuilderConfig.General")
	proto.RegisterType((*BuilderConfig_General_RunWhen)(nil), "chromiumos.BuilderConfig.General.RunWhen")
	proto.RegisterType((*BuilderConfig_Orchestrator)(nil), "chromiumos.BuilderConfig.Orchestrator")
	proto.RegisterType((*BuilderConfig_Orchestrator_ChildSpec)(nil), "chromiumos.BuilderConfig.Orchestrator.ChildSpec")
	proto.RegisterType((*BuilderConfig_Orchestrator_FollowOnOrchestrator)(nil), "chromiumos.BuilderConfig.Orchestrator.FollowOnOrchestrator")
	proto.RegisterType((*BuilderConfig_Artifacts)(nil), "chromiumos.BuilderConfig.Artifacts")
	proto.RegisterType((*BuilderConfig_Artifacts_PublishInfo)(nil), "chromiumos.BuilderConfig.Artifacts.PublishInfo")
	proto.RegisterType((*BuilderConfig_Artifacts_InputArtifactInfo)(nil), "chromiumos.BuilderConfig.Artifacts.InputArtifactInfo")
	proto.RegisterType((*BuilderConfig_Chrome)(nil), "chromiumos.BuilderConfig.Chrome")
	proto.RegisterType((*BuilderConfig_Build)(nil), "chromiumos.BuilderConfig.Build")
	proto.RegisterType((*BuilderConfig_Build_PortageProfile)(nil), "chromiumos.BuilderConfig.Build.PortageProfile")
	proto.RegisterType((*BuilderConfig_Build_PrepareForBuild)(nil), "chromiumos.BuilderConfig.Build.PrepareForBuild")
	proto.RegisterType((*BuilderConfig_Build_SdkUpdate)(nil), "chromiumos.BuilderConfig.Build.SdkUpdate")
	proto.RegisterType((*BuilderConfig_Build_InstallToolchain)(nil), "chromiumos.BuilderConfig.Build.InstallToolchain")
	proto.RegisterType((*BuilderConfig_Build_InstallPackages)(nil), "chromiumos.BuilderConfig.Build.InstallPackages")
	proto.RegisterType((*BuilderConfig_Build_BuildImages)(nil), "chromiumos.BuilderConfig.Build.BuildImages")
	proto.RegisterType((*BuilderConfig_UnitTests)(nil), "chromiumos.BuilderConfig.UnitTests")
	proto.RegisterType((*BuilderConfigs)(nil), "chromiumos.BuilderConfigs")
}

func init() { proto.RegisterFile("chromiumos/builder_config.proto", fileDescriptor_6fe67302c16003fb) }

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