// Code generated by protoc-gen-go. DO NOT EDIT.
// source: go.chromium.org/luci/logdog/api/endpoints/coordinator/services/v1/service.proto

package logdog

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

import (
	context "context"
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	duration "github.com/golang/protobuf/ptypes/duration"
	empty "github.com/golang/protobuf/ptypes/empty"
	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

// Error is a projection of a gRPC error.
//
// NOTE: This and its helper functions may be useful more generally. Maybe
// transplant this to a more general place such as "//grpc" if it ends up being
// useful.
type Error struct {
	// The gRPC code for this error.
	GrpcCode int32 `protobuf:"varint,1,opt,name=grpc_code,json=grpcCode,proto3" json:"grpc_code,omitempty"`
	// Transient is true if this is a transient error.
	Transient bool `protobuf:"varint,2,opt,name=transient,proto3" json:"transient,omitempty"`
	// An optional associated message.
	Msg                  string   `protobuf:"bytes,3,opt,name=msg,proto3" json:"msg,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Error proto.InternalMessageInfo

func (m *Error) GetGrpcCode() int32 {
	if m != nil {
		return m.GrpcCode
	}
	return 0
}

func (m *Error) GetTransient() bool {
	if m != nil {
		return m.Transient
	}
	return false
}

func (m *Error) GetMsg() string {
	if m != nil {
		return m.Msg
	}
	return ""
}

// GetConfigResponse is the response structure for the user
// "GetConfig" endpoint.
type GetConfigResponse struct {
	// The API URL of the base "luci-config" service. If empty, the default
	// service URL will be used.
	ConfigServiceUrl string `protobuf:"bytes,1,opt,name=config_service_url,json=configServiceUrl,proto3" json:"config_service_url,omitempty"`
	// The name of the configuration set to load from.
	ConfigSet string `protobuf:"bytes,2,opt,name=config_set,json=configSet,proto3" json:"config_set,omitempty"`
	// The path of the text-serialized service configuration protobuf.
	ServiceConfigPath string `protobuf:"bytes,3,opt,name=service_config_path,json=serviceConfigPath,proto3" json:"service_config_path,omitempty"`
	// The host name of the configuration service. This is preferred to
	// "config_service_url".
	ConfigServiceHost    string   `protobuf:"bytes,4,opt,name=config_service_host,json=configServiceHost,proto3" json:"config_service_host,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetConfigResponse proto.InternalMessageInfo

func (m *GetConfigResponse) GetConfigServiceUrl() string {
	if m != nil {
		return m.ConfigServiceUrl
	}
	return ""
}

func (m *GetConfigResponse) GetConfigSet() string {
	if m != nil {
		return m.ConfigSet
	}
	return ""
}

func (m *GetConfigResponse) GetServiceConfigPath() string {
	if m != nil {
		return m.ServiceConfigPath
	}
	return ""
}

func (m *GetConfigResponse) GetConfigServiceHost() string {
	if m != nil {
		return m.ConfigServiceHost
	}
	return ""
}

// RegisterStreamRequest is the set of caller-supplied data for the
// RegisterStream Coordinator service endpoint.
type RegisterStreamRequest struct {
	// The log stream's project.
	Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"`
	// The log stream's secret.
	Secret []byte `protobuf:"bytes,2,opt,name=secret,proto3" json:"secret,omitempty"`
	// The protobuf version string for this stream.
	ProtoVersion string `protobuf:"bytes,3,opt,name=proto_version,json=protoVersion,proto3" json:"proto_version,omitempty"`
	// The serialized LogStreamDescriptor protobuf for this stream.
	Desc []byte `protobuf:"bytes,4,opt,name=desc,proto3" json:"desc,omitempty"`
	// The stream's terminal index. If >= 0, the terminal index will be set
	// in the registration request, avoiding the need for an additional
	// termination RPC.
	TerminalIndex        int64    `protobuf:"varint,5,opt,name=terminal_index,json=terminalIndex,proto3" json:"terminal_index,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_RegisterStreamRequest proto.InternalMessageInfo

func (m *RegisterStreamRequest) GetProject() string {
	if m != nil {
		return m.Project
	}
	return ""
}

func (m *RegisterStreamRequest) GetSecret() []byte {
	if m != nil {
		return m.Secret
	}
	return nil
}

func (m *RegisterStreamRequest) GetProtoVersion() string {
	if m != nil {
		return m.ProtoVersion
	}
	return ""
}

func (m *RegisterStreamRequest) GetDesc() []byte {
	if m != nil {
		return m.Desc
	}
	return nil
}

func (m *RegisterStreamRequest) GetTerminalIndex() int64 {
	if m != nil {
		return m.TerminalIndex
	}
	return 0
}

// The response message for the RegisterStream RPC.
type RegisterStreamResponse struct {
	// The Coordinator ID of the log stream.
	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	// The state of the requested log stream.
	State *LogStreamState `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"`
	// Error is the error response.
	Error                *Error   `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_RegisterStreamResponse proto.InternalMessageInfo

func (m *RegisterStreamResponse) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *RegisterStreamResponse) GetState() *LogStreamState {
	if m != nil {
		return m.State
	}
	return nil
}

func (m *RegisterStreamResponse) GetError() *Error {
	if m != nil {
		return m.Error
	}
	return nil
}

// LoadStreamRequest loads the current state of a log stream.
type LoadStreamRequest struct {
	// The log stream's project.
	Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"`
	// The log stream's path Coordinator ID.
	Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
	// If true, include the log stream descriptor.
	Desc                 bool     `protobuf:"varint,3,opt,name=desc,proto3" json:"desc,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_LoadStreamRequest proto.InternalMessageInfo

func (m *LoadStreamRequest) GetProject() string {
	if m != nil {
		return m.Project
	}
	return ""
}

func (m *LoadStreamRequest) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *LoadStreamRequest) GetDesc() bool {
	if m != nil {
		return m.Desc
	}
	return false
}

// The response message for the LoadStream RPC.
type LoadStreamResponse struct {
	// The state of the requested log stream.
	State *LogStreamState `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"`
	// If requested, the serialized log stream descriptor. The protobuf version
	// of this descriptor will match the "proto_version" field in "state".
	Desc []byte `protobuf:"bytes,2,opt,name=desc,proto3" json:"desc,omitempty"`
	// The age of the log stream.
	Age *duration.Duration `protobuf:"bytes,3,opt,name=age,proto3" json:"age,omitempty"`
	// The archival key of the log stream. If this key doesn't match the key in
	// the archival request, the request is superfluous and should be deleted.
	ArchivalKey          []byte   `protobuf:"bytes,4,opt,name=archival_key,json=archivalKey,proto3" json:"archival_key,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_LoadStreamResponse proto.InternalMessageInfo

func (m *LoadStreamResponse) GetState() *LogStreamState {
	if m != nil {
		return m.State
	}
	return nil
}

func (m *LoadStreamResponse) GetDesc() []byte {
	if m != nil {
		return m.Desc
	}
	return nil
}

func (m *LoadStreamResponse) GetAge() *duration.Duration {
	if m != nil {
		return m.Age
	}
	return nil
}

func (m *LoadStreamResponse) GetArchivalKey() []byte {
	if m != nil {
		return m.ArchivalKey
	}
	return nil
}

// TerminateStreamRequest is the set of caller-supplied data for the
// TerminateStream service endpoint.
type TerminateStreamRequest struct {
	// The log stream's project.
	Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"`
	// The log stream's path Coordinator ID.
	Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
	// The log stream's secret.
	Secret []byte `protobuf:"bytes,3,opt,name=secret,proto3" json:"secret,omitempty"`
	// The terminal index of the stream.
	TerminalIndex        int64    `protobuf:"varint,4,opt,name=terminal_index,json=terminalIndex,proto3" json:"terminal_index,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TerminateStreamRequest proto.InternalMessageInfo

func (m *TerminateStreamRequest) GetProject() string {
	if m != nil {
		return m.Project
	}
	return ""
}

func (m *TerminateStreamRequest) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *TerminateStreamRequest) GetSecret() []byte {
	if m != nil {
		return m.Secret
	}
	return nil
}

func (m *TerminateStreamRequest) GetTerminalIndex() int64 {
	if m != nil {
		return m.TerminalIndex
	}
	return 0
}

// ArchiveStreamRequest is the set of caller-supplied data for the ArchiveStream
// service endpoint.
type ArchiveStreamRequest struct {
	// The log stream's project.
	Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"`
	// The Coordinator ID of the log stream that was archived.
	Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
	// The number of log entries that were archived.
	LogEntryCount int64 `protobuf:"varint,3,opt,name=log_entry_count,json=logEntryCount,proto3" json:"log_entry_count,omitempty"`
	// The highest log stream index that was archived.
	TerminalIndex int64 `protobuf:"varint,4,opt,name=terminal_index,json=terminalIndex,proto3" json:"terminal_index,omitempty"`
	// If not empty, there was an archival error.
	//
	// This field serves to indicate that an error occured (being non-empty) and
	// to supply an value that will show up in the Coordinator ArchiveStream
	// endpoint logs.
	Error string `protobuf:"bytes,5,opt,name=error,proto3" json:"error,omitempty"`
	// The archive URL of the log stream's stream data.
	StreamUrl string `protobuf:"bytes,10,opt,name=stream_url,json=streamUrl,proto3" json:"stream_url,omitempty"`
	// The size of the log stream's stream data.
	StreamSize int64 `protobuf:"varint,11,opt,name=stream_size,json=streamSize,proto3" json:"stream_size,omitempty"`
	// The archive URL of the log stream's index data.
	IndexUrl string `protobuf:"bytes,20,opt,name=index_url,json=indexUrl,proto3" json:"index_url,omitempty"`
	// The size of the log stream's index data.
	IndexSize int64 `protobuf:"varint,21,opt,name=index_size,json=indexSize,proto3" json:"index_size,omitempty"`
	// The archive URL of the log stream's binary data.
	DataUrl string `protobuf:"bytes,30,opt,name=data_url,json=dataUrl,proto3" json:"data_url,omitempty"`
	// The size of the log stream's binary data.
	DataSize             int64    `protobuf:"varint,31,opt,name=data_size,json=dataSize,proto3" json:"data_size,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ArchiveStreamRequest proto.InternalMessageInfo

func (m *ArchiveStreamRequest) GetProject() string {
	if m != nil {
		return m.Project
	}
	return ""
}

func (m *ArchiveStreamRequest) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *ArchiveStreamRequest) GetLogEntryCount() int64 {
	if m != nil {
		return m.LogEntryCount
	}
	return 0
}

func (m *ArchiveStreamRequest) GetTerminalIndex() int64 {
	if m != nil {
		return m.TerminalIndex
	}
	return 0
}

func (m *ArchiveStreamRequest) GetError() string {
	if m != nil {
		return m.Error
	}
	return ""
}

func (m *ArchiveStreamRequest) GetStreamUrl() string {
	if m != nil {
		return m.StreamUrl
	}
	return ""
}

func (m *ArchiveStreamRequest) GetStreamSize() int64 {
	if m != nil {
		return m.StreamSize
	}
	return 0
}

func (m *ArchiveStreamRequest) GetIndexUrl() string {
	if m != nil {
		return m.IndexUrl
	}
	return ""
}

func (m *ArchiveStreamRequest) GetIndexSize() int64 {
	if m != nil {
		return m.IndexSize
	}
	return 0
}

func (m *ArchiveStreamRequest) GetDataUrl() string {
	if m != nil {
		return m.DataUrl
	}
	return ""
}

func (m *ArchiveStreamRequest) GetDataSize() int64 {
	if m != nil {
		return m.DataSize
	}
	return 0
}

// BatchRequest is a batch of individual requests to make to the Coordinator.
type BatchRequest struct {
	Req                  []*BatchRequest_Entry `protobuf:"bytes,1,rep,name=req,proto3" json:"req,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_42e88bcc2e6ba8be, []int{8}
}

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) GetReq() []*BatchRequest_Entry {
	if m != nil {
		return m.Req
	}
	return nil
}

// The collection of batched requests.
type BatchRequest_Entry struct {
	// Types that are valid to be assigned to Value:
	//	*BatchRequest_Entry_RegisterStream
	//	*BatchRequest_Entry_LoadStream
	//	*BatchRequest_Entry_TerminateStream
	//	*BatchRequest_Entry_ArchiveStream
	Value                isBatchRequest_Entry_Value `protobuf_oneof:"value"`
	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
	XXX_unrecognized     []byte                     `json:"-"`
	XXX_sizecache        int32                      `json:"-"`
}

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

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

var xxx_messageInfo_BatchRequest_Entry proto.InternalMessageInfo

type isBatchRequest_Entry_Value interface {
	isBatchRequest_Entry_Value()
}

type BatchRequest_Entry_RegisterStream struct {
	RegisterStream *RegisterStreamRequest `protobuf:"bytes,1,opt,name=register_stream,json=registerStream,proto3,oneof"`
}

type BatchRequest_Entry_LoadStream struct {
	LoadStream *LoadStreamRequest `protobuf:"bytes,2,opt,name=load_stream,json=loadStream,proto3,oneof"`
}

type BatchRequest_Entry_TerminateStream struct {
	TerminateStream *TerminateStreamRequest `protobuf:"bytes,3,opt,name=terminate_stream,json=terminateStream,proto3,oneof"`
}

type BatchRequest_Entry_ArchiveStream struct {
	ArchiveStream *ArchiveStreamRequest `protobuf:"bytes,4,opt,name=archive_stream,json=archiveStream,proto3,oneof"`
}

func (*BatchRequest_Entry_RegisterStream) isBatchRequest_Entry_Value() {}

func (*BatchRequest_Entry_LoadStream) isBatchRequest_Entry_Value() {}

func (*BatchRequest_Entry_TerminateStream) isBatchRequest_Entry_Value() {}

func (*BatchRequest_Entry_ArchiveStream) isBatchRequest_Entry_Value() {}

func (m *BatchRequest_Entry) GetValue() isBatchRequest_Entry_Value {
	if m != nil {
		return m.Value
	}
	return nil
}

func (m *BatchRequest_Entry) GetRegisterStream() *RegisterStreamRequest {
	if x, ok := m.GetValue().(*BatchRequest_Entry_RegisterStream); ok {
		return x.RegisterStream
	}
	return nil
}

func (m *BatchRequest_Entry) GetLoadStream() *LoadStreamRequest {
	if x, ok := m.GetValue().(*BatchRequest_Entry_LoadStream); ok {
		return x.LoadStream
	}
	return nil
}

func (m *BatchRequest_Entry) GetTerminateStream() *TerminateStreamRequest {
	if x, ok := m.GetValue().(*BatchRequest_Entry_TerminateStream); ok {
		return x.TerminateStream
	}
	return nil
}

func (m *BatchRequest_Entry) GetArchiveStream() *ArchiveStreamRequest {
	if x, ok := m.GetValue().(*BatchRequest_Entry_ArchiveStream); ok {
		return x.ArchiveStream
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*BatchRequest_Entry) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*BatchRequest_Entry_RegisterStream)(nil),
		(*BatchRequest_Entry_LoadStream)(nil),
		(*BatchRequest_Entry_TerminateStream)(nil),
		(*BatchRequest_Entry_ArchiveStream)(nil),
	}
}

