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

type MarkStableStatusType int32

const (
	// Unspecified
	MarkStableStatusType_MARK_STABLE_STATUS_UNSPECIFIED MarkStableStatusType = 0
	// Success
	MarkStableStatusType_MARK_STABLE_STATUS_SUCCESS MarkStableStatusType = 1
	// Pinned (at android_atom)
	MarkStableStatusType_MARK_STABLE_STATUS_PINNED MarkStableStatusType = 2
	// Early exit
	MarkStableStatusType_MARK_STABLE_STATUS_EARLY_EXIT MarkStableStatusType = 3
)

// Enum value maps for MarkStableStatusType.
var (
	MarkStableStatusType_name = map[int32]string{
		0: "MARK_STABLE_STATUS_UNSPECIFIED",
		1: "MARK_STABLE_STATUS_SUCCESS",
		2: "MARK_STABLE_STATUS_PINNED",
		3: "MARK_STABLE_STATUS_EARLY_EXIT",
	}
	MarkStableStatusType_value = map[string]int32{
		"MARK_STABLE_STATUS_UNSPECIFIED": 0,
		"MARK_STABLE_STATUS_SUCCESS":     1,
		"MARK_STABLE_STATUS_PINNED":      2,
		"MARK_STABLE_STATUS_EARLY_EXIT":  3,
	}
)

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

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

func (MarkStableStatusType) Descriptor() protoreflect.EnumDescriptor {
	return file_chromite_api_android_proto_enumTypes[0].Descriptor()
}

func (MarkStableStatusType) Type() protoreflect.EnumType {
	return &file_chromite_api_android_proto_enumTypes[0]
}

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

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

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

	// Required if not default.
	// The chroot where.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The manifest branch being used.
	// Deprecated since R90.
	//
	// Deprecated: Do not use.
	TrackingBranch string `protobuf:"bytes,2,opt,name=tracking_branch,json=trackingBranch,proto3" json:"tracking_branch,omitempty"`
	// Required.
	// Portage package name for Android container.
	PackageName string `protobuf:"bytes,3,opt,name=package_name,json=packageName,proto3" json:"package_name,omitempty"`
	// Required.
	// Android branch to import from.
	AndroidBuildBranch string `protobuf:"bytes,4,opt,name=android_build_branch,json=androidBuildBranch,proto3" json:"android_build_branch,omitempty"`
	// Force set the android build id that will be used.
	AndroidVersion string `protobuf:"bytes,5,opt,name=android_version,json=androidVersion,proto3" json:"android_version,omitempty"`
	// Android GTS branch to copy artifacts from.
	// Deprecated.
	//
	// Deprecated: Do not use.
	AndroidGtsBuildBranch string `protobuf:"bytes,6,opt,name=android_gts_build_branch,json=androidGtsBuildBranch,proto3" json:"android_gts_build_branch,omitempty"`
	// The set of relevant build targets. Used to clean old version and for a
	// emerge-able sanity check for the new version.
	// Recommended.
	BuildTargets []*chromiumos.BuildTarget `protobuf:"bytes,7,rep,name=build_targets,json=buildTargets,proto3" json:"build_targets,omitempty"`
	// Asks the uprev script to skip commiting changes to git when it's not
	// required, for example in CQ builders.
	// Added in R90.
	SkipCommit bool `protobuf:"varint,8,opt,name=skip_commit,json=skipCommit,proto3" json:"skip_commit,omitempty"`
}

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

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

func (*MarkStableRequest) ProtoMessage() {}

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

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

// Deprecated: Do not use.
func (x *MarkStableRequest) GetTrackingBranch() string {
	if x != nil {
		return x.TrackingBranch
	}
	return ""
}

func (x *MarkStableRequest) GetPackageName() string {
	if x != nil {
		return x.PackageName
	}
	return ""
}

func (x *MarkStableRequest) GetAndroidBuildBranch() string {
	if x != nil {
		return x.AndroidBuildBranch
	}
	return ""
}

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

// Deprecated: Do not use.
func (x *MarkStableRequest) GetAndroidGtsBuildBranch() string {
	if x != nil {
		return x.AndroidGtsBuildBranch
	}
	return ""
}

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

func (x *MarkStableRequest) GetSkipCommit() bool {
	if x != nil {
		return x.SkipCommit
	}
	return false
}

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

	// Possible errors.
	Status MarkStableStatusType `protobuf:"varint,1,opt,name=status,proto3,enum=chromite.api.MarkStableStatusType" json:"status,omitempty"`
	// The new package atom.
	AndroidAtom *chromiumos.PackageInfo `protobuf:"bytes,2,opt,name=android_atom,json=androidAtom,proto3" json:"android_atom,omitempty"`
}

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

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

