// Configurable software attributes for ChromeOS builds.
//
// See
// https://chromium.git.corp.google.com/chromiumos/platform2/+/refs/heads/master/chromeos-config/README.md
// for documentation on Unified Builds and ChromeOS Config.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: build/build_config.proto

package build_config

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// A single ChromeOS Config payload.
//
// The generated ChromeOS Config JSON uses "-", which is not valid in a proto
// field name. Use json_name, so the JSON can be parsed directly into / out of
// this proto.
type ChromeOSConfig struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Identity        *ChromeOSConfig_Identity        `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"`
	Arc             *ChromeOSConfig_Arc             `protobuf:"bytes,2,opt,name=arc,proto3" json:"arc,omitempty"`
	Firmware        *ChromeOSConfig_Firmware        `protobuf:"bytes,3,opt,name=firmware,proto3" json:"firmware,omitempty"`
	FirmwareSigning *ChromeOSConfig_FirmwareSigning `protobuf:"bytes,4,opt,name=firmware_signing,json=firmware-signing,proto3" json:"firmware_signing,omitempty"`
	// Unique name for the given model.
	Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"`
	// Brand code of the model (also called RLZ code).
	BrandCode string `protobuf:"bytes,6,opt,name=brand_code,json=brand-code,proto3" json:"brand_code,omitempty"`
}

func (x *ChromeOSConfig) Reset() {
	*x = ChromeOSConfig{}
	if protoimpl.UnsafeEnabled {
		mi := &file_build_build_config_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ChromeOSConfig) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ChromeOSConfig) ProtoMessage() {}

func (x *ChromeOSConfig) ProtoReflect() protoreflect.Message {
	mi := &file_build_build_config_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ChromeOSConfig.ProtoReflect.Descriptor instead.
func (*ChromeOSConfig) Descriptor() ([]byte, []int) {
	return file_build_build_config_proto_rawDescGZIP(), []int{0}
}

func (x *ChromeOSConfig) GetIdentity() *ChromeOSConfig_Identity {
	if x != nil {
		return x.Identity
	}
	return nil
}

func (x *ChromeOSConfig) GetArc() *ChromeOSConfig_Arc {
	if x != nil {
		return x.Arc
	}
	return nil
}

func (x *ChromeOSConfig) GetFirmware() *ChromeOSConfig_Firmware {
	if x != nil {
		return x.Firmware
	}
	return nil
}

func (x *ChromeOSConfig) GetFirmwareSigning() *ChromeOSConfig_FirmwareSigning {
	if x != nil {
		return x.FirmwareSigning
	}
	return nil
}

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

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

// All ChromeOS Config payloads for a given build.
type ChromeOSConfigs struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Configs []*ChromeOSConfig `protobuf:"bytes,1,rep,name=configs,proto3" json:"configs,omitempty"`
}

func (x *ChromeOSConfigs) Reset() {
	*x = ChromeOSConfigs{}
	if protoimpl.UnsafeEnabled {
		mi := &file_build_build_config_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ChromeOSConfigs) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ChromeOSConfigs) ProtoMessage() {}

func (x *ChromeOSConfigs) ProtoReflect() protoreflect.Message {
	mi := &file_build_build_config_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ChromeOSConfigs.ProtoReflect.Descriptor instead.
func (*ChromeOSConfigs) Descriptor() ([]byte, []int) {
	return file_build_build_config_proto_rawDescGZIP(), []int{1}
}

func (x *ChromeOSConfigs) GetConfigs() []*ChromeOSConfig {
	if x != nil {
		return x.Configs
	}
	return nil
}

type ChromeOSConfig_Arc struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	BuildProperties *ChromeOSConfig_Arc_BuildProperties `protobuf:"bytes,1,opt,name=build_properties,json=build-properties,proto3" json:"build_properties,omitempty"`
}

func (x *ChromeOSConfig_Arc) Reset() {
	*x = ChromeOSConfig_Arc{}
	if protoimpl.UnsafeEnabled {
		mi := &file_build_build_config_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ChromeOSConfig_Arc) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ChromeOSConfig_Arc) ProtoMessage() {}