// BatchResponse is a response to a BatchRequest.
type BatchResponse struct {
	Resp                 []*BatchResponse_Entry `protobuf:"bytes,1,rep,name=resp,proto3" json:"resp,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_42e88bcc2e6ba8be, []int{9}
}

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) GetResp() []*BatchResponse_Entry {
	if m != nil {
		return m.Resp
	}
	return nil
}

// The collection of batched requests.
//
// Each entry corresponds to the BatchRequest entry with the specified index.
//
// Entry objects may appear out of order with their request indexes. Some
// responses may also be missing, if the remote end could not provide them
// due to constraints (e.g., size, time).
type BatchResponse_Entry struct {
	// The index in the BatchRequest for this entry.
	Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"`
	// Types that are valid to be assigned to Value:
	//	*BatchResponse_Entry_Err
	//	*BatchResponse_Entry_RegisterStream
	//	*BatchResponse_Entry_LoadStream
	Value                isBatchResponse_Entry_Value `protobuf_oneof:"value"`
	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
	XXX_unrecognized     []byte                      `json:"-"`
	XXX_sizecache        int32                       `json:"-"`
}

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

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

var xxx_messageInfo_BatchResponse_Entry proto.InternalMessageInfo

func (m *BatchResponse_Entry) GetIndex() int32 {
	if m != nil {
		return m.Index
	}
	return 0
}

