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

package api

import (
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	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)
)

// TODO(b/177907747): Drop this once the migration is complete.
// List of known location that firmware can be built from.
type FwLocation int32

const (
	FwLocation_FW_LOCATION_UNKNOWN FwLocation = 0
	FwLocation_PLATFORM_EC         FwLocation = 1 // platform/ec/firmware_builder.py
	FwLocation_PLATFORM_ZEPHYR     FwLocation = 2 // platform/zephyr-chrome/firmware_builder.py
	FwLocation_PLATFORM_TI50       FwLocation = 3 // platform/ti50/common/firmware_builder.py.  Added in R90.
)

// Enum value maps for FwLocation.
var (
	FwLocation_name = map[int32]string{
		0: "FW_LOCATION_UNKNOWN",
		1: "PLATFORM_EC",
		2: "PLATFORM_ZEPHYR",
		3: "PLATFORM_TI50",
	}
	FwLocation_value = map[string]int32{
		"FW_LOCATION_UNKNOWN": 0,
		"PLATFORM_EC":         1,
		"PLATFORM_ZEPHYR":     2,
		"PLATFORM_TI50":       3,
	}
)

func (x FwLocation) Enum() *FwLocation {
	p := new(FwLocation)
	*p = x
	return p
}

func (x FwLocation) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (FwLocation) Descriptor() protoreflect.EnumDescriptor {
	return file_chromite_api_firmware_proto_enumTypes[0].Descriptor()
}

func (FwLocation) Type() protoreflect.EnumType {
	return &file_chromite_api_firmware_proto_enumTypes[0]
}

func (x FwLocation) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use FwLocation.Descriptor instead.
func (FwLocation) EnumDescriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{0}
}

type FwBuildMetric_FwSection_FwRegion int32

const (
	FwBuildMetric_FwSection_FW_REGION_UNKNOWN FwBuildMetric_FwSection_FwRegion = 0
	FwBuildMetric_FwSection_EC_RO             FwBuildMetric_FwSection_FwRegion = 1 // The entire section protected by write protect.
	FwBuildMetric_FwSection_EC_RW             FwBuildMetric_FwSection_FwRegion = 2 // Also RW_A for EFS1 systems.
	FwBuildMetric_FwSection_EC_RO_BSS         FwBuildMetric_FwSection_FwRegion = 3
	FwBuildMetric_FwSection_EC_RW_BSS         FwBuildMetric_FwSection_FwRegion = 4
	FwBuildMetric_FwSection_EC_SHARED_MEM     FwBuildMetric_FwSection_FwRegion = 5
)

// Enum value maps for FwBuildMetric_FwSection_FwRegion.
var (
	FwBuildMetric_FwSection_FwRegion_name = map[int32]string{
		0: "FW_REGION_UNKNOWN",
		1: "EC_RO",
		2: "EC_RW",
		3: "EC_RO_BSS",
		4: "EC_RW_BSS",
		5: "EC_SHARED_MEM",
	}
	FwBuildMetric_FwSection_FwRegion_value = map[string]int32{
		"FW_REGION_UNKNOWN": 0,
		"EC_RO":             1,
		"EC_RW":             2,
		"EC_RO_BSS":         3,
		"EC_RW_BSS":         4,
		"EC_SHARED_MEM":     5,
	}
)

func (x FwBuildMetric_FwSection_FwRegion) Enum() *FwBuildMetric_FwSection_FwRegion {
	p := new(FwBuildMetric_FwSection_FwRegion)
	*p = x
	return p
}

func (x FwBuildMetric_FwSection_FwRegion) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (FwBuildMetric_FwSection_FwRegion) Descriptor() protoreflect.EnumDescriptor {
	return file_chromite_api_firmware_proto_enumTypes[1].Descriptor()
}

func (FwBuildMetric_FwSection_FwRegion) Type() protoreflect.EnumType {
	return &file_chromite_api_firmware_proto_enumTypes[1]
}

func (x FwBuildMetric_FwSection_FwRegion) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use FwBuildMetric_FwSection_FwRegion.Descriptor instead.
func (FwBuildMetric_FwSection_FwRegion) EnumDescriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{0, 0, 0}
}

type FirmwareArtifactInfo_TarballInfo_FirmwareType_Type int32

const (
	FirmwareArtifactInfo_TarballInfo_FirmwareType_UNKNOWN FirmwareArtifactInfo_TarballInfo_FirmwareType_Type = 0
	FirmwareArtifactInfo_TarballInfo_FirmwareType_MAIN    FirmwareArtifactInfo_TarballInfo_FirmwareType_Type = 1
	FirmwareArtifactInfo_TarballInfo_FirmwareType_EC      FirmwareArtifactInfo_TarballInfo_FirmwareType_Type = 2
	FirmwareArtifactInfo_TarballInfo_FirmwareType_PD      FirmwareArtifactInfo_TarballInfo_FirmwareType_Type = 3
)

// Enum value maps for FirmwareArtifactInfo_TarballInfo_FirmwareType_Type.
var (
	FirmwareArtifactInfo_TarballInfo_FirmwareType_Type_name = map[int32]string{
		0: "UNKNOWN",
		1: "MAIN",
		2: "EC",
		3: "PD",
	}
	FirmwareArtifactInfo_TarballInfo_FirmwareType_Type_value = map[string]int32{
		"UNKNOWN": 0,
		"MAIN":    1,
		"EC":      2,
		"PD":      3,
	}
)

func (x FirmwareArtifactInfo_TarballInfo_FirmwareType_Type) Enum() *FirmwareArtifactInfo_TarballInfo_FirmwareType_Type {
	p := new(FirmwareArtifactInfo_TarballInfo_FirmwareType_Type)
	*p = x
	return p
}

func (x FirmwareArtifactInfo_TarballInfo_FirmwareType_Type) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (FirmwareArtifactInfo_TarballInfo_FirmwareType_Type) Descriptor() protoreflect.EnumDescriptor {
	return file_chromite_api_firmware_proto_enumTypes[2].Descriptor()
}

func (FirmwareArtifactInfo_TarballInfo_FirmwareType_Type) Type() protoreflect.EnumType {
	return &file_chromite_api_firmware_proto_enumTypes[2]
}

func (x FirmwareArtifactInfo_TarballInfo_FirmwareType_Type) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use FirmwareArtifactInfo_TarballInfo_FirmwareType_Type.Descriptor instead.
func (FirmwareArtifactInfo_TarballInfo_FirmwareType_Type) EnumDescriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{14, 0, 0, 0}
}

