// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: chromite/api/binhost.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)
)

// Portage environment variable that points to a remote binhost.
type BinhostKey int32

const (
	// No binhost key was specified.
	BinhostKey_UNSPECIFIED BinhostKey = 0
	// Contains prebuilts generated by the postsubmit builder.
	BinhostKey_POSTSUBMIT_BINHOST BinhostKey = 1
	// Contains prebuilts generated by the PFQ.
	BinhostKey_LATEST_RELEASE_CHROME_BINHOST BinhostKey = 2
	// Contains prebuilts generated by pre-flight builders.
	BinhostKey_PREFLIGHT_BINHOST BinhostKey = 3
)

// Enum value maps for BinhostKey.
var (
	BinhostKey_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "POSTSUBMIT_BINHOST",
		2: "LATEST_RELEASE_CHROME_BINHOST",
		3: "PREFLIGHT_BINHOST",
	}
	BinhostKey_value = map[string]int32{
		"UNSPECIFIED":                   0,
		"POSTSUBMIT_BINHOST":            1,
		"LATEST_RELEASE_CHROME_BINHOST": 2,
		"PREFLIGHT_BINHOST":             3,
	}
)

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

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

func (BinhostKey) Descriptor() protoreflect.EnumDescriptor {
	return file_chromite_api_binhost_proto_enumTypes[0].Descriptor()
}

func (BinhostKey) Type() protoreflect.EnumType {
	return &file_chromite_api_binhost_proto_enumTypes[0]
}

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

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

// Overlay types for push_overlays.
type OverlayType int32

const (
	// Not specified.
	OverlayType_OVERLAYTYPE_UNSPECIFIED OverlayType = 0
	// Both public and private.
	OverlayType_OVERLAYTYPE_BOTH OverlayType = 1
	// Only public overlays.
	OverlayType_OVERLAYTYPE_PUBLIC OverlayType = 2
	// Only private overlays.
	OverlayType_OVERLAYTYPE_PRIVATE OverlayType = 3
	// No overlays will be used.
	OverlayType_OVERLAYTYPE_NONE OverlayType = 4
)

// Enum value maps for OverlayType.
var (
	OverlayType_name = map[int32]string{
		0: "OVERLAYTYPE_UNSPECIFIED",
		1: "OVERLAYTYPE_BOTH",
		2: "OVERLAYTYPE_PUBLIC",
		3: "OVERLAYTYPE_PRIVATE",
		4: "OVERLAYTYPE_NONE",
	}
	OverlayType_value = map[string]int32{
		"OVERLAYTYPE_UNSPECIFIED": 0,
		"OVERLAYTYPE_BOTH":        1,
		"OVERLAYTYPE_PUBLIC":      2,
		"OVERLAYTYPE_PRIVATE":     3,
		"OVERLAYTYPE_NONE":        4,
	}
)

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

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

func (OverlayType) Descriptor() protoreflect.EnumDescriptor {
	return file_chromite_api_binhost_proto_enumTypes[1].Descriptor()
}

func (OverlayType) Type() protoreflect.EnumType {
	return &file_chromite_api_binhost_proto_enumTypes[1]
}

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

// Deprecated: Use OverlayType.Descriptor instead.
func (OverlayType) EnumDescriptor() ([]byte, []int) {
	return file_chromite_api_binhost_proto_rawDescGZIP(), []int{1}
}

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

	// The binhost URI.
	Uri string `protobuf:"bytes,1,opt,name=uri,proto3" json:"uri,omitempty"`
	// The package index file name relative to the base binhost uri.
	PackageIndex string `protobuf:"bytes,2,opt,name=package_index,json=packageIndex,proto3" json:"package_index,omitempty"`
}

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

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

func (*Binhost) ProtoMessage() {}

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

func (x *Binhost) GetUri() string {
	if x != nil {
		return x.Uri
	}
	return ""
}

func (x *Binhost) GetPackageIndex() string {
	if x != nil {
		return x.PackageIndex
	}
	return ""
}