type isBatchResponse_Entry_Value interface {
	isBatchResponse_Entry_Value()
}

type BatchResponse_Entry_Err struct {
	Err *Error `protobuf:"bytes,2,opt,name=err,proto3,oneof"`
}

type BatchResponse_Entry_RegisterStream struct {
	RegisterStream *RegisterStreamResponse `protobuf:"bytes,3,opt,name=register_stream,json=registerStream,proto3,oneof"`
}

type BatchResponse_Entry_LoadStream struct {
	LoadStream *LoadStreamResponse `protobuf:"bytes,4,opt,name=load_stream,json=loadStream,proto3,oneof"`
}

func (*BatchResponse_Entry_Err) isBatchResponse_Entry_Value() {}

func (*BatchResponse_Entry_RegisterStream) isBatchResponse_Entry_Value() {}

func (*BatchResponse_Entry_LoadStream) isBatchResponse_Entry_Value() {}

func (m *BatchResponse_Entry) GetValue() isBatchResponse_Entry_Value {
	if m != nil {
		return m.Value
	}
	return nil
}

func (m *BatchResponse_Entry) GetErr() *Error {
	if x, ok := m.GetValue().(*BatchResponse_Entry_Err); ok {
		return x.Err
	}
	return nil
}

func (m *BatchResponse_Entry) GetRegisterStream() *RegisterStreamResponse {
	if x, ok := m.GetValue().(*BatchResponse_Entry_RegisterStream); ok {
		return x.RegisterStream
	}
	return nil
}