// Metrics collected on every successful firmware build.
type FwBuildMetric struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Lowercase name of the firmware target built. E.g. phaser.
	TargetName string `protobuf:"bytes,1,opt,name=target_name,json=targetName,proto3" json:"target_name,omitempty"`
	// Lowercase name of the platform the firmware target belongs to. May be
	// blank. E.g. octopus.
	PlatformName string `protobuf:"bytes,2,opt,name=platform_name,json=platformName,proto3" json:"platform_name,omitempty"`
	// List of firmware sections and their free and total sizes in bytes.
	FwSection []*FwBuildMetric_FwSection `protobuf:"bytes,3,rep,name=fw_section,json=fwSection,proto3" json:"fw_section,omitempty"`
	// Optional information related to a specific target type.
	//
	// Types that are assignable to ImageType:
	//	*FwBuildMetric_Zephyr
	ImageType isFwBuildMetric_ImageType `protobuf_oneof:"image_type"`
}

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

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

func (*FwBuildMetric) ProtoMessage() {}

func (x *FwBuildMetric) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_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 FwBuildMetric.ProtoReflect.Descriptor instead.
func (*FwBuildMetric) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{0}
}

func (x *FwBuildMetric) GetTargetName() string {
	if x != nil {
		return x.TargetName
	}
	return ""
}

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

func (x *FwBuildMetric) GetFwSection() []*FwBuildMetric_FwSection {
	if x != nil {
		return x.FwSection
	}
	return nil
}

func (m *FwBuildMetric) GetImageType() isFwBuildMetric_ImageType {
	if m != nil {
		return m.ImageType
	}
	return nil
}

func (x *FwBuildMetric) GetZephyr() *FwBuildMetric_ZephyrTarget {
	if x, ok := x.GetImageType().(*FwBuildMetric_Zephyr); ok {
		return x.Zephyr
	}
	return nil
}

type isFwBuildMetric_ImageType interface {
	isFwBuildMetric_ImageType()
}

type FwBuildMetric_Zephyr struct {
	Zephyr *FwBuildMetric_ZephyrTarget `protobuf:"bytes,4,opt,name=zephyr,proto3,oneof"`
}

func (*FwBuildMetric_Zephyr) isFwBuildMetric_ImageType() {}

// A list of FW metrics collected on every successful firmware build
// Implementation note, this is a separate message since it serves as the
// serialization base between the build_api end point and the entry point
// in the firmware_builder.py.
type FwBuildMetricList struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Value []*FwBuildMetric `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"`
}

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

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

func (*FwBuildMetricList) ProtoMessage() {}

func (x *FwBuildMetricList) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_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 FwBuildMetricList.ProtoReflect.Descriptor instead.
func (*FwBuildMetricList) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{1}
}

func (x *FwBuildMetricList) GetValue() []*FwBuildMetric {
	if x != nil {
		return x.Value
	}
	return nil
}

// Metrics collect on successful firmware unit test runs.
type FwTestMetric struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Name of firmware test.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
}

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

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

func (*FwTestMetric) ProtoMessage() {}

func (x *FwTestMetric) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_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 FwTestMetric.ProtoReflect.Descriptor instead.
func (*FwTestMetric) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{2}
}

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

// A list of FW metrics collected on every successful firmware unit test.
// Implementation note, this is a separate message since it serves as the
// serialization base between the build_api end point and the entry point
// in the firmware_builder.py.
type FwTestMetricList struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Value []*FwTestMetric `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"`
}

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

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

func (*FwTestMetricList) ProtoMessage() {}

func (x *FwTestMetricList) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_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 FwTestMetricList.ProtoReflect.Descriptor instead.
func (*FwTestMetricList) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{3}
}

func (x *FwTestMetricList) GetValue() []*FwTestMetric {
	if x != nil {
		return x.Value
	}
	return nil
}

// TODO(b/177907747): Drop this once the migration is complete.
type BuildAllTotFirmwareRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Location of firmware to build call into firmware_builder.py entry point.
	// The `build` subcommand will be called.
	FirmwareLocation FwLocation `protobuf:"varint,1,opt,name=firmware_location,json=firmwareLocation,proto3,enum=chromite.api.FwLocation" json:"firmware_location,omitempty"`
	// The chroot where the operations will be executed.
	// Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// Whether to pass --code-coverage to firmware_builder.py.
	CodeCoverage bool `protobuf:"varint,3,opt,name=code_coverage,json=codeCoverage,proto3" json:"code_coverage,omitempty"`
}

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

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

func (*BuildAllTotFirmwareRequest) ProtoMessage() {}

func (x *BuildAllTotFirmwareRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_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 BuildAllTotFirmwareRequest.ProtoReflect.Descriptor instead.
func (*BuildAllTotFirmwareRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{4}
}

func (x *BuildAllTotFirmwareRequest) GetFirmwareLocation() FwLocation {
	if x != nil {
		return x.FirmwareLocation
	}
	return FwLocation_FW_LOCATION_UNKNOWN
}

func (x *BuildAllTotFirmwareRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

func (x *BuildAllTotFirmwareRequest) GetCodeCoverage() bool {
	if x != nil {
		return x.CodeCoverage
	}
	return false
}

// TODO(b/177907747): Drop this once the migration is complete.
type BuildAllTotFirmwareResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Metrics collected on every successful firmware build
	Metrics *FwBuildMetricList `protobuf:"bytes,1,opt,name=metrics,proto3" json:"metrics,omitempty"`
}

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

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

func (*BuildAllTotFirmwareResponse) ProtoMessage() {}

func (x *BuildAllTotFirmwareResponse) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_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 BuildAllTotFirmwareResponse.ProtoReflect.Descriptor instead.
func (*BuildAllTotFirmwareResponse) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{5}
}

func (x *BuildAllTotFirmwareResponse) GetMetrics() *FwBuildMetricList {
	if x != nil {
		return x.Metrics
	}
	return nil
}

// TODO(b/177907747): Drop this once the migration is complete.
type TestAllTotFirmwareRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Location of firmware to build call into firmware_builder.py entry point.
	// The `test` subcommand will be called
	FirmwareLocation FwLocation `protobuf:"varint,1,opt,name=firmware_location,json=firmwareLocation,proto3,enum=chromite.api.FwLocation" json:"firmware_location,omitempty"`
	// The chroot where the operations will be executed.
	// Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// Whether to pass --code-coverage to firmware_builder.py.
	CodeCoverage bool `protobuf:"varint,3,opt,name=code_coverage,json=codeCoverage,proto3" json:"code_coverage,omitempty"`
}

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

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

func (*TestAllTotFirmwareRequest) ProtoMessage() {}

func (x *TestAllTotFirmwareRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_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 TestAllTotFirmwareRequest.ProtoReflect.Descriptor instead.
func (*TestAllTotFirmwareRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{6}
}

func (x *TestAllTotFirmwareRequest) GetFirmwareLocation() FwLocation {
	if x != nil {
		return x.FirmwareLocation
	}
	return FwLocation_FW_LOCATION_UNKNOWN
}

func (x *TestAllTotFirmwareRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

func (x *TestAllTotFirmwareRequest) GetCodeCoverage() bool {
	if x != nil {
		return x.CodeCoverage
	}
	return false
}

// TODO(b/177907747): Drop this once the migration is complete.
type TestAllTotFirmwareResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Metrics collect on successfuly firmware unit test runs
	Metrics *FwTestMetricList `protobuf:"bytes,1,opt,name=metrics,proto3" json:"metrics,omitempty"`
}

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

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

func (*TestAllTotFirmwareResponse) ProtoMessage() {}

func (x *TestAllTotFirmwareResponse) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_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 TestAllTotFirmwareResponse.ProtoReflect.Descriptor instead.
func (*TestAllTotFirmwareResponse) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{7}
}

