// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromite/api/packages.proto

package api

import (
	context "context"
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "google.golang.org/grpc/status"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// Reasons for needing Chrome source.
type NeedsChromeSourceResponse_Reason int32

const (
	NeedsChromeSourceResponse_UNSPECIFIED NeedsChromeSourceResponse_Reason = 0
	// There is no Chrome prebuilt available.
	NeedsChromeSourceResponse_NO_PREBUILT NeedsChromeSourceResponse_Reason = 1
	// The builder is compiling from source.
	NeedsChromeSourceResponse_COMPILE_SOURCE NeedsChromeSourceResponse_Reason = 2
	// There is a local uprev of Chrome.
	NeedsChromeSourceResponse_LOCAL_UPREV NeedsChromeSourceResponse_Reason = 3
	// A follower package lacks prebuilts.
	NeedsChromeSourceResponse_FOLLOWER_LACKS_PREBUILT NeedsChromeSourceResponse_Reason = 4
)

var NeedsChromeSourceResponse_Reason_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "NO_PREBUILT",
	2: "COMPILE_SOURCE",
	3: "LOCAL_UPREV",
	4: "FOLLOWER_LACKS_PREBUILT",
}

var NeedsChromeSourceResponse_Reason_value = map[string]int32{
	"UNSPECIFIED":             0,
	"NO_PREBUILT":             1,
	"COMPILE_SOURCE":          2,
	"LOCAL_UPREV":             3,
	"FOLLOWER_LACKS_PREBUILT": 4,
}

func (x NeedsChromeSourceResponse_Reason) String() string {
	return proto.EnumName(NeedsChromeSourceResponse_Reason_name, int32(x))
}

func (NeedsChromeSourceResponse_Reason) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_40286986e1d9a416, []int{13, 0}
}