func (x *ChromeOSConfig_Arc) ProtoReflect() protoreflect.Message {
	mi := &file_build_build_config_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ChromeOSConfig_Arc.ProtoReflect.Descriptor instead.
func (*ChromeOSConfig_Arc) Descriptor() ([]byte, []int) {
	return file_build_build_config_proto_rawDescGZIP(), []int{0, 0}
}

func (x *ChromeOSConfig_Arc) GetBuildProperties() *ChromeOSConfig_Arc_BuildProperties {
	if x != nil {
		return x.BuildProperties
	}
	return nil
}

type ChromeOSConfig_Firmware struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// BCS overlay path used to determine BCS file path for binary firmware
	// downloads.
	BcsOverlay string `protobuf:"bytes,1,opt,name=bcs_overlay,json=bcs-overlay,proto3" json:"bcs_overlay,omitempty"`
	// The name of the firmware build. Typically the device name, but can differ
	// when a device may have two or more different firmware builds.
	BuildName    string                                `protobuf:"bytes,2,opt,name=build_name,json=build-name,proto3" json:"build_name,omitempty"`
	BuildTargets *ChromeOSConfig_Firmware_BuildTargets `protobuf:"bytes,3,opt,name=build_targets,json=build-targets,proto3" json:"build_targets,omitempty"`
	// Name of the file located in BCS under the respective bcs-overlay.
	EcRoImage string `protobuf:"bytes,4,opt,name=ec_ro_image,json=ec-ro-image,proto3" json:"ec_ro_image,omitempty"`
	// Name of the file located in BCS under the respective bcs-overlay.
	MainRoImage string `protobuf:"bytes,5,opt,name=main_ro_image,json=main-ro-image,proto3" json:"main_ro_image,omitempty"`
	// Name of the file located in BCS under the respective bcs-overlay.
	MainRwImage string `protobuf:"bytes,6,opt,name=main_rw_image,json=main-rw-image,proto3" json:"main_rw_image,omitempty"`
	// This is a human-recognizable name used to refer to the firmware. It will
	// be used when generating the shellball via firmware packer. Mainly, this
	// is only for compatibility testing with device tree (since DT allowed
	// firmwares to be named).
	Name string `protobuf:"bytes,7,opt,name=name,proto3" json:"name,omitempty"`
	// If present this indicates that this model has no firmware at present.
	// This means that it will be omitted from the firmware updater
	// (chromeos-firmware- ebuild) and it will not be included in the signer
	// instructions file sent to the signer. This option is often useful when a
	// model is first added, since it may not have firmware at that point.
	NoFirmware bool `protobuf:"varint,8,opt,name=no_firmware,json=no-firmware,proto3" json:"no_firmware,omitempty"`
	// Name of the file located in BCS under the respective bcs-overlay.
	PdRoImage string `protobuf:"bytes,9,opt,name=pd_ro_image,json=pd-ro-image,proto3" json:"pd_ro_image,omitempty"`
}

func (x *ChromeOSConfig_Firmware) Reset() {
	*x = ChromeOSConfig_Firmware{}
	if protoimpl.UnsafeEnabled {
		mi := &file_build_build_config_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ChromeOSConfig_Firmware) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ChromeOSConfig_Firmware) ProtoMessage() {}