func (m *BatchResponse_Entry) GetLoadStream() *LoadStreamResponse {
	if x, ok := m.GetValue().(*BatchResponse_Entry_LoadStream); ok {
		return x.LoadStream
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*BatchResponse_Entry) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*BatchResponse_Entry_Err)(nil),
		(*BatchResponse_Entry_RegisterStream)(nil),
		(*BatchResponse_Entry_LoadStream)(nil),
	}
}

func init() {
	proto.RegisterType((*Error)(nil), "logdog.Error")
	proto.RegisterType((*GetConfigResponse)(nil), "logdog.GetConfigResponse")
	proto.RegisterType((*RegisterStreamRequest)(nil), "logdog.RegisterStreamRequest")
	proto.RegisterType((*RegisterStreamResponse)(nil), "logdog.RegisterStreamResponse")
	proto.RegisterType((*LoadStreamRequest)(nil), "logdog.LoadStreamRequest")
	proto.RegisterType((*LoadStreamResponse)(nil), "logdog.LoadStreamResponse")
	proto.RegisterType((*TerminateStreamRequest)(nil), "logdog.TerminateStreamRequest")
	proto.RegisterType((*ArchiveStreamRequest)(nil), "logdog.ArchiveStreamRequest")
	proto.RegisterType((*BatchRequest)(nil), "logdog.BatchRequest")
	proto.RegisterType((*BatchRequest_Entry)(nil), "logdog.BatchRequest.Entry")
	proto.RegisterType((*BatchResponse)(nil), "logdog.BatchResponse")
	proto.RegisterType((*BatchResponse_Entry)(nil), "logdog.BatchResponse.Entry")
}