func (x *TestAllTotFirmwareResponse) GetMetrics() *FwTestMetricList {
	if x != nil {
		return x.Metrics
	}
	return nil
}

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

	// Location of firmware to build call into firmware_builder.py entry point.
	// The `build` subcommand will be called
	FirmwareLocation chromiumos.FwLocation `protobuf:"varint,1,opt,name=firmware_location,json=firmwareLocation,proto3,enum=chromiumos.FwLocation" json:"firmware_location,omitempty"`
	// The chroot where the operations will be executed.
	// Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// Whether to pass --code-coverage to firmware_builder.py.
	CodeCoverage bool `protobuf:"varint,3,opt,name=code_coverage,json=codeCoverage,proto3" json:"code_coverage,omitempty"`
}

func (x *BuildAllFirmwareRequest) Reset() {
	*x = BuildAllFirmwareRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[8]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*BuildAllFirmwareRequest) ProtoMessage() {}

func (x *BuildAllFirmwareRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[8]
	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 BuildAllFirmwareRequest.ProtoReflect.Descriptor instead.
func (*BuildAllFirmwareRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{8}
}

func (x *BuildAllFirmwareRequest) GetFirmwareLocation() chromiumos.FwLocation {
	if x != nil {
		return x.FirmwareLocation
	}
	return chromiumos.FwLocation_FW_LOCATION_UNKNOWN
}

func (x *BuildAllFirmwareRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

func (x *BuildAllFirmwareRequest) GetCodeCoverage() bool {
	if x != nil {
		return x.CodeCoverage
	}
	return false
}

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

	// Metrics collected on every successful firmware build
	Metrics *FwBuildMetricList `protobuf:"bytes,1,opt,name=metrics,proto3" json:"metrics,omitempty"`
}

func (x *BuildAllFirmwareResponse) Reset() {
	*x = BuildAllFirmwareResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[9]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*BuildAllFirmwareResponse) ProtoMessage() {}

func (x *BuildAllFirmwareResponse) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[9]
	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 BuildAllFirmwareResponse.ProtoReflect.Descriptor instead.
func (*BuildAllFirmwareResponse) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{9}
}

func (x *BuildAllFirmwareResponse) GetMetrics() *FwBuildMetricList {
	if x != nil {
		return x.Metrics
	}
	return nil
}

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

	// Location of firmware to build call into firmware_builder.py entry point.
	// The `test` subcommand will be called
	FirmwareLocation chromiumos.FwLocation `protobuf:"varint,1,opt,name=firmware_location,json=firmwareLocation,proto3,enum=chromiumos.FwLocation" json:"firmware_location,omitempty"`
	// The chroot where the operations will be executed.
	// Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// Whether to pass --code-coverage to firmware_builder.py.
	CodeCoverage bool `protobuf:"varint,3,opt,name=code_coverage,json=codeCoverage,proto3" json:"code_coverage,omitempty"`
}

func (x *TestAllFirmwareRequest) Reset() {
	*x = TestAllFirmwareRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[10]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*TestAllFirmwareRequest) ProtoMessage() {}

func (x *TestAllFirmwareRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[10]
	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 TestAllFirmwareRequest.ProtoReflect.Descriptor instead.
func (*TestAllFirmwareRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{10}
}

func (x *TestAllFirmwareRequest) GetFirmwareLocation() chromiumos.FwLocation {
	if x != nil {
		return x.FirmwareLocation
	}
	return chromiumos.FwLocation_FW_LOCATION_UNKNOWN
}

func (x *TestAllFirmwareRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

func (x *TestAllFirmwareRequest) GetCodeCoverage() bool {
	if x != nil {
		return x.CodeCoverage
	}
	return false
}

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

	// Metrics collect on successfuly firmware unit test runs
	Metrics *FwTestMetricList `protobuf:"bytes,1,opt,name=metrics,proto3" json:"metrics,omitempty"`
}

func (x *TestAllFirmwareResponse) Reset() {
	*x = TestAllFirmwareResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[11]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*TestAllFirmwareResponse) ProtoMessage() {}

func (x *TestAllFirmwareResponse) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[11]
	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 TestAllFirmwareResponse.ProtoReflect.Descriptor instead.
func (*TestAllFirmwareResponse) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{11}
}

func (x *TestAllFirmwareResponse) GetMetrics() *FwTestMetricList {
	if x != nil {
		return x.Metrics
	}
	return nil
}

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

	// The chroot where the operations will be executed.
	// Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The output directory in which to place the bundled artifacts.
	ResultPath *chromiumos.ResultPath `protobuf:"bytes,3,opt,name=result_path,json=resultPath,proto3" json:"result_path,omitempty"`
	// The artifact types requested.  The firmware_location is found in
	// artifacts.output_artifacts[].location.
	Artifacts *chromiumos.ArtifactsByService_Firmware `protobuf:"bytes,4,opt,name=artifacts,proto3" json:"artifacts,omitempty"`
}

func (x *BundleFirmwareArtifactsRequest) Reset() {
	*x = BundleFirmwareArtifactsRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[12]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*BundleFirmwareArtifactsRequest) ProtoMessage() {}

func (x *BundleFirmwareArtifactsRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[12]
	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 BundleFirmwareArtifactsRequest.ProtoReflect.Descriptor instead.
func (*BundleFirmwareArtifactsRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{12}
}

func (x *BundleFirmwareArtifactsRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

func (x *BundleFirmwareArtifactsRequest) GetResultPath() *chromiumos.ResultPath {
	if x != nil {
		return x.ResultPath
	}
	return nil
}

func (x *BundleFirmwareArtifactsRequest) GetArtifacts() *chromiumos.ArtifactsByService_Firmware {
	if x != nil {
		return x.Artifacts
	}
	return nil
}

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

	// The artifacts that were bundled.
	Artifacts *chromiumos.UploadedArtifactsByService_Firmware `protobuf:"bytes,1,opt,name=artifacts,proto3" json:"artifacts,omitempty"`
}

func (x *BundleFirmwareArtifactsResponse) Reset() {
	*x = BundleFirmwareArtifactsResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[13]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*BundleFirmwareArtifactsResponse) ProtoMessage() {}

func (x *BundleFirmwareArtifactsResponse) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[13]
	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 BundleFirmwareArtifactsResponse.ProtoReflect.Descriptor instead.
func (*BundleFirmwareArtifactsResponse) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{13}
}

func (x *BundleFirmwareArtifactsResponse) GetArtifacts() *chromiumos.UploadedArtifactsByService_Firmware {
	if x != nil {
		return x.Artifacts
	}
	return nil
}