func (x *ChromeOSConfig_Firmware) ProtoReflect() protoreflect.Message {
	mi := &file_build_build_config_proto_msgTypes[3]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ChromeOSConfig_Firmware.ProtoReflect.Descriptor instead.
func (*ChromeOSConfig_Firmware) Descriptor() ([]byte, []int) {
	return file_build_build_config_proto_rawDescGZIP(), []int{0, 1}
}

func (x *ChromeOSConfig_Firmware) GetBcsOverlay() string {
	if x != nil {
		return x.BcsOverlay
	}
	return ""
}

func (x *ChromeOSConfig_Firmware) GetBuildName() string {
	if x != nil {
		return x.BuildName
	}
	return ""
}

func (x *ChromeOSConfig_Firmware) GetBuildTargets() *ChromeOSConfig_Firmware_BuildTargets {
	if x != nil {
		return x.BuildTargets
	}
	return nil
}

func (x *ChromeOSConfig_Firmware) GetEcRoImage() string {
	if x != nil {
		return x.EcRoImage
	}
	return ""
}

func (x *ChromeOSConfig_Firmware) GetMainRoImage() string {
	if x != nil {
		return x.MainRoImage
	}
	return ""
}

func (x *ChromeOSConfig_Firmware) GetMainRwImage() string {
	if x != nil {
		return x.MainRwImage
	}
	return ""
}

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

func (x *ChromeOSConfig_Firmware) GetNoFirmware() bool {
	if x != nil {
		return x.NoFirmware
	}
	return false
}

func (x *ChromeOSConfig_Firmware) GetPdRoImage() string {
	if x != nil {
		return x.PdRoImage
	}
	return ""
}

type ChromeOSConfig_FirmwareSigning struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Key ID from the signer key set that is used to sign the given firmware
	// image.
	KeyId string `protobuf:"bytes,1,opt,name=key_id,json=key-id,proto3" json:"key_id,omitempty"`
	//   Indicates that this model cannot be decoded by the mapping table.
	//   Instead the model is stored in the VPD (Vital Product Data) region in
	//   the customization_id property. This allows us to determine the model to
	//   use in the factory during the finalization stage. Note that if the VPD
	//   is wiped then the model will be lost. This may mean that the device
	//   will revert back to a generic model, or may not work. It is not
	//   possible in general to test whether the model in the VPD is correct at
	//   run-time. We simply assume that it is. The advantage of using this
	//   property is that no hardware changes are needed to change one model
	//   into another. For example we can create 20 different whitelabel boards,
	//   all with the same hardware, just by changing the customization_id that
	//   is written into SPI flash.
	SigIdInCustomizationId bool `protobuf:"varint,2,opt,name=sig_id_in_customization_id,json=sig-id-in-customization-id,proto3" json:"sig_id_in_customization_id,omitempty"`
	// ID used to generate keys/keyblocks in the firmware signing output. This
	// is also the value provided to mosys platform signature for the
	// updater4.sh script.
	SignatureId string `protobuf:"bytes,3,opt,name=signature_id,json=signature-id,proto3" json:"signature_id,omitempty"`
}

func (x *ChromeOSConfig_FirmwareSigning) Reset() {
	*x = ChromeOSConfig_FirmwareSigning{}
	if protoimpl.UnsafeEnabled {
		mi := &file_build_build_config_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ChromeOSConfig_FirmwareSigning) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ChromeOSConfig_FirmwareSigning) ProtoMessage() {}

func (x *ChromeOSConfig_FirmwareSigning) ProtoReflect() protoreflect.Message {
	mi := &file_build_build_config_proto_msgTypes[4]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ChromeOSConfig_FirmwareSigning.ProtoReflect.Descriptor instead.
func (*ChromeOSConfig_FirmwareSigning) Descriptor() ([]byte, []int) {
	return file_build_build_config_proto_rawDescGZIP(), []int{0, 2}
}

func (x *ChromeOSConfig_FirmwareSigning) GetKeyId() string {
	if x != nil {
		return x.KeyId
	}
	return ""
}

func (x *ChromeOSConfig_FirmwareSigning) GetSigIdInCustomizationId() bool {
	if x != nil {
		return x.SigIdInCustomizationId
	}
	return false
}

func (x *ChromeOSConfig_FirmwareSigning) GetSignatureId() string {
	if x != nil {
		return x.SignatureId
	}
	return ""
}

// Defines attributes that are used by cros_config to detect the identity of
// the platform and which corresponding config should be used.
type ChromeOSConfig_Identity struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// ‘customization_id’ value set in the VPD for non-unibuild Zergs and
	// Whitelabels. Deprecated for use in new products since 2017/07/26.
	CustomizationId string `protobuf:"bytes,1,opt,name=customization_id,json=customization-id,proto3" json:"customization_id,omitempty"`
	// Defines the name that is reported by ‘mosys platform name’ This is
	// typically the reference design name with the first letter capitalized.
	PlatformName string `protobuf:"bytes,2,opt,name=platform_name,json=platform-name,proto3" json:"platform_name,omitempty"`
	// SKU/Board strapping pins configured during board manufacturing. Minimum
	// value: -0x1. Maximum value: 0x7fffffff.
	SkuId int64 `protobuf:"varint,3,opt,name=sku_id,json=sku-id,proto3" json:"sku_id,omitempty"`
	// [x86] Firmware name built into the firmware and reflected back out in the
	// SMBIOS tables.
	SmbiosNameMatch string `protobuf:"bytes,4,opt,name=smbios_name_match,json=smbios-name-match,proto3" json:"smbios_name_match,omitempty"`
	// [ARM] String pattern (partial) that is matched against the contents of
	// /proc/device-tree/compatible on ARM devices.
	DeviceTreeCompatibleMatch string `protobuf:"bytes,5,opt,name=device_tree_compatible_match,json=device-tree-compatible-match,proto3" json:"device_tree_compatible_match,omitempty"`
	// ‘whitelabel_tag’ value set in the VPD, to add Whitelabel branding over an
	// unbranded base model.
	WhitelabelTag string `protobuf:"bytes,6,opt,name=whitelabel_tag,json=whitelabel-tag,proto3" json:"whitelabel_tag,omitempty"`
}