func (*MarkStableResponse) ProtoMessage() {}

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

func (x *MarkStableResponse) GetStatus() MarkStableStatusType {
	if x != nil {
		return x.Status
	}
	return MarkStableStatusType_MARK_STABLE_STATUS_UNSPECIFIED
}

func (x *MarkStableResponse) GetAndroidAtom() *chromiumos.PackageInfo {
	if x != nil {
		return x.AndroidAtom
	}
	return nil
}

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

	// The chroot to use to execute the endpoint.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
}

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

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

func (*UnpinVersionRequest) ProtoMessage() {}

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

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

type UnpinVersionResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*UnpinVersionResponse) ProtoMessage() {}

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

var File_chromite_api_android_proto protoreflect.FileDescriptor

var file_chromite_api_android_proto_rawDesc = []byte{
	0x0a, 0x1a, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61,
	0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x1a, 0x1c, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x61,
	0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x22, 0x86, 0x03, 0x0a, 0x11, 0x4d, 0x61, 0x72, 0x6b, 0x53, 0x74, 0x61, 0x62, 0x6c, 0x65,
	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f,
	0x74, 0x18, 0x01, 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, 0x2b, 0x0a, 0x0f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f,
	0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01,
	0x52, 0x0e, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68,
	0x12, 0x21, 0x0a, 0x0c, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
	0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x4e,
	0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, 0x5f, 0x62,
	0x75, 0x69, 0x6c, 0x64, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x12, 0x61, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x42,
	0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64,
	0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e,
	0x61, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3b,
	0x0a, 0x18, 0x61, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, 0x5f, 0x67, 0x74, 0x73, 0x5f, 0x62, 0x75,
	0x69, 0x6c, 0x64, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09,
	0x42, 0x02, 0x18, 0x01, 0x52, 0x15, 0x61, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, 0x47, 0x74, 0x73,
	0x42, 0x75, 0x69, 0x6c, 0x64, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x3c, 0x0a, 0x0d, 0x62,
	0x75, 0x69, 0x6c, 0x64, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03,
	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, 0x0c, 0x62, 0x75, 0x69,
	0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6b, 0x69,
	0x70, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a,
	0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x22, 0x8c, 0x01, 0x0a, 0x12, 0x4d,
	0x61, 0x72, 0x6b, 0x53, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
	0x65, 0x12, 0x3a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x0e, 0x32, 0x22, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69,
	0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x53, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75,
	0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3a, 0x0a,
	0x0c, 0x61, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, 0x5f, 0x61, 0x74, 0x6f, 0x6d, 0x18, 0x02, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73,
	0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x61, 0x6e,
	0x64, 0x72, 0x6f, 0x69, 0x64, 0x41, 0x74, 0x6f, 0x6d, 0x22, 0x41, 0x0a, 0x13, 0x55, 0x6e, 0x70,
	0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
	0x12, 0x2a, 0x0a, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, 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, 0x16, 0x0a, 0x14,
	0x55, 0x6e, 0x70, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70,
	0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x9c, 0x01, 0x0a, 0x14, 0x4d, 0x61, 0x72, 0x6b, 0x53, 0x74, 0x61,
	0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a,
	0x1e, 0x4d, 0x41, 0x52, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x53, 0x54, 0x41,
	0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10,
	0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x4d, 0x41, 0x52, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x45,
	0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10,
	0x01, 0x12, 0x1d, 0x0a, 0x19, 0x4d, 0x41, 0x52, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x45,
	0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x49, 0x4e, 0x4e, 0x45, 0x44, 0x10, 0x02,
	0x12, 0x21, 0x0a, 0x1d, 0x4d, 0x41, 0x52, 0x4b, 0x5f, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f,
	0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x45, 0x41, 0x52, 0x4c, 0x59, 0x5f, 0x45, 0x58, 0x49,
	0x54, 0x10, 0x03, 0x32, 0xd9, 0x01, 0x0a, 0x0e, 0x41, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, 0x53,
	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x57, 0x0a, 0x0a, 0x4d, 0x61, 0x72, 0x6b, 0x53, 0x74,
	0x61, 0x62, 0x6c, 0x65, 0x12, 0x1f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e,
	0x61, 0x70, 0x69, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x53, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65,
	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65,
	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x53, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52,
	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xc2, 0xed, 0x1a, 0x02, 0x10, 0x02, 0x12,
	0x5d, 0x0a, 0x0c, 0x55, 0x6e, 0x70, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12,
	0x21, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55,
	0x6e, 0x70, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65,
	0x73, 0x74, 0x1a, 0x22, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70,
	0x69, 0x2e, 0x55, 0x6e, 0x70, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65,
	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xc2, 0xed, 0x1a, 0x02, 0x10, 0x01, 0x1a, 0x0f,
	0xc2, 0xed, 0x1a, 0x0b, 0x0a, 0x07, 0x61, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, 0x10, 0x01, 0x42,
	0x38, 0x5a, 0x36, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f,
	0x72, 0x67, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x69, 0x6e,
	0x66, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x33,
}