// Contents of a Firmware.FIRMWARE_TARBALL_INFO artifact.
type FirmwareArtifactInfo struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Objects []*FirmwareArtifactInfo_ObjectInfo `protobuf:"bytes,1,rep,name=objects,proto3" json:"objects,omitempty"`
}

func (x *FirmwareArtifactInfo) Reset() {
	*x = FirmwareArtifactInfo{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[14]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*FirmwareArtifactInfo) ProtoMessage() {}

func (x *FirmwareArtifactInfo) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[14]
	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 FirmwareArtifactInfo.ProtoReflect.Descriptor instead.
func (*FirmwareArtifactInfo) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{14}
}

func (x *FirmwareArtifactInfo) GetObjects() []*FirmwareArtifactInfo_ObjectInfo {
	if x != nil {
		return x.Objects
	}
	return nil
}

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

	// Region as described in FMAP or linker script.
	// E.g. EC_RO, EC_RW, EC_NVRAM, RO_BSS, RW_BSS, SHARED_MEM.
	Region FwBuildMetric_FwSection_FwRegion `protobuf:"varint,1,opt,name=region,proto3,enum=chromite.api.FwBuildMetric_FwSection_FwRegion" json:"region,omitempty"`
	// The number of bytes used in this section.
	Used uint32 `protobuf:"varint,2,opt,name=used,proto3" json:"used,omitempty"`
	// The total number of bytes available in this section.
	Total uint32 `protobuf:"varint,3,opt,name=total,proto3" json:"total,omitempty"`
}

func (x *FwBuildMetric_FwSection) Reset() {
	*x = FwBuildMetric_FwSection{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[15]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*FwBuildMetric_FwSection) ProtoMessage() {}

func (x *FwBuildMetric_FwSection) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[15]
	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 FwBuildMetric_FwSection.ProtoReflect.Descriptor instead.
func (*FwBuildMetric_FwSection) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{0, 0}
}

func (x *FwBuildMetric_FwSection) GetRegion() FwBuildMetric_FwSection_FwRegion {
	if x != nil {
		return x.Region
	}
	return FwBuildMetric_FwSection_FW_REGION_UNKNOWN
}

func (x *FwBuildMetric_FwSection) GetUsed() uint32 {
	if x != nil {
		return x.Used
	}
	return 0
}

func (x *FwBuildMetric_FwSection) GetTotal() uint32 {
	if x != nil {
		return x.Total
	}
	return 0
}

// Version number components: "major.minor.tiny".
type FwBuildMetric_Version struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Major uint32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"`
	Minor uint32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"`
	Tiny  uint32 `protobuf:"varint,3,opt,name=tiny,proto3" json:"tiny,omitempty"`
}

func (x *FwBuildMetric_Version) Reset() {
	*x = FwBuildMetric_Version{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[16]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*FwBuildMetric_Version) ProtoMessage() {}

func (x *FwBuildMetric_Version) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[16]
	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 FwBuildMetric_Version.ProtoReflect.Descriptor instead.
func (*FwBuildMetric_Version) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{0, 1}
}

func (x *FwBuildMetric_Version) GetMajor() uint32 {
	if x != nil {
		return x.Major
	}
	return 0
}

func (x *FwBuildMetric_Version) GetMinor() uint32 {
	if x != nil {
		return x.Minor
	}
	return 0
}

func (x *FwBuildMetric_Version) GetTiny() uint32 {
	if x != nil {
		return x.Tiny
	}
	return 0
}

// Zephyr-base firmware target related build metrics.
type FwBuildMetric_ZephyrTarget struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The version of the Zephyr kernel used during build.
	KernelVersion *FwBuildMetric_Version `protobuf:"bytes,1,opt,name=kernel_version,json=kernelVersion,proto3" json:"kernel_version,omitempty"`
}

func (x *FwBuildMetric_ZephyrTarget) Reset() {
	*x = FwBuildMetric_ZephyrTarget{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[17]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*FwBuildMetric_ZephyrTarget) ProtoMessage() {}

func (x *FwBuildMetric_ZephyrTarget) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[17]
	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 FwBuildMetric_ZephyrTarget.ProtoReflect.Descriptor instead.
func (*FwBuildMetric_ZephyrTarget) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{0, 2}
}

func (x *FwBuildMetric_ZephyrTarget) GetKernelVersion() *FwBuildMetric_Version {
	if x != nil {
		return x.KernelVersion
	}
	return nil
}

// TODO(crbug/1176305): Use types from
// chromiumos/config/api/software/firmware_config.proto
type FirmwareArtifactInfo_TarballInfo struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The Chrome OS style version
	BcsVersion string `protobuf:"bytes,1,opt,name=bcs_version,json=bcsVersion,proto3" json:"bcs_version,omitempty"`
	// The name of the firmware image used by the firmware updater. Typically
	// the device name, but can differ when a device may have two or more
	// different firmware images.
	FirmwareImageName string                                             `protobuf:"bytes,2,opt,name=firmware_image_name,json=firmwareImageName,proto3" json:"firmware_image_name,omitempty"`
	Type              FirmwareArtifactInfo_TarballInfo_FirmwareType_Type `protobuf:"varint,3,opt,name=type,proto3,enum=chromite.api.FirmwareArtifactInfo_TarballInfo_FirmwareType_Type" json:"type,omitempty"`
	Version           *FirmwareArtifactInfo_TarballInfo_Version          `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"`
}

func (x *FirmwareArtifactInfo_TarballInfo) Reset() {
	*x = FirmwareArtifactInfo_TarballInfo{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[18]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*FirmwareArtifactInfo_TarballInfo) ProtoMessage() {}

func (x *FirmwareArtifactInfo_TarballInfo) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[18]
	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 FirmwareArtifactInfo_TarballInfo.ProtoReflect.Descriptor instead.
func (*FirmwareArtifactInfo_TarballInfo) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{14, 0}
}

func (x *FirmwareArtifactInfo_TarballInfo) GetBcsVersion() string {
	if x != nil {
		return x.BcsVersion
	}
	return ""
}

func (x *FirmwareArtifactInfo_TarballInfo) GetFirmwareImageName() string {
	if x != nil {
		return x.FirmwareImageName
	}
	return ""
}

func (x *FirmwareArtifactInfo_TarballInfo) GetType() FirmwareArtifactInfo_TarballInfo_FirmwareType_Type {
	if x != nil {
		return x.Type
	}
	return FirmwareArtifactInfo_TarballInfo_FirmwareType_UNKNOWN
}

func (x *FirmwareArtifactInfo_TarballInfo) GetVersion() *FirmwareArtifactInfo_TarballInfo_Version {
	if x != nil {
		return x.Version
	}
	return nil
}

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

	// The name of the file.
	FileName string `protobuf:"bytes,1,opt,name=file_name,json=fileName,proto3" json:"file_name,omitempty"`
	// Types that are assignable to FirmwareObjectInfo:
	//	*FirmwareArtifactInfo_ObjectInfo_TarballInfo
	FirmwareObjectInfo isFirmwareArtifactInfo_ObjectInfo_FirmwareObjectInfo `protobuf_oneof:"firmware_object_info"`
}

