// Code generated by protoc-gen-go. DO NOT EDIT.
// source: services.proto

/*
Package proto is a generated protocol buffer package.

It is generated from these files:
	services.proto

It has these top-level messages:
	HeartbeatSetRequest
	HeartbeatSetElement
	HeartbeatSetResponse
	InstanceHbRst
	GetServicesInfoRequest
	GetServicesInfoResponse
	MicroServiceKey
	MicroService
	ServiceRule
	AddOrUpdateServiceRule
	ServicePath
	Response
	GetExistenceRequest
	GetExistenceResponse
	CreateServiceRequest
	CreateServiceResponse
	DeleteServiceRequest
	DeleteServiceResponse
	GetServiceRequest
	GetServiceResponse
	GetServicesRequest
	GetServicesResponse
	UpdateServicePropsRequest
	UpdateServicePropsResponse
	GetServiceRulesRequest
	GetServiceRulesResponse
	UpdateServiceRuleRequest
	UpdateServiceRuleResponse
	AddServiceRulesRequest
	AddServiceRulesResponse
	DeleteServiceRulesRequest
	DeleteServiceRulesResponse
	GetServiceTagsRequest
	GetServiceTagsResponse
	UpdateServiceTagRequest
	UpdateServiceTagResponse
	AddServiceTagsRequest
	AddServiceTagsResponse
	DeleteServiceTagsRequest
	DeleteServiceTagsResponse
	HealthCheck
	MicroServiceInstance
	DataCenterInfo
	MicroServiceInstanceKey
	RegisterInstanceRequest
	RegisterInstanceResponse
	UnregisterInstanceRequest
	UnregisterInstanceResponse
	HeartbeatRequest
	HeartbeatResponse
	FindInstancesRequest
	FindInstancesResponse
	GetOneInstanceRequest
	GetOneInstanceResponse
	GetInstancesRequest
	GetInstancesResponse
	UpdateInstanceStatusRequest
	UpdateInstanceStatusResponse
	UpdateInstancePropsRequest
	UpdateInstancePropsResponse
	WatchInstanceRequest
	WatchInstanceResponse
	GetSchemaRequest
	GetSchemaResponse
	DeleteSchemaRequest
	DeleteSchemaResponse
	ModifySchemaRequest
	ModifySchemaResponse
	CreateDependenciesRequest
	DependencyMircroService
	MircroServiceDependency
	CreateDependenciesResponse
	GetDependenciesRequest
	GetConDependenciesResponse
	GetProDependenciesResponse
	ServiceOverview
	SchemaInfos
	ServiceDetail
	GetServiceDetailResponse
	DelServicesRequest
	DelServicesRspInfo
	DelServicesResponse
*/
package proto

import proto1 "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"

import (
	context "golang.org/x/net/context"
	grpc "google.golang.org/grpc"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto1.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 _ = proto1.ProtoPackageIsVersion2 // please upgrade the proto package

type Response_Code int32

const (
	Response_UNKNOWN Response_Code = 0
	Response_SUCCESS Response_Code = 1
	Response_FAIL    Response_Code = 2
)

var Response_Code_name = map[int32]string{
	0: "UNKNOWN",
	1: "SUCCESS",
	2: "FAIL",
}
var Response_Code_value = map[string]int32{
	"UNKNOWN": 0,
	"SUCCESS": 1,
	"FAIL":    2,
}

func (x Response_Code) String() string {
	return proto1.EnumName(Response_Code_name, int32(x))
}
func (Response_Code) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{11, 0} }

type HeartbeatSetRequest struct {
	Instances []*HeartbeatSetElement `protobuf:"bytes,1,rep,name=instances" json:"instances,omitempty"`
}

func (m *HeartbeatSetRequest) Reset()                    { *m = HeartbeatSetRequest{} }
func (m *HeartbeatSetRequest) String() string            { return proto1.CompactTextString(m) }
func (*HeartbeatSetRequest) ProtoMessage()               {}
func (*HeartbeatSetRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }

func (m *HeartbeatSetRequest) GetInstances() []*HeartbeatSetElement {
	if m != nil {
		return m.Instances
	}
	return nil
}

type HeartbeatSetElement struct {
	ServiceId  string `protobuf:"bytes,1,opt,name=serviceId" json:"serviceId,omitempty"`
	InstanceId string `protobuf:"bytes,2,opt,name=instanceId" json:"instanceId,omitempty"`
}

func (m *HeartbeatSetElement) Reset()                    { *m = HeartbeatSetElement{} }
func (m *HeartbeatSetElement) String() string            { return proto1.CompactTextString(m) }
func (*HeartbeatSetElement) ProtoMessage()               {}
func (*HeartbeatSetElement) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }

func (m *HeartbeatSetElement) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

func (m *HeartbeatSetElement) GetInstanceId() string {
	if m != nil {
		return m.InstanceId
	}
	return ""
}

type HeartbeatSetResponse struct {
	Response  *Response        `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
	Instances []*InstanceHbRst `protobuf:"bytes,2,rep,name=instances" json:"instances,omitempty"`
}

func (m *HeartbeatSetResponse) Reset()                    { *m = HeartbeatSetResponse{} }
func (m *HeartbeatSetResponse) String() string            { return proto1.CompactTextString(m) }
func (*HeartbeatSetResponse) ProtoMessage()               {}
func (*HeartbeatSetResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }

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

func (m *HeartbeatSetResponse) GetInstances() []*InstanceHbRst {
	if m != nil {
		return m.Instances
	}
	return nil
}

type InstanceHbRst struct {
	ServiceId  string `protobuf:"bytes,1,opt,name=serviceId" json:"serviceId,omitempty"`
	InstanceId string `protobuf:"bytes,2,opt,name=instanceId" json:"instanceId,omitempty"`
	ErrMessage string `protobuf:"bytes,3,opt,name=errMessage" json:"errMessage,omitempty"`
}

func (m *InstanceHbRst) Reset()                    { *m = InstanceHbRst{} }
func (m *InstanceHbRst) String() string            { return proto1.CompactTextString(m) }
func (*InstanceHbRst) ProtoMessage()               {}
func (*InstanceHbRst) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }

func (m *InstanceHbRst) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

func (m *InstanceHbRst) GetInstanceId() string {
	if m != nil {
		return m.InstanceId
	}
	return ""
}

func (m *InstanceHbRst) GetErrMessage() string {
	if m != nil {
		return m.ErrMessage
	}
	return ""
}

type GetServicesInfoRequest struct {
	Options []string `protobuf:"bytes,1,rep,name=options" json:"options,omitempty"`
}

func (m *GetServicesInfoRequest) Reset()                    { *m = GetServicesInfoRequest{} }
func (m *GetServicesInfoRequest) String() string            { return proto1.CompactTextString(m) }
func (*GetServicesInfoRequest) ProtoMessage()               {}
func (*GetServicesInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }

func (m *GetServicesInfoRequest) GetOptions() []string {
	if m != nil {
		return m.Options
	}
	return nil
}

type GetServicesInfoResponse struct {
	Response          *Response        `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
	AllServicesDetail []*ServiceDetail `protobuf:"bytes,2,rep,name=allServicesDetail" json:"allServicesDetail,omitempty"`
}

func (m *GetServicesInfoResponse) Reset()                    { *m = GetServicesInfoResponse{} }
func (m *GetServicesInfoResponse) String() string            { return proto1.CompactTextString(m) }
func (*GetServicesInfoResponse) ProtoMessage()               {}
func (*GetServicesInfoResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }

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

func (m *GetServicesInfoResponse) GetAllServicesDetail() []*ServiceDetail {
	if m != nil {
		return m.AllServicesDetail
	}
	return nil
}

type MicroServiceKey struct {
	Tenant      string `protobuf:"bytes,1,opt,name=tenant" json:"tenant,omitempty"`
	Project     string `protobuf:"bytes,2,opt,name=project" json:"project,omitempty"`
	AppId       string `protobuf:"bytes,3,opt,name=appId" json:"appId,omitempty"`
	ServiceName string `protobuf:"bytes,4,opt,name=serviceName" json:"serviceName,omitempty"`
	Version     string `protobuf:"bytes,5,opt,name=version" json:"version,omitempty"`
	Stage       string `protobuf:"bytes,6,opt,name=stage" json:"stage,omitempty"`
	Alias       string `protobuf:"bytes,7,opt,name=alias" json:"alias,omitempty"`
}

func (m *MicroServiceKey) Reset()                    { *m = MicroServiceKey{} }
func (m *MicroServiceKey) String() string            { return proto1.CompactTextString(m) }
func (*MicroServiceKey) ProtoMessage()               {}
func (*MicroServiceKey) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }

func (m *MicroServiceKey) GetTenant() string {
	if m != nil {
		return m.Tenant
	}
	return ""
}

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

func (m *MicroServiceKey) GetAppId() string {
	if m != nil {
		return m.AppId
	}
	return ""
}

func (m *MicroServiceKey) GetServiceName() string {
	if m != nil {
		return m.ServiceName
	}
	return ""
}

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

func (m *MicroServiceKey) GetStage() string {
	if m != nil {
		return m.Stage
	}
	return ""
}

func (m *MicroServiceKey) GetAlias() string {
	if m != nil {
		return m.Alias
	}
	return ""
}

type MicroService struct {
	ServiceId   string                     `protobuf:"bytes,1,opt,name=serviceId" json:"serviceId,omitempty"`
	AppId       string                     `protobuf:"bytes,2,opt,name=appId" json:"appId,omitempty"`
	ServiceName string                     `protobuf:"bytes,3,opt,name=serviceName" json:"serviceName,omitempty"`
	Version     string                     `protobuf:"bytes,4,opt,name=version" json:"version,omitempty"`
	Description string                     `protobuf:"bytes,5,opt,name=description" json:"description,omitempty"`
	Level       string                     `protobuf:"bytes,6,opt,name=level" json:"level,omitempty"`
	Schemas     []string                   `protobuf:"bytes,7,rep,name=schemas" json:"schemas,omitempty"`
	Paths       []*ServicePath             `protobuf:"bytes,10,rep,name=paths" json:"paths,omitempty"`
	Status      string                     `protobuf:"bytes,8,opt,name=status" json:"status,omitempty"`
	Properties  map[string]string          `protobuf:"bytes,9,rep,name=properties" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
	Timestamp   string                     `protobuf:"bytes,11,opt,name=timestamp" json:"timestamp,omitempty"`
	Providers   []*DependencyMircroService `protobuf:"bytes,12,rep,name=providers" json:"providers,omitempty"`
	Alias       string                     `protobuf:"bytes,13,opt,name=alias" json:"alias,omitempty"`
	LBStrategy  map[string]string          `protobuf:"bytes,14,rep,name=LBStrategy" json:"LBStrategy,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
}

func (m *MicroService) Reset()                    { *m = MicroService{} }
func (m *MicroService) String() string            { return proto1.CompactTextString(m) }
func (*MicroService) ProtoMessage()               {}
func (*MicroService) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} }

func (m *MicroService) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

func (m *MicroService) GetAppId() string {
	if m != nil {
		return m.AppId
	}
	return ""
}

func (m *MicroService) GetServiceName() string {
	if m != nil {
		return m.ServiceName
	}
	return ""
}

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

func (m *MicroService) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *MicroService) GetLevel() string {
	if m != nil {
		return m.Level
	}
	return ""
}

func (m *MicroService) GetSchemas() []string {
	if m != nil {
		return m.Schemas
	}
	return nil
}

func (m *MicroService) GetPaths() []*ServicePath {
	if m != nil {
		return m.Paths
	}
	return nil
}

func (m *MicroService) GetStatus() string {
	if m != nil {
		return m.Status
	}
	return ""
}

func (m *MicroService) GetProperties() map[string]string {
	if m != nil {
		return m.Properties
	}
	return nil
}

func (m *MicroService) GetTimestamp() string {
	if m != nil {
		return m.Timestamp
	}
	return ""
}

func (m *MicroService) GetProviders() []*DependencyMircroService {
	if m != nil {
		return m.Providers
	}
	return nil
}

func (m *MicroService) GetAlias() string {
	if m != nil {
		return m.Alias
	}
	return ""
}

func (m *MicroService) GetLBStrategy() map[string]string {
	if m != nil {
		return m.LBStrategy
	}
	return nil
}

type ServiceRule struct {
	RuleId      string `protobuf:"bytes,1,opt,name=ruleId" json:"ruleId,omitempty"`
	RuleType    string `protobuf:"bytes,2,opt,name=ruleType" json:"ruleType,omitempty"`
	Attribute   string `protobuf:"bytes,3,opt,name=attribute" json:"attribute,omitempty"`
	Pattern     string `protobuf:"bytes,4,opt,name=pattern" json:"pattern,omitempty"`
	Description string `protobuf:"bytes,5,opt,name=description" json:"description,omitempty"`
	Timestamp   string `protobuf:"bytes,6,opt,name=timestamp" json:"timestamp,omitempty"`
}

func (m *ServiceRule) Reset()                    { *m = ServiceRule{} }
func (m *ServiceRule) String() string            { return proto1.CompactTextString(m) }
func (*ServiceRule) ProtoMessage()               {}
func (*ServiceRule) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} }

func (m *ServiceRule) GetRuleId() string {
	if m != nil {
		return m.RuleId
	}
	return ""
}

func (m *ServiceRule) GetRuleType() string {
	if m != nil {
		return m.RuleType
	}
	return ""
}

func (m *ServiceRule) GetAttribute() string {
	if m != nil {
		return m.Attribute
	}
	return ""
}