func (x *ChromeOSConfig_Identity) Reset() {
	*x = ChromeOSConfig_Identity{}
	if protoimpl.UnsafeEnabled {
		mi := &file_build_build_config_proto_msgTypes[5]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ChromeOSConfig_Identity) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ChromeOSConfig_Identity) ProtoMessage() {}

func (x *ChromeOSConfig_Identity) ProtoReflect() protoreflect.Message {
	mi := &file_build_build_config_proto_msgTypes[5]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ChromeOSConfig_Identity.ProtoReflect.Descriptor instead.
func (*ChromeOSConfig_Identity) Descriptor() ([]byte, []int) {
	return file_build_build_config_proto_rawDescGZIP(), []int{0, 3}
}

func (x *ChromeOSConfig_Identity) GetCustomizationId() string {
	if x != nil {
		return x.CustomizationId
	}
	return ""
}

func (x *ChromeOSConfig_Identity) GetPlatformName() string {
	if x != nil {
		return x.PlatformName
	}
	return ""
}

func (x *ChromeOSConfig_Identity) GetSkuId() int64 {
	if x != nil {
		return x.SkuId
	}
	return 0
}

func (x *ChromeOSConfig_Identity) GetSmbiosNameMatch() string {
	if x != nil {
		return x.SmbiosNameMatch
	}
	return ""
}

func (x *ChromeOSConfig_Identity) GetDeviceTreeCompatibleMatch() string {
	if x != nil {
		return x.DeviceTreeCompatibleMatch
	}
	return ""
}

func (x *ChromeOSConfig_Identity) GetWhitelabelTag() string {
	if x != nil {
		return x.WhitelabelTag
	}
	return ""
}

type ChromeOSConfig_Arc_BuildProperties struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Device name to report in ‘ro.product.device’. This is often
	// ‘{product}_cheets’ but it can be something else if desired.
	Device string `protobuf:"bytes,1,opt,name=device,proto3" json:"device,omitempty"`
	// The first Android API level that this model shipped with.
	FirstApiLevel string `protobuf:"bytes,2,opt,name=first_api_level,json=first-api-level,proto3" json:"first_api_level,omitempty"`
	// Name of this model as it is called in the market, reported in
	// ‘ro.product.model’. This often starts with ‘{oem}’.
	MarketingName string `protobuf:"bytes,3,opt,name=marketing_name,json=marketing-name,proto3" json:"marketing_name,omitempty"`
	// Tag to use to track metrics for this model. The tag can be shared
	// across many devices if desired, but this will result in larger
	// granularity for metrics reporting. Ideally the metrics system should
	// support collation of metrics with different tags into groups, but if
	// this is not supported, this tag can be used to achieve the same end.
	// This is reported in ‘ro.product.metrics.tag’.
	MetricsTag string `protobuf:"bytes,4,opt,name=metrics_tag,json=metrics-tag,proto3" json:"metrics_tag,omitempty"`
	// Original Equipment Manufacturer for this model. This generally means
	// the OEM name printed on the device.
	Oem        string `protobuf:"bytes,5,opt,name=oem,proto3" json:"oem,omitempty"`
	PaiRegions string `protobuf:"bytes,6,opt,name=pai_regions,json=pai-regions,proto3" json:"pai_regions,omitempty"`
	// Product name to report in ‘ro.product.name’. This may be the device
	// name, or it can be something else, to allow several devices to be
	// grouped into one product.
	Product string `protobuf:"bytes,7,opt,name=product,proto3" json:"product,omitempty"`
}

func (x *ChromeOSConfig_Arc_BuildProperties) Reset() {
	*x = ChromeOSConfig_Arc_BuildProperties{}
	if protoimpl.UnsafeEnabled {
		mi := &file_build_build_config_proto_msgTypes[6]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ChromeOSConfig_Arc_BuildProperties) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ChromeOSConfig_Arc_BuildProperties) ProtoMessage() {}