func (x *FirmwareArtifactInfo_ObjectInfo) Reset() {
	*x = FirmwareArtifactInfo_ObjectInfo{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[19]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*FirmwareArtifactInfo_ObjectInfo) ProtoMessage() {}

func (x *FirmwareArtifactInfo_ObjectInfo) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[19]
	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 FirmwareArtifactInfo_ObjectInfo.ProtoReflect.Descriptor instead.
func (*FirmwareArtifactInfo_ObjectInfo) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{14, 1}
}

func (x *FirmwareArtifactInfo_ObjectInfo) GetFileName() string {
	if x != nil {
		return x.FileName
	}
	return ""
}

func (m *FirmwareArtifactInfo_ObjectInfo) GetFirmwareObjectInfo() isFirmwareArtifactInfo_ObjectInfo_FirmwareObjectInfo {
	if m != nil {
		return m.FirmwareObjectInfo
	}
	return nil
}

func (x *FirmwareArtifactInfo_ObjectInfo) GetTarballInfo() *FirmwareArtifactInfo_TarballInfo {
	if x, ok := x.GetFirmwareObjectInfo().(*FirmwareArtifactInfo_ObjectInfo_TarballInfo); ok {
		return x.TarballInfo
	}
	return nil
}

type isFirmwareArtifactInfo_ObjectInfo_FirmwareObjectInfo interface {
	isFirmwareArtifactInfo_ObjectInfo_FirmwareObjectInfo()
}

type FirmwareArtifactInfo_ObjectInfo_TarballInfo struct {
	// Info about Firmware.FIRMWARE_TARBALL.
	TarballInfo *FirmwareArtifactInfo_TarballInfo `protobuf:"bytes,2,opt,name=tarball_info,json=tarballInfo,proto3,oneof"`
}

func (*FirmwareArtifactInfo_ObjectInfo_TarballInfo) isFirmwareArtifactInfo_ObjectInfo_FirmwareObjectInfo() {
}

// The type of a firmware binary.
type FirmwareArtifactInfo_TarballInfo_FirmwareType struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *FirmwareArtifactInfo_TarballInfo_FirmwareType) Reset() {
	*x = FirmwareArtifactInfo_TarballInfo_FirmwareType{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[20]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*FirmwareArtifactInfo_TarballInfo_FirmwareType) ProtoMessage() {}

func (x *FirmwareArtifactInfo_TarballInfo_FirmwareType) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[20]
	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 FirmwareArtifactInfo_TarballInfo_FirmwareType.ProtoReflect.Descriptor instead.
func (*FirmwareArtifactInfo_TarballInfo_FirmwareType) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{14, 0, 0}
}

// The firmware version from updater.sh --manifest.
type FirmwareArtifactInfo_TarballInfo_Version struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Major int32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"`
	Minor int32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"`
}

func (x *FirmwareArtifactInfo_TarballInfo_Version) Reset() {
	*x = FirmwareArtifactInfo_TarballInfo_Version{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[21]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*FirmwareArtifactInfo_TarballInfo_Version) ProtoMessage() {}

func (x *FirmwareArtifactInfo_TarballInfo_Version) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[21]
	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 FirmwareArtifactInfo_TarballInfo_Version.ProtoReflect.Descriptor instead.
func (*FirmwareArtifactInfo_TarballInfo_Version) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{14, 0, 1}
}

func (x *FirmwareArtifactInfo_TarballInfo_Version) GetMajor() int32 {
	if x != nil {
		return x.Major
	}
	return 0
}

func (x *FirmwareArtifactInfo_TarballInfo_Version) GetMinor() int32 {
	if x != nil {
		return x.Minor
	}
	return 0
}

var File_chromite_api_firmware_proto protoreflect.FileDescriptor