func init() {
	proto.RegisterFile("go.chromium.org/luci/logdog/api/endpoints/coordinator/services/v1/service.proto", fileDescriptor_42e88bcc2e6ba8be)
}

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

// ServicesClient is the client API for Services service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type ServicesClient interface {
	// GetConfig allows a service to retrieve the current service configuration
	// parameters.
	GetConfig(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*GetConfigResponse, error)
	// RegisterStream is an idempotent stream state register operation.
	RegisterStream(ctx context.Context, in *RegisterStreamRequest, opts ...grpc.CallOption) (*RegisterStreamResponse, error)
	// LoadStream loads the current state of a log stream.
	LoadStream(ctx context.Context, in *LoadStreamRequest, opts ...grpc.CallOption) (*LoadStreamResponse, error)
	// TerminateStream is an idempotent operation to update the stream's terminal
	// index.
	TerminateStream(ctx context.Context, in *TerminateStreamRequest, opts ...grpc.CallOption) (*empty.Empty, error)
	// ArchiveStream is an idempotent operation to record a log stream's archival
	// parameters. It is used by the Archivist service upon successful stream
	// archival.
	ArchiveStream(ctx context.Context, in *ArchiveStreamRequest, opts ...grpc.CallOption) (*empty.Empty, error)
	// RescheduleArchiveTask is an internal operation used to schedule an archive task
	// for a later time.
	RescheduleArchiveTask(ctx context.Context, in *ArchiveDispatchTask, opts ...grpc.CallOption) (*empty.Empty, error)
	// Batch is a series of requests submitted in batch. It returns a
	// BatchResponse containing the same number of entries, with each entry index
	// corresponding to its request index.
	Batch(ctx context.Context, in *BatchRequest, opts ...grpc.CallOption) (*BatchResponse, error)
}
type servicesPRPCClient struct {
	client *prpc.Client
}