// This can easily be generalized to a Builds method if necessary, but
// currently we have no use case for anything but Chrome, and making this
// specifically for Chrome simplifies the calling code significantly.
type BuildsChromeRequest struct {
	// The chroot where the operations will be executed.
	// Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The build target we are checking for.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// List of packages to be installed by the builder. If none are specified the
	// standard list of packages is used.
	Packages             []*chromiumos.PackageInfo `protobuf:"bytes,3,rep,name=packages,proto3" json:"packages,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

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

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

var xxx_messageInfo_BuildsChromeRequest proto.InternalMessageInfo

func (m *BuildsChromeRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

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

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

type BuildsChromeResponse struct {
	// Whether or not it builds chrome.
	BuildsChrome         bool     `protobuf:"varint,1,opt,name=builds_chrome,json=buildsChrome,proto3" json:"builds_chrome,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuildsChromeResponse proto.InternalMessageInfo

func (m *BuildsChromeResponse) GetBuildsChrome() bool {
	if m != nil {
		return m.BuildsChrome
	}
	return false
}

type GetBestVisibleRequest struct {
	// An atom to pass to portageq, e.g. 'chromeos-chrome'.
	Atom string `protobuf:"bytes,1,opt,name=atom,proto3" json:"atom,omitempty"`
	// The chroot path.
	// Required if not in the default location.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The build target to examine. Checks the chroot when not provided.
	// Required when examining a build target.
	BuildTarget          *chromiumos.BuildTarget `protobuf:"bytes,3,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_GetBestVisibleRequest proto.InternalMessageInfo

func (m *GetBestVisibleRequest) GetAtom() string {
	if m != nil {
		return m.Atom
	}
	return ""
}

func (m *GetBestVisibleRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

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

type GetBestVisibleResponse struct {
	// TODO: is this sufficient? Needs tag too?
	PackageInfo          *chromiumos.PackageInfo `protobuf:"bytes,1,opt,name=package_info,json=packageInfo,proto3" json:"package_info,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_GetBestVisibleResponse proto.InternalMessageInfo

func (m *GetBestVisibleResponse) GetPackageInfo() *chromiumos.PackageInfo {
	if m != nil {
		return m.PackageInfo
	}
	return nil
}

type GetChromeVersionRequest struct {
	// The chroot path.
	// Required if not in the default location.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The build target to examine.
	// Required.
	BuildTarget          *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_GetChromeVersionRequest proto.InternalMessageInfo

func (m *GetChromeVersionRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

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

type GetChromeVersionResponse struct {
	// The chrome version.
	Version              string   `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetChromeVersionResponse proto.InternalMessageInfo

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

type GetTargetVersionsRequest struct {
	// The chroot path.
	// Required if not in the default location.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The build target to examine.
	// Required.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// Optional packages to generate the depgraph for, such as
	// 'virtual/target-fuzzers'.  This is passed in based on the informational
	// builder type, see chromite/config/chromeos_config.py for examples.
	Packages             []*chromiumos.PackageInfo `protobuf:"bytes,3,rep,name=packages,proto3" json:"packages,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

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

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

var xxx_messageInfo_GetTargetVersionsRequest proto.InternalMessageInfo

func (m *GetTargetVersionsRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

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

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

type GetTargetVersionsResponse struct {
	// Android version, e.g. 5812377
	AndroidVersion string `protobuf:"bytes,1,opt,name=android_version,json=androidVersion,proto3" json:"android_version,omitempty"`
	// Android-branch version, e.g. git_nyc
	AndroidBranchVersion string `protobuf:"bytes,2,opt,name=android_branch_version,json=androidBranchVersion,proto3" json:"android_branch_version,omitempty"`
	// Android-target version, e.g. cheets
	AndroidTargetVersion string `protobuf:"bytes,3,opt,name=android_target_version,json=androidTargetVersion,proto3" json:"android_target_version,omitempty"`
	// Chrome version, e.g. 78.0.3877.0.
	ChromeVersion string `protobuf:"bytes,4,opt,name=chrome_version,json=chromeVersion,proto3" json:"chrome_version,omitempty"`
	// Full version, e.g. R78-12438.0.0.
	FullVersion string `protobuf:"bytes,5,opt,name=full_version,json=fullVersion,proto3" json:"full_version,omitempty"`
	// Milestone version, e.g. 78.
	MilestoneVersion string `protobuf:"bytes,6,opt,name=milestone_version,json=milestoneVersion,proto3" json:"milestone_version,omitempty"`
	// Platform version, e.g. 12438.0.0.
	PlatformVersion      string   `protobuf:"bytes,7,opt,name=platform_version,json=platformVersion,proto3" json:"platform_version,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetTargetVersionsResponse proto.InternalMessageInfo

func (m *GetTargetVersionsResponse) GetAndroidVersion() string {
	if m != nil {
		return m.AndroidVersion
	}
	return ""
}

func (m *GetTargetVersionsResponse) GetAndroidBranchVersion() string {
	if m != nil {
		return m.AndroidBranchVersion
	}
	return ""
}

func (m *GetTargetVersionsResponse) GetAndroidTargetVersion() string {
	if m != nil {
		return m.AndroidTargetVersion
	}
	return ""
}

func (m *GetTargetVersionsResponse) GetChromeVersion() string {
	if m != nil {
		return m.ChromeVersion
	}
	return ""
}

func (m *GetTargetVersionsResponse) GetFullVersion() string {
	if m != nil {
		return m.FullVersion
	}
	return ""
}

func (m *GetTargetVersionsResponse) GetMilestoneVersion() string {
	if m != nil {
		return m.MilestoneVersion
	}
	return ""
}

func (m *GetTargetVersionsResponse) GetPlatformVersion() string {
	if m != nil {
		return m.PlatformVersion
	}
	return ""
}

// The associated method can be run after InstallPackages.
type GetBuilderMetadataRequest struct {
	// The chroot path.
	// Required if not in the default location.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The build target to examine.
	// Required.
	BuildTarget          *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_GetBuilderMetadataRequest proto.InternalMessageInfo

func (m *GetBuilderMetadataRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

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

type GetBuilderMetadataResponse struct {
	// Metadata for build targets.
	BuildTargetMetadata []*GetBuilderMetadataResponse_BuildTargetMetadata `protobuf:"bytes,1,rep,name=build_target_metadata,json=buildTargetMetadata,proto3" json:"build_target_metadata,omitempty"`
	// Metadata for models.
	ModelMetadata        []*GetBuilderMetadataResponse_ModelMetadata `protobuf:"bytes,2,rep,name=model_metadata,json=modelMetadata,proto3" json:"model_metadata,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                    `json:"-"`
	XXX_unrecognized     []byte                                      `json:"-"`
	XXX_sizecache        int32                                       `json:"-"`
}

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

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

var xxx_messageInfo_GetBuilderMetadataResponse proto.InternalMessageInfo

func (m *GetBuilderMetadataResponse) GetBuildTargetMetadata() []*GetBuilderMetadataResponse_BuildTargetMetadata {
	if m != nil {
		return m.BuildTargetMetadata
	}
	return nil
}

func (m *GetBuilderMetadataResponse) GetModelMetadata() []*GetBuilderMetadataResponse_ModelMetadata {
	if m != nil {
		return m.ModelMetadata
	}
	return nil
}

type GetBuilderMetadataResponse_ModelMetadata struct {
	// Name of model, such as "astronaut", "babymega", etc.
	ModelName string `protobuf:"bytes,1,opt,name=model_name,json=modelName,proto3" json:"model_name,omitempty"`
	// EC firmware version, such as "coral_v1.1.7292-04956f5df".
	EcFirmwareVersion string `protobuf:"bytes,2,opt,name=ec_firmware_version,json=ecFirmwareVersion,proto3" json:"ec_firmware_version,omitempty"`
	// Firmware key id, such as "CORALG"
	FirmwareKeyId string `protobuf:"bytes,3,opt,name=firmware_key_id,json=firmwareKeyId,proto3" json:"firmware_key_id,omitempty"`
	// Main readonly firmware version, such as "Google_Coral.10068.82.0".
	MainReadonlyFirmwareVersion string `protobuf:"bytes,4,opt,name=main_readonly_firmware_version,json=mainReadonlyFirmwareVersion,proto3" json:"main_readonly_firmware_version,omitempty"`
	// Main readwrite firmware version, such as "Google_Coral.10068.82.0".
	MainReadwriteFirmwareVersion string   `protobuf:"bytes,5,opt,name=main_readwrite_firmware_version,json=mainReadwriteFirmwareVersion,proto3" json:"main_readwrite_firmware_version,omitempty"`
	XXX_NoUnkeyedLiteral         struct{} `json:"-"`
	XXX_unrecognized             []byte   `json:"-"`
	XXX_sizecache                int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetBuilderMetadataResponse_ModelMetadata proto.InternalMessageInfo

func (m *GetBuilderMetadataResponse_ModelMetadata) GetModelName() string {
	if m != nil {
		return m.ModelName
	}
	return ""
}

func (m *GetBuilderMetadataResponse_ModelMetadata) GetEcFirmwareVersion() string {
	if m != nil {
		return m.EcFirmwareVersion
	}
	return ""
}

func (m *GetBuilderMetadataResponse_ModelMetadata) GetFirmwareKeyId() string {
	if m != nil {
		return m.FirmwareKeyId
	}
	return ""
}

func (m *GetBuilderMetadataResponse_ModelMetadata) GetMainReadonlyFirmwareVersion() string {
	if m != nil {
		return m.MainReadonlyFirmwareVersion
	}
	return ""
}

func (m *GetBuilderMetadataResponse_ModelMetadata) GetMainReadwriteFirmwareVersion() string {
	if m != nil {
		return m.MainReadwriteFirmwareVersion
	}
	return ""
}

type GetBuilderMetadataResponse_BuildTargetMetadata struct {
	// Name of build_target, such as auron_paine, coral, etc.
	BuildTarget string `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// Name of android container branch, such as "git_pi-arc".
	AndroidContainerBranch string `protobuf:"bytes,2,opt,name=android_container_branch,json=androidContainerBranch,proto3" json:"android_container_branch,omitempty"`
	// Name of android container target, such as "cheets".
	AndroidContainerTarget string `protobuf:"bytes,3,opt,name=android_container_target,json=androidContainerTarget,proto3" json:"android_container_target,omitempty"`
	// Name of android container version, such as "6387315".
	AndroidContainerVersion string `protobuf:"bytes,4,opt,name=android_container_version,json=androidContainerVersion,proto3" json:"android_container_version,omitempty"`
	// Whether or not arc-use is enabled.
	ArcUseSet bool `protobuf:"varint,5,opt,name=arc_use_set,json=arcUseSet,proto3" json:"arc_use_set,omitempty"`
	// EC firmware version.
	EcFirmwareVersion string `protobuf:"bytes,6,opt,name=ec_firmware_version,json=ecFirmwareVersion,proto3" json:"ec_firmware_version,omitempty"`
	// Fingerprints.
	Fingerprints []string `protobuf:"bytes,7,rep,name=fingerprints,proto3" json:"fingerprints,omitempty"`
	// Kernel version, such as  "4.14.176-r1088".
	KernelVersion string `protobuf:"bytes,8,opt,name=kernel_version,json=kernelVersion,proto3" json:"kernel_version,omitempty"`
	// Main firmware version, such as "Google_Auron_paine.6301.58.98.
	MainFirmwareVersion  string   `protobuf:"bytes,9,opt,name=main_firmware_version,json=mainFirmwareVersion,proto3" json:"main_firmware_version,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetBuilderMetadataResponse_BuildTargetMetadata proto.InternalMessageInfo

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

func (m *GetBuilderMetadataResponse_BuildTargetMetadata) GetAndroidContainerBranch() string {
	if m != nil {
		return m.AndroidContainerBranch
	}
	return ""
}

func (m *GetBuilderMetadataResponse_BuildTargetMetadata) GetAndroidContainerTarget() string {
	if m != nil {
		return m.AndroidContainerTarget
	}
	return ""
}

func (m *GetBuilderMetadataResponse_BuildTargetMetadata) GetAndroidContainerVersion() string {
	if m != nil {
		return m.AndroidContainerVersion
	}
	return ""
}

func (m *GetBuilderMetadataResponse_BuildTargetMetadata) GetArcUseSet() bool {
	if m != nil {
		return m.ArcUseSet
	}
	return false
}

func (m *GetBuilderMetadataResponse_BuildTargetMetadata) GetEcFirmwareVersion() string {
	if m != nil {
		return m.EcFirmwareVersion
	}
	return ""
}

func (m *GetBuilderMetadataResponse_BuildTargetMetadata) GetFingerprints() []string {
	if m != nil {
		return m.Fingerprints
	}
	return nil
}

func (m *GetBuilderMetadataResponse_BuildTargetMetadata) GetKernelVersion() string {
	if m != nil {
		return m.KernelVersion
	}
	return ""
}

func (m *GetBuilderMetadataResponse_BuildTargetMetadata) GetMainFirmwareVersion() string {
	if m != nil {
		return m.MainFirmwareVersion
	}
	return ""
}

// This can easily be generalized to a HasPrebuilt method if necessary, but
// currently we have no use case for anything but Chrome, and making this
// specifically for Chrome simplifies the calling code significantly.
type HasChromePrebuiltRequest struct {
	// The chroot where the operations will be executed.
	// Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The build target whose prebuilt is being checked.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// Whether to look for internal chrome, or external chromium prebuilts.
	// Shortcut for ensuring USE=chrome_internal. Does not disable
	// chrome_internal when false if otherwise set (e.g. chroot env).
	Chrome               bool     `protobuf:"varint,3,opt,name=chrome,proto3" json:"chrome,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_HasChromePrebuiltRequest proto.InternalMessageInfo

func (m *HasChromePrebuiltRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

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

func (m *HasChromePrebuiltRequest) GetChrome() bool {
	if m != nil {
		return m.Chrome
	}
	return false
}

type HasChromePrebuiltResponse struct {
	// Whether or not it has a prebuilt.
	HasPrebuilt          bool     `protobuf:"varint,1,opt,name=has_prebuilt,json=hasPrebuilt,proto3" json:"has_prebuilt,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_HasChromePrebuiltResponse proto.InternalMessageInfo

func (m *HasChromePrebuiltResponse) GetHasPrebuilt() bool {
	if m != nil {
		return m.HasPrebuilt
	}
	return false
}

type NeedsChromeSourceRequest struct {
	// The request that will be passed to InstallPackages.
	InstallRequest       *InstallPackagesRequest `protobuf:"bytes,1,opt,name=install_request,json=installRequest,proto3" json:"install_request,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_NeedsChromeSourceRequest proto.InternalMessageInfo

func (m *NeedsChromeSourceRequest) GetInstallRequest() *InstallPackagesRequest {
	if m != nil {
		return m.InstallRequest
	}
	return nil
}

type NeedsChromeSourceResponse struct {
	// Whether Chrome source is needed.
	NeedsChromeSource bool                               `protobuf:"varint,1,opt,name=needs_chrome_source,json=needsChromeSource,proto3" json:"needs_chrome_source,omitempty"`
	Reasons           []NeedsChromeSourceResponse_Reason `protobuf:"varint,2,rep,packed,name=reasons,proto3,enum=chromite.api.NeedsChromeSourceResponse_Reason" json:"reasons,omitempty"`
	// Packages causing the need for source.
	Packages []*chromiumos.PackageInfo `protobuf:"bytes,3,rep,name=packages,proto3" json:"packages,omitempty"`
	// Whether or not it builds Chrome.  See BuildsChrome().
	BuildsChrome         bool     `protobuf:"varint,4,opt,name=builds_chrome,json=buildsChrome,proto3" json:"builds_chrome,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_NeedsChromeSourceResponse proto.InternalMessageInfo

func (m *NeedsChromeSourceResponse) GetNeedsChromeSource() bool {
	if m != nil {
		return m.NeedsChromeSource
	}
	return false
}

func (m *NeedsChromeSourceResponse) GetReasons() []NeedsChromeSourceResponse_Reason {
	if m != nil {
		return m.Reasons
	}
	return nil
}

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

func (m *NeedsChromeSourceResponse) GetBuildsChrome() bool {
	if m != nil {
		return m.BuildsChrome
	}
	return false
}

// The generic version of HasChromePrebuilt.
type HasPrebuiltRequest struct {
	// The chroot where the operations will be executed.
	// Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The build target whose prebuilt is being checked.
	// Required.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// Whether to look for internal chrome, or external chromium prebuilts.
	// Shortcut for ensuring USE=chrome_internal. Does not disable
	// chrome_internal when false if otherwise set (e.g. chroot env).
	Chrome bool `protobuf:"varint,3,opt,name=chrome,proto3" json:"chrome,omitempty"`
	// The package whose prebuilt is being queried.
	// The category and package name are required.
	PackageInfo          *chromiumos.PackageInfo `protobuf:"bytes,4,opt,name=package_info,json=packageInfo,proto3" json:"package_info,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_HasPrebuiltRequest proto.InternalMessageInfo

func (m *HasPrebuiltRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

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

func (m *HasPrebuiltRequest) GetChrome() bool {
	if m != nil {
		return m.Chrome
	}
	return false
}

func (m *HasPrebuiltRequest) GetPackageInfo() *chromiumos.PackageInfo {
	if m != nil {
		return m.PackageInfo
	}
	return nil
}

type HasPrebuiltResponse struct {
	// Whether or not it has a prebuilt.
	HasPrebuilt          bool     `protobuf:"varint,1,opt,name=has_prebuilt,json=hasPrebuilt,proto3" json:"has_prebuilt,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_HasPrebuiltResponse proto.InternalMessageInfo

func (m *HasPrebuiltResponse) GetHasPrebuilt() bool {
	if m != nil {
		return m.HasPrebuilt
	}
	return false
}

type UprevPackagesRequest struct {
	// The chroot path.
	// Required if not in the default location.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The build target(s) whose packages should be uprevved.
	// Defaults to all build targets when none are given.
	BuildTargets []*chromiumos.BuildTarget `protobuf:"bytes,2,rep,name=build_targets,json=buildTargets,proto3" json:"build_targets,omitempty"`
	// Required.
	// The overlay type to search against.
	OverlayType OverlayType `protobuf:"varint,3,opt,name=overlay_type,json=overlayType,proto3,enum=chromite.api.OverlayType" json:"overlay_type,omitempty"`
	// Optional.
	// A directory where results should be dumped.
	OutputDir            string   `protobuf:"bytes,4,opt,name=output_dir,json=outputDir,proto3" json:"output_dir,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UprevPackagesRequest proto.InternalMessageInfo

func (m *UprevPackagesRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

func (m *UprevPackagesRequest) GetBuildTargets() []*chromiumos.BuildTarget {
	if m != nil {
		return m.BuildTargets
	}
	return nil
}

func (m *UprevPackagesRequest) GetOverlayType() OverlayType {
	if m != nil {
		return m.OverlayType
	}
	return OverlayType_OVERLAYTYPE_UNSPECIFIED
}

func (m *UprevPackagesRequest) GetOutputDir() string {
	if m != nil {
		return m.OutputDir
	}
	return ""
}

// TODO(evanhernandez): Support build-target specific uprevs once needed.
type UprevVersionedPackageRequest struct {
	// The chroot path. Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The package to uprev.
	PackageInfo *chromiumos.PackageInfo `protobuf:"bytes,2,opt,name=package_info,json=packageInfo,proto3" json:"package_info,omitempty"`
	// The versions to consider for an update.
	Versions []*UprevVersionedPackageRequest_GitRef `protobuf:"bytes,3,rep,name=versions,proto3" json:"versions,omitempty"`
	// The build targets whose sysroot should be cleaned of old versions.
	BuildTargets         []*chromiumos.BuildTarget `protobuf:"bytes,4,rep,name=build_targets,json=buildTargets,proto3" json:"build_targets,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

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

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

var xxx_messageInfo_UprevVersionedPackageRequest proto.InternalMessageInfo

func (m *UprevVersionedPackageRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

func (m *UprevVersionedPackageRequest) GetPackageInfo() *chromiumos.PackageInfo {
	if m != nil {
		return m.PackageInfo
	}
	return nil
}

func (m *UprevVersionedPackageRequest) GetVersions() []*UprevVersionedPackageRequest_GitRef {
	if m != nil {
		return m.Versions
	}
	return nil
}

func (m *UprevVersionedPackageRequest) GetBuildTargets() []*chromiumos.BuildTarget {
	if m != nil {
		return m.BuildTargets
	}
	return nil
}

type UprevVersionedPackageRequest_GitRef struct {
	// Relative path to the git repository.
	Repository string `protobuf:"bytes,1,opt,name=repository,proto3" json:"repository,omitempty"`
	// The name of the git ref.
	Ref string `protobuf:"bytes,2,opt,name=ref,proto3" json:"ref,omitempty"`
	// The exact sha1 of the git ref.
	Revision             string   `protobuf:"bytes,3,opt,name=revision,proto3" json:"revision,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UprevVersionedPackageRequest_GitRef proto.InternalMessageInfo

func (m *UprevVersionedPackageRequest_GitRef) GetRepository() string {
	if m != nil {
		return m.Repository
	}
	return ""
}

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

func (m *UprevVersionedPackageRequest_GitRef) GetRevision() string {
	if m != nil {
		return m.Revision
	}
	return ""
}

type UprevPackagesResponse struct {
	// The list of ebuilds that were modified. Contains added and deleted files.
	ModifiedEbuilds []*UprevPackagesResponse_Ebuild `protobuf:"bytes,1,rep,name=modified_ebuilds,json=modifiedEbuilds,proto3" json:"modified_ebuilds,omitempty"`
	// The new version that was uprevved to when an uprev was completed.
	Version              string   `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UprevPackagesResponse proto.InternalMessageInfo

func (m *UprevPackagesResponse) GetModifiedEbuilds() []*UprevPackagesResponse_Ebuild {
	if m != nil {
		return m.ModifiedEbuilds
	}
	return nil
}

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

type UprevPackagesResponse_Ebuild struct {
	Path                 string   `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UprevPackagesResponse_Ebuild proto.InternalMessageInfo

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

type UprevVersionedPackageResponse struct {
	// list of uprev responses.
	Responses            []*UprevPackagesResponse `protobuf:"bytes,1,rep,name=responses,proto3" json:"responses,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

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

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

var xxx_messageInfo_UprevVersionedPackageResponse proto.InternalMessageInfo

func (m *UprevVersionedPackageResponse) GetResponses() []*UprevPackagesResponse {
	if m != nil {
		return m.Responses
	}
	return nil
}

func init() {
	proto.RegisterEnum("chromite.api.NeedsChromeSourceResponse_Reason", NeedsChromeSourceResponse_Reason_name, NeedsChromeSourceResponse_Reason_value)
	proto.RegisterType((*BuildsChromeRequest)(nil), "chromite.api.BuildsChromeRequest")
	proto.RegisterType((*BuildsChromeResponse)(nil), "chromite.api.BuildsChromeResponse")
	proto.RegisterType((*GetBestVisibleRequest)(nil), "chromite.api.GetBestVisibleRequest")
	proto.RegisterType((*GetBestVisibleResponse)(nil), "chromite.api.GetBestVisibleResponse")
	proto.RegisterType((*GetChromeVersionRequest)(nil), "chromite.api.GetChromeVersionRequest")
	proto.RegisterType((*GetChromeVersionResponse)(nil), "chromite.api.GetChromeVersionResponse")
	proto.RegisterType((*GetTargetVersionsRequest)(nil), "chromite.api.GetTargetVersionsRequest")
	proto.RegisterType((*GetTargetVersionsResponse)(nil), "chromite.api.GetTargetVersionsResponse")
	proto.RegisterType((*GetBuilderMetadataRequest)(nil), "chromite.api.GetBuilderMetadataRequest")
	proto.RegisterType((*GetBuilderMetadataResponse)(nil), "chromite.api.GetBuilderMetadataResponse")
	proto.RegisterType((*GetBuilderMetadataResponse_ModelMetadata)(nil), "chromite.api.GetBuilderMetadataResponse.ModelMetadata")
	proto.RegisterType((*GetBuilderMetadataResponse_BuildTargetMetadata)(nil), "chromite.api.GetBuilderMetadataResponse.BuildTargetMetadata")
	proto.RegisterType((*HasChromePrebuiltRequest)(nil), "chromite.api.HasChromePrebuiltRequest")
	proto.RegisterType((*HasChromePrebuiltResponse)(nil), "chromite.api.HasChromePrebuiltResponse")
	proto.RegisterType((*NeedsChromeSourceRequest)(nil), "chromite.api.NeedsChromeSourceRequest")
	proto.RegisterType((*NeedsChromeSourceResponse)(nil), "chromite.api.NeedsChromeSourceResponse")
	proto.RegisterType((*HasPrebuiltRequest)(nil), "chromite.api.HasPrebuiltRequest")
	proto.RegisterType((*HasPrebuiltResponse)(nil), "chromite.api.HasPrebuiltResponse")
	proto.RegisterType((*UprevPackagesRequest)(nil), "chromite.api.UprevPackagesRequest")
	proto.RegisterType((*UprevVersionedPackageRequest)(nil), "chromite.api.UprevVersionedPackageRequest")
	proto.RegisterType((*UprevVersionedPackageRequest_GitRef)(nil), "chromite.api.UprevVersionedPackageRequest.GitRef")
	proto.RegisterType((*UprevPackagesResponse)(nil), "chromite.api.UprevPackagesResponse")
	proto.RegisterType((*UprevPackagesResponse_Ebuild)(nil), "chromite.api.UprevPackagesResponse.Ebuild")
	proto.RegisterType((*UprevVersionedPackageResponse)(nil), "chromite.api.UprevVersionedPackageResponse")
}

func init() { proto.RegisterFile("chromite/api/packages.proto", fileDescriptor_40286986e1d9a416) }

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

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion4

// PackageServiceClient is the client API for PackageService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type PackageServiceClient interface {
	// Check if the build target has chrome in its depgraph.
	BuildsChrome(ctx context.Context, in *BuildsChromeRequest, opts ...grpc.CallOption) (*BuildsChromeResponse, error)
	// Find the best (highest) available version of the requested package.
	// This must be run after the chroot is set up (for chroot package lookup) or
	// after the sysroot is created (for build target package lookup).
	GetBestVisible(ctx context.Context, in *GetBestVisibleRequest, opts ...grpc.CallOption) (*GetBestVisibleResponse, error)
	// Like GetBestVisible, but returns only the chrome version. The chrome
	// package version is something like 78.9.0.123_rc-r1, where the chrome
	// version itself is just 78.9.0.123. This case does not have a spec in
	// Portage, so it cannot be directly fetched by GetBestVisible.
	GetChromeVersion(ctx context.Context, in *GetChromeVersionRequest, opts ...grpc.CallOption) (*GetChromeVersionResponse, error)
	// Return the various build version fields that can be stored (e.g. in
	// metadata.json).
	GetTargetVersions(ctx context.Context, in *GetTargetVersionsRequest, opts ...grpc.CallOption) (*GetTargetVersionsResponse, error)
	// Return the various metabuilder fields for a release builder.
	// This can be run after InstallPackages.
	GetBuilderMetadata(ctx context.Context, in *GetBuilderMetadataRequest, opts ...grpc.CallOption) (*GetBuilderMetadataResponse, error)
	// Check if there is an available chrome prebuilt for the most recent
	// version of chrome.
	HasChromePrebuilt(ctx context.Context, in *HasChromePrebuiltRequest, opts ...grpc.CallOption) (*HasChromePrebuiltResponse, error)
	// Check if there is an available prebuilt for the most recent version of the
	// package.
	HasPrebuilt(ctx context.Context, in *HasPrebuiltRequest, opts ...grpc.CallOption) (*HasPrebuiltResponse, error)
	// The generic uprev process -- performs uprevs for all packages in the
	// public and/or private overlays for the build target(s) specified.
	// This handles all cros_workon packages except those that have a separate
	// uprev process.
	Uprev(ctx context.Context, in *UprevPackagesRequest, opts ...grpc.CallOption) (*UprevPackagesResponse, error)
	// Uprev a package that is externally versioned (e.g. Chrome).
	// This endpoint iterates over a list of git refs that represent versions
	// and searches for a new version, updating and upreving the package ebuild
	// if such a version is found. The exact behavior depends on the package.
	UprevVersionedPackage(ctx context.Context, in *UprevVersionedPackageRequest, opts ...grpc.CallOption) (*UprevVersionedPackageResponse, error)
}

type packageServiceClient struct {
	cc *grpc.ClientConn
}

func NewPackageServiceClient(cc *grpc.ClientConn) PackageServiceClient {
	return &packageServiceClient{cc}
}

func (c *packageServiceClient) BuildsChrome(ctx context.Context, in *BuildsChromeRequest, opts ...grpc.CallOption) (*BuildsChromeResponse, error) {
	out := new(BuildsChromeResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/BuildsChrome", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) GetBestVisible(ctx context.Context, in *GetBestVisibleRequest, opts ...grpc.CallOption) (*GetBestVisibleResponse, error) {
	out := new(GetBestVisibleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/GetBestVisible", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) GetChromeVersion(ctx context.Context, in *GetChromeVersionRequest, opts ...grpc.CallOption) (*GetChromeVersionResponse, error) {
	out := new(GetChromeVersionResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/GetChromeVersion", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) GetTargetVersions(ctx context.Context, in *GetTargetVersionsRequest, opts ...grpc.CallOption) (*GetTargetVersionsResponse, error) {
	out := new(GetTargetVersionsResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/GetTargetVersions", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) GetBuilderMetadata(ctx context.Context, in *GetBuilderMetadataRequest, opts ...grpc.CallOption) (*GetBuilderMetadataResponse, error) {
	out := new(GetBuilderMetadataResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/GetBuilderMetadata", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) HasChromePrebuilt(ctx context.Context, in *HasChromePrebuiltRequest, opts ...grpc.CallOption) (*HasChromePrebuiltResponse, error) {
	out := new(HasChromePrebuiltResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/HasChromePrebuilt", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) HasPrebuilt(ctx context.Context, in *HasPrebuiltRequest, opts ...grpc.CallOption) (*HasPrebuiltResponse, error) {
	out := new(HasPrebuiltResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/HasPrebuilt", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) Uprev(ctx context.Context, in *UprevPackagesRequest, opts ...grpc.CallOption) (*UprevPackagesResponse, error) {
	out := new(UprevPackagesResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/Uprev", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *packageServiceClient) UprevVersionedPackage(ctx context.Context, in *UprevVersionedPackageRequest, opts ...grpc.CallOption) (*UprevVersionedPackageResponse, error) {
	out := new(UprevVersionedPackageResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.PackageService/UprevVersionedPackage", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// PackageServiceServer is the server API for PackageService service.
type PackageServiceServer interface {
	// Check if the build target has chrome in its depgraph.
	BuildsChrome(context.Context, *BuildsChromeRequest) (*BuildsChromeResponse, error)
	// Find the best (highest) available version of the requested package.
	// This must be run after the chroot is set up (for chroot package lookup) or
	// after the sysroot is created (for build target package lookup).
	GetBestVisible(context.Context, *GetBestVisibleRequest) (*GetBestVisibleResponse, error)
	// Like GetBestVisible, but returns only the chrome version. The chrome
	// package version is something like 78.9.0.123_rc-r1, where the chrome
	// version itself is just 78.9.0.123. This case does not have a spec in
	// Portage, so it cannot be directly fetched by GetBestVisible.
	GetChromeVersion(context.Context, *GetChromeVersionRequest) (*GetChromeVersionResponse, error)
	// Return the various build version fields that can be stored (e.g. in
	// metadata.json).
	GetTargetVersions(context.Context, *GetTargetVersionsRequest) (*GetTargetVersionsResponse, error)
	// Return the various metabuilder fields for a release builder.
	// This can be run after InstallPackages.
	GetBuilderMetadata(context.Context, *GetBuilderMetadataRequest) (*GetBuilderMetadataResponse, error)
	// Check if there is an available chrome prebuilt for the most recent
	// version of chrome.
	HasChromePrebuilt(context.Context, *HasChromePrebuiltRequest) (*HasChromePrebuiltResponse, error)
	// Check if there is an available prebuilt for the most recent version of the
	// package.
	HasPrebuilt(context.Context, *HasPrebuiltRequest) (*HasPrebuiltResponse, error)
	// The generic uprev process -- performs uprevs for all packages in the
	// public and/or private overlays for the build target(s) specified.
	// This handles all cros_workon packages except those that have a separate
	// uprev process.
	Uprev(context.Context, *UprevPackagesRequest) (*UprevPackagesResponse, error)
	// Uprev a package that is externally versioned (e.g. Chrome).
	// This endpoint iterates over a list of git refs that represent versions
	// and searches for a new version, updating and upreving the package ebuild
	// if such a version is found. The exact behavior depends on the package.
	UprevVersionedPackage(context.Context, *UprevVersionedPackageRequest) (*UprevVersionedPackageResponse, error)
}

// UnimplementedPackageServiceServer can be embedded to have forward compatible implementations.
type UnimplementedPackageServiceServer struct {
}

func (*UnimplementedPackageServiceServer) BuildsChrome(ctx context.Context, req *BuildsChromeRequest) (*BuildsChromeResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BuildsChrome not implemented")
}
func (*UnimplementedPackageServiceServer) GetBestVisible(ctx context.Context, req *GetBestVisibleRequest) (*GetBestVisibleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetBestVisible not implemented")
}
func (*UnimplementedPackageServiceServer) GetChromeVersion(ctx context.Context, req *GetChromeVersionRequest) (*GetChromeVersionResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetChromeVersion not implemented")
}
func (*UnimplementedPackageServiceServer) GetTargetVersions(ctx context.Context, req *GetTargetVersionsRequest) (*GetTargetVersionsResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetTargetVersions not implemented")
}
func (*UnimplementedPackageServiceServer) GetBuilderMetadata(ctx context.Context, req *GetBuilderMetadataRequest) (*GetBuilderMetadataResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetBuilderMetadata not implemented")
}
func (*UnimplementedPackageServiceServer) HasChromePrebuilt(ctx context.Context, req *HasChromePrebuiltRequest) (*HasChromePrebuiltResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method HasChromePrebuilt not implemented")
}
func (*UnimplementedPackageServiceServer) HasPrebuilt(ctx context.Context, req *HasPrebuiltRequest) (*HasPrebuiltResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method HasPrebuilt not implemented")
}
func (*UnimplementedPackageServiceServer) Uprev(ctx context.Context, req *UprevPackagesRequest) (*UprevPackagesResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method Uprev not implemented")
}
func (*UnimplementedPackageServiceServer) UprevVersionedPackage(ctx context.Context, req *UprevVersionedPackageRequest) (*UprevVersionedPackageResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method UprevVersionedPackage not implemented")
}

func RegisterPackageServiceServer(s *grpc.Server, srv PackageServiceServer) {
	s.RegisterService(&_PackageService_serviceDesc, srv)
}

func _PackageService_BuildsChrome_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BuildsChromeRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).BuildsChrome(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/BuildsChrome",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).BuildsChrome(ctx, req.(*BuildsChromeRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_GetBestVisible_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetBestVisibleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).GetBestVisible(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/GetBestVisible",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).GetBestVisible(ctx, req.(*GetBestVisibleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_GetChromeVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetChromeVersionRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).GetChromeVersion(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/GetChromeVersion",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).GetChromeVersion(ctx, req.(*GetChromeVersionRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_GetTargetVersions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetTargetVersionsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).GetTargetVersions(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/GetTargetVersions",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).GetTargetVersions(ctx, req.(*GetTargetVersionsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_GetBuilderMetadata_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetBuilderMetadataRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).GetBuilderMetadata(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/GetBuilderMetadata",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).GetBuilderMetadata(ctx, req.(*GetBuilderMetadataRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_HasChromePrebuilt_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(HasChromePrebuiltRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).HasChromePrebuilt(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/HasChromePrebuilt",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).HasChromePrebuilt(ctx, req.(*HasChromePrebuiltRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_HasPrebuilt_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(HasPrebuiltRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).HasPrebuilt(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/HasPrebuilt",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).HasPrebuilt(ctx, req.(*HasPrebuiltRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_Uprev_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UprevPackagesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).Uprev(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/Uprev",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).Uprev(ctx, req.(*UprevPackagesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _PackageService_UprevVersionedPackage_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UprevVersionedPackageRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PackageServiceServer).UprevVersionedPackage(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PackageService/UprevVersionedPackage",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PackageServiceServer).UprevVersionedPackage(ctx, req.(*UprevVersionedPackageRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _PackageService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "chromite.api.PackageService",
	HandlerType: (*PackageServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "BuildsChrome",
			Handler:    _PackageService_BuildsChrome_Handler,
		},
		{
			MethodName: "GetBestVisible",
			Handler:    _PackageService_GetBestVisible_Handler,
		},
		{
			MethodName: "GetChromeVersion",
			Handler:    _PackageService_GetChromeVersion_Handler,
		},
		{
			MethodName: "GetTargetVersions",
			Handler:    _PackageService_GetTargetVersions_Handler,
		},
		{
			MethodName: "GetBuilderMetadata",
			Handler:    _PackageService_GetBuilderMetadata_Handler,
		},
		{
			MethodName: "HasChromePrebuilt",
			Handler:    _PackageService_HasChromePrebuilt_Handler,
		},
		{
			MethodName: "HasPrebuilt",
			Handler:    _PackageService_HasPrebuilt_Handler,
		},
		{
			MethodName: "Uprev",
			Handler:    _PackageService_Uprev_Handler,
		},
		{
			MethodName: "UprevVersionedPackage",
			Handler:    _PackageService_UprevVersionedPackage_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "chromite/api/packages.proto",
}