var file_chromite_api_firmware_proto_rawDesc = []byte{
	0x0a, 0x1b, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66,
	0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x63,
	0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x1a, 0x1c, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f,
	0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x22, 0xfe, 0x04, 0x0a, 0x0d, 0x46, 0x77, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65,
	0x74, 0x72, 0x69, 0x63, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6e,
	0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65,
	0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72,
	0x6d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x6c,
	0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x44, 0x0a, 0x0a, 0x66, 0x77,
	0x5f, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25,
	0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x77,
	0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x46, 0x77, 0x53, 0x65,
	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x66, 0x77, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
	0x12, 0x42, 0x0a, 0x06, 0x7a, 0x65, 0x70, 0x68, 0x79, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x28, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e,
	0x46, 0x77, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x5a, 0x65,
	0x70, 0x68, 0x79, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x48, 0x00, 0x52, 0x06, 0x7a, 0x65,
	0x70, 0x68, 0x79, 0x72, 0x1a, 0xe7, 0x01, 0x0a, 0x09, 0x46, 0x77, 0x53, 0x65, 0x63, 0x74, 0x69,
	0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70,
	0x69, 0x2e, 0x46, 0x77, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x2e,
	0x46, 0x77, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x46, 0x77, 0x52, 0x65, 0x67, 0x69,
	0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73,
	0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x75, 0x73, 0x65, 0x64, 0x12, 0x14,
	0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x74,
	0x6f, 0x74, 0x61, 0x6c, 0x22, 0x68, 0x0a, 0x08, 0x46, 0x77, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e,
	0x12, 0x15, 0x0a, 0x11, 0x46, 0x57, 0x5f, 0x52, 0x45, 0x47, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e,
	0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x43, 0x5f, 0x52, 0x4f,
	0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x43, 0x5f, 0x52, 0x57, 0x10, 0x02, 0x12, 0x0d, 0x0a,
	0x09, 0x45, 0x43, 0x5f, 0x52, 0x4f, 0x5f, 0x42, 0x53, 0x53, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09,
	0x45, 0x43, 0x5f, 0x52, 0x57, 0x5f, 0x42, 0x53, 0x53, 0x10, 0x04, 0x12, 0x11, 0x0a, 0x0d, 0x45,
	0x43, 0x5f, 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x5f, 0x4d, 0x45, 0x4d, 0x10, 0x05, 0x1a, 0x49,
	0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x6a,
	0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12,
	0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05,
	0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6e, 0x79, 0x18, 0x03, 0x20,
	0x01, 0x28, 0x0d, 0x52, 0x04, 0x74, 0x69, 0x6e, 0x79, 0x1a, 0x5a, 0x0a, 0x0c, 0x5a, 0x65, 0x70,
	0x68, 0x79, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x4a, 0x0a, 0x0e, 0x6b, 0x65, 0x72,
	0x6e, 0x65, 0x6c, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x23, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69,
	0x2e, 0x46, 0x77, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x56,
	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x56, 0x65,
	0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x0c, 0x0a, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x74,
	0x79, 0x70, 0x65, 0x22, 0x46, 0x0a, 0x11, 0x46, 0x77, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65,
	0x74, 0x72, 0x69, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
	0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x77, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65,
	0x74, 0x72, 0x69, 0x63, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x22, 0x0a, 0x0c, 0x46,
	0x77, 0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e,
	0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22,
	0x44, 0x0a, 0x10, 0x46, 0x77, 0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4c,
	0x69, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x03,
	0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70,
	0x69, 0x2e, 0x46, 0x77, 0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x05,
	0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xb4, 0x01, 0x0a, 0x1a, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x41,
	0x6c, 0x6c, 0x54, 0x6f, 0x74, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71,
	0x75, 0x65, 0x73, 0x74, 0x12, 0x45, 0x0a, 0x11, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65,
	0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32,
	0x18, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46,
	0x77, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x69, 0x72, 0x6d, 0x77,
	0x61, 0x72, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x06, 0x63,
	0x68, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x52,
	0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x64, 0x65, 0x5f,
	0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c,
	0x63, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x22, 0x58, 0x0a, 0x1b,
	0x42, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x74, 0x46, 0x69, 0x72, 0x6d, 0x77,
	0x61, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x07, 0x6d,
	0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63,
	0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x77, 0x42, 0x75,
	0x69, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x07, 0x6d,
	0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xb3, 0x01, 0x0a, 0x19, 0x54, 0x65, 0x73, 0x74, 0x41,
	0x6c, 0x6c, 0x54, 0x6f, 0x74, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71,
	0x75, 0x65, 0x73, 0x74, 0x12, 0x45, 0x0a, 0x11, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65,
	0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32,
	0x18, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46,
	0x77, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x69, 0x72, 0x6d, 0x77,
	0x61, 0x72, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x06, 0x63,
	0x68, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x52,
	0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x64, 0x65, 0x5f,
	0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c,
	0x63, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x22, 0x56, 0x0a, 0x1a,
	0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x74, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61,
	0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x07, 0x6d, 0x65,
	0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x77, 0x54, 0x65, 0x73,
	0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x07, 0x6d, 0x65, 0x74,
	0x72, 0x69, 0x63, 0x73, 0x22, 0xaf, 0x01, 0x0a, 0x17, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x6c,
	0x6c, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
	0x12, 0x43, 0x0a, 0x11, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x6c, 0x6f, 0x63,
	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x46, 0x77, 0x4c, 0x6f, 0x63, 0x61, 0x74,
	0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x4c, 0x6f, 0x63,
	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d,
	0x6f, 0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f,
	0x74, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61,
	0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x63, 0x6f, 0x64, 0x65, 0x43, 0x6f,
	0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x22, 0x55, 0x0a, 0x18, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x41,
	0x6c, 0x6c, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
	0x73, 0x65, 0x12, 0x39, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61,
	0x70, 0x69, 0x2e, 0x46, 0x77, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63,
	0x4c, 0x69, 0x73, 0x74, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xae, 0x01,
	0x0a, 0x16, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72,
	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x11, 0x66, 0x69, 0x72, 0x6d,
	0x77, 0x61, 0x72, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73,
	0x2e, 0x46, 0x77, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x69, 0x72,
	0x6d, 0x77, 0x61, 0x72, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a,
	0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6f,
	0x74, 0x52, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x64,
	0x65, 0x5f, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08,
	0x52, 0x0c, 0x63, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x22, 0x53,
	0x0a, 0x17, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72,
	0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x07, 0x6d, 0x65, 0x74,
	0x72, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x77, 0x54, 0x65, 0x73, 0x74,
	0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72,
	0x69, 0x63, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1e, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x46, 0x69,
	0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x52,
	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74,
	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75,
	0x6d, 0x6f, 0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x06, 0x63, 0x68, 0x72, 0x6f,
	0x6f, 0x74, 0x12, 0x37, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x70, 0x61, 0x74,
	0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52,
	0x0a, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x45, 0x0a, 0x09, 0x61,
	0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27,
	0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x72, 0x74, 0x69,
	0x66, 0x61, 0x63, 0x74, 0x73, 0x42, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x46,
	0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63,
	0x74, 0x73, 0x22, 0x70, 0x0a, 0x1f, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x46, 0x69, 0x72, 0x6d,
	0x77, 0x61, 0x72, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73,
	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63,
	0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x41, 0x72,
	0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x42, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
	0x2e, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66,
	0x61, 0x63, 0x74, 0x73, 0x22, 0xf7, 0x04, 0x0a, 0x14, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72,
	0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x47, 0x0a,
	0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d,
	0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69,
	0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x49, 0x6e,
	0x66, 0x6f, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x6f,
	0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x1a, 0xfc, 0x02, 0x0a, 0x0b, 0x54, 0x61, 0x72, 0x62, 0x61,
	0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x63, 0x73, 0x5f, 0x76, 0x65,
	0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x63, 0x73,
	0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x69, 0x72, 0x6d, 0x77,
	0x61, 0x72, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x49, 0x6d,
	0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x54, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18,
	0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x40, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65,
	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x41, 0x72, 0x74,
	0x69, 0x66, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x54, 0x61, 0x72, 0x62, 0x61, 0x6c,
	0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x54, 0x79,
	0x70, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x50, 0x0a,
	0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36,
	0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69,
	0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x49, 0x6e,
	0x66, 0x6f, 0x2e, 0x54, 0x61, 0x72, 0x62, 0x61, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56,
	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a,
	0x3d, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22,
	0x2d, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f,
	0x57, 0x4e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x4d, 0x41, 0x49, 0x4e, 0x10, 0x01, 0x12, 0x06,
	0x0a, 0x02, 0x45, 0x43, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x50, 0x44, 0x10, 0x03, 0x1a, 0x35,
	0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x6a,
	0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12,
	0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05,
	0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x1a, 0x96, 0x01, 0x0a, 0x0a, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74,
	0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d,
	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d,
	0x65, 0x12, 0x53, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x62, 0x61, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, 0x66,
	0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x41,
	0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x54, 0x61, 0x72, 0x62,
	0x61, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x61, 0x72, 0x62, 0x61,
	0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x16, 0x0a, 0x14, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61,
	0x72, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x2a, 0x5e,
	0x0a, 0x0a, 0x46, 0x77, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x13,
	0x46, 0x57, 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4b, 0x4e,
	0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x50, 0x4c, 0x41, 0x54, 0x46, 0x4f, 0x52,
	0x4d, 0x5f, 0x45, 0x43, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x4c, 0x41, 0x54, 0x46, 0x4f,
	0x52, 0x4d, 0x5f, 0x5a, 0x45, 0x50, 0x48, 0x59, 0x52, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x50,
	0x4c, 0x41, 0x54, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x54, 0x49, 0x35, 0x30, 0x10, 0x03, 0x32, 0xb3,
	0x04, 0x0a, 0x0f, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69,
	0x63, 0x65, 0x12, 0x6a, 0x0a, 0x13, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x6c, 0x6c, 0x54, 0x6f,
	0x74, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x12, 0x28, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x6c,
	0x6c, 0x54, 0x6f, 0x74, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75,
	0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61,
	0x70, 0x69, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x74, 0x46, 0x69,
	0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67,
	0x0a, 0x12, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x74, 0x46, 0x69, 0x72, 0x6d,
	0x77, 0x61, 0x72, 0x65, 0x12, 0x27, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e,
	0x61, 0x70, 0x69, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x74, 0x46, 0x69,
	0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x65, 0x73,
	0x74, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x74, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52,
	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x10, 0x42, 0x75, 0x69, 0x6c, 0x64,
	0x41, 0x6c, 0x6c, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x12, 0x25, 0x2e, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64,
	0x41, 0x6c, 0x6c, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
	0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70,
	0x69, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x6c, 0x6c, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61,
	0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x0f, 0x54, 0x65,
	0x73, 0x74, 0x41, 0x6c, 0x6c, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x12, 0x24, 0x2e,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x65, 0x73,
	0x74, 0x41, 0x6c, 0x6c, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75,
	0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61,
	0x70, 0x69, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61,
	0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x17, 0x42, 0x75,
	0x6e, 0x64, 0x6c, 0x65, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x41, 0x72, 0x74, 0x69,
	0x66, 0x61, 0x63, 0x74, 0x73, 0x12, 0x2c, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65,
	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x46, 0x69, 0x72, 0x6d, 0x77,
	0x61, 0x72, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75,
	0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61,
	0x70, 0x69, 0x2e, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72,
	0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
	0x73, 0x65, 0x1a, 0x10, 0xc2, 0xed, 0x1a, 0x0c, 0x0a, 0x08, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61,
	0x72, 0x65, 0x10, 0x01, 0x42, 0x38, 0x5a, 0x36, 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, 0x67,
	0x6f, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x62, 0x06,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_chromite_api_firmware_proto_rawDescOnce sync.Once
	file_chromite_api_firmware_proto_rawDescData = file_chromite_api_firmware_proto_rawDesc
)

