// Code generated by protoc-gen-go. DO NOT EDIT.
// source: go.chromium.org/luci/buildbucket/proto/rpc.proto

package buildbucketpb

import prpc "go.chromium.org/luci/grpc/prpc"

import (
	context "context"
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	_struct "github.com/golang/protobuf/ptypes/struct"
	status "google.golang.org/genproto/googleapis/rpc/status"
	field_mask "google.golang.org/genproto/protobuf/field_mask"
	grpc "google.golang.org/grpc"
	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

// A request message for GetBuild rpc.
type GetBuildRequest struct {
	// Build id.
	// Mutually exclusive with builder and number.
	Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
	// Builder of the build.
	// Requires number. Mutually exclusive with id.
	Builder *BuilderID `protobuf:"bytes,2,opt,name=builder,proto3" json:"builder,omitempty"`
	// Build number.
	// Requires builder. Mutually exclusive with id.
	BuildNumber int32 `protobuf:"varint,3,opt,name=build_number,json=buildNumber,proto3" json:"build_number,omitempty"`
	// Fields to include in the response.
	// If not set, the default mask is used, see Build message comments for the
	// list of fields returned by default.
	//
	// Supports advanced semantics, see
	// https://chromium.googlesource.com/infra/luci/luci-py/+/f9ae69a37c4bdd0e08a8b0f7e123f6e403e774eb/appengine/components/components/protoutil/field_masks.py#7
	// In particular, if the client needs only some output properties, they
	// can be requested with paths "output.properties.fields.foo".
	Fields               *field_mask.FieldMask `protobuf:"bytes,100,opt,name=fields,proto3" json:"fields,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_GetBuildRequest proto.InternalMessageInfo

func (m *GetBuildRequest) GetId() int64 {
	if m != nil {
		return m.Id
	}
	return 0
}

func (m *GetBuildRequest) GetBuilder() *BuilderID {
	if m != nil {
		return m.Builder
	}
	return nil
}

func (m *GetBuildRequest) GetBuildNumber() int32 {
	if m != nil {
		return m.BuildNumber
	}
	return 0
}

func (m *GetBuildRequest) GetFields() *field_mask.FieldMask {
	if m != nil {
		return m.Fields
	}
	return nil
}

// A request message for SearchBuilds rpc.
type SearchBuildsRequest struct {
	// Returned builds must satisfy this predicate. Required.
	Predicate *BuildPredicate `protobuf:"bytes,1,opt,name=predicate,proto3" json:"predicate,omitempty"`
	// Fields to include in the response, see GetBuildRequest.fields.
	// Note that this applies to the response, not each build, so e.g. steps must
	// be requested with a path "builds.*.steps".
	Fields *field_mask.FieldMask `protobuf:"bytes,100,opt,name=fields,proto3" json:"fields,omitempty"`
	// Number of builds to return.
	// Defaults to 100.
	// Any value >1000 is interpreted as 1000.
	PageSize int32 `protobuf:"varint,101,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
	// Value of SearchBuildsResponse.next_page_token from the previous response.
	// Use it to continue searching.
	PageToken            string   `protobuf:"bytes,102,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SearchBuildsRequest proto.InternalMessageInfo

func (m *SearchBuildsRequest) GetPredicate() *BuildPredicate {
	if m != nil {
		return m.Predicate
	}
	return nil
}

func (m *SearchBuildsRequest) GetFields() *field_mask.FieldMask {
	if m != nil {
		return m.Fields
	}
	return nil
}

func (m *SearchBuildsRequest) GetPageSize() int32 {
	if m != nil {
		return m.PageSize
	}
	return 0
}

func (m *SearchBuildsRequest) GetPageToken() string {
	if m != nil {
		return m.PageToken
	}
	return ""
}

// A response message for SearchBuilds rpc.
type SearchBuildsResponse struct {
	// Search results.
	//
	// Ordered by build id, descending. Ids are monotonically decreasing, so in
	// other words the order is newest-to-oldest.
	Builds []*Build `protobuf:"bytes,1,rep,name=builds,proto3" json:"builds,omitempty"`
	// Value for SearchBuildsRequest.page_token to continue searching.
	NextPageToken        string   `protobuf:"bytes,100,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SearchBuildsResponse proto.InternalMessageInfo

func (m *SearchBuildsResponse) GetBuilds() []*Build {
	if m != nil {
		return m.Builds
	}
	return nil
}

func (m *SearchBuildsResponse) GetNextPageToken() string {
	if m != nil {
		return m.NextPageToken
	}
	return ""
}

// A request message for Batch rpc.
type BatchRequest struct {
	// Requests to execute in a single batch.
	//
	// All requests are executed in their own individual transactions.
	// BatchRequest as a whole is not transactional.
	// Mutations are executed before read-only requests.
	Requests             []*BatchRequest_Request `protobuf:"bytes,1,rep,name=requests,proto3" json:"requests,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_BatchRequest proto.InternalMessageInfo

func (m *BatchRequest) GetRequests() []*BatchRequest_Request {
	if m != nil {
		return m.Requests
	}
	return nil
}

// One request in a batch.
type BatchRequest_Request struct {
	// Types that are valid to be assigned to Request:
	//	*BatchRequest_Request_GetBuild
	//	*BatchRequest_Request_SearchBuilds
	//	*BatchRequest_Request_ScheduleBuild
	Request              isBatchRequest_Request_Request `protobuf_oneof:"request"`
	XXX_NoUnkeyedLiteral struct{}                       `json:"-"`
	XXX_unrecognized     []byte                         `json:"-"`
	XXX_sizecache        int32                          `json:"-"`
}

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

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

var xxx_messageInfo_BatchRequest_Request proto.InternalMessageInfo

type isBatchRequest_Request_Request interface {
	isBatchRequest_Request_Request()
}

type BatchRequest_Request_GetBuild struct {
	GetBuild *GetBuildRequest `protobuf:"bytes,1,opt,name=get_build,json=getBuild,proto3,oneof"`
}

type BatchRequest_Request_SearchBuilds struct {
	SearchBuilds *SearchBuildsRequest `protobuf:"bytes,2,opt,name=search_builds,json=searchBuilds,proto3,oneof"`
}

type BatchRequest_Request_ScheduleBuild struct {
	ScheduleBuild *ScheduleBuildRequest `protobuf:"bytes,3,opt,name=schedule_build,json=scheduleBuild,proto3,oneof"`
}

func (*BatchRequest_Request_GetBuild) isBatchRequest_Request_Request() {}

func (*BatchRequest_Request_SearchBuilds) isBatchRequest_Request_Request() {}

func (*BatchRequest_Request_ScheduleBuild) isBatchRequest_Request_Request() {}

func (m *BatchRequest_Request) GetRequest() isBatchRequest_Request_Request {
	if m != nil {
		return m.Request
	}
	return nil
}

func (m *BatchRequest_Request) GetGetBuild() *GetBuildRequest {
	if x, ok := m.GetRequest().(*BatchRequest_Request_GetBuild); ok {
		return x.GetBuild
	}
	return nil
}

func (m *BatchRequest_Request) GetSearchBuilds() *SearchBuildsRequest {
	if x, ok := m.GetRequest().(*BatchRequest_Request_SearchBuilds); ok {
		return x.SearchBuilds
	}
	return nil
}

func (m *BatchRequest_Request) GetScheduleBuild() *ScheduleBuildRequest {
	if x, ok := m.GetRequest().(*BatchRequest_Request_ScheduleBuild); ok {
		return x.ScheduleBuild
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*BatchRequest_Request) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*BatchRequest_Request_GetBuild)(nil),
		(*BatchRequest_Request_SearchBuilds)(nil),
		(*BatchRequest_Request_ScheduleBuild)(nil),
	}
}

// A response message for Batch rpc.
type BatchResponse struct {
	// Responses in the same order as BatchRequest.requests.
	Responses            []*BatchResponse_Response `protobuf:"bytes,1,rep,name=responses,proto3" json:"responses,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

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

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

var xxx_messageInfo_BatchResponse proto.InternalMessageInfo

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

// Response a BatchRequest.Response.
type BatchResponse_Response struct {
	// Types that are valid to be assigned to Response:
	//	*BatchResponse_Response_GetBuild
	//	*BatchResponse_Response_SearchBuilds
	//	*BatchResponse_Response_ScheduleBuild
	//	*BatchResponse_Response_Error
	Response             isBatchResponse_Response_Response `protobuf_oneof:"response"`
	XXX_NoUnkeyedLiteral struct{}                          `json:"-"`
	XXX_unrecognized     []byte                            `json:"-"`
	XXX_sizecache        int32                             `json:"-"`
}

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

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

var xxx_messageInfo_BatchResponse_Response proto.InternalMessageInfo

type isBatchResponse_Response_Response interface {
	isBatchResponse_Response_Response()
}

type BatchResponse_Response_GetBuild struct {
	GetBuild *Build `protobuf:"bytes,1,opt,name=get_build,json=getBuild,proto3,oneof"`
}

type BatchResponse_Response_SearchBuilds struct {
	SearchBuilds *SearchBuildsResponse `protobuf:"bytes,2,opt,name=search_builds,json=searchBuilds,proto3,oneof"`
}

type BatchResponse_Response_ScheduleBuild struct {
	ScheduleBuild *Build `protobuf:"bytes,3,opt,name=schedule_build,json=scheduleBuild,proto3,oneof"`
}

type BatchResponse_Response_Error struct {
	Error *status.Status `protobuf:"bytes,100,opt,name=error,proto3,oneof"`
}

func (*BatchResponse_Response_GetBuild) isBatchResponse_Response_Response() {}

func (*BatchResponse_Response_SearchBuilds) isBatchResponse_Response_Response() {}

func (*BatchResponse_Response_ScheduleBuild) isBatchResponse_Response_Response() {}

func (*BatchResponse_Response_Error) isBatchResponse_Response_Response() {}

func (m *BatchResponse_Response) GetResponse() isBatchResponse_Response_Response {
	if m != nil {
		return m.Response
	}
	return nil
}

func (m *BatchResponse_Response) GetGetBuild() *Build {
	if x, ok := m.GetResponse().(*BatchResponse_Response_GetBuild); ok {
		return x.GetBuild
	}
	return nil
}

func (m *BatchResponse_Response) GetSearchBuilds() *SearchBuildsResponse {
	if x, ok := m.GetResponse().(*BatchResponse_Response_SearchBuilds); ok {
		return x.SearchBuilds
	}
	return nil
}

func (m *BatchResponse_Response) GetScheduleBuild() *Build {
	if x, ok := m.GetResponse().(*BatchResponse_Response_ScheduleBuild); ok {
		return x.ScheduleBuild
	}
	return nil
}

func (m *BatchResponse_Response) GetError() *status.Status {
	if x, ok := m.GetResponse().(*BatchResponse_Response_Error); ok {
		return x.Error
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*BatchResponse_Response) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*BatchResponse_Response_GetBuild)(nil),
		(*BatchResponse_Response_SearchBuilds)(nil),
		(*BatchResponse_Response_ScheduleBuild)(nil),
		(*BatchResponse_Response_Error)(nil),
	}
}

// A request message for UpdateBuild rpc.
type UpdateBuildRequest struct {
	// Build to update, with new field values.
	Build *Build `protobuf:"bytes,1,opt,name=build,proto3" json:"build,omitempty"`
	// Build fields to update.
	// See also
	// https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#fieldmask
	//
	// Currently supports only the following path strings:
	// - build.steps
	// - build.output.properties
	UpdateMask *field_mask.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
	// Fields to include in the response. See also GetBuildRequest.fields.
	Fields               *field_mask.FieldMask `protobuf:"bytes,100,opt,name=fields,proto3" json:"fields,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_UpdateBuildRequest proto.InternalMessageInfo

func (m *UpdateBuildRequest) GetBuild() *Build {
	if m != nil {
		return m.Build
	}
	return nil
}

func (m *UpdateBuildRequest) GetUpdateMask() *field_mask.FieldMask {
	if m != nil {
		return m.UpdateMask
	}
	return nil
}

func (m *UpdateBuildRequest) GetFields() *field_mask.FieldMask {
	if m != nil {
		return m.Fields
	}
	return nil
}

// A request message for ScheduleBuild rpc.
//
// Next ID: 13.
type ScheduleBuildRequest struct {
	// Required. A unique string id used for detecting duplicate requests.
	// Should be unique at least per requesting identity.
	// Used to dedup build scheduling requests with same id within 1 min.
	// If a build was successfully scheduled with the same request id in the past
	// minute, the existing build will be returned.
	RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"`
	// ID of a build to retry as is or altered.
	// When specified, fields below default to the values in the template build.
	TemplateBuildId int64 `protobuf:"varint,2,opt,name=template_build_id,json=templateBuildId,proto3" json:"template_build_id,omitempty"`
	// Value for Build.builder. See its comments.
	// Required, unless template_build_id is specified.
	Builder *BuilderID `protobuf:"bytes,3,opt,name=builder,proto3" json:"builder,omitempty"`
	// If specified, overrides server-defined value of
	// Build.infra.buildbucket.canary.
	// Otherwise the value is computed based on the builder config.
	// See Swarming.task_template_canary_percentage in
	// ./config/project_config.proto.
	Canary Trinary `protobuf:"varint,4,opt,name=canary,proto3,enum=buildbucket.v2.Trinary" json:"canary,omitempty"`
	// If specified, overrides server-defined value of Build.input.experimental.
	// Otherwise the value is computed based on the builder config.
	// See Builder.experimental in ./config/project_config.proto.
	Experimental Trinary `protobuf:"varint,5,opt,name=experimental,proto3,enum=buildbucket.v2.Trinary" json:"experimental,omitempty"`
	// Properties to include in Build.input.properties.
	//
	// Input properties of the created build are result of merging server-defined
	// properties and properties in this field.
	// Each property in this field defines a new or replaces an existing property
	// on the server.
	// If the server config does not allow overriding/adding the property, the
	// request will fail with InvalidArgument error code.
	// A server-defined property cannot be removed, but its value can be
	// replaced with null.
	//
	// Reserved property paths:
	// * ["buildbucket"]
	// * ["buildername"]
	// * ["blamelist""]
	// * ["$recipe_engine/runtime", "is_luci"]
	// * ["$recipe_engine/runtime", "is_experimental"]
	//
	// V1 equivalent: corresponds to "properties" key in "parameters_json".
	Properties *_struct.Struct `protobuf:"bytes,6,opt,name=properties,proto3" json:"properties,omitempty"`
	// Value for Build.input.gitiles_commit.
	//
	// Setting this field will cause the created build to have a "buildset"
	// tag with value "commit/gitiles/{hostname}/{project}/+/{id}".
	//
	// V1 equivalent: supersedes "revision" property and "buildset"
	// tag that starts with "commit/gitiles/".
	GitilesCommit *GitilesCommit `protobuf:"bytes,7,opt,name=gitiles_commit,json=gitilesCommit,proto3" json:"gitiles_commit,omitempty"`
	// Value for Build.input.gerrit_changes.
	// Usually present in tryjobs, set by CQ, Gerrit, git-cl-try.
	// Applied on top of gitiles_commit if specified, otherwise tip of the tree.
	//
	// Setting this field will cause the created build to have a "buildset"
	// tag with value "patch/gerrit/{hostname}/{change}/{patchset}"
	// for each change.
	//
	// V1 equivalent: supersedes patch_* properties and "buildset"
	// tag that starts with "patch/gerrit/".
	GerritChanges []*GerritChange `protobuf:"bytes,8,rep,name=gerrit_changes,json=gerritChanges,proto3" json:"gerrit_changes,omitempty"`
	// Tags to include in Build.tags of the created build, see Build.tags
	// comments.
	// Note: tags of the created build may include other tags defined on the
	// server.
	Tags []*StringPair `protobuf:"bytes,9,rep,name=tags,proto3" json:"tags,omitempty"`
	// Overrides default dimensions defined by builder config or template build.
	//
	// A set of entries with the same key defines a new or replaces an existing
	// dimension with the same key.
	// If the config does not allow overriding/adding the dimension, the request
	// will fail with InvalidArgument error code.
	//
	// After merging, dimensions with empty value will be excluded.
	//
	// A dimension expiration must be a multiple of 1min.
	Dimensions []*RequestedDimension `protobuf:"bytes,10,rep,name=dimensions,proto3" json:"dimensions,omitempty"`
	// If not zero, overrides swarming task priority.
	// See also Build.infra.swarming.priority.
	Priority int32 `protobuf:"varint,11,opt,name=priority,proto3" json:"priority,omitempty"`
	// A per-build notification configuration.
	Notify *NotificationConfig `protobuf:"bytes,12,opt,name=notify,proto3" json:"notify,omitempty"`
	// Fields to include in the response. See also GetBuildRequest.fields.
	Fields               *field_mask.FieldMask `protobuf:"bytes,100,opt,name=fields,proto3" json:"fields,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_ScheduleBuildRequest proto.InternalMessageInfo

func (m *ScheduleBuildRequest) GetRequestId() string {
	if m != nil {
		return m.RequestId
	}
	return ""
}

func (m *ScheduleBuildRequest) GetTemplateBuildId() int64 {
	if m != nil {
		return m.TemplateBuildId
	}
	return 0
}

func (m *ScheduleBuildRequest) GetBuilder() *BuilderID {
	if m != nil {
		return m.Builder
	}
	return nil
}

func (m *ScheduleBuildRequest) GetCanary() Trinary {
	if m != nil {
		return m.Canary
	}
	return Trinary_UNSET
}

func (m *ScheduleBuildRequest) GetExperimental() Trinary {
	if m != nil {
		return m.Experimental
	}
	return Trinary_UNSET
}

func (m *ScheduleBuildRequest) GetProperties() *_struct.Struct {
	if m != nil {
		return m.Properties
	}
	return nil
}

func (m *ScheduleBuildRequest) GetGitilesCommit() *GitilesCommit {
	if m != nil {
		return m.GitilesCommit
	}
	return nil
}

func (m *ScheduleBuildRequest) GetGerritChanges() []*GerritChange {
	if m != nil {
		return m.GerritChanges
	}
	return nil
}

func (m *ScheduleBuildRequest) GetTags() []*StringPair {
	if m != nil {
		return m.Tags
	}
	return nil
}

func (m *ScheduleBuildRequest) GetDimensions() []*RequestedDimension {
	if m != nil {
		return m.Dimensions
	}
	return nil
}

func (m *ScheduleBuildRequest) GetPriority() int32 {
	if m != nil {
		return m.Priority
	}
	return 0
}

func (m *ScheduleBuildRequest) GetNotify() *NotificationConfig {
	if m != nil {
		return m.Notify
	}
	return nil
}

func (m *ScheduleBuildRequest) GetFields() *field_mask.FieldMask {
	if m != nil {
		return m.Fields
	}
	return nil
}

// A request message for CancelBuild rpc.
type CancelBuildRequest struct {
	// ID of the build to cancel.
	Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
	// Required. Why the build is being cancelled.
	Reason *CancelReason `protobuf:"bytes,2,opt,name=reason,proto3" json:"reason,omitempty"`
	// Fields to include in the response. See also GetBuildRequest.fields.
	Fields               *field_mask.FieldMask `protobuf:"bytes,100,opt,name=fields,proto3" json:"fields,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_CancelBuildRequest proto.InternalMessageInfo

func (m *CancelBuildRequest) GetId() int64 {
	if m != nil {
		return m.Id
	}
	return 0
}

func (m *CancelBuildRequest) GetReason() *CancelReason {
	if m != nil {
		return m.Reason
	}
	return nil
}

func (m *CancelBuildRequest) GetFields() *field_mask.FieldMask {
	if m != nil {
		return m.Fields
	}
	return nil
}

// A build predicate.
//
// At least one of the following fields is required: builder, gerrit_changes and
// git_commits..
// If a field value is empty, it is ignored, unless stated otherwise.
type BuildPredicate struct {
	// A build must be in this builder.
	Builder *BuilderID `protobuf:"bytes,1,opt,name=builder,proto3" json:"builder,omitempty"`
	// A build must have this status.
	Status Status `protobuf:"varint,2,opt,name=status,proto3,enum=buildbucket.v2.Status" json:"status,omitempty"`
	// A build's Build.Input.gerrit_changes must include ALL of these changes.
	GerritChanges []*GerritChange `protobuf:"bytes,3,rep,name=gerrit_changes,json=gerritChanges,proto3" json:"gerrit_changes,omitempty"`
	// A build's Build.Output.gitiles_commit must match this commit.
	// One of the following subfield sets must specified:
	// - host, project, id
	// - host, project, ref
	// - host, project, ref, position
	OutputGitilesCommit *GitilesCommit `protobuf:"bytes,4,opt,name=output_gitiles_commit,json=outputGitilesCommit,proto3" json:"output_gitiles_commit,omitempty"`
	// A build must be created by this identity.
	CreatedBy string `protobuf:"bytes,5,opt,name=created_by,json=createdBy,proto3" json:"created_by,omitempty"`
	// A build must have ALL of these tags.
	// For "ANY of these tags" make separate RPCs.
	Tags []*StringPair `protobuf:"bytes,6,rep,name=tags,proto3" json:"tags,omitempty"`
	// A build must have been created within the specified range.
	// Both boundaries are optional.
	CreateTime *TimeRange `protobuf:"bytes,7,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
	// If false (default), a build must be non-experimental.
	// Otherwise it may be experimental or non-experimental.
	IncludeExperimental bool `protobuf:"varint,8,opt,name=include_experimental,json=includeExperimental,proto3" json:"include_experimental,omitempty"`
	// A build must be in this build range.
	// A pair of SearchBuildsRequest.predicate.build.end_build_id and
	// SearchBuildsRequest.page_size=1 can be used to find the previous build.
	Build *BuildRange `protobuf:"bytes,9,opt,name=build,proto3" json:"build,omitempty"`
	// A build must have a matching value of Build.infra.buildbucket.canary.
	Canary               Trinary  `protobuf:"varint,10,opt,name=canary,proto3,enum=buildbucket.v2.Trinary" json:"canary,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuildPredicate proto.InternalMessageInfo

func (m *BuildPredicate) GetBuilder() *BuilderID {
	if m != nil {
		return m.Builder
	}
	return nil
}

func (m *BuildPredicate) GetStatus() Status {
	if m != nil {
		return m.Status
	}
	return Status_STATUS_UNSPECIFIED
}

func (m *BuildPredicate) GetGerritChanges() []*GerritChange {
	if m != nil {
		return m.GerritChanges
	}
	return nil
}

func (m *BuildPredicate) GetOutputGitilesCommit() *GitilesCommit {
	if m != nil {
		return m.OutputGitilesCommit
	}
	return nil
}

func (m *BuildPredicate) GetCreatedBy() string {
	if m != nil {
		return m.CreatedBy
	}
	return ""
}

func (m *BuildPredicate) GetTags() []*StringPair {
	if m != nil {
		return m.Tags
	}
	return nil
}

func (m *BuildPredicate) GetCreateTime() *TimeRange {
	if m != nil {
		return m.CreateTime
	}
	return nil
}

func (m *BuildPredicate) GetIncludeExperimental() bool {
	if m != nil {
		return m.IncludeExperimental
	}
	return false
}

func (m *BuildPredicate) GetBuild() *BuildRange {
	if m != nil {
		return m.Build
	}
	return nil
}

func (m *BuildPredicate) GetCanary() Trinary {
	if m != nil {
		return m.Canary
	}
	return Trinary_UNSET
}

// Half-open build range.
// The range is defined on the build order in the context.
// Usually the order is newest-to-oldest, so start_build_id is a newer
// build and end_build_id is an older build.
type BuildRange struct {
	// Inclusive lower boundary. Optional.
	StartBuildId int64 `protobuf:"varint,1,opt,name=start_build_id,json=startBuildId,proto3" json:"start_build_id,omitempty"`
	// Exclusive upper boundary. Optional.
	EndBuildId           int64    `protobuf:"varint,2,opt,name=end_build_id,json=endBuildId,proto3" json:"end_build_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuildRange proto.InternalMessageInfo

func (m *BuildRange) GetStartBuildId() int64 {
	if m != nil {
		return m.StartBuildId
	}
	return 0
}

func (m *BuildRange) GetEndBuildId() int64 {
	if m != nil {
		return m.EndBuildId
	}
	return 0
}

func init() {
	proto.RegisterType((*GetBuildRequest)(nil), "buildbucket.v2.GetBuildRequest")
	proto.RegisterType((*SearchBuildsRequest)(nil), "buildbucket.v2.SearchBuildsRequest")
	proto.RegisterType((*SearchBuildsResponse)(nil), "buildbucket.v2.SearchBuildsResponse")
	proto.RegisterType((*BatchRequest)(nil), "buildbucket.v2.BatchRequest")
	proto.RegisterType((*BatchRequest_Request)(nil), "buildbucket.v2.BatchRequest.Request")
	proto.RegisterType((*BatchResponse)(nil), "buildbucket.v2.BatchResponse")
	proto.RegisterType((*BatchResponse_Response)(nil), "buildbucket.v2.BatchResponse.Response")
	proto.RegisterType((*UpdateBuildRequest)(nil), "buildbucket.v2.UpdateBuildRequest")
	proto.RegisterType((*ScheduleBuildRequest)(nil), "buildbucket.v2.ScheduleBuildRequest")
	proto.RegisterType((*CancelBuildRequest)(nil), "buildbucket.v2.CancelBuildRequest")
	proto.RegisterType((*BuildPredicate)(nil), "buildbucket.v2.BuildPredicate")
	proto.RegisterType((*BuildRange)(nil), "buildbucket.v2.BuildRange")
}

func init() {
	proto.RegisterFile("go.chromium.org/luci/buildbucket/proto/rpc.proto", fileDescriptor_6551d9ae29a9e5a9)
}

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

// BuildsClient is the client API for Builds service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type BuildsClient interface {
	// Gets a build.
	//
	// By default the returned build does not include all fields.
	// See GetBuildRequest.fields.
	//
	// Buildbot: if the specified build is a buildbot build, converts it to Build
	// message with the following rules:
	// * bucket names are full, e.g. "master.chromium". Note that LUCI buckets
	//   in v2 are shortened, e.g. "ci".
	// * if a v2 Build field does not make sense in V1, it is unset/empty.
	// * step support is not implemented for Buildbot builds.
	// Note that it does not support getting a buildbot build by build number.
	GetBuild(ctx context.Context, in *GetBuildRequest, opts ...grpc.CallOption) (*Build, error)
	// Searches for builds.
	//
	// Buildbot: can return Buildbot builds, see GetBuild for conversion rules.
	// For example, response may include a mix of LUCI and Buildbot builds if the
	// predicate is a CL.
	// Cannot search in a buildbot bucket or buildbot builder, e.g.
	// {
	//   "predicate": {
	//     "builder": {
	//       "project": "chromium",
	//       "bucket": "master.chromium",
	//       "builder": "linux-rel"
	//     }
	//   }
	// }
	// will look for builds in "master.chromium" LUCI bucket which probably does
	// not exist.
	SearchBuilds(ctx context.Context, in *SearchBuildsRequest, opts ...grpc.CallOption) (*SearchBuildsResponse, error)
	// Updates a build. Returns an empty build.
	//
	// RPC metadata must include "X-Build-Token" key with a token
	// generated by the server when scheduling the build.
	UpdateBuild(ctx context.Context, in *UpdateBuildRequest, opts ...grpc.CallOption) (*Build, error)
	// Schedules a new build.
	// The requester must have at least SCHEDULER role in the destination bucket.
	ScheduleBuild(ctx context.Context, in *ScheduleBuildRequest, opts ...grpc.CallOption) (*Build, error)
	// Cancels a build.
	// The requester must have at least SCHEDULER role in the destination bucket.
	CancelBuild(ctx context.Context, in *CancelBuildRequest, opts ...grpc.CallOption) (*Build, error)
	// Executes multiple requests in a batch.
	// The response code is always OK.
	Batch(ctx context.Context, in *BatchRequest, opts ...grpc.CallOption) (*BatchResponse, error)
}
type buildsPRPCClient struct {
	client *prpc.Client
}

func NewBuildsPRPCClient(client *prpc.Client) BuildsClient {
	return &buildsPRPCClient{client}
}

func (c *buildsPRPCClient) GetBuild(ctx context.Context, in *GetBuildRequest, opts ...grpc.CallOption) (*Build, error) {
	out := new(Build)
	err := c.client.Call(ctx, "buildbucket.v2.Builds", "GetBuild", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *buildsPRPCClient) SearchBuilds(ctx context.Context, in *SearchBuildsRequest, opts ...grpc.CallOption) (*SearchBuildsResponse, error) {
	out := new(SearchBuildsResponse)
	err := c.client.Call(ctx, "buildbucket.v2.Builds", "SearchBuilds", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *buildsPRPCClient) UpdateBuild(ctx context.Context, in *UpdateBuildRequest, opts ...grpc.CallOption) (*Build, error) {
	out := new(Build)
	err := c.client.Call(ctx, "buildbucket.v2.Builds", "UpdateBuild", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *buildsPRPCClient) ScheduleBuild(ctx context.Context, in *ScheduleBuildRequest, opts ...grpc.CallOption) (*Build, error) {
	out := new(Build)
	err := c.client.Call(ctx, "buildbucket.v2.Builds", "ScheduleBuild", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *buildsPRPCClient) CancelBuild(ctx context.Context, in *CancelBuildRequest, opts ...grpc.CallOption) (*Build, error) {
	out := new(Build)
	err := c.client.Call(ctx, "buildbucket.v2.Builds", "CancelBuild", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *buildsPRPCClient) Batch(ctx context.Context, in *BatchRequest, opts ...grpc.CallOption) (*BatchResponse, error) {
	out := new(BatchResponse)
	err := c.client.Call(ctx, "buildbucket.v2.Builds", "Batch", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

type buildsClient struct {
	cc *grpc.ClientConn
}

func NewBuildsClient(cc *grpc.ClientConn) BuildsClient {
	return &buildsClient{cc}
}

func (c *buildsClient) GetBuild(ctx context.Context, in *GetBuildRequest, opts ...grpc.CallOption) (*Build, error) {
	out := new(Build)
	err := c.cc.Invoke(ctx, "/buildbucket.v2.Builds/GetBuild", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *buildsClient) SearchBuilds(ctx context.Context, in *SearchBuildsRequest, opts ...grpc.CallOption) (*SearchBuildsResponse, error) {
	out := new(SearchBuildsResponse)
	err := c.cc.Invoke(ctx, "/buildbucket.v2.Builds/SearchBuilds", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *buildsClient) UpdateBuild(ctx context.Context, in *UpdateBuildRequest, opts ...grpc.CallOption) (*Build, error) {
	out := new(Build)
	err := c.cc.Invoke(ctx, "/buildbucket.v2.Builds/UpdateBuild", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *buildsClient) ScheduleBuild(ctx context.Context, in *ScheduleBuildRequest, opts ...grpc.CallOption) (*Build, error) {
	out := new(Build)
	err := c.cc.Invoke(ctx, "/buildbucket.v2.Builds/ScheduleBuild", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *buildsClient) CancelBuild(ctx context.Context, in *CancelBuildRequest, opts ...grpc.CallOption) (*Build, error) {
	out := new(Build)
	err := c.cc.Invoke(ctx, "/buildbucket.v2.Builds/CancelBuild", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *buildsClient) Batch(ctx context.Context, in *BatchRequest, opts ...grpc.CallOption) (*BatchResponse, error) {
	out := new(BatchResponse)
	err := c.cc.Invoke(ctx, "/buildbucket.v2.Builds/Batch", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// BuildsServer is the server API for Builds service.
type BuildsServer interface {
	// Gets a build.
	//
	// By default the returned build does not include all fields.
	// See GetBuildRequest.fields.
	//
	// Buildbot: if the specified build is a buildbot build, converts it to Build
	// message with the following rules:
	// * bucket names are full, e.g. "master.chromium". Note that LUCI buckets
	//   in v2 are shortened, e.g. "ci".
	// * if a v2 Build field does not make sense in V1, it is unset/empty.
	// * step support is not implemented for Buildbot builds.
	// Note that it does not support getting a buildbot build by build number.
	GetBuild(context.Context, *GetBuildRequest) (*Build, error)
	// Searches for builds.
	//
	// Buildbot: can return Buildbot builds, see GetBuild for conversion rules.
	// For example, response may include a mix of LUCI and Buildbot builds if the
	// predicate is a CL.
	// Cannot search in a buildbot bucket or buildbot builder, e.g.
	// {
	//   "predicate": {
	//     "builder": {
	//       "project": "chromium",
	//       "bucket": "master.chromium",
	//       "builder": "linux-rel"
	//     }
	//   }
	// }
	// will look for builds in "master.chromium" LUCI bucket which probably does
	// not exist.
	SearchBuilds(context.Context, *SearchBuildsRequest) (*SearchBuildsResponse, error)
	// Updates a build. Returns an empty build.
	//
	// RPC metadata must include "X-Build-Token" key with a token
	// generated by the server when scheduling the build.
	UpdateBuild(context.Context, *UpdateBuildRequest) (*Build, error)
	// Schedules a new build.
	// The requester must have at least SCHEDULER role in the destination bucket.
	ScheduleBuild(context.Context, *ScheduleBuildRequest) (*Build, error)
	// Cancels a build.
	// The requester must have at least SCHEDULER role in the destination bucket.
	CancelBuild(context.Context, *CancelBuildRequest) (*Build, error)
	// Executes multiple requests in a batch.
	// The response code is always OK.
	Batch(context.Context, *BatchRequest) (*BatchResponse, error)
}

func RegisterBuildsServer(s prpc.Registrar, srv BuildsServer) {
	s.RegisterService(&_Builds_serviceDesc, srv)
}

func _Builds_GetBuild_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetBuildRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BuildsServer).GetBuild(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/buildbucket.v2.Builds/GetBuild",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BuildsServer).GetBuild(ctx, req.(*GetBuildRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _Builds_SearchBuilds_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(SearchBuildsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BuildsServer).SearchBuilds(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/buildbucket.v2.Builds/SearchBuilds",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BuildsServer).SearchBuilds(ctx, req.(*SearchBuildsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _Builds_UpdateBuild_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UpdateBuildRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BuildsServer).UpdateBuild(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/buildbucket.v2.Builds/UpdateBuild",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BuildsServer).UpdateBuild(ctx, req.(*UpdateBuildRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _Builds_ScheduleBuild_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ScheduleBuildRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BuildsServer).ScheduleBuild(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/buildbucket.v2.Builds/ScheduleBuild",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BuildsServer).ScheduleBuild(ctx, req.(*ScheduleBuildRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _Builds_CancelBuild_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CancelBuildRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BuildsServer).CancelBuild(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/buildbucket.v2.Builds/CancelBuild",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BuildsServer).CancelBuild(ctx, req.(*CancelBuildRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _Builds_Batch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BatchRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BuildsServer).Batch(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/buildbucket.v2.Builds/Batch",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BuildsServer).Batch(ctx, req.(*BatchRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _Builds_serviceDesc = grpc.ServiceDesc{
	ServiceName: "buildbucket.v2.Builds",
	HandlerType: (*BuildsServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "GetBuild",
			Handler:    _Builds_GetBuild_Handler,
		},
		{
			MethodName: "SearchBuilds",
			Handler:    _Builds_SearchBuilds_Handler,
		},
		{
			MethodName: "UpdateBuild",
			Handler:    _Builds_UpdateBuild_Handler,
		},
		{
			MethodName: "ScheduleBuild",
			Handler:    _Builds_ScheduleBuild_Handler,
		},
		{
			MethodName: "CancelBuild",
			Handler:    _Builds_CancelBuild_Handler,
		},
		{
			MethodName: "Batch",
			Handler:    _Builds_Batch_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "go.chromium.org/luci/buildbucket/proto/rpc.proto",
}