func (m *ServiceRule) GetPattern() string {
	if m != nil {
		return m.Pattern
	}
	return ""
}

func (m *ServiceRule) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *ServiceRule) GetTimestamp() string {
	if m != nil {
		return m.Timestamp
	}
	return ""
}

type AddOrUpdateServiceRule struct {
	RuleType    string `protobuf:"bytes,1,opt,name=ruleType" json:"ruleType,omitempty"`
	Attribute   string `protobuf:"bytes,2,opt,name=attribute" json:"attribute,omitempty"`
	Pattern     string `protobuf:"bytes,3,opt,name=pattern" json:"pattern,omitempty"`
	Description string `protobuf:"bytes,4,opt,name=description" json:"description,omitempty"`
}

func (m *AddOrUpdateServiceRule) Reset()                    { *m = AddOrUpdateServiceRule{} }
func (m *AddOrUpdateServiceRule) String() string            { return proto1.CompactTextString(m) }
func (*AddOrUpdateServiceRule) ProtoMessage()               {}
func (*AddOrUpdateServiceRule) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} }

func (m *AddOrUpdateServiceRule) GetRuleType() string {
	if m != nil {
		return m.RuleType
	}
	return ""
}

func (m *AddOrUpdateServiceRule) GetAttribute() string {
	if m != nil {
		return m.Attribute
	}
	return ""
}

func (m *AddOrUpdateServiceRule) GetPattern() string {
	if m != nil {
		return m.Pattern
	}
	return ""
}

func (m *AddOrUpdateServiceRule) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

type ServicePath struct {
	Path     string            `protobuf:"bytes,1,opt,name=path" json:"path,omitempty"`
	Property map[string]string `protobuf:"bytes,2,rep,name=property" json:"property,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
}

func (m *ServicePath) Reset()                    { *m = ServicePath{} }
func (m *ServicePath) String() string            { return proto1.CompactTextString(m) }
func (*ServicePath) ProtoMessage()               {}
func (*ServicePath) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} }

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

func (m *ServicePath) GetProperty() map[string]string {
	if m != nil {
		return m.Property
	}
	return nil
}

type Response struct {
	Code    Response_Code `protobuf:"varint,1,opt,name=code,enum=com.huawei.paas.cse.serviceregistry.api.Response_Code" json:"code,omitempty"`
	Message string        `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"`
}

func (m *Response) Reset()                    { *m = Response{} }
func (m *Response) String() string            { return proto1.CompactTextString(m) }
func (*Response) ProtoMessage()               {}
func (*Response) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} }

func (m *Response) GetCode() Response_Code {
	if m != nil {
		return m.Code
	}
	return Response_UNKNOWN
}

func (m *Response) GetMessage() string {
	if m != nil {
		return m.Message
	}
	return ""
}

type GetExistenceRequest struct {
	Type        string `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"`
	AppId       string `protobuf:"bytes,2,opt,name=appId" json:"appId,omitempty"`
	ServiceName string `protobuf:"bytes,3,opt,name=serviceName" json:"serviceName,omitempty"`
	Version     string `protobuf:"bytes,4,opt,name=version" json:"version,omitempty"`
	ServiceId   string `protobuf:"bytes,5,opt,name=serviceId" json:"serviceId,omitempty"`
	SchemaId    string `protobuf:"bytes,6,opt,name=schemaId" json:"schemaId,omitempty"`
}

func (m *GetExistenceRequest) Reset()                    { *m = GetExistenceRequest{} }
func (m *GetExistenceRequest) String() string            { return proto1.CompactTextString(m) }
func (*GetExistenceRequest) ProtoMessage()               {}
func (*GetExistenceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} }

func (m *GetExistenceRequest) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *GetExistenceRequest) GetAppId() string {
	if m != nil {
		return m.AppId
	}
	return ""
}

func (m *GetExistenceRequest) GetServiceName() string {
	if m != nil {
		return m.ServiceName
	}
	return ""
}

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

func (m *GetExistenceRequest) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

func (m *GetExistenceRequest) GetSchemaId() string {
	if m != nil {
		return m.SchemaId
	}
	return ""
}

type GetExistenceResponse struct {
	Response  *Response `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
	ServiceId string    `protobuf:"bytes,2,opt,name=serviceId" json:"serviceId,omitempty"`
	SchemaId  string    `protobuf:"bytes,3,opt,name=schemaId" json:"schemaId,omitempty"`
}

func (m *GetExistenceResponse) Reset()                    { *m = GetExistenceResponse{} }
func (m *GetExistenceResponse) String() string            { return proto1.CompactTextString(m) }
func (*GetExistenceResponse) ProtoMessage()               {}
func (*GetExistenceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} }

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

func (m *GetExistenceResponse) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

func (m *GetExistenceResponse) GetSchemaId() string {
	if m != nil {
		return m.SchemaId
	}
	return ""
}

type CreateServiceRequest struct {
	Service *MicroService `protobuf:"bytes,1,opt,name=service" json:"service,omitempty"`
}

func (m *CreateServiceRequest) Reset()                    { *m = CreateServiceRequest{} }
func (m *CreateServiceRequest) String() string            { return proto1.CompactTextString(m) }
func (*CreateServiceRequest) ProtoMessage()               {}
func (*CreateServiceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }

func (m *CreateServiceRequest) GetService() *MicroService {
	if m != nil {
		return m.Service
	}
	return nil
}

type CreateServiceResponse struct {
	Response  *Response `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
	ServiceId string    `protobuf:"bytes,2,opt,name=serviceId" json:"serviceId,omitempty"`
}

func (m *CreateServiceResponse) Reset()                    { *m = CreateServiceResponse{} }
func (m *CreateServiceResponse) String() string            { return proto1.CompactTextString(m) }
func (*CreateServiceResponse) ProtoMessage()               {}
func (*CreateServiceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }

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

func (m *CreateServiceResponse) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

type DeleteServiceRequest struct {
	ServiceId string `protobuf:"bytes,1,opt,name=serviceId" json:"serviceId,omitempty"`
	Force     bool   `protobuf:"varint,2,opt,name=force" json:"force,omitempty"`
}

func (m *DeleteServiceRequest) Reset()                    { *m = DeleteServiceRequest{} }
func (m *DeleteServiceRequest) String() string            { return proto1.CompactTextString(m) }
func (*DeleteServiceRequest) ProtoMessage()               {}
func (*DeleteServiceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} }

func (m *DeleteServiceRequest) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

func (m *DeleteServiceRequest) GetForce() bool {
	if m != nil {
		return m.Force
	}
	return false
}

type DeleteServiceResponse struct {
	Response *Response `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
}

func (m *DeleteServiceResponse) Reset()                    { *m = DeleteServiceResponse{} }
func (m *DeleteServiceResponse) String() string            { return proto1.CompactTextString(m) }
func (*DeleteServiceResponse) ProtoMessage()               {}
func (*DeleteServiceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} }

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

type GetServiceRequest struct {
	ServiceId string `protobuf:"bytes,1,opt,name=serviceId" json:"serviceId,omitempty"`
}

func (m *GetServiceRequest) Reset()                    { *m = GetServiceRequest{} }
func (m *GetServiceRequest) String() string            { return proto1.CompactTextString(m) }
func (*GetServiceRequest) ProtoMessage()               {}
func (*GetServiceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} }

func (m *GetServiceRequest) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

type GetServiceResponse struct {
	Response *Response     `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
	Service  *MicroService `protobuf:"bytes,2,opt,name=service" json:"service,omitempty"`
}

func (m *GetServiceResponse) Reset()                    { *m = GetServiceResponse{} }
func (m *GetServiceResponse) String() string            { return proto1.CompactTextString(m) }
func (*GetServiceResponse) ProtoMessage()               {}
func (*GetServiceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} }

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

func (m *GetServiceResponse) GetService() *MicroService {
	if m != nil {
		return m.Service
	}
	return nil
}

type GetServicesRequest struct {
}

func (m *GetServicesRequest) Reset()                    { *m = GetServicesRequest{} }
func (m *GetServicesRequest) String() string            { return proto1.CompactTextString(m) }
func (*GetServicesRequest) ProtoMessage()               {}
func (*GetServicesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} }

type GetServicesResponse struct {
	Response *Response       `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
	Services []*MicroService `protobuf:"bytes,2,rep,name=services" json:"services,omitempty"`
}

func (m *GetServicesResponse) Reset()                    { *m = GetServicesResponse{} }
func (m *GetServicesResponse) String() string            { return proto1.CompactTextString(m) }
func (*GetServicesResponse) ProtoMessage()               {}
func (*GetServicesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} }

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

func (m *GetServicesResponse) GetServices() []*MicroService {
	if m != nil {
		return m.Services
	}
	return nil
}

type UpdateServicePropsRequest struct {
	ServiceId  string            `protobuf:"bytes,1,opt,name=serviceId" json:"serviceId,omitempty"`
	Properties map[string]string `protobuf:"bytes,2,rep,name=properties" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
}

func (m *UpdateServicePropsRequest) Reset()                    { *m = UpdateServicePropsRequest{} }
func (m *UpdateServicePropsRequest) String() string            { return proto1.CompactTextString(m) }
func (*UpdateServicePropsRequest) ProtoMessage()               {}
func (*UpdateServicePropsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} }

func (m *UpdateServicePropsRequest) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

func (m *UpdateServicePropsRequest) GetProperties() map[string]string {
	if m != nil {
		return m.Properties
	}
	return nil
}

type UpdateServicePropsResponse struct {
	Response *Response `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
}

func (m *UpdateServicePropsResponse) Reset()                    { *m = UpdateServicePropsResponse{} }
func (m *UpdateServicePropsResponse) String() string            { return proto1.CompactTextString(m) }
func (*UpdateServicePropsResponse) ProtoMessage()               {}
func (*UpdateServicePropsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} }

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

type GetServiceRulesRequest struct {
	ServiceId string `protobuf:"bytes,1,opt,name=serviceId" json:"serviceId,omitempty"`
}

func (m *GetServiceRulesRequest) Reset()                    { *m = GetServiceRulesRequest{} }
func (m *GetServiceRulesRequest) String() string            { return proto1.CompactTextString(m) }
func (*GetServiceRulesRequest) ProtoMessage()               {}
func (*GetServiceRulesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} }

func (m *GetServiceRulesRequest) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

type GetServiceRulesResponse struct {
	Response *Response      `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
	Rules    []*ServiceRule `protobuf:"bytes,2,rep,name=rules" json:"rules,omitempty"`
}

func (m *GetServiceRulesResponse) Reset()                    { *m = GetServiceRulesResponse{} }
func (m *GetServiceRulesResponse) String() string            { return proto1.CompactTextString(m) }
func (*GetServiceRulesResponse) ProtoMessage()               {}
func (*GetServiceRulesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} }

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

func (m *GetServiceRulesResponse) GetRules() []*ServiceRule {
	if m != nil {
		return m.Rules
	}
	return nil
}

type UpdateServiceRuleRequest struct {
	ServiceId string                  `protobuf:"bytes,1,opt,name=serviceId" json:"serviceId,omitempty"`
	RuleId    string                  `protobuf:"bytes,2,opt,name=ruleId" json:"ruleId,omitempty"`
	Rule      *AddOrUpdateServiceRule `protobuf:"bytes,3,opt,name=rule" json:"rule,omitempty"`
}

func (m *UpdateServiceRuleRequest) Reset()                    { *m = UpdateServiceRuleRequest{} }
func (m *UpdateServiceRuleRequest) String() string            { return proto1.CompactTextString(m) }
func (*UpdateServiceRuleRequest) ProtoMessage()               {}
func (*UpdateServiceRuleRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} }

func (m *UpdateServiceRuleRequest) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

func (m *UpdateServiceRuleRequest) GetRuleId() string {
	if m != nil {
		return m.RuleId
	}
	return ""
}

func (m *UpdateServiceRuleRequest) GetRule() *AddOrUpdateServiceRule {
	if m != nil {
		return m.Rule
	}
	return nil
}

type UpdateServiceRuleResponse struct {
	Response *Response `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
}

func (m *UpdateServiceRuleResponse) Reset()                    { *m = UpdateServiceRuleResponse{} }
func (m *UpdateServiceRuleResponse) String() string            { return proto1.CompactTextString(m) }
func (*UpdateServiceRuleResponse) ProtoMessage()               {}
func (*UpdateServiceRuleResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} }

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

type AddServiceRulesRequest struct {
	ServiceId string                    `protobuf:"bytes,1,opt,name=serviceId" json:"serviceId,omitempty"`
	Rules     []*AddOrUpdateServiceRule `protobuf:"bytes,2,rep,name=rules" json:"rules,omitempty"`
}

func (m *AddServiceRulesRequest) Reset()                    { *m = AddServiceRulesRequest{} }
func (m *AddServiceRulesRequest) String() string            { return proto1.CompactTextString(m) }
func (*AddServiceRulesRequest) ProtoMessage()               {}
func (*AddServiceRulesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} }

func (m *AddServiceRulesRequest) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

func (m *AddServiceRulesRequest) GetRules() []*AddOrUpdateServiceRule {
	if m != nil {
		return m.Rules
	}
	return nil
}

type AddServiceRulesResponse struct {
	Response *Response `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
	RuleIds  []string  `protobuf:"bytes,2,rep,name=RuleIds" json:"RuleIds,omitempty"`
}

func (m *AddServiceRulesResponse) Reset()                    { *m = AddServiceRulesResponse{} }
func (m *AddServiceRulesResponse) String() string            { return proto1.CompactTextString(m) }
func (*AddServiceRulesResponse) ProtoMessage()               {}
func (*AddServiceRulesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} }

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