func (x *ChromeOSConfig_Arc_BuildProperties) ProtoReflect() protoreflect.Message {
	mi := &file_build_build_config_proto_msgTypes[6]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ChromeOSConfig_Arc_BuildProperties.ProtoReflect.Descriptor instead.
func (*ChromeOSConfig_Arc_BuildProperties) Descriptor() ([]byte, []int) {
	return file_build_build_config_proto_rawDescGZIP(), []int{0, 0, 0}
}

func (x *ChromeOSConfig_Arc_BuildProperties) GetDevice() string {
	if x != nil {
		return x.Device
	}
	return ""
}

func (x *ChromeOSConfig_Arc_BuildProperties) GetFirstApiLevel() string {
	if x != nil {
		return x.FirstApiLevel
	}
	return ""
}

func (x *ChromeOSConfig_Arc_BuildProperties) GetMarketingName() string {
	if x != nil {
		return x.MarketingName
	}
	return ""
}

func (x *ChromeOSConfig_Arc_BuildProperties) GetMetricsTag() string {
	if x != nil {
		return x.MetricsTag
	}
	return ""
}

func (x *ChromeOSConfig_Arc_BuildProperties) GetOem() string {
	if x != nil {
		return x.Oem
	}
	return ""
}

func (x *ChromeOSConfig_Arc_BuildProperties) GetPaiRegions() string {
	if x != nil {
		return x.PaiRegions
	}
	return ""
}

func (x *ChromeOSConfig_Arc_BuildProperties) GetProduct() string {
	if x != nil {
		return x.Product
	}
	return ""
}

type ChromeOSConfig_Firmware_BuildTargets struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Build target of the base EC firmware for a detachable device, that will
	// be considered dirty when building/testing
	Base string `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
	// Build target that will be considered dirty when building/testing
	// locally.
	Coreboot string `protobuf:"bytes,2,opt,name=coreboot,proto3" json:"coreboot,omitempty"`
	// Build target that will be considered dirty when building/testing
	// locally.
	Cr50 string `protobuf:"bytes,3,opt,name=cr50,proto3" json:"cr50,omitempty"`
	// Build target that will be considered dirty when building/testing
	// locally.
	Depthcharge string `protobuf:"bytes,4,opt,name=depthcharge,proto3" json:"depthcharge,omitempty"`
	// Build target that will be considered dirty when building/testing
	// locally.
	Ec string `protobuf:"bytes,5,opt,name=ec,proto3" json:"ec,omitempty"`
	// Extra EC build targets to build within chromeos-ec.
	EcExtras []string `protobuf:"bytes,6,rep,name=ec_extras,json=ecExtras,proto3" json:"ec_extras,omitempty"`
	// Build target that will be considered dirty when building/testing
	// locally.
	Ish string `protobuf:"bytes,7,opt,name=ish,proto3" json:"ish,omitempty"`
	// Build target that will be considered dirty when building/testing
	// locally.
	Libpayload string `protobuf:"bytes,8,opt,name=libpayload,proto3" json:"libpayload,omitempty"`
	// Build target that will be considered dirty when building/testing
	// locally.
	UBoot string `protobuf:"bytes,9,opt,name=u_boot,json=u-boot,proto3" json:"u_boot,omitempty"`
}

func (x *ChromeOSConfig_Firmware_BuildTargets) Reset() {
	*x = ChromeOSConfig_Firmware_BuildTargets{}
	if protoimpl.UnsafeEnabled {
		mi := &file_build_build_config_proto_msgTypes[7]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ChromeOSConfig_Firmware_BuildTargets) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ChromeOSConfig_Firmware_BuildTargets) ProtoMessage() {}

func (x *ChromeOSConfig_Firmware_BuildTargets) ProtoReflect() protoreflect.Message {
	mi := &file_build_build_config_proto_msgTypes[7]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ChromeOSConfig_Firmware_BuildTargets.ProtoReflect.Descriptor instead.
func (*ChromeOSConfig_Firmware_BuildTargets) Descriptor() ([]byte, []int) {
	return file_build_build_config_proto_rawDescGZIP(), []int{0, 1, 0}
}

func (x *ChromeOSConfig_Firmware_BuildTargets) GetBase() string {
	if x != nil {
		return x.Base
	}
	return ""
}

func (x *ChromeOSConfig_Firmware_BuildTargets) GetCoreboot() string {
	if x != nil {
		return x.Coreboot
	}
	return ""
}

func (x *ChromeOSConfig_Firmware_BuildTargets) GetCr50() string {
	if x != nil {
		return x.Cr50
	}
	return ""
}

func (x *ChromeOSConfig_Firmware_BuildTargets) GetDepthcharge() string {
	if x != nil {
		return x.Depthcharge
	}
	return ""
}

func (x *ChromeOSConfig_Firmware_BuildTargets) GetEc() string {
	if x != nil {
		return x.Ec
	}
	return ""
}

func (x *ChromeOSConfig_Firmware_BuildTargets) GetEcExtras() []string {
	if x != nil {
		return x.EcExtras
	}
	return nil
}

func (x *ChromeOSConfig_Firmware_BuildTargets) GetIsh() string {
	if x != nil {
		return x.Ish
	}
	return ""
}

func (x *ChromeOSConfig_Firmware_BuildTargets) GetLibpayload() string {
	if x != nil {
		return x.Libpayload
	}
	return ""
}

func (x *ChromeOSConfig_Firmware_BuildTargets) GetUBoot() string {
	if x != nil {
		return x.UBoot
	}
	return ""
}

var File_build_build_config_proto protoreflect.FileDescriptor

var file_build_build_config_proto_rawDesc = []byte{
	0x0a, 0x18, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x63, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x62, 0x75, 0x69, 0x6c,
	0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xaa, 0x0d, 0x0a, 0x0e, 0x43, 0x68, 0x72,
	0x6f, 0x6d, 0x65, 0x4f, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x41, 0x0a, 0x08, 0x69,
	0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e,
	0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x68, 0x72,
	0x6f, 0x6d, 0x65, 0x4f, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x49, 0x64, 0x65, 0x6e,
	0x74, 0x69, 0x74, 0x79, 0x52, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x32,
	0x0a, 0x03, 0x61, 0x72, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x62, 0x75,
	0x69, 0x6c, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6d,
	0x65, 0x4f, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x41, 0x72, 0x63, 0x52, 0x03, 0x61,
	0x72, 0x63, 0x12, 0x41, 0x0a, 0x08, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x18, 0x03,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x63, 0x6f, 0x6e,
	0x66, 0x69, 0x67, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x4f, 0x53, 0x43, 0x6f, 0x6e, 0x66,
	0x69, 0x67, 0x2e, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x08, 0x66, 0x69, 0x72,
	0x6d, 0x77, 0x61, 0x72, 0x65, 0x12, 0x58, 0x0a, 0x10, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72,
	0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x2c, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43,
	0x68, 0x72, 0x6f, 0x6d, 0x65, 0x4f, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x46, 0x69,
	0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x10, 0x66,
	0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x2d, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x12,
	0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
	0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x64,
	0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x2d, 0x63,
	0x6f, 0x64, 0x65, 0x1a, 0xd1, 0x02, 0x0a, 0x03, 0x41, 0x72, 0x63, 0x12, 0x5c, 0x0a, 0x10, 0x62,
	0x75, 0x69, 0x6c, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x63, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x4f, 0x53, 0x43, 0x6f, 0x6e,
	0x66, 0x69, 0x67, 0x2e, 0x41, 0x72, 0x63, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f,
	0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x10, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2d, 0x70,
	0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0xeb, 0x01, 0x0a, 0x0f, 0x42, 0x75,
	0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x16, 0x0a,
	0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64,
	0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x61,
	0x70, 0x69, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f,
	0x66, 0x69, 0x72, 0x73, 0x74, 0x2d, 0x61, 0x70, 0x69, 0x2d, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12,
	0x26, 0x0a, 0x0e, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x61, 0x6d,
	0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x69,
	0x6e, 0x67, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69,
	0x63, 0x73, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x65,
	0x74, 0x72, 0x69, 0x63, 0x73, 0x2d, 0x74, 0x61, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x6f, 0x65, 0x6d,
	0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6f, 0x65, 0x6d, 0x12, 0x20, 0x0a, 0x0b, 0x70,
	0x61, 0x69, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x0b, 0x70, 0x61, 0x69, 0x2d, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x18, 0x0a,
	0x07, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
	0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x1a, 0xda, 0x04, 0x0a, 0x08, 0x46, 0x69, 0x72, 0x6d,
	0x77, 0x61, 0x72, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x63, 0x73, 0x5f, 0x6f, 0x76, 0x65, 0x72,
	0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x63, 0x73, 0x2d, 0x6f,
	0x76, 0x65, 0x72, 0x6c, 0x61, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f,
	0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x69, 0x6c,
	0x64, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x58, 0x0a, 0x0d, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f,
	0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e,
	0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x68, 0x72,
	0x6f, 0x6d, 0x65, 0x4f, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x46, 0x69, 0x72, 0x6d,
	0x77, 0x61, 0x72, 0x65, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74,
	0x73, 0x52, 0x0d, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73,
	0x12, 0x20, 0x0a, 0x0b, 0x65, 0x63, 0x5f, 0x72, 0x6f, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18,
	0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x63, 0x2d, 0x72, 0x6f, 0x2d, 0x69, 0x6d, 0x61,
	0x67, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x72, 0x6f, 0x5f, 0x69, 0x6d,
	0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x61, 0x69, 0x6e, 0x2d,
	0x72, 0x6f, 0x2d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x69, 0x6e,
	0x5f, 0x72, 0x77, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x0d, 0x6d, 0x61, 0x69, 0x6e, 0x2d, 0x72, 0x77, 0x2d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x12,
	0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
	0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x6f, 0x5f, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72,
	0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x6e, 0x6f, 0x2d, 0x66, 0x69, 0x72, 0x6d,
	0x77, 0x61, 0x72, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x64, 0x5f, 0x72, 0x6f, 0x5f, 0x69, 0x6d,
	0x61, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x64, 0x2d, 0x72, 0x6f,
	0x2d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x1a, 0xeb, 0x01, 0x0a, 0x0c, 0x42, 0x75, 0x69, 0x6c, 0x64,
	0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63,
	0x6f, 0x72, 0x65, 0x62, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63,
	0x6f, 0x72, 0x65, 0x62, 0x6f, 0x6f, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x72, 0x35, 0x30, 0x18,
	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x72, 0x35, 0x30, 0x12, 0x20, 0x0a, 0x0b, 0x64,
	0x65, 0x70, 0x74, 0x68, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x0b, 0x64, 0x65, 0x70, 0x74, 0x68, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x0e, 0x0a,
	0x02, 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x65, 0x63, 0x12, 0x1b, 0x0a,
	0x09, 0x65, 0x63, 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09,
	0x52, 0x08, 0x65, 0x63, 0x45, 0x78, 0x74, 0x72, 0x61, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x73,
	0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x69, 0x73, 0x68, 0x12, 0x1e, 0x0a, 0x0a,
	0x6c, 0x69, 0x62, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x0a, 0x6c, 0x69, 0x62, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x16, 0x0a, 0x06,
	0x75, 0x5f, 0x62, 0x6f, 0x6f, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x2d,
	0x62, 0x6f, 0x6f, 0x74, 0x1a, 0x8d, 0x01, 0x0a, 0x0f, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72,
	0x65, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x6b, 0x65, 0x79, 0x5f,
	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6b, 0x65, 0x79, 0x2d, 0x69, 0x64,
	0x12, 0x3e, 0x0a, 0x1a, 0x73, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x5f, 0x69, 0x6e, 0x5f, 0x63, 0x75,
	0x73, 0x74, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02,
	0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x73, 0x69, 0x67, 0x2d, 0x69, 0x64, 0x2d, 0x69, 0x6e, 0x2d,
	0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x69, 0x64,
	0x12, 0x22, 0x0a, 0x0c, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x64,
	0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72,
	0x65, 0x2d, 0x69, 0x64, 0x1a, 0x8e, 0x02, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74,
	0x79, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69,
	0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x75, 0x73,
	0x74, 0x6f, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x69, 0x64, 0x12, 0x24, 0x0a,
	0x0d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2d, 0x6e,
	0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6b, 0x75, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20,
	0x01, 0x28, 0x03, 0x52, 0x06, 0x73, 0x6b, 0x75, 0x2d, 0x69, 0x64, 0x12, 0x2c, 0x0a, 0x11, 0x73,
	0x6d, 0x62, 0x69, 0x6f, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68,
	0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x6d, 0x62, 0x69, 0x6f, 0x73, 0x2d, 0x6e,
	0x61, 0x6d, 0x65, 0x2d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x42, 0x0a, 0x1c, 0x64, 0x65, 0x76,
	0x69, 0x63, 0x65, 0x5f, 0x74, 0x72, 0x65, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69,
	0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x1c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x74, 0x72, 0x65, 0x65, 0x2d, 0x63, 0x6f, 0x6d,
	0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x2d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x26, 0x0a,
	0x0e, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x74, 0x61, 0x67, 0x18,
	0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x61, 0x62, 0x65,
	0x6c, 0x2d, 0x74, 0x61, 0x67, 0x22, 0x49, 0x0a, 0x0f, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x4f,
	0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x36, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66,
	0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x75, 0x69, 0x6c,
	0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x4f,
	0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73,
	0x42, 0x35, 0x5a, 0x33, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e,
	0x6f, 0x72, 0x67, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x69,
	0x6e, 0x66, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64,
	0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_build_build_config_proto_rawDescOnce sync.Once
	file_build_build_config_proto_rawDescData = file_build_build_config_proto_rawDesc
)

func file_build_build_config_proto_rawDescGZIP() []byte {
	file_build_build_config_proto_rawDescOnce.Do(func() {
		file_build_build_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_build_build_config_proto_rawDescData)
	})
	return file_build_build_config_proto_rawDescData
}

var file_build_build_config_proto_msgTypes = make([]protoimpl.MessageInfo, 8)
var file_build_build_config_proto_goTypes = []interface{}{
	(*ChromeOSConfig)(nil),                       // 0: build_config.ChromeOSConfig
	(*ChromeOSConfigs)(nil),                      // 1: build_config.ChromeOSConfigs
	(*ChromeOSConfig_Arc)(nil),                   // 2: build_config.ChromeOSConfig.Arc
	(*ChromeOSConfig_Firmware)(nil),              // 3: build_config.ChromeOSConfig.Firmware
	(*ChromeOSConfig_FirmwareSigning)(nil),       // 4: build_config.ChromeOSConfig.FirmwareSigning
	(*ChromeOSConfig_Identity)(nil),              // 5: build_config.ChromeOSConfig.Identity
	(*ChromeOSConfig_Arc_BuildProperties)(nil),   // 6: build_config.ChromeOSConfig.Arc.BuildProperties
	(*ChromeOSConfig_Firmware_BuildTargets)(nil), // 7: build_config.ChromeOSConfig.Firmware.BuildTargets
}
var file_build_build_config_proto_depIdxs = []int32{
	5, // 0: build_config.ChromeOSConfig.identity:type_name -> build_config.ChromeOSConfig.Identity
	2, // 1: build_config.ChromeOSConfig.arc:type_name -> build_config.ChromeOSConfig.Arc
	3, // 2: build_config.ChromeOSConfig.firmware:type_name -> build_config.ChromeOSConfig.Firmware
	4, // 3: build_config.ChromeOSConfig.firmware_signing:type_name -> build_config.ChromeOSConfig.FirmwareSigning
	0, // 4: build_config.ChromeOSConfigs.configs:type_name -> build_config.ChromeOSConfig
	6, // 5: build_config.ChromeOSConfig.Arc.build_properties:type_name -> build_config.ChromeOSConfig.Arc.BuildProperties
	7, // 6: build_config.ChromeOSConfig.Firmware.build_targets:type_name -> build_config.ChromeOSConfig.Firmware.BuildTargets
	7, // [7:7] is the sub-list for method output_type
	7, // [7:7] is the sub-list for method input_type
	7, // [7:7] is the sub-list for extension type_name
	7, // [7:7] is the sub-list for extension extendee
	0, // [0:7] is the sub-list for field type_name
}

func init() { file_build_build_config_proto_init() }
func file_build_build_config_proto_init() {
	if File_build_build_config_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_build_build_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ChromeOSConfig); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_build_build_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ChromeOSConfigs); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_build_build_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ChromeOSConfig_Arc); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_build_build_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ChromeOSConfig_Firmware); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_build_build_config_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ChromeOSConfig_FirmwareSigning); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_build_build_config_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ChromeOSConfig_Identity); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_build_build_config_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ChromeOSConfig_Arc_BuildProperties); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_build_build_config_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ChromeOSConfig_Firmware_BuildTargets); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_build_build_config_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   8,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_build_build_config_proto_goTypes,
		DependencyIndexes: file_build_build_config_proto_depIdxs,
		MessageInfos:      file_build_build_config_proto_msgTypes,
	}.Build()
	File_build_build_config_proto = out.File
	file_build_build_config_proto_rawDesc = nil
	file_build_build_config_proto_goTypes = nil
	file_build_build_config_proto_depIdxs = nil
}