var (
	file_chromite_api_android_proto_rawDescOnce sync.Once
	file_chromite_api_android_proto_rawDescData = file_chromite_api_android_proto_rawDesc
)

func file_chromite_api_android_proto_rawDescGZIP() []byte {
	file_chromite_api_android_proto_rawDescOnce.Do(func() {
		file_chromite_api_android_proto_rawDescData = protoimpl.X.CompressGZIP(file_chromite_api_android_proto_rawDescData)
	})
	return file_chromite_api_android_proto_rawDescData
}

var file_chromite_api_android_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_chromite_api_android_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
var file_chromite_api_android_proto_goTypes = []interface{}{
	(MarkStableStatusType)(0),      // 0: chromite.api.MarkStableStatusType
	(*MarkStableRequest)(nil),      // 1: chromite.api.MarkStableRequest
	(*MarkStableResponse)(nil),     // 2: chromite.api.MarkStableResponse
	(*UnpinVersionRequest)(nil),    // 3: chromite.api.UnpinVersionRequest
	(*UnpinVersionResponse)(nil),   // 4: chromite.api.UnpinVersionResponse
	(*chromiumos.Chroot)(nil),      // 5: chromiumos.Chroot
	(*chromiumos.BuildTarget)(nil), // 6: chromiumos.BuildTarget
	(*chromiumos.PackageInfo)(nil), // 7: chromiumos.PackageInfo
}
var file_chromite_api_android_proto_depIdxs = []int32{
	5, // 0: chromite.api.MarkStableRequest.chroot:type_name -> chromiumos.Chroot
	6, // 1: chromite.api.MarkStableRequest.build_targets:type_name -> chromiumos.BuildTarget
	0, // 2: chromite.api.MarkStableResponse.status:type_name -> chromite.api.MarkStableStatusType
	7, // 3: chromite.api.MarkStableResponse.android_atom:type_name -> chromiumos.PackageInfo
	5, // 4: chromite.api.UnpinVersionRequest.chroot:type_name -> chromiumos.Chroot
	1, // 5: chromite.api.AndroidService.MarkStable:input_type -> chromite.api.MarkStableRequest
	3, // 6: chromite.api.AndroidService.UnpinVersion:input_type -> chromite.api.UnpinVersionRequest
	2, // 7: chromite.api.AndroidService.MarkStable:output_type -> chromite.api.MarkStableResponse
	4, // 8: chromite.api.AndroidService.UnpinVersion:output_type -> chromite.api.UnpinVersionResponse
	7, // [7:9] is the sub-list for method output_type
	5, // [5:7] is the sub-list for method input_type
	5, // [5:5] is the sub-list for extension type_name
	5, // [5:5] is the sub-list for extension extendee
	0, // [0:5] is the sub-list for field type_name
}

func init() { file_chromite_api_android_proto_init() }
func file_chromite_api_android_proto_init() {
	if File_chromite_api_android_proto != nil {
		return
	}
	file_chromite_api_build_api_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_chromite_api_android_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*MarkStableRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_android_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*MarkStableResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_android_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*UnpinVersionRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_android_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*UnpinVersionResponse); 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_android_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   4,
			NumExtensions: 0,
			NumServices:   1,
		},
		GoTypes:           file_chromite_api_android_proto_goTypes,
		DependencyIndexes: file_chromite_api_android_proto_depIdxs,
		EnumInfos:         file_chromite_api_android_proto_enumTypes,
		MessageInfos:      file_chromite_api_android_proto_msgTypes,
	}.Build()
	File_chromite_api_android_proto = out.File
	file_chromite_api_android_proto_rawDesc = nil
	file_chromite_api_android_proto_goTypes = nil
	file_chromite_api_android_proto_depIdxs = nil
}