func (m *AddServiceRulesResponse) GetRuleIds() []string {
	if m != nil {
		return m.RuleIds
	}
	return nil
}

type DeleteServiceRulesRequest struct {
	ServiceId string   `protobuf:"bytes,1,opt,name=serviceId" json:"serviceId,omitempty"`
	RuleIds   []string `protobuf:"bytes,2,rep,name=ruleIds" json:"ruleIds,omitempty"`
}

func (m *DeleteServiceRulesRequest) Reset()                    { *m = DeleteServiceRulesRequest{} }
func (m *DeleteServiceRulesRequest) String() string            { return proto1.CompactTextString(m) }
func (*DeleteServiceRulesRequest) ProtoMessage()               {}
func (*DeleteServiceRulesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} }

func (m *DeleteServiceRulesRequest) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

func (m *DeleteServiceRulesRequest) GetRuleIds() []string {
	if m != nil {
		return m.RuleIds
	}
	return nil
}

type DeleteServiceRulesResponse struct {
	Response *Response `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
}

func (m *DeleteServiceRulesResponse) Reset()                    { *m = DeleteServiceRulesResponse{} }
func (m *DeleteServiceRulesResponse) String() string            { return proto1.CompactTextString(m) }
func (*DeleteServiceRulesResponse) ProtoMessage()               {}
func (*DeleteServiceRulesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} }

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

type GetServiceTagsRequest struct {
	ServiceId string `protobuf:"bytes,1,opt,name=serviceId" json:"serviceId,omitempty"`
}

func (m *GetServiceTagsRequest) Reset()                    { *m = GetServiceTagsRequest{} }
func (m *GetServiceTagsRequest) String() string            { return proto1.CompactTextString(m) }
func (*GetServiceTagsRequest) ProtoMessage()               {}
func (*GetServiceTagsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{32} }

func (m *GetServiceTagsRequest) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

type GetServiceTagsResponse struct {
	Response *Response         `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
	Tags     map[string]string `protobuf:"bytes,2,rep,name=tags" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
}

func (m *GetServiceTagsResponse) Reset()                    { *m = GetServiceTagsResponse{} }
func (m *GetServiceTagsResponse) String() string            { return proto1.CompactTextString(m) }
func (*GetServiceTagsResponse) ProtoMessage()               {}
func (*GetServiceTagsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{33} }

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

func (m *GetServiceTagsResponse) GetTags() map[string]string {
	if m != nil {
		return m.Tags
	}
	return nil
}

type UpdateServiceTagRequest struct {
	ServiceId string `protobuf:"bytes,1,opt,name=serviceId" json:"serviceId,omitempty"`
	Key       string `protobuf:"bytes,2,opt,name=key" json:"key,omitempty"`
	Value     string `protobuf:"bytes,3,opt,name=value" json:"value,omitempty"`
}

func (m *UpdateServiceTagRequest) Reset()                    { *m = UpdateServiceTagRequest{} }
func (m *UpdateServiceTagRequest) String() string            { return proto1.CompactTextString(m) }
func (*UpdateServiceTagRequest) ProtoMessage()               {}
func (*UpdateServiceTagRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34} }

func (m *UpdateServiceTagRequest) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

func (m *UpdateServiceTagRequest) GetKey() string {
	if m != nil {
		return m.Key
	}
	return ""
}

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

type UpdateServiceTagResponse struct {
	Response *Response `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
}

func (m *UpdateServiceTagResponse) Reset()                    { *m = UpdateServiceTagResponse{} }
func (m *UpdateServiceTagResponse) String() string            { return proto1.CompactTextString(m) }
func (*UpdateServiceTagResponse) ProtoMessage()               {}
func (*UpdateServiceTagResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} }

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

type AddServiceTagsRequest struct {
	ServiceId string            `protobuf:"bytes,1,opt,name=serviceId" json:"serviceId,omitempty"`
	Tags      map[string]string `protobuf:"bytes,2,rep,name=tags" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
}

func (m *AddServiceTagsRequest) Reset()                    { *m = AddServiceTagsRequest{} }
func (m *AddServiceTagsRequest) String() string            { return proto1.CompactTextString(m) }
func (*AddServiceTagsRequest) ProtoMessage()               {}
func (*AddServiceTagsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} }

func (m *AddServiceTagsRequest) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

func (m *AddServiceTagsRequest) GetTags() map[string]string {
	if m != nil {
		return m.Tags
	}
	return nil
}

type AddServiceTagsResponse struct {
	Response *Response `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
}

func (m *AddServiceTagsResponse) Reset()                    { *m = AddServiceTagsResponse{} }
func (m *AddServiceTagsResponse) String() string            { return proto1.CompactTextString(m) }
func (*AddServiceTagsResponse) ProtoMessage()               {}
func (*AddServiceTagsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} }

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

type DeleteServiceTagsRequest struct {
	ServiceId string   `protobuf:"bytes,1,opt,name=serviceId" json:"serviceId,omitempty"`
	Keys      []string `protobuf:"bytes,2,rep,name=keys" json:"keys,omitempty"`
}

func (m *DeleteServiceTagsRequest) Reset()                    { *m = DeleteServiceTagsRequest{} }
func (m *DeleteServiceTagsRequest) String() string            { return proto1.CompactTextString(m) }
func (*DeleteServiceTagsRequest) ProtoMessage()               {}
func (*DeleteServiceTagsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38} }

func (m *DeleteServiceTagsRequest) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

func (m *DeleteServiceTagsRequest) GetKeys() []string {
	if m != nil {
		return m.Keys
	}
	return nil
}

type DeleteServiceTagsResponse struct {
	Response *Response `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
}

func (m *DeleteServiceTagsResponse) Reset()                    { *m = DeleteServiceTagsResponse{} }
func (m *DeleteServiceTagsResponse) String() string            { return proto1.CompactTextString(m) }
func (*DeleteServiceTagsResponse) ProtoMessage()               {}
func (*DeleteServiceTagsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{39} }

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

type HealthCheck struct {
	Mode     string `protobuf:"bytes,1,opt,name=mode" json:"mode,omitempty"`
	Port     int32  `protobuf:"varint,2,opt,name=port" json:"port,omitempty"`
	Interval int32  `protobuf:"varint,3,opt,name=interval" json:"interval,omitempty"`
	Times    int32  `protobuf:"varint,4,opt,name=times" json:"times,omitempty"`
	Url      string `protobuf:"bytes,5,opt,name=url" json:"url,omitempty"`
}

func (m *HealthCheck) Reset()                    { *m = HealthCheck{} }
func (m *HealthCheck) String() string            { return proto1.CompactTextString(m) }
func (*HealthCheck) ProtoMessage()               {}
func (*HealthCheck) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} }

func (m *HealthCheck) GetMode() string {
	if m != nil {
		return m.Mode
	}
	return ""
}

func (m *HealthCheck) GetPort() int32 {
	if m != nil {
		return m.Port
	}
	return 0
}

func (m *HealthCheck) GetInterval() int32 {
	if m != nil {
		return m.Interval
	}
	return 0
}

func (m *HealthCheck) GetTimes() int32 {
	if m != nil {
		return m.Times
	}
	return 0
}

func (m *HealthCheck) GetUrl() string {
	if m != nil {
		return m.Url
	}
	return ""
}

type MicroServiceInstance struct {
	InstanceId     string            `protobuf:"bytes,1,opt,name=instanceId" json:"instanceId,omitempty"`
	ServiceId      string            `protobuf:"bytes,2,opt,name=serviceId" json:"serviceId,omitempty"`
	Endpoints      []string          `protobuf:"bytes,3,rep,name=endpoints" json:"endpoints,omitempty"`
	HostName       string            `protobuf:"bytes,4,opt,name=hostName" json:"hostName,omitempty"`
	Status         string            `protobuf:"bytes,5,opt,name=status" json:"status,omitempty"`
	Properties     map[string]string `protobuf:"bytes,6,rep,name=properties" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
	HealthCheck    *HealthCheck      `protobuf:"bytes,7,opt,name=healthCheck" json:"healthCheck,omitempty"`
	Timestamp      string            `protobuf:"bytes,8,opt,name=timestamp" json:"timestamp,omitempty"`
	DataCenterInfo *DataCenterInfo   `protobuf:"bytes,9,opt,name=dataCenterInfo" json:"dataCenterInfo,omitempty"`
	Stage          string            `protobuf:"bytes,10,opt,name=stage" json:"stage,omitempty"`
}

func (m *MicroServiceInstance) Reset()                    { *m = MicroServiceInstance{} }
func (m *MicroServiceInstance) String() string            { return proto1.CompactTextString(m) }
func (*MicroServiceInstance) ProtoMessage()               {}
func (*MicroServiceInstance) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{41} }

func (m *MicroServiceInstance) GetInstanceId() string {
	if m != nil {
		return m.InstanceId
	}
	return ""
}

func (m *MicroServiceInstance) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

func (m *MicroServiceInstance) GetEndpoints() []string {
	if m != nil {
		return m.Endpoints
	}
	return nil
}

func (m *MicroServiceInstance) GetHostName() string {
	if m != nil {
		return m.HostName
	}
	return ""
}

func (m *MicroServiceInstance) GetStatus() string {
	if m != nil {
		return m.Status
	}
	return ""
}

func (m *MicroServiceInstance) GetProperties() map[string]string {
	if m != nil {
		return m.Properties
	}
	return nil
}

func (m *MicroServiceInstance) GetHealthCheck() *HealthCheck {
	if m != nil {
		return m.HealthCheck
	}
	return nil
}

func (m *MicroServiceInstance) GetTimestamp() string {
	if m != nil {
		return m.Timestamp
	}
	return ""
}

func (m *MicroServiceInstance) GetDataCenterInfo() *DataCenterInfo {
	if m != nil {
		return m.DataCenterInfo
	}
	return nil
}

func (m *MicroServiceInstance) GetStage() string {
	if m != nil {
		return m.Stage
	}
	return ""
}

type DataCenterInfo struct {
	Name          string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
	Region        string `protobuf:"bytes,2,opt,name=region" json:"region,omitempty"`
	AvailableZone string `protobuf:"bytes,3,opt,name=availableZone" json:"availableZone,omitempty"`
}

func (m *DataCenterInfo) Reset()                    { *m = DataCenterInfo{} }
func (m *DataCenterInfo) String() string            { return proto1.CompactTextString(m) }
func (*DataCenterInfo) ProtoMessage()               {}
func (*DataCenterInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{42} }

func (m *DataCenterInfo) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *DataCenterInfo) GetRegion() string {
	if m != nil {
		return m.Region
	}
	return ""
}

func (m *DataCenterInfo) GetAvailableZone() string {
	if m != nil {
		return m.AvailableZone
	}
	return ""
}

type MicroServiceInstanceKey struct {
	InstanceId string `protobuf:"bytes,1,opt,name=instanceId" json:"instanceId,omitempty"`
	ServiceId  string `protobuf:"bytes,2,opt,name=serviceId" json:"serviceId,omitempty"`
}

func (m *MicroServiceInstanceKey) Reset()                    { *m = MicroServiceInstanceKey{} }
func (m *MicroServiceInstanceKey) String() string            { return proto1.CompactTextString(m) }
func (*MicroServiceInstanceKey) ProtoMessage()               {}
func (*MicroServiceInstanceKey) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{43} }

func (m *MicroServiceInstanceKey) GetInstanceId() string {
	if m != nil {
		return m.InstanceId
	}
	return ""
}

func (m *MicroServiceInstanceKey) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

type RegisterInstanceRequest struct {
	Instance *MicroServiceInstance `protobuf:"bytes,1,opt,name=instance" json:"instance,omitempty"`
}

func (m *RegisterInstanceRequest) Reset()                    { *m = RegisterInstanceRequest{} }
func (m *RegisterInstanceRequest) String() string            { return proto1.CompactTextString(m) }
func (*RegisterInstanceRequest) ProtoMessage()               {}
func (*RegisterInstanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44} }

func (m *RegisterInstanceRequest) GetInstance() *MicroServiceInstance {
	if m != nil {
		return m.Instance
	}
	return nil
}

type RegisterInstanceResponse struct {
	Response   *Response `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
	InstanceId string    `protobuf:"bytes,2,opt,name=instanceId" json:"instanceId,omitempty"`
}

func (m *RegisterInstanceResponse) Reset()                    { *m = RegisterInstanceResponse{} }
func (m *RegisterInstanceResponse) String() string            { return proto1.CompactTextString(m) }
func (*RegisterInstanceResponse) ProtoMessage()               {}
func (*RegisterInstanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{45} }

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

func (m *RegisterInstanceResponse) GetInstanceId() string {
	if m != nil {
		return m.InstanceId
	}
	return ""
}

type UnregisterInstanceRequest struct {
	ServiceId  string `protobuf:"bytes,1,opt,name=serviceId" json:"serviceId,omitempty"`
	InstanceId string `protobuf:"bytes,2,opt,name=instanceId" json:"instanceId,omitempty"`
}

func (m *UnregisterInstanceRequest) Reset()                    { *m = UnregisterInstanceRequest{} }
func (m *UnregisterInstanceRequest) String() string            { return proto1.CompactTextString(m) }
func (*UnregisterInstanceRequest) ProtoMessage()               {}
func (*UnregisterInstanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{46} }

func (m *UnregisterInstanceRequest) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

func (m *UnregisterInstanceRequest) GetInstanceId() string {
	if m != nil {
		return m.InstanceId
	}
	return ""
}

type UnregisterInstanceResponse struct {
	Response *Response `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
}