func file_chromite_api_firmware_proto_rawDescGZIP() []byte {
	file_chromite_api_firmware_proto_rawDescOnce.Do(func() {
		file_chromite_api_firmware_proto_rawDescData = protoimpl.X.CompressGZIP(file_chromite_api_firmware_proto_rawDescData)
	})
	return file_chromite_api_firmware_proto_rawDescData
}

var file_chromite_api_firmware_proto_enumTypes = make([]protoimpl.EnumInfo, 3)
var file_chromite_api_firmware_proto_msgTypes = make([]protoimpl.MessageInfo, 22)
var file_chromite_api_firmware_proto_goTypes = []interface{}{
	(FwLocation)(0),                                         // 0: chromite.api.FwLocation
	(FwBuildMetric_FwSection_FwRegion)(0),                   // 1: chromite.api.FwBuildMetric.FwSection.FwRegion
	(FirmwareArtifactInfo_TarballInfo_FirmwareType_Type)(0), // 2: chromite.api.FirmwareArtifactInfo.TarballInfo.FirmwareType.Type
	(*FwBuildMetric)(nil),                                   // 3: chromite.api.FwBuildMetric
	(*FwBuildMetricList)(nil),                               // 4: chromite.api.FwBuildMetricList
	(*FwTestMetric)(nil),                                    // 5: chromite.api.FwTestMetric
	(*FwTestMetricList)(nil),                                // 6: chromite.api.FwTestMetricList
	(*BuildAllTotFirmwareRequest)(nil),                      // 7: chromite.api.BuildAllTotFirmwareRequest
	(*BuildAllTotFirmwareResponse)(nil),                     // 8: chromite.api.BuildAllTotFirmwareResponse
	(*TestAllTotFirmwareRequest)(nil),                       // 9: chromite.api.TestAllTotFirmwareRequest
	(*TestAllTotFirmwareResponse)(nil),                      // 10: chromite.api.TestAllTotFirmwareResponse
	(*BuildAllFirmwareRequest)(nil),                         // 11: chromite.api.BuildAllFirmwareRequest
	(*BuildAllFirmwareResponse)(nil),                        // 12: chromite.api.BuildAllFirmwareResponse
	(*TestAllFirmwareRequest)(nil),                          // 13: chromite.api.TestAllFirmwareRequest
	(*TestAllFirmwareResponse)(nil),                         // 14: chromite.api.TestAllFirmwareResponse
	(*BundleFirmwareArtifactsRequest)(nil),                  // 15: chromite.api.BundleFirmwareArtifactsRequest
	(*BundleFirmwareArtifactsResponse)(nil),                 // 16: chromite.api.BundleFirmwareArtifactsResponse
	(*FirmwareArtifactInfo)(nil),                            // 17: chromite.api.FirmwareArtifactInfo
	(*FwBuildMetric_FwSection)(nil),                         // 18: chromite.api.FwBuildMetric.FwSection
	(*FwBuildMetric_Version)(nil),                           // 19: chromite.api.FwBuildMetric.Version
	(*FwBuildMetric_ZephyrTarget)(nil),                      // 20: chromite.api.FwBuildMetric.ZephyrTarget
	(*FirmwareArtifactInfo_TarballInfo)(nil),                // 21: chromite.api.FirmwareArtifactInfo.TarballInfo
	(*FirmwareArtifactInfo_ObjectInfo)(nil),                 // 22: chromite.api.FirmwareArtifactInfo.ObjectInfo
	(*FirmwareArtifactInfo_TarballInfo_FirmwareType)(nil),   // 23: chromite.api.FirmwareArtifactInfo.TarballInfo.FirmwareType
	(*FirmwareArtifactInfo_TarballInfo_Version)(nil),        // 24: chromite.api.FirmwareArtifactInfo.TarballInfo.Version
	(*chromiumos.Chroot)(nil),                               // 25: chromiumos.Chroot
	(chromiumos.FwLocation)(0),                              // 26: chromiumos.FwLocation
	(*chromiumos.ResultPath)(nil),                           // 27: chromiumos.ResultPath
	(*chromiumos.ArtifactsByService_Firmware)(nil),          // 28: chromiumos.ArtifactsByService.Firmware
	(*chromiumos.UploadedArtifactsByService_Firmware)(nil),  // 29: chromiumos.UploadedArtifactsByService.Firmware
}
var file_chromite_api_firmware_proto_depIdxs = []int32{
	18, // 0: chromite.api.FwBuildMetric.fw_section:type_name -> chromite.api.FwBuildMetric.FwSection
	20, // 1: chromite.api.FwBuildMetric.zephyr:type_name -> chromite.api.FwBuildMetric.ZephyrTarget
	3,  // 2: chromite.api.FwBuildMetricList.value:type_name -> chromite.api.FwBuildMetric
	5,  // 3: chromite.api.FwTestMetricList.value:type_name -> chromite.api.FwTestMetric
	0,  // 4: chromite.api.BuildAllTotFirmwareRequest.firmware_location:type_name -> chromite.api.FwLocation
	25, // 5: chromite.api.BuildAllTotFirmwareRequest.chroot:type_name -> chromiumos.Chroot
	4,  // 6: chromite.api.BuildAllTotFirmwareResponse.metrics:type_name -> chromite.api.FwBuildMetricList
	0,  // 7: chromite.api.TestAllTotFirmwareRequest.firmware_location:type_name -> chromite.api.FwLocation
	25, // 8: chromite.api.TestAllTotFirmwareRequest.chroot:type_name -> chromiumos.Chroot
	6,  // 9: chromite.api.TestAllTotFirmwareResponse.metrics:type_name -> chromite.api.FwTestMetricList
	26, // 10: chromite.api.BuildAllFirmwareRequest.firmware_location:type_name -> chromiumos.FwLocation
	25, // 11: chromite.api.BuildAllFirmwareRequest.chroot:type_name -> chromiumos.Chroot
	4,  // 12: chromite.api.BuildAllFirmwareResponse.metrics:type_name -> chromite.api.FwBuildMetricList
	26, // 13: chromite.api.TestAllFirmwareRequest.firmware_location:type_name -> chromiumos.FwLocation
	25, // 14: chromite.api.TestAllFirmwareRequest.chroot:type_name -> chromiumos.Chroot
	6,  // 15: chromite.api.TestAllFirmwareResponse.metrics:type_name -> chromite.api.FwTestMetricList
	25, // 16: chromite.api.BundleFirmwareArtifactsRequest.chroot:type_name -> chromiumos.Chroot
	27, // 17: chromite.api.BundleFirmwareArtifactsRequest.result_path:type_name -> chromiumos.ResultPath
	28, // 18: chromite.api.BundleFirmwareArtifactsRequest.artifacts:type_name -> chromiumos.ArtifactsByService.Firmware
	29, // 19: chromite.api.BundleFirmwareArtifactsResponse.artifacts:type_name -> chromiumos.UploadedArtifactsByService.Firmware
	22, // 20: chromite.api.FirmwareArtifactInfo.objects:type_name -> chromite.api.FirmwareArtifactInfo.ObjectInfo
	1,  // 21: chromite.api.FwBuildMetric.FwSection.region:type_name -> chromite.api.FwBuildMetric.FwSection.FwRegion
	19, // 22: chromite.api.FwBuildMetric.ZephyrTarget.kernel_version:type_name -> chromite.api.FwBuildMetric.Version
	2,  // 23: chromite.api.FirmwareArtifactInfo.TarballInfo.type:type_name -> chromite.api.FirmwareArtifactInfo.TarballInfo.FirmwareType.Type
	24, // 24: chromite.api.FirmwareArtifactInfo.TarballInfo.version:type_name -> chromite.api.FirmwareArtifactInfo.TarballInfo.Version
	21, // 25: chromite.api.FirmwareArtifactInfo.ObjectInfo.tarball_info:type_name -> chromite.api.FirmwareArtifactInfo.TarballInfo
	7,  // 26: chromite.api.FirmwareService.BuildAllTotFirmware:input_type -> chromite.api.BuildAllTotFirmwareRequest
	9,  // 27: chromite.api.FirmwareService.TestAllTotFirmware:input_type -> chromite.api.TestAllTotFirmwareRequest
	11, // 28: chromite.api.FirmwareService.BuildAllFirmware:input_type -> chromite.api.BuildAllFirmwareRequest
	13, // 29: chromite.api.FirmwareService.TestAllFirmware:input_type -> chromite.api.TestAllFirmwareRequest
	15, // 30: chromite.api.FirmwareService.BundleFirmwareArtifacts:input_type -> chromite.api.BundleFirmwareArtifactsRequest
	8,  // 31: chromite.api.FirmwareService.BuildAllTotFirmware:output_type -> chromite.api.BuildAllTotFirmwareResponse
	10, // 32: chromite.api.FirmwareService.TestAllTotFirmware:output_type -> chromite.api.TestAllTotFirmwareResponse
	12, // 33: chromite.api.FirmwareService.BuildAllFirmware:output_type -> chromite.api.BuildAllFirmwareResponse
	14, // 34: chromite.api.FirmwareService.TestAllFirmware:output_type -> chromite.api.TestAllFirmwareResponse
	16, // 35: chromite.api.FirmwareService.BundleFirmwareArtifacts:output_type -> chromite.api.BundleFirmwareArtifactsResponse
	31, // [31:36] is the sub-list for method output_type
	26, // [26:31] is the sub-list for method input_type
	26, // [26:26] is the sub-list for extension type_name
	26, // [26:26] is the sub-list for extension extendee
	0,  // [0:26] is the sub-list for field type_name
}