// Local package index file message.
type PackageIndex struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Path *chromiumos.Path `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
}

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

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

func (*PackageIndex) ProtoMessage() {}

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

func (x *PackageIndex) GetPath() *chromiumos.Path {
	if x != nil {
		return x.Path
	}
	return nil
}

// Get the private prebuilts' ACL args for a build target.
type AclArgsRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. The build target whose Prebuilt ACL args are being fetched.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
}

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

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

func (*AclArgsRequest) ProtoMessage() {}

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

func (x *AclArgsRequest) GetBuildTarget() *chromiumos.BuildTarget {
	if x != nil {
		return x.BuildTarget
	}
	return nil
}

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

	Args []*AclArgsResponse_AclArg `protobuf:"bytes,1,rep,name=args,proto3" json:"args,omitempty"`
}

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

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

func (*AclArgsResponse) ProtoMessage() {}

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

func (x *AclArgsResponse) GetArgs() []*AclArgsResponse_AclArg {
	if x != nil {
		return x.Args
	}
	return nil
}

// Get the binhosts for the build target.
type BinhostGetRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required.
	// The build target whose binhosts are being fetched.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// Required.
	// Whether to include private binhosts.
	Private bool `protobuf:"varint,2,opt,name=private,proto3" json:"private,omitempty"`
}

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

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

func (*BinhostGetRequest) ProtoMessage() {}

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

func (x *BinhostGetRequest) GetBuildTarget() *chromiumos.BuildTarget {
	if x != nil {
		return x.BuildTarget
	}
	return nil
}

func (x *BinhostGetRequest) GetPrivate() bool {
	if x != nil {
		return x.Private
	}
	return false
}

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

	// The binhosts.
	Binhosts []*Binhost `protobuf:"bytes,1,rep,name=binhosts,proto3" json:"binhosts,omitempty"`
}

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

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

func (*BinhostGetResponse) ProtoMessage() {}

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

func (x *BinhostGetResponse) GetBinhosts() []*Binhost {
	if x != nil {
		return x.Binhosts
	}
	return nil
}

// Describes where prebuilts will be uploaded so package index and other
// Portage metadata can be updated appropriately.
type PrepareBinhostUploadsRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Deprecated.
	// Build target to prepare prebuilts for.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// Full URI where we wish to store prebuilts. Note that this service
	// call does NOT upload them, it only updates metadata.
	// Example: gs://chromeos-prebuilt/board/amd64-generic/packages/
	Uri string `protobuf:"bytes,2,opt,name=uri,proto3" json:"uri,omitempty"`
	// Required when chroot not at default location.
	// The chroot where the sysroot lives.
	Chroot *chromiumos.Chroot `protobuf:"bytes,3,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// Required.
	// The sysroot whose prebuilts are being uploaded.
	Sysroot *Sysroot `protobuf:"bytes,4,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	// The package index files to deduplicate the prebuilt list.
	PackageIndexFiles []*PackageIndex `protobuf:"bytes,5,rep,name=package_index_files,json=packageIndexFiles,proto3" json:"package_index_files,omitempty"`
}

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

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

func (*PrepareBinhostUploadsRequest) ProtoMessage() {}

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

func (x *PrepareBinhostUploadsRequest) GetBuildTarget() *chromiumos.BuildTarget {
	if x != nil {
		return x.BuildTarget
	}
	return nil
}

func (x *PrepareBinhostUploadsRequest) GetUri() string {
	if x != nil {
		return x.Uri
	}
	return ""
}

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

func (x *PrepareBinhostUploadsRequest) GetSysroot() *Sysroot {
	if x != nil {
		return x.Sysroot
	}
	return nil
}

func (x *PrepareBinhostUploadsRequest) GetPackageIndexFiles() []*PackageIndex {
	if x != nil {
		return x.PackageIndexFiles
	}
	return nil
}

// An upload target is a file in the uploads_dir, and is used by
// PrepareBinhostUploadsResponse and PrepareDevInstallBinhostUploadsResponse.
type UploadTarget struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Paths relative to uploads_dir.
	Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
}

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

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

func (*UploadTarget) ProtoMessage() {}

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

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

// Return all files to upload.
type PrepareBinhostUploadsResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Absolute chroot path to the local directory containing files to upload.
	UploadsDir string `protobuf:"bytes,1,opt,name=uploads_dir,json=uploadsDir,proto3" json:"uploads_dir,omitempty"`
	// All targets to be uploaded to the binhost.
	UploadTargets []*UploadTarget `protobuf:"bytes,2,rep,name=upload_targets,json=uploadTargets,proto3" json:"upload_targets,omitempty"`
}

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

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

func (*PrepareBinhostUploadsResponse) ProtoMessage() {}

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

func (x *PrepareBinhostUploadsResponse) GetUploadsDir() string {
	if x != nil {
		return x.UploadsDir
	}
	return ""
}

func (x *PrepareBinhostUploadsResponse) GetUploadTargets() []*UploadTarget {
	if x != nil {
		return x.UploadTargets
	}
	return nil
}

// Describes where dev-install prebuilts will be uploaded so package index and
// other Portage metadata can be updated appropriately.
type PrepareDevInstallBinhostUploadsRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Absolute path to the local directory that will contain all of the files to
	// upload.  This directory must already exist before calling
	// PrepareDevInstallBinhostUploads.
	UploadsDir string `protobuf:"bytes,1,opt,name=uploads_dir,json=uploadsDir,proto3" json:"uploads_dir,omitempty"`
	// Full URI where we wish to store prebuilts. Note that this service
	// call does NOT upload them, it only updates metadata.
	// Example: gs://chromeos-prebuilt/board/amd64-generic/packages/
	Uri string `protobuf:"bytes,2,opt,name=uri,proto3" json:"uri,omitempty"`
	// Required when chroot not at default location.
	// The chroot where the sysroot lives.
	Chroot *chromiumos.Chroot `protobuf:"bytes,3,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// Required.
	// The sysroot whose prebuilts are being uploaded.
	Sysroot *Sysroot `protobuf:"bytes,4,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
}

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

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

func (*PrepareDevInstallBinhostUploadsRequest) ProtoMessage() {}

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

func (x *PrepareDevInstallBinhostUploadsRequest) GetUploadsDir() string {
	if x != nil {
		return x.UploadsDir
	}
	return ""
}

func (x *PrepareDevInstallBinhostUploadsRequest) GetUri() string {
	if x != nil {
		return x.Uri
	}
	return ""
}

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

func (x *PrepareDevInstallBinhostUploadsRequest) GetSysroot() *Sysroot {
	if x != nil {
		return x.Sysroot
	}
	return nil
}

// Return all dev-install files to upload.
type PrepareDevInstallBinhostUploadsResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// All targets to be uploaded to the binhost.
	UploadTargets []*UploadTarget `protobuf:"bytes,1,rep,name=upload_targets,json=uploadTargets,proto3" json:"upload_targets,omitempty"`
}

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

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

func (*PrepareDevInstallBinhostUploadsResponse) ProtoMessage() {}

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

func (x *PrepareDevInstallBinhostUploadsResponse) GetUploadTargets() []*UploadTarget {
	if x != nil {
		return x.UploadTargets
	}
	return nil
}

// Set a binhost URL for the given build target.
type SetBinhostRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Build target to update binhost for.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// Whether or not the binhost is private.
	Private bool `protobuf:"varint,2,opt,name=private,proto3" json:"private,omitempty"`
	// Binhost key to set or update.
	Key BinhostKey `protobuf:"varint,3,opt,name=key,proto3,enum=chromite.api.BinhostKey" json:"key,omitempty"`
	// URI storing all the binaries.
	Uri string `protobuf:"bytes,4,opt,name=uri,proto3" json:"uri,omitempty"`
}

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

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

func (*SetBinhostRequest) ProtoMessage() {}

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

func (x *SetBinhostRequest) GetBuildTarget() *chromiumos.BuildTarget {
	if x != nil {
		return x.BuildTarget
	}
	return nil
}

func (x *SetBinhostRequest) GetPrivate() bool {
	if x != nil {
		return x.Private
	}
	return false
}

func (x *SetBinhostRequest) GetKey() BinhostKey {
	if x != nil {
		return x.Key
	}
	return BinhostKey_UNSPECIFIED
}

func (x *SetBinhostRequest) GetUri() string {
	if x != nil {
		return x.Uri
	}
	return ""
}

// Response for SetBinhost service call.
type SetBinhostResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Absolute path to the updated binhost conf file.
	OutputFile string `protobuf:"bytes,1,opt,name=output_file,json=outputFile,proto3" json:"output_file,omitempty"`
}

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

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

func (*SetBinhostResponse) ProtoMessage() {}

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

func (x *SetBinhostResponse) GetOutputFile() string {
	if x != nil {
		return x.OutputFile
	}
	return ""
}

// Regenerate the build cache.
type RegenBuildCacheRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required.
	// The type of overlays to push:  "public", "private", or "both".
	OverlayType OverlayType `protobuf:"varint,1,opt,name=overlay_type,json=overlayType,proto3,enum=chromite.api.OverlayType" json:"overlay_type,omitempty"`
	// Required if not in the default location.
	// The chroot to be used.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
}

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

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

func (*RegenBuildCacheRequest) ProtoMessage() {}

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

func (x *RegenBuildCacheRequest) GetOverlayType() OverlayType {
	if x != nil {
		return x.OverlayType
	}
	return OverlayType_OVERLAYTYPE_UNSPECIFIED
}

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

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

	// The overlays that have outstanding cache updates.
	ModifiedOverlays []*RegenBuildCacheResponse_Overlay `protobuf:"bytes,1,rep,name=modified_overlays,json=modifiedOverlays,proto3" json:"modified_overlays,omitempty"`
}

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

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

func (*RegenBuildCacheResponse) ProtoMessage() {}

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

func (x *RegenBuildCacheResponse) GetModifiedOverlays() []*RegenBuildCacheResponse_Overlay {
	if x != nil {
		return x.ModifiedOverlays
	}
	return nil
}

// An ACL command argument.
type AclArgsResponse_AclArg struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The argument (usually -g or -u).
	Arg string `protobuf:"bytes,1,opt,name=arg,proto3" json:"arg,omitempty"`
	// The argument value ([group_id|user]:PERMISSION)
	Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
}

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

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

func (*AclArgsResponse_AclArg) ProtoMessage() {}

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

func (x *AclArgsResponse_AclArg) GetArg() string {
	if x != nil {
		return x.Arg
	}
	return ""
}

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

// Message to encapsulate the modified overlays.
type RegenBuildCacheResponse_Overlay struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
}

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

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

func (*RegenBuildCacheResponse_Overlay) ProtoMessage() {}

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

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

var File_chromite_api_binhost_proto protoreflect.FileDescriptor

var file_chromite_api_binhost_proto_rawDesc = []byte{
	0x0a, 0x1a, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x62,
	0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74, 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, 0x1a, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x79, 0x73, 0x72, 0x6f, 0x6f, 0x74, 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, 0x40, 0x0a,
	0x07, 0x42, 0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x61,
	0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x0c, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22,
	0x34, 0x0a, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12,
	0x24, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x52,
	0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x4c, 0x0a, 0x0e, 0x41, 0x63, 0x6c, 0x41, 0x72, 0x67, 0x73,
	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64,
	0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64,
	0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72,
	0x67, 0x65, 0x74, 0x22, 0x7d, 0x0a, 0x0f, 0x41, 0x63, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x52, 0x65,
	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x01,
	0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e,
	0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
	0x6e, 0x73, 0x65, 0x2e, 0x41, 0x63, 0x6c, 0x41, 0x72, 0x67, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73,
	0x1a, 0x30, 0x0a, 0x06, 0x41, 0x63, 0x6c, 0x41, 0x72, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x72,
	0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x72, 0x67, 0x12, 0x14, 0x0a, 0x05,
	0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c,
	0x75, 0x65, 0x22, 0x69, 0x0a, 0x11, 0x42, 0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74,
	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64,
	0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64,
	0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72,
	0x67, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x02,
	0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x22, 0x47, 0x0a,
	0x12, 0x42, 0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f,
	0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x08, 0x62, 0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18,
	0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65,
	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x52, 0x08, 0x62, 0x69,
	0x6e, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x22, 0x95, 0x02, 0x0a, 0x1c, 0x50, 0x72, 0x65, 0x70, 0x61,
	0x72, 0x65, 0x42, 0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73,
	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64,
	0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64,
	0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72,
	0x67, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x03, 0x75, 0x72, 0x69, 0x12, 0x2a, 0x0a, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x18,
	0x03, 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, 0x2f, 0x0a, 0x07, 0x73, 0x79, 0x73, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70,
	0x69, 0x2e, 0x53, 0x79, 0x73, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x07, 0x73, 0x79, 0x73, 0x72, 0x6f,
	0x6f, 0x74, 0x12, 0x4a, 0x0a, 0x13, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e,
	0x64, 0x65, 0x78, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32,
	0x1a, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x50,
	0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x11, 0x70, 0x61, 0x63,
	0x6b, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x22,
	0x0a, 0x0c, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x12,
	0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61,
	0x74, 0x68, 0x22, 0x83, 0x01, 0x0a, 0x1d, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x42, 0x69,
	0x6e, 0x68, 0x6f, 0x73, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70,
	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x5f,
	0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x75, 0x70, 0x6c, 0x6f, 0x61,
	0x64, 0x73, 0x44, 0x69, 0x72, 0x12, 0x41, 0x0a, 0x0e, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f,
	0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x6c,
	0x6f, 0x61, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x0d, 0x75, 0x70, 0x6c, 0x6f, 0x61,
	0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x26, 0x50, 0x72, 0x65,
	0x70, 0x61, 0x72, 0x65, 0x44, 0x65, 0x76, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x42, 0x69,
	0x6e, 0x68, 0x6f, 0x73, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75,
	0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x5f, 0x64,
	0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64,
	0x73, 0x44, 0x69, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x12, 0x2a, 0x0a, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74,
	0x18, 0x03, 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, 0x2f, 0x0a, 0x07, 0x73, 0x79, 0x73, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61,
	0x70, 0x69, 0x2e, 0x53, 0x79, 0x73, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x07, 0x73, 0x79, 0x73, 0x72,
	0x6f, 0x6f, 0x74, 0x22, 0x6c, 0x0a, 0x27, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x44, 0x65,
	0x76, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x42, 0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x55,
	0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41,
	0x0a, 0x0e, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73,
	0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74,
	0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x61, 0x72, 0x67,
	0x65, 0x74, 0x52, 0x0d, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74,
	0x73, 0x22, 0xa7, 0x01, 0x0a, 0x11, 0x53, 0x65, 0x74, 0x42, 0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74,
	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64,
	0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64,
	0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72,
	0x67, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x02,
	0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a,
	0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x69, 0x6e, 0x68, 0x6f, 0x73,
	0x74, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69,
	0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x22, 0x35, 0x0a, 0x12, 0x53,
	0x65, 0x74, 0x42, 0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
	0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x69,
	0x6c, 0x65, 0x22, 0x82, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x42, 0x75, 0x69, 0x6c,
	0x64, 0x43, 0x61, 0x63, 0x68, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a,
	0x0c, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61,
	0x70, 0x69, 0x2e, 0x4f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x79, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b,
	0x6f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x79, 0x54, 0x79, 0x70, 0x65, 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, 0x22, 0x94, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x67, 0x65,
	0x6e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x61, 0x63, 0x68, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,
	0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x11, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f,
	0x6f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d,
	0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65,
	0x67, 0x65, 0x6e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x61, 0x63, 0x68, 0x65, 0x52, 0x65, 0x73,
	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x79, 0x52, 0x10, 0x6d,
	0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x4f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x79, 0x73, 0x1a,
	0x1d, 0x0a, 0x07, 0x4f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61,
	0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x2a, 0x6f,
	0x0a, 0x0a, 0x42, 0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x0f, 0x0a, 0x0b,
	0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a,
	0x12, 0x50, 0x4f, 0x53, 0x54, 0x53, 0x55, 0x42, 0x4d, 0x49, 0x54, 0x5f, 0x42, 0x49, 0x4e, 0x48,
	0x4f, 0x53, 0x54, 0x10, 0x01, 0x12, 0x21, 0x0a, 0x1d, 0x4c, 0x41, 0x54, 0x45, 0x53, 0x54, 0x5f,
	0x52, 0x45, 0x4c, 0x45, 0x41, 0x53, 0x45, 0x5f, 0x43, 0x48, 0x52, 0x4f, 0x4d, 0x45, 0x5f, 0x42,
	0x49, 0x4e, 0x48, 0x4f, 0x53, 0x54, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x50, 0x52, 0x45, 0x46,
	0x4c, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x42, 0x49, 0x4e, 0x48, 0x4f, 0x53, 0x54, 0x10, 0x03, 0x2a,
	0x87, 0x01, 0x0a, 0x0b, 0x4f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12,
	0x1b, 0x0a, 0x17, 0x4f, 0x56, 0x45, 0x52, 0x4c, 0x41, 0x59, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55,
	0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10,
	0x4f, 0x56, 0x45, 0x52, 0x4c, 0x41, 0x59, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x4f, 0x54, 0x48,
	0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x4f, 0x56, 0x45, 0x52, 0x4c, 0x41, 0x59, 0x54, 0x59, 0x50,
	0x45, 0x5f, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x4f, 0x56,
	0x45, 0x52, 0x4c, 0x41, 0x59, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54,
	0x45, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x4f, 0x56, 0x45, 0x52, 0x4c, 0x41, 0x59, 0x54, 0x59,
	0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x04, 0x32, 0x8c, 0x05, 0x0a, 0x0e, 0x42, 0x69,
	0x6e, 0x68, 0x6f, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x03,
	0x47, 0x65, 0x74, 0x12, 0x1f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61,
	0x70, 0x69, 0x2e, 0x42, 0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71,
	0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e,
	0x61, 0x70, 0x69, 0x2e, 0x42, 0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65,
	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x11, 0xc2, 0xed, 0x1a, 0x0d, 0x0a, 0x0b, 0x47, 0x65,
	0x74, 0x42, 0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x58, 0x0a, 0x19, 0x47, 0x65, 0x74,
	0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x41,
	0x63, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x12, 0x1c, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74,
	0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x52, 0x65, 0x71,
	0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e,
	0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
	0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x15, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x42, 0x69,
	0x6e, 0x68, 0x6f, 0x73, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x2a, 0x2e, 0x63,
	0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x72, 0x65, 0x70,
	0x61, 0x72, 0x65, 0x42, 0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64,
	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x42,
	0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x73,
	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8e, 0x01, 0x0a, 0x1f, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72,
	0x65, 0x44, 0x65, 0x76, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x42, 0x69, 0x6e, 0x68, 0x6f,
	0x73, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x34, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65,
	0x44, 0x65, 0x76, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x42, 0x69, 0x6e, 0x68, 0x6f, 0x73,
	0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
	0x35, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x50,
	0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x44, 0x65, 0x76, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c,
	0x42, 0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x52, 0x65,
	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0a, 0x53, 0x65, 0x74, 0x42, 0x69, 0x6e,
	0x68, 0x6f, 0x73, 0x74, 0x12, 0x1f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e,
	0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x74, 0x42, 0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x52, 0x65,
	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65,
	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x74, 0x42, 0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x52,
	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x0f, 0x52, 0x65, 0x67, 0x65, 0x6e,
	0x42, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x24, 0x2e, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x42,
	0x75, 0x69, 0x6c, 0x64, 0x43, 0x61, 0x63, 0x68, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
	0x1a, 0x25, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e,
	0x52, 0x65, 0x67, 0x65, 0x6e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x61, 0x63, 0x68, 0x65, 0x52,
	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x0f, 0xc2, 0xed, 0x1a, 0x0b, 0x0a, 0x07, 0x62,
	0x69, 0x6e, 0x68, 0x6f, 0x73, 0x74, 0x10, 0x02, 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_binhost_proto_rawDescOnce sync.Once
	file_chromite_api_binhost_proto_rawDescData = file_chromite_api_binhost_proto_rawDesc
)

func file_chromite_api_binhost_proto_rawDescGZIP() []byte {
	file_chromite_api_binhost_proto_rawDescOnce.Do(func() {
		file_chromite_api_binhost_proto_rawDescData = protoimpl.X.CompressGZIP(file_chromite_api_binhost_proto_rawDescData)
	})
	return file_chromite_api_binhost_proto_rawDescData
}

var file_chromite_api_binhost_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
var file_chromite_api_binhost_proto_msgTypes = make([]protoimpl.MessageInfo, 17)
var file_chromite_api_binhost_proto_goTypes = []interface{}{
	(BinhostKey)(0),                                 // 0: chromite.api.BinhostKey
	(OverlayType)(0),                                // 1: chromite.api.OverlayType
	(*Binhost)(nil),                                 // 2: chromite.api.Binhost
	(*PackageIndex)(nil),                            // 3: chromite.api.PackageIndex
	(*AclArgsRequest)(nil),                          // 4: chromite.api.AclArgsRequest
	(*AclArgsResponse)(nil),                         // 5: chromite.api.AclArgsResponse
	(*BinhostGetRequest)(nil),                       // 6: chromite.api.BinhostGetRequest
	(*BinhostGetResponse)(nil),                      // 7: chromite.api.BinhostGetResponse
	(*PrepareBinhostUploadsRequest)(nil),            // 8: chromite.api.PrepareBinhostUploadsRequest
	(*UploadTarget)(nil),                            // 9: chromite.api.UploadTarget
	(*PrepareBinhostUploadsResponse)(nil),           // 10: chromite.api.PrepareBinhostUploadsResponse
	(*PrepareDevInstallBinhostUploadsRequest)(nil),  // 11: chromite.api.PrepareDevInstallBinhostUploadsRequest
	(*PrepareDevInstallBinhostUploadsResponse)(nil), // 12: chromite.api.PrepareDevInstallBinhostUploadsResponse
	(*SetBinhostRequest)(nil),                       // 13: chromite.api.SetBinhostRequest
	(*SetBinhostResponse)(nil),                      // 14: chromite.api.SetBinhostResponse
	(*RegenBuildCacheRequest)(nil),                  // 15: chromite.api.RegenBuildCacheRequest
	(*RegenBuildCacheResponse)(nil),                 // 16: chromite.api.RegenBuildCacheResponse
	(*AclArgsResponse_AclArg)(nil),                  // 17: chromite.api.AclArgsResponse.AclArg
	(*RegenBuildCacheResponse_Overlay)(nil),         // 18: chromite.api.RegenBuildCacheResponse.Overlay
	(*chromiumos.Path)(nil),                         // 19: chromiumos.Path
	(*chromiumos.BuildTarget)(nil),                  // 20: chromiumos.BuildTarget
	(*chromiumos.Chroot)(nil),                       // 21: chromiumos.Chroot
	(*Sysroot)(nil),                                 // 22: chromite.api.Sysroot
}
var file_chromite_api_binhost_proto_depIdxs = []int32{
	19, // 0: chromite.api.PackageIndex.path:type_name -> chromiumos.Path
	20, // 1: chromite.api.AclArgsRequest.build_target:type_name -> chromiumos.BuildTarget
	17, // 2: chromite.api.AclArgsResponse.args:type_name -> chromite.api.AclArgsResponse.AclArg
	20, // 3: chromite.api.BinhostGetRequest.build_target:type_name -> chromiumos.BuildTarget
	2,  // 4: chromite.api.BinhostGetResponse.binhosts:type_name -> chromite.api.Binhost
	20, // 5: chromite.api.PrepareBinhostUploadsRequest.build_target:type_name -> chromiumos.BuildTarget
	21, // 6: chromite.api.PrepareBinhostUploadsRequest.chroot:type_name -> chromiumos.Chroot
	22, // 7: chromite.api.PrepareBinhostUploadsRequest.sysroot:type_name -> chromite.api.Sysroot
	3,  // 8: chromite.api.PrepareBinhostUploadsRequest.package_index_files:type_name -> chromite.api.PackageIndex
	9,  // 9: chromite.api.PrepareBinhostUploadsResponse.upload_targets:type_name -> chromite.api.UploadTarget
	21, // 10: chromite.api.PrepareDevInstallBinhostUploadsRequest.chroot:type_name -> chromiumos.Chroot
	22, // 11: chromite.api.PrepareDevInstallBinhostUploadsRequest.sysroot:type_name -> chromite.api.Sysroot
	9,  // 12: chromite.api.PrepareDevInstallBinhostUploadsResponse.upload_targets:type_name -> chromite.api.UploadTarget
	20, // 13: chromite.api.SetBinhostRequest.build_target:type_name -> chromiumos.BuildTarget
	0,  // 14: chromite.api.SetBinhostRequest.key:type_name -> chromite.api.BinhostKey
	1,  // 15: chromite.api.RegenBuildCacheRequest.overlay_type:type_name -> chromite.api.OverlayType
	21, // 16: chromite.api.RegenBuildCacheRequest.chroot:type_name -> chromiumos.Chroot
	18, // 17: chromite.api.RegenBuildCacheResponse.modified_overlays:type_name -> chromite.api.RegenBuildCacheResponse.Overlay
	6,  // 18: chromite.api.BinhostService.Get:input_type -> chromite.api.BinhostGetRequest
	4,  // 19: chromite.api.BinhostService.GetPrivatePrebuiltAclArgs:input_type -> chromite.api.AclArgsRequest
	8,  // 20: chromite.api.BinhostService.PrepareBinhostUploads:input_type -> chromite.api.PrepareBinhostUploadsRequest
	11, // 21: chromite.api.BinhostService.PrepareDevInstallBinhostUploads:input_type -> chromite.api.PrepareDevInstallBinhostUploadsRequest
	13, // 22: chromite.api.BinhostService.SetBinhost:input_type -> chromite.api.SetBinhostRequest
	15, // 23: chromite.api.BinhostService.RegenBuildCache:input_type -> chromite.api.RegenBuildCacheRequest
	7,  // 24: chromite.api.BinhostService.Get:output_type -> chromite.api.BinhostGetResponse
	5,  // 25: chromite.api.BinhostService.GetPrivatePrebuiltAclArgs:output_type -> chromite.api.AclArgsResponse
	10, // 26: chromite.api.BinhostService.PrepareBinhostUploads:output_type -> chromite.api.PrepareBinhostUploadsResponse
	12, // 27: chromite.api.BinhostService.PrepareDevInstallBinhostUploads:output_type -> chromite.api.PrepareDevInstallBinhostUploadsResponse
	14, // 28: chromite.api.BinhostService.SetBinhost:output_type -> chromite.api.SetBinhostResponse
	16, // 29: chromite.api.BinhostService.RegenBuildCache:output_type -> chromite.api.RegenBuildCacheResponse
	24, // [24:30] is the sub-list for method output_type
	18, // [18:24] is the sub-list for method input_type
	18, // [18:18] is the sub-list for extension type_name
	18, // [18:18] is the sub-list for extension extendee
	0,  // [0:18] is the sub-list for field type_name
}

func init() { file_chromite_api_binhost_proto_init() }
func file_chromite_api_binhost_proto_init() {
	if File_chromite_api_binhost_proto != nil {
		return
	}
	file_chromite_api_build_api_proto_init()
	file_chromite_api_sysroot_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_chromite_api_binhost_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Binhost); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_binhost_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*PackageIndex); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_binhost_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AclArgsRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_binhost_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AclArgsResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_binhost_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BinhostGetRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_binhost_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BinhostGetResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_binhost_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*PrepareBinhostUploadsRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_binhost_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*UploadTarget); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_binhost_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*PrepareBinhostUploadsResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_binhost_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*PrepareDevInstallBinhostUploadsRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_binhost_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*PrepareDevInstallBinhostUploadsResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_binhost_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SetBinhostRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_binhost_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SetBinhostResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_binhost_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*RegenBuildCacheRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_binhost_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*RegenBuildCacheResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_binhost_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AclArgsResponse_AclArg); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_binhost_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*RegenBuildCacheResponse_Overlay); 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_chromite_api_binhost_proto_rawDesc,
			NumEnums:      2,
			NumMessages:   17,
			NumExtensions: 0,
			NumServices:   1,
		},
		GoTypes:           file_chromite_api_binhost_proto_goTypes,
		DependencyIndexes: file_chromite_api_binhost_proto_depIdxs,
		EnumInfos:         file_chromite_api_binhost_proto_enumTypes,
		MessageInfos:      file_chromite_api_binhost_proto_msgTypes,
	}.Build()
	File_chromite_api_binhost_proto = out.File
	file_chromite_api_binhost_proto_rawDesc = nil
	file_chromite_api_binhost_proto_goTypes = nil
	file_chromite_api_binhost_proto_depIdxs = nil
}