func (m *UnregisterInstanceResponse) Reset()                    { *m = UnregisterInstanceResponse{} }
func (m *UnregisterInstanceResponse) String() string            { return proto1.CompactTextString(m) }
func (*UnregisterInstanceResponse) ProtoMessage()               {}
func (*UnregisterInstanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{47} }

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

type HeartbeatRequest struct {
	ServiceId  string `protobuf:"bytes,1,opt,name=serviceId" json:"serviceId,omitempty"`
	InstanceId string `protobuf:"bytes,2,opt,name=instanceId" json:"instanceId,omitempty"`
}

func (m *HeartbeatRequest) Reset()                    { *m = HeartbeatRequest{} }
func (m *HeartbeatRequest) String() string            { return proto1.CompactTextString(m) }
func (*HeartbeatRequest) ProtoMessage()               {}
func (*HeartbeatRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{48} }

func (m *HeartbeatRequest) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

func (m *HeartbeatRequest) GetInstanceId() string {
	if m != nil {
		return m.InstanceId
	}
	return ""
}

type HeartbeatResponse struct {
	Response *Response `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
}

func (m *HeartbeatResponse) Reset()                    { *m = HeartbeatResponse{} }
func (m *HeartbeatResponse) String() string            { return proto1.CompactTextString(m) }
func (*HeartbeatResponse) ProtoMessage()               {}
func (*HeartbeatResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{49} }

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

type FindInstancesRequest struct {
	ConsumerServiceId string   `protobuf:"bytes,1,opt,name=consumerServiceId" json:"consumerServiceId,omitempty"`
	AppId             string   `protobuf:"bytes,2,opt,name=appId" json:"appId,omitempty"`
	ServiceName       string   `protobuf:"bytes,3,opt,name=serviceName" json:"serviceName,omitempty"`
	VersionRule       string   `protobuf:"bytes,4,opt,name=versionRule" json:"versionRule,omitempty"`
	Tags              []string `protobuf:"bytes,5,rep,name=tags" json:"tags,omitempty"`
	Stage             string   `protobuf:"bytes,6,opt,name=stage" json:"stage,omitempty"`
}

func (m *FindInstancesRequest) Reset()                    { *m = FindInstancesRequest{} }
func (m *FindInstancesRequest) String() string            { return proto1.CompactTextString(m) }
func (*FindInstancesRequest) ProtoMessage()               {}
func (*FindInstancesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{50} }

func (m *FindInstancesRequest) GetConsumerServiceId() string {
	if m != nil {
		return m.ConsumerServiceId
	}
	return ""
}

func (m *FindInstancesRequest) GetAppId() string {
	if m != nil {
		return m.AppId
	}
	return ""
}

func (m *FindInstancesRequest) GetServiceName() string {
	if m != nil {
		return m.ServiceName
	}
	return ""
}

func (m *FindInstancesRequest) GetVersionRule() string {
	if m != nil {
		return m.VersionRule
	}
	return ""
}

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

func (m *FindInstancesRequest) GetStage() string {
	if m != nil {
		return m.Stage
	}
	return ""
}

type FindInstancesResponse struct {
	Response  *Response               `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
	Instances []*MicroServiceInstance `protobuf:"bytes,2,rep,name=instances" json:"instances,omitempty"`
}

func (m *FindInstancesResponse) Reset()                    { *m = FindInstancesResponse{} }
func (m *FindInstancesResponse) String() string            { return proto1.CompactTextString(m) }
func (*FindInstancesResponse) ProtoMessage()               {}
func (*FindInstancesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{51} }

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

func (m *FindInstancesResponse) GetInstances() []*MicroServiceInstance {
	if m != nil {
		return m.Instances
	}
	return nil
}

type GetOneInstanceRequest struct {
	ConsumerServiceId  string   `protobuf:"bytes,1,opt,name=consumerServiceId" json:"consumerServiceId,omitempty"`
	ProviderServiceId  string   `protobuf:"bytes,2,opt,name=providerServiceId" json:"providerServiceId,omitempty"`
	ProviderInstanceId string   `protobuf:"bytes,3,opt,name=providerInstanceId" json:"providerInstanceId,omitempty"`
	Tags               []string `protobuf:"bytes,4,rep,name=tags" json:"tags,omitempty"`
	Stage              string   `protobuf:"bytes,5,opt,name=stage" json:"stage,omitempty"`
}

func (m *GetOneInstanceRequest) Reset()                    { *m = GetOneInstanceRequest{} }
func (m *GetOneInstanceRequest) String() string            { return proto1.CompactTextString(m) }
func (*GetOneInstanceRequest) ProtoMessage()               {}
func (*GetOneInstanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{52} }

func (m *GetOneInstanceRequest) GetConsumerServiceId() string {
	if m != nil {
		return m.ConsumerServiceId
	}
	return ""
}

func (m *GetOneInstanceRequest) GetProviderServiceId() string {
	if m != nil {
		return m.ProviderServiceId
	}
	return ""
}

func (m *GetOneInstanceRequest) GetProviderInstanceId() string {
	if m != nil {
		return m.ProviderInstanceId
	}
	return ""
}

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

func (m *GetOneInstanceRequest) GetStage() string {
	if m != nil {
		return m.Stage
	}
	return ""
}

type GetOneInstanceResponse struct {
	Response *Response             `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
	Instance *MicroServiceInstance `protobuf:"bytes,2,opt,name=instance" json:"instance,omitempty"`
}

func (m *GetOneInstanceResponse) Reset()                    { *m = GetOneInstanceResponse{} }
func (m *GetOneInstanceResponse) String() string            { return proto1.CompactTextString(m) }
func (*GetOneInstanceResponse) ProtoMessage()               {}
func (*GetOneInstanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{53} }

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

func (m *GetOneInstanceResponse) GetInstance() *MicroServiceInstance {
	if m != nil {
		return m.Instance
	}
	return nil
}

type GetInstancesRequest struct {
	ConsumerServiceId string   `protobuf:"bytes,1,opt,name=consumerServiceId" json:"consumerServiceId,omitempty"`
	ProviderServiceId string   `protobuf:"bytes,2,opt,name=providerServiceId" json:"providerServiceId,omitempty"`
	Tags              []string `protobuf:"bytes,3,rep,name=tags" json:"tags,omitempty"`
	Stage             string   `protobuf:"bytes,4,opt,name=stage" json:"stage,omitempty"`
}

func (m *GetInstancesRequest) Reset()                    { *m = GetInstancesRequest{} }
func (m *GetInstancesRequest) String() string            { return proto1.CompactTextString(m) }
func (*GetInstancesRequest) ProtoMessage()               {}
func (*GetInstancesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{54} }

func (m *GetInstancesRequest) GetConsumerServiceId() string {
	if m != nil {
		return m.ConsumerServiceId
	}
	return ""
}

func (m *GetInstancesRequest) GetProviderServiceId() string {
	if m != nil {
		return m.ProviderServiceId
	}
	return ""
}

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

func (m *GetInstancesRequest) GetStage() string {
	if m != nil {
		return m.Stage
	}
	return ""
}

type GetInstancesResponse struct {
	Response  *Response               `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
	Instances []*MicroServiceInstance `protobuf:"bytes,2,rep,name=instances" json:"instances,omitempty"`
}

func (m *GetInstancesResponse) Reset()                    { *m = GetInstancesResponse{} }
func (m *GetInstancesResponse) String() string            { return proto1.CompactTextString(m) }
func (*GetInstancesResponse) ProtoMessage()               {}
func (*GetInstancesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{55} }

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

func (m *GetInstancesResponse) GetInstances() []*MicroServiceInstance {
	if m != nil {
		return m.Instances
	}
	return nil
}

type UpdateInstanceStatusRequest struct {
	ServiceId  string `protobuf:"bytes,1,opt,name=serviceId" json:"serviceId,omitempty"`
	InstanceId string `protobuf:"bytes,2,opt,name=instanceId" json:"instanceId,omitempty"`
	Status     string `protobuf:"bytes,3,opt,name=status" json:"status,omitempty"`
}

func (m *UpdateInstanceStatusRequest) Reset()                    { *m = UpdateInstanceStatusRequest{} }
func (m *UpdateInstanceStatusRequest) String() string            { return proto1.CompactTextString(m) }
func (*UpdateInstanceStatusRequest) ProtoMessage()               {}
func (*UpdateInstanceStatusRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{56} }

func (m *UpdateInstanceStatusRequest) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

func (m *UpdateInstanceStatusRequest) GetInstanceId() string {
	if m != nil {
		return m.InstanceId
	}
	return ""
}

func (m *UpdateInstanceStatusRequest) GetStatus() string {
	if m != nil {
		return m.Status
	}
	return ""
}

type UpdateInstanceStatusResponse struct {
	Response *Response `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
}

func (m *UpdateInstanceStatusResponse) Reset()                    { *m = UpdateInstanceStatusResponse{} }
func (m *UpdateInstanceStatusResponse) String() string            { return proto1.CompactTextString(m) }
func (*UpdateInstanceStatusResponse) ProtoMessage()               {}
func (*UpdateInstanceStatusResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{57} }

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

type UpdateInstancePropsRequest struct {
	ServiceId  string            `protobuf:"bytes,1,opt,name=serviceId" json:"serviceId,omitempty"`
	InstanceId string            `protobuf:"bytes,2,opt,name=instanceId" json:"instanceId,omitempty"`
	Properties map[string]string `protobuf:"bytes,3,rep,name=properties" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
}

func (m *UpdateInstancePropsRequest) Reset()                    { *m = UpdateInstancePropsRequest{} }
func (m *UpdateInstancePropsRequest) String() string            { return proto1.CompactTextString(m) }
func (*UpdateInstancePropsRequest) ProtoMessage()               {}
func (*UpdateInstancePropsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{58} }

func (m *UpdateInstancePropsRequest) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

func (m *UpdateInstancePropsRequest) GetInstanceId() string {
	if m != nil {
		return m.InstanceId
	}
	return ""
}

func (m *UpdateInstancePropsRequest) GetProperties() map[string]string {
	if m != nil {
		return m.Properties
	}
	return nil
}

type UpdateInstancePropsResponse struct {
	Response *Response `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
}

func (m *UpdateInstancePropsResponse) Reset()                    { *m = UpdateInstancePropsResponse{} }
func (m *UpdateInstancePropsResponse) String() string            { return proto1.CompactTextString(m) }
func (*UpdateInstancePropsResponse) ProtoMessage()               {}
func (*UpdateInstancePropsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{59} }

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

type WatchInstanceRequest struct {
	SelfServiceId string `protobuf:"bytes,1,opt,name=selfServiceId" json:"selfServiceId,omitempty"`
}

func (m *WatchInstanceRequest) Reset()                    { *m = WatchInstanceRequest{} }
func (m *WatchInstanceRequest) String() string            { return proto1.CompactTextString(m) }
func (*WatchInstanceRequest) ProtoMessage()               {}
func (*WatchInstanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{60} }

func (m *WatchInstanceRequest) GetSelfServiceId() string {
	if m != nil {
		return m.SelfServiceId
	}
	return ""
}

type WatchInstanceResponse struct {
	Response *Response             `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
	Action   string                `protobuf:"bytes,2,opt,name=action" json:"action,omitempty"`
	Key      *MicroServiceKey      `protobuf:"bytes,3,opt,name=key" json:"key,omitempty"`
	Instance *MicroServiceInstance `protobuf:"bytes,4,opt,name=instance" json:"instance,omitempty"`
}

func (m *WatchInstanceResponse) Reset()                    { *m = WatchInstanceResponse{} }
func (m *WatchInstanceResponse) String() string            { return proto1.CompactTextString(m) }
func (*WatchInstanceResponse) ProtoMessage()               {}
func (*WatchInstanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{61} }

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

func (m *WatchInstanceResponse) GetAction() string {
	if m != nil {
		return m.Action
	}
	return ""
}

func (m *WatchInstanceResponse) GetKey() *MicroServiceKey {
	if m != nil {
		return m.Key
	}
	return nil
}

func (m *WatchInstanceResponse) GetInstance() *MicroServiceInstance {
	if m != nil {
		return m.Instance
	}
	return nil
}

type GetSchemaRequest struct {
	ServiceId string `protobuf:"bytes,1,opt,name=serviceId" json:"serviceId,omitempty"`
	SchemaId  string `protobuf:"bytes,2,opt,name=schemaId" json:"schemaId,omitempty"`
}

func (m *GetSchemaRequest) Reset()                    { *m = GetSchemaRequest{} }
func (m *GetSchemaRequest) String() string            { return proto1.CompactTextString(m) }
func (*GetSchemaRequest) ProtoMessage()               {}
func (*GetSchemaRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{62} }

func (m *GetSchemaRequest) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

func (m *GetSchemaRequest) GetSchemaId() string {
	if m != nil {
		return m.SchemaId
	}
	return ""
}

type GetSchemaResponse struct {
	Response *Response `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
	Schema   string    `protobuf:"bytes,2,opt,name=schema" json:"schema,omitempty"`
}

func (m *GetSchemaResponse) Reset()                    { *m = GetSchemaResponse{} }
func (m *GetSchemaResponse) String() string            { return proto1.CompactTextString(m) }
func (*GetSchemaResponse) ProtoMessage()               {}
func (*GetSchemaResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{63} }

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

func (m *GetSchemaResponse) GetSchema() string {
	if m != nil {
		return m.Schema
	}
	return ""
}

type DeleteSchemaRequest struct {
	ServiceId string `protobuf:"bytes,1,opt,name=serviceId" json:"serviceId,omitempty"`
	SchemaId  string `protobuf:"bytes,2,opt,name=schemaId" json:"schemaId,omitempty"`
}

func (m *DeleteSchemaRequest) Reset()                    { *m = DeleteSchemaRequest{} }
func (m *DeleteSchemaRequest) String() string            { return proto1.CompactTextString(m) }
func (*DeleteSchemaRequest) ProtoMessage()               {}
func (*DeleteSchemaRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{64} }

func (m *DeleteSchemaRequest) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

func (m *DeleteSchemaRequest) GetSchemaId() string {
	if m != nil {
		return m.SchemaId
	}
	return ""
}

type DeleteSchemaResponse struct {
	Response *Response `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
}