func init() { file_chromite_api_firmware_proto_init() }
func file_chromite_api_firmware_proto_init() {
	if File_chromite_api_firmware_proto != nil {
		return
	}
	file_chromite_api_build_api_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_chromite_api_firmware_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FwBuildMetric); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FwBuildMetricList); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FwTestMetric); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FwTestMetricList); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuildAllTotFirmwareRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuildAllTotFirmwareResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TestAllTotFirmwareRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TestAllTotFirmwareResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuildAllFirmwareRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuildAllFirmwareResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TestAllFirmwareRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TestAllFirmwareResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BundleFirmwareArtifactsRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BundleFirmwareArtifactsResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FirmwareArtifactInfo); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FwBuildMetric_FwSection); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FwBuildMetric_Version); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FwBuildMetric_ZephyrTarget); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FirmwareArtifactInfo_TarballInfo); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FirmwareArtifactInfo_ObjectInfo); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FirmwareArtifactInfo_TarballInfo_FirmwareType); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FirmwareArtifactInfo_TarballInfo_Version); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_chromite_api_firmware_proto_msgTypes[0].OneofWrappers = []interface{}{
		(*FwBuildMetric_Zephyr)(nil),
	}
	file_chromite_api_firmware_proto_msgTypes[19].OneofWrappers = []interface{}{
		(*FirmwareArtifactInfo_ObjectInfo_TarballInfo)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_chromite_api_firmware_proto_rawDesc,
			NumEnums:      3,
			NumMessages:   22,
			NumExtensions: 0,
			NumServices:   1,
		},
		GoTypes:           file_chromite_api_firmware_proto_goTypes,
		DependencyIndexes: file_chromite_api_firmware_proto_depIdxs,
		EnumInfos:         file_chromite_api_firmware_proto_enumTypes,
		MessageInfos:      file_chromite_api_firmware_proto_msgTypes,
	}.Build()
	File_chromite_api_firmware_proto = out.File
	file_chromite_api_firmware_proto_rawDesc = nil
	file_chromite_api_firmware_proto_goTypes = nil
	file_chromite_api_firmware_proto_depIdxs = nil
}