func NewServicesPRPCClient(client *prpc.Client) ServicesClient {
	return &servicesPRPCClient{client}
}

func (c *servicesPRPCClient) GetConfig(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*GetConfigResponse, error) {
	out := new(GetConfigResponse)
	err := c.client.Call(ctx, "logdog.Services", "GetConfig", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *servicesPRPCClient) RegisterStream(ctx context.Context, in *RegisterStreamRequest, opts ...grpc.CallOption) (*RegisterStreamResponse, error) {
	out := new(RegisterStreamResponse)
	err := c.client.Call(ctx, "logdog.Services", "RegisterStream", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *servicesPRPCClient) LoadStream(ctx context.Context, in *LoadStreamRequest, opts ...grpc.CallOption) (*LoadStreamResponse, error) {
	out := new(LoadStreamResponse)
	err := c.client.Call(ctx, "logdog.Services", "LoadStream", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *servicesPRPCClient) TerminateStream(ctx context.Context, in *TerminateStreamRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
	out := new(empty.Empty)
	err := c.client.Call(ctx, "logdog.Services", "TerminateStream", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *servicesPRPCClient) ArchiveStream(ctx context.Context, in *ArchiveStreamRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
	out := new(empty.Empty)
	err := c.client.Call(ctx, "logdog.Services", "ArchiveStream", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *servicesPRPCClient) RescheduleArchiveTask(ctx context.Context, in *ArchiveDispatchTask, opts ...grpc.CallOption) (*empty.Empty, error) {
	out := new(empty.Empty)
	err := c.client.Call(ctx, "logdog.Services", "RescheduleArchiveTask", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

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

type servicesClient struct {
	cc *grpc.ClientConn
}

func NewServicesClient(cc *grpc.ClientConn) ServicesClient {
	return &servicesClient{cc}
}

func (c *servicesClient) GetConfig(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*GetConfigResponse, error) {
	out := new(GetConfigResponse)
	err := c.cc.Invoke(ctx, "/logdog.Services/GetConfig", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *servicesClient) RegisterStream(ctx context.Context, in *RegisterStreamRequest, opts ...grpc.CallOption) (*RegisterStreamResponse, error) {
	out := new(RegisterStreamResponse)
	err := c.cc.Invoke(ctx, "/logdog.Services/RegisterStream", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *servicesClient) LoadStream(ctx context.Context, in *LoadStreamRequest, opts ...grpc.CallOption) (*LoadStreamResponse, error) {
	out := new(LoadStreamResponse)
	err := c.cc.Invoke(ctx, "/logdog.Services/LoadStream", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *servicesClient) TerminateStream(ctx context.Context, in *TerminateStreamRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
	out := new(empty.Empty)
	err := c.cc.Invoke(ctx, "/logdog.Services/TerminateStream", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *servicesClient) ArchiveStream(ctx context.Context, in *ArchiveStreamRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
	out := new(empty.Empty)
	err := c.cc.Invoke(ctx, "/logdog.Services/ArchiveStream", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *servicesClient) RescheduleArchiveTask(ctx context.Context, in *ArchiveDispatchTask, opts ...grpc.CallOption) (*empty.Empty, error) {
	out := new(empty.Empty)
	err := c.cc.Invoke(ctx, "/logdog.Services/RescheduleArchiveTask", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

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

// ServicesServer is the server API for Services service.
type ServicesServer interface {
	// GetConfig allows a service to retrieve the current service configuration
	// parameters.
	GetConfig(context.Context, *empty.Empty) (*GetConfigResponse, error)
	// RegisterStream is an idempotent stream state register operation.
	RegisterStream(context.Context, *RegisterStreamRequest) (*RegisterStreamResponse, error)
	// LoadStream loads the current state of a log stream.
	LoadStream(context.Context, *LoadStreamRequest) (*LoadStreamResponse, error)
	// TerminateStream is an idempotent operation to update the stream's terminal
	// index.
	TerminateStream(context.Context, *TerminateStreamRequest) (*empty.Empty, error)
	// ArchiveStream is an idempotent operation to record a log stream's archival
	// parameters. It is used by the Archivist service upon successful stream
	// archival.
	ArchiveStream(context.Context, *ArchiveStreamRequest) (*empty.Empty, error)
	// RescheduleArchiveTask is an internal operation used to schedule an archive task
	// for a later time.
	RescheduleArchiveTask(context.Context, *ArchiveDispatchTask) (*empty.Empty, error)
	// Batch is a series of requests submitted in batch. It returns a
	// BatchResponse containing the same number of entries, with each entry index
	// corresponding to its request index.
	Batch(context.Context, *BatchRequest) (*BatchResponse, error)
}

func RegisterServicesServer(s prpc.Registrar, srv ServicesServer) {
	s.RegisterService(&_Services_serviceDesc, srv)
}

func _Services_GetConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(empty.Empty)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServicesServer).GetConfig(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/logdog.Services/GetConfig",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServicesServer).GetConfig(ctx, req.(*empty.Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _Services_RegisterStream_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(RegisterStreamRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServicesServer).RegisterStream(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/logdog.Services/RegisterStream",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServicesServer).RegisterStream(ctx, req.(*RegisterStreamRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _Services_LoadStream_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(LoadStreamRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServicesServer).LoadStream(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/logdog.Services/LoadStream",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServicesServer).LoadStream(ctx, req.(*LoadStreamRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _Services_TerminateStream_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(TerminateStreamRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServicesServer).TerminateStream(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/logdog.Services/TerminateStream",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServicesServer).TerminateStream(ctx, req.(*TerminateStreamRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _Services_ArchiveStream_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ArchiveStreamRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServicesServer).ArchiveStream(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/logdog.Services/ArchiveStream",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServicesServer).ArchiveStream(ctx, req.(*ArchiveStreamRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _Services_RescheduleArchiveTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ArchiveDispatchTask)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServicesServer).RescheduleArchiveTask(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/logdog.Services/RescheduleArchiveTask",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServicesServer).RescheduleArchiveTask(ctx, req.(*ArchiveDispatchTask))
	}
	return interceptor(ctx, in, info, handler)
}

func _Services_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.(ServicesServer).Batch(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/logdog.Services/Batch",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServicesServer).Batch(ctx, req.(*BatchRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _Services_serviceDesc = grpc.ServiceDesc{
	ServiceName: "logdog.Services",
	HandlerType: (*ServicesServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "GetConfig",
			Handler:    _Services_GetConfig_Handler,
		},
		{
			MethodName: "RegisterStream",
			Handler:    _Services_RegisterStream_Handler,
		},
		{
			MethodName: "LoadStream",
			Handler:    _Services_LoadStream_Handler,
		},
		{
			MethodName: "TerminateStream",
			Handler:    _Services_TerminateStream_Handler,
		},
		{
			MethodName: "ArchiveStream",
			Handler:    _Services_ArchiveStream_Handler,
		},
		{
			MethodName: "RescheduleArchiveTask",
			Handler:    _Services_RescheduleArchiveTask_Handler,
		},
		{
			MethodName: "Batch",
			Handler:    _Services_Batch_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "go.chromium.org/luci/logdog/api/endpoints/coordinator/services/v1/service.proto",
}