func (m *DeleteSchemaResponse) Reset()                    { *m = DeleteSchemaResponse{} }
func (m *DeleteSchemaResponse) String() string            { return proto1.CompactTextString(m) }
func (*DeleteSchemaResponse) ProtoMessage()               {}
func (*DeleteSchemaResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{65} }

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

type ModifySchemaRequest struct {
	ServiceId string `protobuf:"bytes,1,opt,name=serviceId" json:"serviceId,omitempty"`
	SchemaId  string `protobuf:"bytes,2,opt,name=schemaId" json:"schemaId,omitempty"`
	Schema    string `protobuf:"bytes,3,opt,name=schema" json:"schema,omitempty"`
}

func (m *ModifySchemaRequest) Reset()                    { *m = ModifySchemaRequest{} }
func (m *ModifySchemaRequest) String() string            { return proto1.CompactTextString(m) }
func (*ModifySchemaRequest) ProtoMessage()               {}
func (*ModifySchemaRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{66} }

func (m *ModifySchemaRequest) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

func (m *ModifySchemaRequest) GetSchemaId() string {
	if m != nil {
		return m.SchemaId
	}
	return ""
}

func (m *ModifySchemaRequest) GetSchema() string {
	if m != nil {
		return m.Schema
	}
	return ""
}

type ModifySchemaResponse struct {
	Response *Response `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
}

func (m *ModifySchemaResponse) Reset()                    { *m = ModifySchemaResponse{} }
func (m *ModifySchemaResponse) String() string            { return proto1.CompactTextString(m) }
func (*ModifySchemaResponse) ProtoMessage()               {}
func (*ModifySchemaResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{67} }

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

type CreateDependenciesRequest struct {
	Dependencies []*MircroServiceDependency `protobuf:"bytes,1,rep,name=dependencies" json:"dependencies,omitempty"`
}

func (m *CreateDependenciesRequest) Reset()                    { *m = CreateDependenciesRequest{} }
func (m *CreateDependenciesRequest) String() string            { return proto1.CompactTextString(m) }
func (*CreateDependenciesRequest) ProtoMessage()               {}
func (*CreateDependenciesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{68} }

func (m *CreateDependenciesRequest) GetDependencies() []*MircroServiceDependency {
	if m != nil {
		return m.Dependencies
	}
	return nil
}

type DependencyMircroService struct {
	AppId       string `protobuf:"bytes,1,opt,name=appId" json:"appId,omitempty"`
	ServiceName string `protobuf:"bytes,2,opt,name=serviceName" json:"serviceName,omitempty"`
	Version     string `protobuf:"bytes,3,opt,name=version" json:"version,omitempty"`
	Stage       string `protobuf:"bytes,4,opt,name=stage" json:"stage,omitempty"`
}

func (m *DependencyMircroService) Reset()                    { *m = DependencyMircroService{} }
func (m *DependencyMircroService) String() string            { return proto1.CompactTextString(m) }
func (*DependencyMircroService) ProtoMessage()               {}
func (*DependencyMircroService) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{69} }

func (m *DependencyMircroService) GetAppId() string {
	if m != nil {
		return m.AppId
	}
	return ""
}

func (m *DependencyMircroService) GetServiceName() string {
	if m != nil {
		return m.ServiceName
	}
	return ""
}

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

func (m *DependencyMircroService) GetStage() string {
	if m != nil {
		return m.Stage
	}
	return ""
}

type MircroServiceDependency struct {
	Consumer  *DependencyMircroService   `protobuf:"bytes,1,opt,name=consumer" json:"consumer,omitempty"`
	Providers []*DependencyMircroService `protobuf:"bytes,2,rep,name=providers" json:"providers,omitempty"`
}

func (m *MircroServiceDependency) Reset()                    { *m = MircroServiceDependency{} }
func (m *MircroServiceDependency) String() string            { return proto1.CompactTextString(m) }
func (*MircroServiceDependency) ProtoMessage()               {}
func (*MircroServiceDependency) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{70} }

func (m *MircroServiceDependency) GetConsumer() *DependencyMircroService {
	if m != nil {
		return m.Consumer
	}
	return nil
}

func (m *MircroServiceDependency) GetProviders() []*DependencyMircroService {
	if m != nil {
		return m.Providers
	}
	return nil
}

type CreateDependenciesResponse struct {
	Response *Response `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
}

func (m *CreateDependenciesResponse) Reset()                    { *m = CreateDependenciesResponse{} }
func (m *CreateDependenciesResponse) String() string            { return proto1.CompactTextString(m) }
func (*CreateDependenciesResponse) ProtoMessage()               {}
func (*CreateDependenciesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{71} }

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

type GetDependenciesRequest struct {
	ServiceId string `protobuf:"bytes,1,opt,name=serviceId" json:"serviceId,omitempty"`
}

func (m *GetDependenciesRequest) Reset()                    { *m = GetDependenciesRequest{} }
func (m *GetDependenciesRequest) String() string            { return proto1.CompactTextString(m) }
func (*GetDependenciesRequest) ProtoMessage()               {}
func (*GetDependenciesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{72} }

func (m *GetDependenciesRequest) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

type GetConDependenciesResponse struct {
	Response  *Response       `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
	Providers []*MicroService `protobuf:"bytes,2,rep,name=providers" json:"providers,omitempty"`
}

func (m *GetConDependenciesResponse) Reset()                    { *m = GetConDependenciesResponse{} }
func (m *GetConDependenciesResponse) String() string            { return proto1.CompactTextString(m) }
func (*GetConDependenciesResponse) ProtoMessage()               {}
func (*GetConDependenciesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{73} }

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

func (m *GetConDependenciesResponse) GetProviders() []*MicroService {
	if m != nil {
		return m.Providers
	}
	return nil
}

type GetProDependenciesResponse struct {
	Response  *Response       `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
	Consumers []*MicroService `protobuf:"bytes,2,rep,name=consumers" json:"consumers,omitempty"`
}

func (m *GetProDependenciesResponse) Reset()                    { *m = GetProDependenciesResponse{} }
func (m *GetProDependenciesResponse) String() string            { return proto1.CompactTextString(m) }
func (*GetProDependenciesResponse) ProtoMessage()               {}
func (*GetProDependenciesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{74} }

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

func (m *GetProDependenciesResponse) GetConsumers() []*MicroService {
	if m != nil {
		return m.Consumers
	}
	return nil
}

// 服务概览
type ServiceOverview struct {
	MicroSerivce *MicroService           `protobuf:"bytes,1,opt,name=microSerivce" json:"microSerivce,omitempty"`
	Instances    []*MicroServiceInstance `protobuf:"bytes,2,rep,name=instances" json:"instances,omitempty"`
	Tags         map[string]string       `protobuf:"bytes,3,rep,name=tags" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
}

func (m *ServiceOverview) Reset()                    { *m = ServiceOverview{} }
func (m *ServiceOverview) String() string            { return proto1.CompactTextString(m) }
func (*ServiceOverview) ProtoMessage()               {}
func (*ServiceOverview) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{75} }

func (m *ServiceOverview) GetMicroSerivce() *MicroService {
	if m != nil {
		return m.MicroSerivce
	}
	return nil
}

func (m *ServiceOverview) GetInstances() []*MicroServiceInstance {
	if m != nil {
		return m.Instances
	}
	return nil
}

func (m *ServiceOverview) GetTags() map[string]string {
	if m != nil {
		return m.Tags
	}
	return nil
}

type SchemaInfos struct {
	SchemaId string `protobuf:"bytes,1,opt,name=schemaId" json:"schemaId,omitempty"`
	Schema   string `protobuf:"bytes,2,opt,name=schema" json:"schema,omitempty"`
}

func (m *SchemaInfos) Reset()                    { *m = SchemaInfos{} }
func (m *SchemaInfos) String() string            { return proto1.CompactTextString(m) }
func (*SchemaInfos) ProtoMessage()               {}
func (*SchemaInfos) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{76} }

func (m *SchemaInfos) GetSchemaId() string {
	if m != nil {
		return m.SchemaId
	}
	return ""
}

func (m *SchemaInfos) GetSchema() string {
	if m != nil {
		return m.Schema
	}
	return ""
}

// 服务详情
type ServiceDetail struct {
	MicroSerivce         *MicroService           `protobuf:"bytes,1,opt,name=microSerivce" json:"microSerivce,omitempty"`
	Instances            []*MicroServiceInstance `protobuf:"bytes,2,rep,name=instances" json:"instances,omitempty"`
	SchemaInfos          []*SchemaInfos          `protobuf:"bytes,3,rep,name=schemaInfos" json:"schemaInfos,omitempty"`
	Rules                []*ServiceRule          `protobuf:"bytes,4,rep,name=rules" json:"rules,omitempty"`
	Providers            []*MicroService         `protobuf:"bytes,5,rep,name=providers" json:"providers,omitempty"`
	Consumers            []*MicroService         `protobuf:"bytes,6,rep,name=consumers" json:"consumers,omitempty"`
	Tags                 map[string]string       `protobuf:"bytes,7,rep,name=tags" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
	MicroServiceVersions []string                `protobuf:"bytes,8,rep,name=microServiceVersions" json:"microServiceVersions,omitempty"`
}

func (m *ServiceDetail) Reset()                    { *m = ServiceDetail{} }
func (m *ServiceDetail) String() string            { return proto1.CompactTextString(m) }
func (*ServiceDetail) ProtoMessage()               {}
func (*ServiceDetail) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{77} }

func (m *ServiceDetail) GetMicroSerivce() *MicroService {
	if m != nil {
		return m.MicroSerivce
	}
	return nil
}

func (m *ServiceDetail) GetInstances() []*MicroServiceInstance {
	if m != nil {
		return m.Instances
	}
	return nil
}

func (m *ServiceDetail) GetSchemaInfos() []*SchemaInfos {
	if m != nil {
		return m.SchemaInfos
	}
	return nil
}

func (m *ServiceDetail) GetRules() []*ServiceRule {
	if m != nil {
		return m.Rules
	}
	return nil
}

func (m *ServiceDetail) GetProviders() []*MicroService {
	if m != nil {
		return m.Providers
	}
	return nil
}

func (m *ServiceDetail) GetConsumers() []*MicroService {
	if m != nil {
		return m.Consumers
	}
	return nil
}

func (m *ServiceDetail) GetTags() map[string]string {
	if m != nil {
		return m.Tags
	}
	return nil
}

func (m *ServiceDetail) GetMicroServiceVersions() []string {
	if m != nil {
		return m.MicroServiceVersions
	}
	return nil
}

// 服务详情返回信息
type GetServiceDetailResponse struct {
	Response *Response      `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
	Service  *ServiceDetail `protobuf:"bytes,2,opt,name=service" json:"service,omitempty"`
}

func (m *GetServiceDetailResponse) Reset()                    { *m = GetServiceDetailResponse{} }
func (m *GetServiceDetailResponse) String() string            { return proto1.CompactTextString(m) }
func (*GetServiceDetailResponse) ProtoMessage()               {}
func (*GetServiceDetailResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{78} }

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

func (m *GetServiceDetailResponse) GetService() *ServiceDetail {
	if m != nil {
		return m.Service
	}
	return nil
}

// 删除服务请求
type DelServicesRequest struct {
	ServiceIds []string `protobuf:"bytes,1,rep,name=serviceIds" json:"serviceIds,omitempty"`
	Force      bool     `protobuf:"varint,2,opt,name=force" json:"force,omitempty"`
}

func (m *DelServicesRequest) Reset()                    { *m = DelServicesRequest{} }
func (m *DelServicesRequest) String() string            { return proto1.CompactTextString(m) }
func (*DelServicesRequest) ProtoMessage()               {}
func (*DelServicesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{79} }

func (m *DelServicesRequest) GetServiceIds() []string {
	if m != nil {
		return m.ServiceIds
	}
	return nil
}

func (m *DelServicesRequest) GetForce() bool {
	if m != nil {
		return m.Force
	}
	return false
}

// 删除服务响应内容
type DelServicesRspInfo struct {
	ErrMessage string `protobuf:"bytes,1,opt,name=errMessage" json:"errMessage,omitempty"`
	ServiceId  string `protobuf:"bytes,2,opt,name=serviceId" json:"serviceId,omitempty"`
}

func (m *DelServicesRspInfo) Reset()                    { *m = DelServicesRspInfo{} }
func (m *DelServicesRspInfo) String() string            { return proto1.CompactTextString(m) }
func (*DelServicesRspInfo) ProtoMessage()               {}
func (*DelServicesRspInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{80} }

func (m *DelServicesRspInfo) GetErrMessage() string {
	if m != nil {
		return m.ErrMessage
	}
	return ""
}

func (m *DelServicesRspInfo) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

// 删除服务响应
type DelServicesResponse struct {
	Response *Response             `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"`
	Services []*DelServicesRspInfo `protobuf:"bytes,2,rep,name=services" json:"services,omitempty"`
}

func (m *DelServicesResponse) Reset()                    { *m = DelServicesResponse{} }
func (m *DelServicesResponse) String() string            { return proto1.CompactTextString(m) }
func (*DelServicesResponse) ProtoMessage()               {}
func (*DelServicesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{81} }

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

func (m *DelServicesResponse) GetServices() []*DelServicesRspInfo {
	if m != nil {
		return m.Services
	}
	return nil
}

func init() {
	proto1.RegisterType((*HeartbeatSetRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.HeartbeatSetRequest")
	proto1.RegisterType((*HeartbeatSetElement)(nil), "com.huawei.paas.cse.serviceregistry.api.HeartbeatSetElement")
	proto1.RegisterType((*HeartbeatSetResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.HeartbeatSetResponse")
	proto1.RegisterType((*InstanceHbRst)(nil), "com.huawei.paas.cse.serviceregistry.api.InstanceHbRst")
	proto1.RegisterType((*GetServicesInfoRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.GetServicesInfoRequest")
	proto1.RegisterType((*GetServicesInfoResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.GetServicesInfoResponse")
	proto1.RegisterType((*MicroServiceKey)(nil), "com.huawei.paas.cse.serviceregistry.api.MicroServiceKey")
	proto1.RegisterType((*MicroService)(nil), "com.huawei.paas.cse.serviceregistry.api.MicroService")
	proto1.RegisterType((*ServiceRule)(nil), "com.huawei.paas.cse.serviceregistry.api.ServiceRule")
	proto1.RegisterType((*AddOrUpdateServiceRule)(nil), "com.huawei.paas.cse.serviceregistry.api.AddOrUpdateServiceRule")
	proto1.RegisterType((*ServicePath)(nil), "com.huawei.paas.cse.serviceregistry.api.ServicePath")
	proto1.RegisterType((*Response)(nil), "com.huawei.paas.cse.serviceregistry.api.Response")
	proto1.RegisterType((*GetExistenceRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.GetExistenceRequest")
	proto1.RegisterType((*GetExistenceResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.GetExistenceResponse")
	proto1.RegisterType((*CreateServiceRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.CreateServiceRequest")
	proto1.RegisterType((*CreateServiceResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.CreateServiceResponse")
	proto1.RegisterType((*DeleteServiceRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.DeleteServiceRequest")
	proto1.RegisterType((*DeleteServiceResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.DeleteServiceResponse")
	proto1.RegisterType((*GetServiceRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.GetServiceRequest")
	proto1.RegisterType((*GetServiceResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.GetServiceResponse")
	proto1.RegisterType((*GetServicesRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.GetServicesRequest")
	proto1.RegisterType((*GetServicesResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.GetServicesResponse")
	proto1.RegisterType((*UpdateServicePropsRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.UpdateServicePropsRequest")
	proto1.RegisterType((*UpdateServicePropsResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.UpdateServicePropsResponse")
	proto1.RegisterType((*GetServiceRulesRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.GetServiceRulesRequest")
	proto1.RegisterType((*GetServiceRulesResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.GetServiceRulesResponse")
	proto1.RegisterType((*UpdateServiceRuleRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.UpdateServiceRuleRequest")
	proto1.RegisterType((*UpdateServiceRuleResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.UpdateServiceRuleResponse")
	proto1.RegisterType((*AddServiceRulesRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.AddServiceRulesRequest")
	proto1.RegisterType((*AddServiceRulesResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.AddServiceRulesResponse")
	proto1.RegisterType((*DeleteServiceRulesRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.DeleteServiceRulesRequest")
	proto1.RegisterType((*DeleteServiceRulesResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.DeleteServiceRulesResponse")
	proto1.RegisterType((*GetServiceTagsRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.GetServiceTagsRequest")
	proto1.RegisterType((*GetServiceTagsResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.GetServiceTagsResponse")
	proto1.RegisterType((*UpdateServiceTagRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.UpdateServiceTagRequest")
	proto1.RegisterType((*UpdateServiceTagResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.UpdateServiceTagResponse")
	proto1.RegisterType((*AddServiceTagsRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.AddServiceTagsRequest")
	proto1.RegisterType((*AddServiceTagsResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.AddServiceTagsResponse")
	proto1.RegisterType((*DeleteServiceTagsRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.DeleteServiceTagsRequest")
	proto1.RegisterType((*DeleteServiceTagsResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.DeleteServiceTagsResponse")
	proto1.RegisterType((*HealthCheck)(nil), "com.huawei.paas.cse.serviceregistry.api.HealthCheck")
	proto1.RegisterType((*MicroServiceInstance)(nil), "com.huawei.paas.cse.serviceregistry.api.MicroServiceInstance")
	proto1.RegisterType((*DataCenterInfo)(nil), "com.huawei.paas.cse.serviceregistry.api.DataCenterInfo")
	proto1.RegisterType((*MicroServiceInstanceKey)(nil), "com.huawei.paas.cse.serviceregistry.api.MicroServiceInstanceKey")
	proto1.RegisterType((*RegisterInstanceRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.RegisterInstanceRequest")
	proto1.RegisterType((*RegisterInstanceResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.RegisterInstanceResponse")
	proto1.RegisterType((*UnregisterInstanceRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.UnregisterInstanceRequest")
	proto1.RegisterType((*UnregisterInstanceResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.UnregisterInstanceResponse")
	proto1.RegisterType((*HeartbeatRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.HeartbeatRequest")
	proto1.RegisterType((*HeartbeatResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.HeartbeatResponse")
	proto1.RegisterType((*FindInstancesRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.FindInstancesRequest")
	proto1.RegisterType((*FindInstancesResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.FindInstancesResponse")
	proto1.RegisterType((*GetOneInstanceRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.GetOneInstanceRequest")
	proto1.RegisterType((*GetOneInstanceResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.GetOneInstanceResponse")
	proto1.RegisterType((*GetInstancesRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.GetInstancesRequest")
	proto1.RegisterType((*GetInstancesResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.GetInstancesResponse")
	proto1.RegisterType((*UpdateInstanceStatusRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.UpdateInstanceStatusRequest")
	proto1.RegisterType((*UpdateInstanceStatusResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.UpdateInstanceStatusResponse")
	proto1.RegisterType((*UpdateInstancePropsRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.UpdateInstancePropsRequest")
	proto1.RegisterType((*UpdateInstancePropsResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.UpdateInstancePropsResponse")
	proto1.RegisterType((*WatchInstanceRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.WatchInstanceRequest")
	proto1.RegisterType((*WatchInstanceResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.WatchInstanceResponse")
	proto1.RegisterType((*GetSchemaRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.GetSchemaRequest")
	proto1.RegisterType((*GetSchemaResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.GetSchemaResponse")
	proto1.RegisterType((*DeleteSchemaRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.DeleteSchemaRequest")
	proto1.RegisterType((*DeleteSchemaResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.DeleteSchemaResponse")
	proto1.RegisterType((*ModifySchemaRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.ModifySchemaRequest")
	proto1.RegisterType((*ModifySchemaResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.ModifySchemaResponse")
	proto1.RegisterType((*CreateDependenciesRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.CreateDependenciesRequest")
	proto1.RegisterType((*DependencyMircroService)(nil), "com.huawei.paas.cse.serviceregistry.api.DependencyMircroService")
	proto1.RegisterType((*MircroServiceDependency)(nil), "com.huawei.paas.cse.serviceregistry.api.MircroServiceDependency")
	proto1.RegisterType((*CreateDependenciesResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.CreateDependenciesResponse")
	proto1.RegisterType((*GetDependenciesRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.GetDependenciesRequest")
	proto1.RegisterType((*GetConDependenciesResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.GetConDependenciesResponse")
	proto1.RegisterType((*GetProDependenciesResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.GetProDependenciesResponse")
	proto1.RegisterType((*ServiceOverview)(nil), "com.huawei.paas.cse.serviceregistry.api.ServiceOverview")
	proto1.RegisterType((*SchemaInfos)(nil), "com.huawei.paas.cse.serviceregistry.api.SchemaInfos")
	proto1.RegisterType((*ServiceDetail)(nil), "com.huawei.paas.cse.serviceregistry.api.ServiceDetail")
	proto1.RegisterType((*GetServiceDetailResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.GetServiceDetailResponse")
	proto1.RegisterType((*DelServicesRequest)(nil), "com.huawei.paas.cse.serviceregistry.api.DelServicesRequest")
	proto1.RegisterType((*DelServicesRspInfo)(nil), "com.huawei.paas.cse.serviceregistry.api.DelServicesRspInfo")
	proto1.RegisterType((*DelServicesResponse)(nil), "com.huawei.paas.cse.serviceregistry.api.DelServicesResponse")
	proto1.RegisterEnum("com.huawei.paas.cse.serviceregistry.api.Response_Code", Response_Code_name, Response_Code_value)
}

// 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

// Client API for ServiceCtrl service

type ServiceCtrlClient interface {
	Exist(ctx context.Context, in *GetExistenceRequest, opts ...grpc.CallOption) (*GetExistenceResponse, error)
	Create(ctx context.Context, in *CreateServiceRequest, opts ...grpc.CallOption) (*CreateServiceResponse, error)
	Delete(ctx context.Context, in *DeleteServiceRequest, opts ...grpc.CallOption) (*DeleteServiceResponse, error)
	GetOne(ctx context.Context, in *GetServiceRequest, opts ...grpc.CallOption) (*GetServiceResponse, error)
	GetServices(ctx context.Context, in *GetServicesRequest, opts ...grpc.CallOption) (*GetServicesResponse, error)
	UpdateProperties(ctx context.Context, in *UpdateServicePropsRequest, opts ...grpc.CallOption) (*UpdateServicePropsResponse, error)
	AddRule(ctx context.Context, in *AddServiceRulesRequest, opts ...grpc.CallOption) (*AddServiceRulesResponse, error)
	GetRule(ctx context.Context, in *GetServiceRulesRequest, opts ...grpc.CallOption) (*GetServiceRulesResponse, error)
	UpdateRule(ctx context.Context, in *UpdateServiceRuleRequest, opts ...grpc.CallOption) (*UpdateServiceRuleResponse, error)
	DeleteRule(ctx context.Context, in *DeleteServiceRulesRequest, opts ...grpc.CallOption) (*DeleteServiceRulesResponse, error)
	AddTags(ctx context.Context, in *AddServiceTagsRequest, opts ...grpc.CallOption) (*AddServiceTagsResponse, error)
	GetTags(ctx context.Context, in *GetServiceTagsRequest, opts ...grpc.CallOption) (*GetServiceTagsResponse, error)
	UpdateTag(ctx context.Context, in *UpdateServiceTagRequest, opts ...grpc.CallOption) (*UpdateServiceTagResponse, error)
	DeleteTags(ctx context.Context, in *DeleteServiceTagsRequest, opts ...grpc.CallOption) (*DeleteServiceTagsResponse, error)
	GetSchemaInfo(ctx context.Context, in *GetSchemaRequest, opts ...grpc.CallOption) (*GetSchemaResponse, error)
	DeleteSchema(ctx context.Context, in *DeleteSchemaRequest, opts ...grpc.CallOption) (*DeleteSchemaResponse, error)
	ModifySchema(ctx context.Context, in *ModifySchemaRequest, opts ...grpc.CallOption) (*ModifySchemaResponse, error)
	CreateDependenciesForMircServices(ctx context.Context, in *CreateDependenciesRequest, opts ...grpc.CallOption) (*CreateDependenciesResponse, error)
	GetProviderDependencies(ctx context.Context, in *GetDependenciesRequest, opts ...grpc.CallOption) (*GetProDependenciesResponse, error)
	GetConsumerDependencies(ctx context.Context, in *GetDependenciesRequest, opts ...grpc.CallOption) (*GetConDependenciesResponse, error)
	DeleteServices(ctx context.Context, in *DelServicesRequest, opts ...grpc.CallOption) (*DelServicesResponse, error)
}

type serviceCtrlClient struct {
	cc *grpc.ClientConn
}

func NewServiceCtrlClient(cc *grpc.ClientConn) ServiceCtrlClient {
	return &serviceCtrlClient{cc}
}

func (c *serviceCtrlClient) Exist(ctx context.Context, in *GetExistenceRequest, opts ...grpc.CallOption) (*GetExistenceResponse, error) {
	out := new(GetExistenceResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/exist", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *serviceCtrlClient) Create(ctx context.Context, in *CreateServiceRequest, opts ...grpc.CallOption) (*CreateServiceResponse, error) {
	out := new(CreateServiceResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/create", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *serviceCtrlClient) Delete(ctx context.Context, in *DeleteServiceRequest, opts ...grpc.CallOption) (*DeleteServiceResponse, error) {
	out := new(DeleteServiceResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/delete", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *serviceCtrlClient) GetOne(ctx context.Context, in *GetServiceRequest, opts ...grpc.CallOption) (*GetServiceResponse, error) {
	out := new(GetServiceResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/getOne", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *serviceCtrlClient) GetServices(ctx context.Context, in *GetServicesRequest, opts ...grpc.CallOption) (*GetServicesResponse, error) {
	out := new(GetServicesResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/getServices", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *serviceCtrlClient) UpdateProperties(ctx context.Context, in *UpdateServicePropsRequest, opts ...grpc.CallOption) (*UpdateServicePropsResponse, error) {
	out := new(UpdateServicePropsResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/updateProperties", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *serviceCtrlClient) AddRule(ctx context.Context, in *AddServiceRulesRequest, opts ...grpc.CallOption) (*AddServiceRulesResponse, error) {
	out := new(AddServiceRulesResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/addRule", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *serviceCtrlClient) GetRule(ctx context.Context, in *GetServiceRulesRequest, opts ...grpc.CallOption) (*GetServiceRulesResponse, error) {
	out := new(GetServiceRulesResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/getRule", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *serviceCtrlClient) UpdateRule(ctx context.Context, in *UpdateServiceRuleRequest, opts ...grpc.CallOption) (*UpdateServiceRuleResponse, error) {
	out := new(UpdateServiceRuleResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/updateRule", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *serviceCtrlClient) DeleteRule(ctx context.Context, in *DeleteServiceRulesRequest, opts ...grpc.CallOption) (*DeleteServiceRulesResponse, error) {
	out := new(DeleteServiceRulesResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/deleteRule", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *serviceCtrlClient) AddTags(ctx context.Context, in *AddServiceTagsRequest, opts ...grpc.CallOption) (*AddServiceTagsResponse, error) {
	out := new(AddServiceTagsResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/addTags", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *serviceCtrlClient) GetTags(ctx context.Context, in *GetServiceTagsRequest, opts ...grpc.CallOption) (*GetServiceTagsResponse, error) {
	out := new(GetServiceTagsResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/getTags", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *serviceCtrlClient) UpdateTag(ctx context.Context, in *UpdateServiceTagRequest, opts ...grpc.CallOption) (*UpdateServiceTagResponse, error) {
	out := new(UpdateServiceTagResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/updateTag", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *serviceCtrlClient) DeleteTags(ctx context.Context, in *DeleteServiceTagsRequest, opts ...grpc.CallOption) (*DeleteServiceTagsResponse, error) {
	out := new(DeleteServiceTagsResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/deleteTags", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *serviceCtrlClient) GetSchemaInfo(ctx context.Context, in *GetSchemaRequest, opts ...grpc.CallOption) (*GetSchemaResponse, error) {
	out := new(GetSchemaResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/getSchemaInfo", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *serviceCtrlClient) DeleteSchema(ctx context.Context, in *DeleteSchemaRequest, opts ...grpc.CallOption) (*DeleteSchemaResponse, error) {
	out := new(DeleteSchemaResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/deleteSchema", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *serviceCtrlClient) ModifySchema(ctx context.Context, in *ModifySchemaRequest, opts ...grpc.CallOption) (*ModifySchemaResponse, error) {
	out := new(ModifySchemaResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/modifySchema", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *serviceCtrlClient) CreateDependenciesForMircServices(ctx context.Context, in *CreateDependenciesRequest, opts ...grpc.CallOption) (*CreateDependenciesResponse, error) {
	out := new(CreateDependenciesResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/createDependenciesForMircServices", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *serviceCtrlClient) GetProviderDependencies(ctx context.Context, in *GetDependenciesRequest, opts ...grpc.CallOption) (*GetProDependenciesResponse, error) {
	out := new(GetProDependenciesResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/getProviderDependencies", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *serviceCtrlClient) GetConsumerDependencies(ctx context.Context, in *GetDependenciesRequest, opts ...grpc.CallOption) (*GetConDependenciesResponse, error) {
	out := new(GetConDependenciesResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/getConsumerDependencies", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *serviceCtrlClient) DeleteServices(ctx context.Context, in *DelServicesRequest, opts ...grpc.CallOption) (*DelServicesResponse, error) {
	out := new(DelServicesResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/deleteServices", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// Server API for ServiceCtrl service

type ServiceCtrlServer interface {
	Exist(context.Context, *GetExistenceRequest) (*GetExistenceResponse, error)
	Create(context.Context, *CreateServiceRequest) (*CreateServiceResponse, error)
	Delete(context.Context, *DeleteServiceRequest) (*DeleteServiceResponse, error)
	GetOne(context.Context, *GetServiceRequest) (*GetServiceResponse, error)
	GetServices(context.Context, *GetServicesRequest) (*GetServicesResponse, error)
	UpdateProperties(context.Context, *UpdateServicePropsRequest) (*UpdateServicePropsResponse, error)
	AddRule(context.Context, *AddServiceRulesRequest) (*AddServiceRulesResponse, error)
	GetRule(context.Context, *GetServiceRulesRequest) (*GetServiceRulesResponse, error)
	UpdateRule(context.Context, *UpdateServiceRuleRequest) (*UpdateServiceRuleResponse, error)
	DeleteRule(context.Context, *DeleteServiceRulesRequest) (*DeleteServiceRulesResponse, error)
	AddTags(context.Context, *AddServiceTagsRequest) (*AddServiceTagsResponse, error)
	GetTags(context.Context, *GetServiceTagsRequest) (*GetServiceTagsResponse, error)
	UpdateTag(context.Context, *UpdateServiceTagRequest) (*UpdateServiceTagResponse, error)
	DeleteTags(context.Context, *DeleteServiceTagsRequest) (*DeleteServiceTagsResponse, error)
	GetSchemaInfo(context.Context, *GetSchemaRequest) (*GetSchemaResponse, error)
	DeleteSchema(context.Context, *DeleteSchemaRequest) (*DeleteSchemaResponse, error)
	ModifySchema(context.Context, *ModifySchemaRequest) (*ModifySchemaResponse, error)
	CreateDependenciesForMircServices(context.Context, *CreateDependenciesRequest) (*CreateDependenciesResponse, error)
	GetProviderDependencies(context.Context, *GetDependenciesRequest) (*GetProDependenciesResponse, error)
	GetConsumerDependencies(context.Context, *GetDependenciesRequest) (*GetConDependenciesResponse, error)
	DeleteServices(context.Context, *DelServicesRequest) (*DelServicesResponse, error)
}

func RegisterServiceCtrlServer(s *grpc.Server, srv ServiceCtrlServer) {
	s.RegisterService(&_ServiceCtrl_serviceDesc, srv)
}

func _ServiceCtrl_Exist_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetExistenceRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceCtrlServer).Exist(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/Exist",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceCtrlServer).Exist(ctx, req.(*GetExistenceRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ServiceCtrl_Create_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CreateServiceRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceCtrlServer).Create(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/Create",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceCtrlServer).Create(ctx, req.(*CreateServiceRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ServiceCtrl_Delete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(DeleteServiceRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceCtrlServer).Delete(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/Delete",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceCtrlServer).Delete(ctx, req.(*DeleteServiceRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ServiceCtrl_GetOne_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetServiceRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceCtrlServer).GetOne(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/GetOne",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceCtrlServer).GetOne(ctx, req.(*GetServiceRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ServiceCtrl_GetServices_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetServicesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceCtrlServer).GetServices(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/GetServices",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceCtrlServer).GetServices(ctx, req.(*GetServicesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ServiceCtrl_UpdateProperties_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UpdateServicePropsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceCtrlServer).UpdateProperties(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/UpdateProperties",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceCtrlServer).UpdateProperties(ctx, req.(*UpdateServicePropsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ServiceCtrl_AddRule_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(AddServiceRulesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceCtrlServer).AddRule(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/AddRule",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceCtrlServer).AddRule(ctx, req.(*AddServiceRulesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ServiceCtrl_GetRule_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetServiceRulesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceCtrlServer).GetRule(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/GetRule",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceCtrlServer).GetRule(ctx, req.(*GetServiceRulesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ServiceCtrl_UpdateRule_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UpdateServiceRuleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceCtrlServer).UpdateRule(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/UpdateRule",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceCtrlServer).UpdateRule(ctx, req.(*UpdateServiceRuleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ServiceCtrl_DeleteRule_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(DeleteServiceRulesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceCtrlServer).DeleteRule(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/DeleteRule",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceCtrlServer).DeleteRule(ctx, req.(*DeleteServiceRulesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ServiceCtrl_AddTags_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(AddServiceTagsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceCtrlServer).AddTags(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/AddTags",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceCtrlServer).AddTags(ctx, req.(*AddServiceTagsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ServiceCtrl_GetTags_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetServiceTagsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceCtrlServer).GetTags(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/GetTags",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceCtrlServer).GetTags(ctx, req.(*GetServiceTagsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ServiceCtrl_UpdateTag_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UpdateServiceTagRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceCtrlServer).UpdateTag(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/UpdateTag",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceCtrlServer).UpdateTag(ctx, req.(*UpdateServiceTagRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ServiceCtrl_DeleteTags_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(DeleteServiceTagsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceCtrlServer).DeleteTags(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/DeleteTags",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceCtrlServer).DeleteTags(ctx, req.(*DeleteServiceTagsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ServiceCtrl_GetSchemaInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetSchemaRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceCtrlServer).GetSchemaInfo(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/GetSchemaInfo",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceCtrlServer).GetSchemaInfo(ctx, req.(*GetSchemaRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ServiceCtrl_DeleteSchema_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(DeleteSchemaRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceCtrlServer).DeleteSchema(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/DeleteSchema",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceCtrlServer).DeleteSchema(ctx, req.(*DeleteSchemaRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ServiceCtrl_ModifySchema_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ModifySchemaRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceCtrlServer).ModifySchema(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/ModifySchema",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceCtrlServer).ModifySchema(ctx, req.(*ModifySchemaRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ServiceCtrl_CreateDependenciesForMircServices_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CreateDependenciesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceCtrlServer).CreateDependenciesForMircServices(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/CreateDependenciesForMircServices",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceCtrlServer).CreateDependenciesForMircServices(ctx, req.(*CreateDependenciesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ServiceCtrl_GetProviderDependencies_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetDependenciesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceCtrlServer).GetProviderDependencies(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/GetProviderDependencies",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceCtrlServer).GetProviderDependencies(ctx, req.(*GetDependenciesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ServiceCtrl_GetConsumerDependencies_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetDependenciesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceCtrlServer).GetConsumerDependencies(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/GetConsumerDependencies",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceCtrlServer).GetConsumerDependencies(ctx, req.(*GetDependenciesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ServiceCtrl_DeleteServices_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(DelServicesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceCtrlServer).DeleteServices(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceCtrl/DeleteServices",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceCtrlServer).DeleteServices(ctx, req.(*DelServicesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _ServiceCtrl_serviceDesc = grpc.ServiceDesc{
	ServiceName: "com.huawei.paas.cse.serviceregistry.api.ServiceCtrl",
	HandlerType: (*ServiceCtrlServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "exist",
			Handler:    _ServiceCtrl_Exist_Handler,
		},
		{
			MethodName: "create",
			Handler:    _ServiceCtrl_Create_Handler,
		},
		{
			MethodName: "delete",
			Handler:    _ServiceCtrl_Delete_Handler,
		},
		{
			MethodName: "getOne",
			Handler:    _ServiceCtrl_GetOne_Handler,
		},
		{
			MethodName: "getServices",
			Handler:    _ServiceCtrl_GetServices_Handler,
		},
		{
			MethodName: "updateProperties",
			Handler:    _ServiceCtrl_UpdateProperties_Handler,
		},
		{
			MethodName: "addRule",
			Handler:    _ServiceCtrl_AddRule_Handler,
		},
		{
			MethodName: "getRule",
			Handler:    _ServiceCtrl_GetRule_Handler,
		},
		{
			MethodName: "updateRule",
			Handler:    _ServiceCtrl_UpdateRule_Handler,
		},
		{
			MethodName: "deleteRule",
			Handler:    _ServiceCtrl_DeleteRule_Handler,
		},
		{
			MethodName: "addTags",
			Handler:    _ServiceCtrl_AddTags_Handler,
		},
		{
			MethodName: "getTags",
			Handler:    _ServiceCtrl_GetTags_Handler,
		},
		{
			MethodName: "updateTag",
			Handler:    _ServiceCtrl_UpdateTag_Handler,
		},
		{
			MethodName: "deleteTags",
			Handler:    _ServiceCtrl_DeleteTags_Handler,
		},
		{
			MethodName: "getSchemaInfo",
			Handler:    _ServiceCtrl_GetSchemaInfo_Handler,
		},
		{
			MethodName: "deleteSchema",
			Handler:    _ServiceCtrl_DeleteSchema_Handler,
		},
		{
			MethodName: "modifySchema",
			Handler:    _ServiceCtrl_ModifySchema_Handler,
		},
		{
			MethodName: "createDependenciesForMircServices",
			Handler:    _ServiceCtrl_CreateDependenciesForMircServices_Handler,
		},
		{
			MethodName: "getProviderDependencies",
			Handler:    _ServiceCtrl_GetProviderDependencies_Handler,
		},
		{
			MethodName: "getConsumerDependencies",
			Handler:    _ServiceCtrl_GetConsumerDependencies_Handler,
		},
		{
			MethodName: "deleteServices",
			Handler:    _ServiceCtrl_DeleteServices_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "services.proto",
}

// Client API for ServiceInstanceCtrl service

type ServiceInstanceCtrlClient interface {
	Register(ctx context.Context, in *RegisterInstanceRequest, opts ...grpc.CallOption) (*RegisterInstanceResponse, error)
	Unregister(ctx context.Context, in *UnregisterInstanceRequest, opts ...grpc.CallOption) (*UnregisterInstanceResponse, error)
	Heartbeat(ctx context.Context, in *HeartbeatRequest, opts ...grpc.CallOption) (*HeartbeatResponse, error)
	Find(ctx context.Context, in *FindInstancesRequest, opts ...grpc.CallOption) (*FindInstancesResponse, error)
	GetInstances(ctx context.Context, in *GetInstancesRequest, opts ...grpc.CallOption) (*GetInstancesResponse, error)
	GetOneInstance(ctx context.Context, in *GetOneInstanceRequest, opts ...grpc.CallOption) (*GetOneInstanceResponse, error)
	UpdateStatus(ctx context.Context, in *UpdateInstanceStatusRequest, opts ...grpc.CallOption) (*UpdateInstanceStatusResponse, error)
	UpdateInstanceProperties(ctx context.Context, in *UpdateInstancePropsRequest, opts ...grpc.CallOption) (*UpdateInstancePropsResponse, error)
	Watch(ctx context.Context, in *WatchInstanceRequest, opts ...grpc.CallOption) (ServiceInstanceCtrl_WatchClient, error)
	HeartbeatSet(ctx context.Context, in *HeartbeatSetRequest, opts ...grpc.CallOption) (*HeartbeatSetResponse, error)
}

type serviceInstanceCtrlClient struct {
	cc *grpc.ClientConn
}

func NewServiceInstanceCtrlClient(cc *grpc.ClientConn) ServiceInstanceCtrlClient {
	return &serviceInstanceCtrlClient{cc}
}

func (c *serviceInstanceCtrlClient) Register(ctx context.Context, in *RegisterInstanceRequest, opts ...grpc.CallOption) (*RegisterInstanceResponse, error) {
	out := new(RegisterInstanceResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceInstanceCtrl/register", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *serviceInstanceCtrlClient) Unregister(ctx context.Context, in *UnregisterInstanceRequest, opts ...grpc.CallOption) (*UnregisterInstanceResponse, error) {
	out := new(UnregisterInstanceResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceInstanceCtrl/unregister", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *serviceInstanceCtrlClient) Heartbeat(ctx context.Context, in *HeartbeatRequest, opts ...grpc.CallOption) (*HeartbeatResponse, error) {
	out := new(HeartbeatResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceInstanceCtrl/heartbeat", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *serviceInstanceCtrlClient) Find(ctx context.Context, in *FindInstancesRequest, opts ...grpc.CallOption) (*FindInstancesResponse, error) {
	out := new(FindInstancesResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceInstanceCtrl/find", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *serviceInstanceCtrlClient) GetInstances(ctx context.Context, in *GetInstancesRequest, opts ...grpc.CallOption) (*GetInstancesResponse, error) {
	out := new(GetInstancesResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceInstanceCtrl/getInstances", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *serviceInstanceCtrlClient) GetOneInstance(ctx context.Context, in *GetOneInstanceRequest, opts ...grpc.CallOption) (*GetOneInstanceResponse, error) {
	out := new(GetOneInstanceResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceInstanceCtrl/getOneInstance", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *serviceInstanceCtrlClient) UpdateStatus(ctx context.Context, in *UpdateInstanceStatusRequest, opts ...grpc.CallOption) (*UpdateInstanceStatusResponse, error) {
	out := new(UpdateInstanceStatusResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceInstanceCtrl/updateStatus", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *serviceInstanceCtrlClient) UpdateInstanceProperties(ctx context.Context, in *UpdateInstancePropsRequest, opts ...grpc.CallOption) (*UpdateInstancePropsResponse, error) {
	out := new(UpdateInstancePropsResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceInstanceCtrl/updateInstanceProperties", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *serviceInstanceCtrlClient) Watch(ctx context.Context, in *WatchInstanceRequest, opts ...grpc.CallOption) (ServiceInstanceCtrl_WatchClient, error) {
	stream, err := grpc.NewClientStream(ctx, &_ServiceInstanceCtrl_serviceDesc.Streams[0], c.cc, "/com.huawei.paas.cse.serviceregistry.api.ServiceInstanceCtrl/watch", opts...)
	if err != nil {
		return nil, err
	}
	x := &serviceInstanceCtrlWatchClient{stream}
	if err := x.ClientStream.SendMsg(in); err != nil {
		return nil, err
	}
	if err := x.ClientStream.CloseSend(); err != nil {
		return nil, err
	}
	return x, nil
}

type ServiceInstanceCtrl_WatchClient interface {
	Recv() (*WatchInstanceResponse, error)
	grpc.ClientStream
}

type serviceInstanceCtrlWatchClient struct {
	grpc.ClientStream
}

func (x *serviceInstanceCtrlWatchClient) Recv() (*WatchInstanceResponse, error) {
	m := new(WatchInstanceResponse)
	if err := x.ClientStream.RecvMsg(m); err != nil {
		return nil, err
	}
	return m, nil
}

func (c *serviceInstanceCtrlClient) HeartbeatSet(ctx context.Context, in *HeartbeatSetRequest, opts ...grpc.CallOption) (*HeartbeatSetResponse, error) {
	out := new(HeartbeatSetResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.ServiceInstanceCtrl/heartbeatSet", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// Server API for ServiceInstanceCtrl service

type ServiceInstanceCtrlServer interface {
	Register(context.Context, *RegisterInstanceRequest) (*RegisterInstanceResponse, error)
	Unregister(context.Context, *UnregisterInstanceRequest) (*UnregisterInstanceResponse, error)
	Heartbeat(context.Context, *HeartbeatRequest) (*HeartbeatResponse, error)
	Find(context.Context, *FindInstancesRequest) (*FindInstancesResponse, error)
	GetInstances(context.Context, *GetInstancesRequest) (*GetInstancesResponse, error)
	GetOneInstance(context.Context, *GetOneInstanceRequest) (*GetOneInstanceResponse, error)
	UpdateStatus(context.Context, *UpdateInstanceStatusRequest) (*UpdateInstanceStatusResponse, error)
	UpdateInstanceProperties(context.Context, *UpdateInstancePropsRequest) (*UpdateInstancePropsResponse, error)
	Watch(*WatchInstanceRequest, ServiceInstanceCtrl_WatchServer) error
	HeartbeatSet(context.Context, *HeartbeatSetRequest) (*HeartbeatSetResponse, error)
}

func RegisterServiceInstanceCtrlServer(s *grpc.Server, srv ServiceInstanceCtrlServer) {
	s.RegisterService(&_ServiceInstanceCtrl_serviceDesc, srv)
}

func _ServiceInstanceCtrl_Register_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(RegisterInstanceRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceInstanceCtrlServer).Register(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceInstanceCtrl/Register",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceInstanceCtrlServer).Register(ctx, req.(*RegisterInstanceRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ServiceInstanceCtrl_Unregister_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UnregisterInstanceRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceInstanceCtrlServer).Unregister(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceInstanceCtrl/Unregister",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceInstanceCtrlServer).Unregister(ctx, req.(*UnregisterInstanceRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ServiceInstanceCtrl_Heartbeat_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(HeartbeatRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceInstanceCtrlServer).Heartbeat(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceInstanceCtrl/Heartbeat",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceInstanceCtrlServer).Heartbeat(ctx, req.(*HeartbeatRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ServiceInstanceCtrl_Find_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(FindInstancesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceInstanceCtrlServer).Find(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceInstanceCtrl/Find",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceInstanceCtrlServer).Find(ctx, req.(*FindInstancesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ServiceInstanceCtrl_GetInstances_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetInstancesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceInstanceCtrlServer).GetInstances(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceInstanceCtrl/GetInstances",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceInstanceCtrlServer).GetInstances(ctx, req.(*GetInstancesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ServiceInstanceCtrl_GetOneInstance_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetOneInstanceRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceInstanceCtrlServer).GetOneInstance(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceInstanceCtrl/GetOneInstance",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceInstanceCtrlServer).GetOneInstance(ctx, req.(*GetOneInstanceRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ServiceInstanceCtrl_UpdateStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UpdateInstanceStatusRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceInstanceCtrlServer).UpdateStatus(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceInstanceCtrl/UpdateStatus",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceInstanceCtrlServer).UpdateStatus(ctx, req.(*UpdateInstanceStatusRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ServiceInstanceCtrl_UpdateInstanceProperties_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UpdateInstancePropsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceInstanceCtrlServer).UpdateInstanceProperties(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceInstanceCtrl/UpdateInstanceProperties",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceInstanceCtrlServer).UpdateInstanceProperties(ctx, req.(*UpdateInstancePropsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ServiceInstanceCtrl_Watch_Handler(srv interface{}, stream grpc.ServerStream) error {
	m := new(WatchInstanceRequest)
	if err := stream.RecvMsg(m); err != nil {
		return err
	}
	return srv.(ServiceInstanceCtrlServer).Watch(m, &serviceInstanceCtrlWatchServer{stream})
}

type ServiceInstanceCtrl_WatchServer interface {
	Send(*WatchInstanceResponse) error
	grpc.ServerStream
}

type serviceInstanceCtrlWatchServer struct {
	grpc.ServerStream
}

func (x *serviceInstanceCtrlWatchServer) Send(m *WatchInstanceResponse) error {
	return x.ServerStream.SendMsg(m)
}

func _ServiceInstanceCtrl_HeartbeatSet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(HeartbeatSetRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ServiceInstanceCtrlServer).HeartbeatSet(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.ServiceInstanceCtrl/HeartbeatSet",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ServiceInstanceCtrlServer).HeartbeatSet(ctx, req.(*HeartbeatSetRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _ServiceInstanceCtrl_serviceDesc = grpc.ServiceDesc{
	ServiceName: "com.huawei.paas.cse.serviceregistry.api.ServiceInstanceCtrl",
	HandlerType: (*ServiceInstanceCtrlServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "register",
			Handler:    _ServiceInstanceCtrl_Register_Handler,
		},
		{
			MethodName: "unregister",
			Handler:    _ServiceInstanceCtrl_Unregister_Handler,
		},
		{
			MethodName: "heartbeat",
			Handler:    _ServiceInstanceCtrl_Heartbeat_Handler,
		},
		{
			MethodName: "find",
			Handler:    _ServiceInstanceCtrl_Find_Handler,
		},
		{
			MethodName: "getInstances",
			Handler:    _ServiceInstanceCtrl_GetInstances_Handler,
		},
		{
			MethodName: "getOneInstance",
			Handler:    _ServiceInstanceCtrl_GetOneInstance_Handler,
		},
		{
			MethodName: "updateStatus",
			Handler:    _ServiceInstanceCtrl_UpdateStatus_Handler,
		},
		{
			MethodName: "updateInstanceProperties",
			Handler:    _ServiceInstanceCtrl_UpdateInstanceProperties_Handler,
		},
		{
			MethodName: "heartbeatSet",
			Handler:    _ServiceInstanceCtrl_HeartbeatSet_Handler,
		},
	},
	Streams: []grpc.StreamDesc{
		{
			StreamName:    "watch",
			Handler:       _ServiceInstanceCtrl_Watch_Handler,
			ServerStreams: true,
		},
	},
	Metadata: "services.proto",
}

// Client API for GovernServiceCtrl service

type GovernServiceCtrlClient interface {
	GetServiceDetail(ctx context.Context, in *GetServiceRequest, opts ...grpc.CallOption) (*GetServiceDetailResponse, error)
	GetServicesInfo(ctx context.Context, in *GetServicesInfoRequest, opts ...grpc.CallOption) (*GetServicesInfoResponse, error)
}

type governServiceCtrlClient struct {
	cc *grpc.ClientConn
}

func NewGovernServiceCtrlClient(cc *grpc.ClientConn) GovernServiceCtrlClient {
	return &governServiceCtrlClient{cc}
}

func (c *governServiceCtrlClient) GetServiceDetail(ctx context.Context, in *GetServiceRequest, opts ...grpc.CallOption) (*GetServiceDetailResponse, error) {
	out := new(GetServiceDetailResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.GovernServiceCtrl/getServiceDetail", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *governServiceCtrlClient) GetServicesInfo(ctx context.Context, in *GetServicesInfoRequest, opts ...grpc.CallOption) (*GetServicesInfoResponse, error) {
	out := new(GetServicesInfoResponse)
	err := grpc.Invoke(ctx, "/com.huawei.paas.cse.serviceregistry.api.GovernServiceCtrl/getServicesInfo", in, out, c.cc, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// Server API for GovernServiceCtrl service

type GovernServiceCtrlServer interface {
	GetServiceDetail(context.Context, *GetServiceRequest) (*GetServiceDetailResponse, error)
	GetServicesInfo(context.Context, *GetServicesInfoRequest) (*GetServicesInfoResponse, error)
}

func RegisterGovernServiceCtrlServer(s *grpc.Server, srv GovernServiceCtrlServer) {
	s.RegisterService(&_GovernServiceCtrl_serviceDesc, srv)
}

func _GovernServiceCtrl_GetServiceDetail_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetServiceRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(GovernServiceCtrlServer).GetServiceDetail(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.GovernServiceCtrl/GetServiceDetail",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(GovernServiceCtrlServer).GetServiceDetail(ctx, req.(*GetServiceRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _GovernServiceCtrl_GetServicesInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetServicesInfoRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(GovernServiceCtrlServer).GetServicesInfo(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/com.huawei.paas.cse.serviceregistry.api.GovernServiceCtrl/GetServicesInfo",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(GovernServiceCtrlServer).GetServicesInfo(ctx, req.(*GetServicesInfoRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _GovernServiceCtrl_serviceDesc = grpc.ServiceDesc{
	ServiceName: "com.huawei.paas.cse.serviceregistry.api.GovernServiceCtrl",
	HandlerType: (*GovernServiceCtrlServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "getServiceDetail",
			Handler:    _GovernServiceCtrl_GetServiceDetail_Handler,
		},
		{
			MethodName: "getServicesInfo",
			Handler:    _GovernServiceCtrl_GetServicesInfo_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "services.proto",
}

func init() { proto1.RegisterFile("services.proto", fileDescriptor0) }

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