From 20b531e4a21e96936da6e01fc419271618d98084 Mon Sep 17 00:00:00 2001 From: Jermaine Hua Date: Tue, 17 Dec 2024 11:44:42 +0800 Subject: [PATCH 1/2] feat: Support SubscribeTopicEvents API (#1088) --- demo/pubsub/README.md | 3 +- .../{ => appcallback}/subscribe_server.go | 0 pkg/grpc/default_api/api.go | 2 + pkg/grpc/default_api/api_pubsub.go | 94 +- pkg/grpc/default_api/api_subscribe.go | 260 ++ pkg/grpc/default_api/api_subscribe_test.go | 132 + pkg/mock/runtime/runtime.pb.go | 305 +++ spec/proto/runtime/v1/runtime.pb.go | 2392 ++++++++++------- spec/proto/runtime/v1/runtime.proto | 65 + spec/proto/runtime/v1/runtime_grpc.pb.go | 76 +- 10 files changed, 2345 insertions(+), 984 deletions(-) rename demo/pubsub/server/{ => appcallback}/subscribe_server.go (100%) create mode 100644 pkg/grpc/default_api/api_subscribe.go create mode 100644 pkg/grpc/default_api/api_subscribe_test.go diff --git a/demo/pubsub/README.md b/demo/pubsub/README.md index 1a45e305bb..54adb532dd 100644 --- a/demo/pubsub/README.md +++ b/demo/pubsub/README.md @@ -2,7 +2,8 @@ You can run server/client demo with different component names. It is worth noting that both server and client demo should set the same store name by param `-s`. For example: ```shell -cd ${project_path}/demo/pubsub/server/ +#################### Run pubsub demo with appcallback #################### +cd ${project_path}/demo/pubsub/appcallback/ # 1. start subscriber go build -o subscriber /.subscriber -s pub_subs_demo diff --git a/demo/pubsub/server/subscribe_server.go b/demo/pubsub/server/appcallback/subscribe_server.go similarity index 100% rename from demo/pubsub/server/subscribe_server.go rename to demo/pubsub/server/appcallback/subscribe_server.go diff --git a/pkg/grpc/default_api/api.go b/pkg/grpc/default_api/api.go index fa4903b98f..9e1d26632d 100644 --- a/pkg/grpc/default_api/api.go +++ b/pkg/grpc/default_api/api.go @@ -86,6 +86,7 @@ type api struct { // app callback AppCallbackConn *grpc.ClientConn topicPerComponent map[string]TopicSubscriptions + streamer *streamer // json json jsoniter.API } @@ -148,6 +149,7 @@ func NewAPI( secretStores: secretStores, json: jsoniter.ConfigFastest, } + } func (a *api) SayHello(ctx context.Context, in *runtimev1pb.SayHelloRequest) (*runtimev1pb.SayHelloResponse, error) { diff --git a/pkg/grpc/default_api/api_pubsub.go b/pkg/grpc/default_api/api_pubsub.go index 0b4cb82229..43c78216e6 100644 --- a/pkg/grpc/default_api/api_pubsub.go +++ b/pkg/grpc/default_api/api_pubsub.go @@ -151,56 +151,23 @@ func (a *api) getInterestedTopics() (map[string]TopicSubscriptions, error) { } func (a *api) publishMessageGRPC(ctx context.Context, msg *pubsub.NewMessage) error { - // 1. Unmarshal to cloudEvent model - var cloudEvent map[string]interface{} - err := a.json.Unmarshal(msg.Data, &cloudEvent) + + // TODO tracing + envelope, cloudEvent, err := a.envelopeFromSubscriptionMessage(ctx, msg) + if err != nil { - log.DefaultLogger.Debugf("[runtime]error deserializing cloud events proto: %s", err) return err } - // 2. Drop msg if the current cloud event has expired - if pubsub.HasExpired(cloudEvent) { - log.DefaultLogger.Warnf("[runtime]dropping expired pub/sub event %v as of %v", cloudEvent[pubsub.IDField].(string), cloudEvent[pubsub.ExpirationField].(string)) + if envelope == nil { return nil } - // 3. Convert to proto domain struct - envelope := &runtimev1pb.TopicEventRequest{ - Id: cloudEvent[pubsub.IDField].(string), - Source: cloudEvent[pubsub.SourceField].(string), - DataContentType: cloudEvent[pubsub.DataContentTypeField].(string), - Type: cloudEvent[pubsub.TypeField].(string), - SpecVersion: cloudEvent[pubsub.SpecVersionField].(string), - Topic: msg.Topic, - PubsubName: msg.Metadata[Metadata_key_pubsubName], - } - - // set data field - if data, ok := cloudEvent[pubsub.DataBase64Field]; ok && data != nil { - decoded, decodeErr := base64.StdEncoding.DecodeString(data.(string)) - if decodeErr != nil { - log.DefaultLogger.Debugf("unable to base64 decode cloudEvent field data_base64: %s", decodeErr) - return err - } - - envelope.Data = decoded - } else if data, ok := cloudEvent[pubsub.DataField]; ok && data != nil { - envelope.Data = nil - - if contenttype.IsStringContentType(envelope.DataContentType) { - envelope.Data = []byte(data.(string)) - } else if contenttype.IsJSONContentType(envelope.DataContentType) { - envelope.Data, _ = a.json.Marshal(data) - } - } - // TODO tracing - - // 4. Call appcallback + // Call appcallback clientV1 := runtimev1pb.NewAppCallbackClient(a.AppCallbackConn) res, err := clientV1.OnTopicEvent(ctx, envelope) - // 5. Check result + // Check result return retryStrategy(err, res, cloudEvent) } @@ -246,3 +213,50 @@ func listTopicSubscriptions(client runtimev1pb.AppCallbackClient, log log.ErrorL } return make([]*runtimev1pb.TopicSubscription, 0) } + +func (a *api) envelopeFromSubscriptionMessage(ctx context.Context, msg *pubsub.NewMessage) (*runtimev1pb.TopicEventRequest, map[string]interface{}, error) { + // 1. Unmarshal to cloudEvent model + var cloudEvent map[string]interface{} + err := a.json.Unmarshal(msg.Data, &cloudEvent) + if err != nil { + log.DefaultLogger.Debugf("[runtime]error deserializing cloud events proto: %s", err) + return nil, cloudEvent, err + } + + // 2. Drop msg if the current cloud event has expired + if pubsub.HasExpired(cloudEvent) { + log.DefaultLogger.Warnf("[runtime]dropping expired pub/sub event %v as of %v", cloudEvent[pubsub.IDField].(string), cloudEvent[pubsub.ExpirationField].(string)) + return nil, cloudEvent, nil + } + + // 3. Convert to proto domain struct + envelope := &runtimev1pb.TopicEventRequest{ + Id: cloudEvent[pubsub.IDField].(string), + Source: cloudEvent[pubsub.SourceField].(string), + DataContentType: cloudEvent[pubsub.DataContentTypeField].(string), + Type: cloudEvent[pubsub.TypeField].(string), + SpecVersion: cloudEvent[pubsub.SpecVersionField].(string), + Topic: msg.Topic, + PubsubName: msg.Metadata[Metadata_key_pubsubName], + } + + // set data field + if data, ok := cloudEvent[pubsub.DataBase64Field]; ok && data != nil { + decoded, decodeErr := base64.StdEncoding.DecodeString(data.(string)) + if decodeErr != nil { + log.DefaultLogger.Debugf("unable to base64 decode cloudEvent field data_base64: %s", decodeErr) + return nil, cloudEvent, err + } + + envelope.Data = decoded + } else if data, ok := cloudEvent[pubsub.DataField]; ok && data != nil { + envelope.Data = nil + + if contenttype.IsStringContentType(envelope.DataContentType) { + envelope.Data = []byte(data.(string)) + } else if contenttype.IsJSONContentType(envelope.DataContentType) { + envelope.Data, _ = a.json.Marshal(data) + } + } + return envelope, cloudEvent, nil +} diff --git a/pkg/grpc/default_api/api_subscribe.go b/pkg/grpc/default_api/api_subscribe.go new file mode 100644 index 0000000000..19c85f4f94 --- /dev/null +++ b/pkg/grpc/default_api/api_subscribe.go @@ -0,0 +1,260 @@ +/* + * Copyright 2021 Layotto Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package default_api + +import ( + "context" + "errors" + "fmt" + "io" + "sync" + + "github.com/dapr/components-contrib/pubsub" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "mosn.io/pkg/log" + + runtimev1pb "mosn.io/layotto/spec/proto/runtime/v1" +) + +type streamer struct { + subscribers map[string]*conn + lock sync.RWMutex +} + +type conn struct { + lock sync.RWMutex + streamLock sync.Mutex + stream runtimev1pb.Runtime_SubscribeTopicEventsServer + publishResponses map[string]chan *runtimev1pb.SubscribeTopicEventsRequestProcessed +} + +// SubscribeTopicEvents is called by the layotto runtime to ad hoc stream +// subscribe to topics. If gRPC API server closes, returns func early with nil +// to close stream. +func (a *api) SubscribeTopicEvents(stream runtimev1pb.Runtime_SubscribeTopicEventsServer) error { + errCh := make(chan error, 2) + subDone := make(chan struct{}) + + go func() { + <-subDone + }() + + go func() { + errCh <- a.streamSubscribe(stream, subDone) + }() + + return <-errCh +} + +func (a *api) streamSubscribe(stream runtimev1pb.Runtime_SubscribeTopicEventsServer, subDone chan struct{}) error { + defer close(subDone) + + subscribeTopicEventsRequest, err := stream.Recv() + if err != nil { + return err + } + + initialRequest := subscribeTopicEventsRequest.GetInitialRequest() + + if initialRequest == nil { + return errors.New("initial request is required") + } + + if len(initialRequest.GetPubsubName()) == 0 { + return errors.New("pubsubName is required") + } + + if len(initialRequest.GetTopic()) == 0 { + return errors.New("topic is required") + } + + if a.topicPerComponent == nil { + a.topicPerComponent = make(map[string]TopicSubscriptions) + } + + if a.streamer == nil { + a.streamer = &streamer{ + subscribers: make(map[string]*conn), + } + } + + if _, ok := a.topicPerComponent[initialRequest.PubsubName]; !ok { + a.topicPerComponent[initialRequest.PubsubName] = TopicSubscriptions{topic2Details: make(map[string]Details)} + } + + a.topicPerComponent[initialRequest.PubsubName].topic2Details[initialRequest.Topic] = Details{ + metadata: initialRequest.Metadata, + } + + if len(a.topicPerComponent) > 0 { + for pubsubName, v := range a.topicPerComponent { + topics := []string{} + for topic := range v.topic2Details { + topics = append(topics, topic) + } + log.DefaultLogger.Infof("[runtime][streamSubscribe]app is subscribed to the following topics: %v through pubsub=%s", topics, pubsubName) + } + } + + if a.pubSubs[initialRequest.PubsubName] == nil { + return errors.New("pubsub " + initialRequest.PubsubName + " is not initialized.") + } + + if err = stream.Send(&runtimev1pb.SubscribeTopicEventsResponse{ + SubscribeTopicEventsResponseType: &runtimev1pb.SubscribeTopicEventsResponse_InitialResponse{ + InitialResponse: new(runtimev1pb.SubscribeTopicEventsResponseInitial), + }, + }); err != nil { + return err + } + + if err = a.pubSubs[initialRequest.PubsubName].Subscribe(pubsub.SubscribeRequest{ + Topic: initialRequest.Topic, + Metadata: a.topicPerComponent[initialRequest.PubsubName].topic2Details[initialRequest.Topic].metadata, + }, func(ctx context.Context, msg *pubsub.NewMessage) error { + if msg.Metadata == nil { + msg.Metadata = make(map[string]string, 1) + } + msg.Metadata[Metadata_key_pubsubName] = initialRequest.PubsubName + return a.publishMessageForStream(ctx, msg, initialRequest.PubsubName) + }); err != nil { + log.DefaultLogger.Warnf("[runtime][beginPubSub]failed to subscribe to topic %s: %s", initialRequest.Topic, err) + return err + } + + return a.streamer.Subscribe(stream, initialRequest) +} + +func (s *streamer) Subscribe(stream runtimev1pb.Runtime_SubscribeTopicEventsServer, req *runtimev1pb.SubscribeTopicEventsRequestInitial) error { + s.lock.Lock() + key := s.StreamerKey(req.GetPubsubName(), req.GetTopic()) + if _, ok := s.subscribers[key]; ok { + s.lock.Unlock() + return fmt.Errorf("already subscribed to pubsub %q topic %q", req.GetPubsubName(), req.GetTopic()) + } + + conn := &conn{ + stream: stream, + publishResponses: make(map[string]chan *runtimev1pb.SubscribeTopicEventsRequestProcessed), + } + s.subscribers[key] = conn + + log.DefaultLogger.Infof("Subscribing to pubsub '%s' topic '%s'", req.GetPubsubName(), req.GetTopic()) + s.lock.Unlock() + + defer func() { + s.lock.Lock() + delete(s.subscribers, key) + s.lock.Unlock() + }() + + for { + resp, err := stream.Recv() + + s, ok := status.FromError(err) + + if (ok && s.Code() == codes.Canceled) || + errors.Is(err, context.Canceled) || + errors.Is(err, io.EOF) { + log.DefaultLogger.Infof("Unsubscribed from pubsub '%s' topic '%s'", req.GetPubsubName(), req.GetTopic()) + return err + } + + if err != nil { + log.DefaultLogger.Errorf("error receiving message from client stream: %s", err) + return err + } + + eventResp := resp.GetEventProcessed() + if eventResp == nil { + return errors.New("duplicate initial request received") + } + go func() { + conn.notifyPublishResponse(stream.Context(), eventResp) + }() + } +} + +func (a *api) publishMessageForStream(ctx context.Context, msg *pubsub.NewMessage, pubsubName string) error { + a.streamer.lock.RLock() + key := a.streamer.StreamerKey(pubsubName, msg.Topic) + conn, ok := a.streamer.subscribers[key] + a.streamer.lock.RUnlock() + if !ok { + return fmt.Errorf("no streamer subscribed to pubsub %q topic %q", pubsubName, msg.Topic) + } + + envelope, cloudEvent, _ := a.envelopeFromSubscriptionMessage(ctx, msg) + + ch, defFn := conn.registerPublishResponse(envelope.GetId()) + defer defFn() + + conn.streamLock.Lock() + err := conn.stream.Send(&runtimev1pb.SubscribeTopicEventsResponse{ + SubscribeTopicEventsResponseType: &runtimev1pb.SubscribeTopicEventsResponse_EventMessage{ + EventMessage: envelope, + }, + }) + if err != nil { + log.DefaultLogger.Errorf("error sending message to client stream: %s", err) + return err + } + conn.streamLock.Unlock() + + var resp *runtimev1pb.SubscribeTopicEventsRequestProcessed + select { + case <-ctx.Done(): + return ctx.Err() + case resp = <-ch: + } + + // 5. Check result + return retryStrategy(err, resp.Status, cloudEvent) +} + +func (c *conn) notifyPublishResponse(ctx context.Context, resp *runtimev1pb.SubscribeTopicEventsRequestProcessed) { + c.lock.RLock() + ch, ok := c.publishResponses[resp.GetId()] + c.lock.RUnlock() + + if !ok { + log.DefaultLogger.Errorf("no client stream expecting publish response for id %q", resp.GetId()) + return + } + + select { + case <-ctx.Done(): + case ch <- resp: + } +} + +func (c *conn) registerPublishResponse(id string) (chan *runtimev1pb.SubscribeTopicEventsRequestProcessed, func()) { + ch := make(chan *runtimev1pb.SubscribeTopicEventsRequestProcessed) + c.lock.Lock() + c.publishResponses[id] = ch + c.lock.Unlock() + return ch, func() { + c.lock.Lock() + delete(c.publishResponses, id) + c.lock.Unlock() + } +} + +func (s *streamer) StreamerKey(pubsub, topic string) string { + return "___" + pubsub + "||" + topic +} diff --git a/pkg/grpc/default_api/api_subscribe_test.go b/pkg/grpc/default_api/api_subscribe_test.go new file mode 100644 index 0000000000..48188dacd3 --- /dev/null +++ b/pkg/grpc/default_api/api_subscribe_test.go @@ -0,0 +1,132 @@ +/* + * Copyright 2021 Layotto Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package default_api + +import ( + "context" + "encoding/json" + "testing" + "time" + + "github.com/dapr/components-contrib/pubsub" + "github.com/golang/mock/gomock" + jsoniter "github.com/json-iterator/go" + "github.com/stretchr/testify/assert" + + mock "mosn.io/layotto/pkg/mock/components/pubsub" + "mosn.io/layotto/pkg/mock/runtime" + runtimev1pb "mosn.io/layotto/spec/proto/runtime/v1" +) + +func TestSubscribeTopicEvents(t *testing.T) { + t.Run("SubscribeTopicEvents duplicate initial request", func(t *testing.T) { + pubsubName := "test" + topic := "layotto" + ctrl := gomock.NewController(t) + stream := runtime.NewMockRuntime_SubscribeTopicEventsServer(ctrl) + stream.EXPECT().Send(gomock.Any()).Return(nil).Times(1) + stream.EXPECT().Context().Return(context.Background()).AnyTimes() + stream.EXPECT().Recv().Return(&runtimev1pb.SubscribeTopicEventsRequest{ + SubscribeTopicEventsRequestType: &runtimev1pb.SubscribeTopicEventsRequest_InitialRequest{ + InitialRequest: &runtimev1pb.SubscribeTopicEventsRequestInitial{ + PubsubName: pubsubName, Topic: topic, + Metadata: make(map[string]string), + }, + }}, nil).AnyTimes() + + a := NewAPI("", nil, nil, nil, make(map[string]pubsub.PubSub), nil, nil, nil, nil, nil, nil) + + var apiForTest = a.(*api) + + m := mock.NewMockPubSub(ctrl) + m.EXPECT().Subscribe(gomock.Any(), gomock.Any()).Return(nil).Times(1) + apiForTest.pubSubs["test"] = m + + apiForTest.streamer = &streamer{ + subscribers: make(map[string]*conn), + } + + apiForTest.json = jsoniter.ConfigFastest + + err := apiForTest.SubscribeTopicEvents(stream) + assert.Error(t, err, "Expected error") + }) +} + +func TestPublishMessageForStream(t *testing.T) { + t.Run("publish success", func(t *testing.T) { + pubsubName := "test" + topic := "layotto" + ctrl := gomock.NewController(t) + stream := runtime.NewMockRuntime_SubscribeTopicEventsServer(ctrl) + stream.EXPECT().Send(gomock.Any()).Return(nil).Times(1) + stream.EXPECT().Recv().Return(&runtimev1pb.SubscribeTopicEventsRequest{ + SubscribeTopicEventsRequestType: &runtimev1pb.SubscribeTopicEventsRequest_InitialRequest{ + InitialRequest: &runtimev1pb.SubscribeTopicEventsRequestInitial{ + PubsubName: pubsubName, Topic: topic, + Metadata: make(map[string]string), + }, + }}, nil).Times(1) + + cloudEvent := map[string]interface{}{ + pubsub.IDField: "1", + pubsub.SourceField: "source", + pubsub.DataContentTypeField: "content-type", + pubsub.TypeField: "type", + pubsub.SpecVersionField: "v1.0.0", + pubsub.DataBase64Field: "bGF5b3R0bw==", + } + + data, err := json.Marshal(cloudEvent) + assert.Nil(t, err) + + msg := &pubsub.NewMessage{ + Data: data, + Topic: topic, + Metadata: make(map[string]string), + } + a := NewAPI("", nil, nil, nil, make(map[string]pubsub.PubSub), nil, nil, nil, nil, nil, nil) + + var apiForTest = a.(*api) + + apiForTest.streamer = &streamer{ + subscribers: make(map[string]*conn), + } + + apiForTest.streamer.subscribers["___test||layotto"] = &conn{ + stream: stream, + publishResponses: make(map[string]chan *runtimev1pb.SubscribeTopicEventsRequestProcessed), + } + + _ = apiForTest.SubscribeTopicEvents(stream) + apiForTest.json = jsoniter.ConfigFastest + + go func() { + time.Sleep(1 * time.Second) + ch := apiForTest.streamer.subscribers["___test||layotto"].publishResponses["1"] + ch <- &runtimev1pb.SubscribeTopicEventsRequestProcessed{ + Id: "1", + Status: &runtimev1pb.TopicEventResponse{ + Status: runtimev1pb.TopicEventResponse_SUCCESS, + }, + } + }() + + err = apiForTest.publishMessageForStream(context.Background(), msg, pubsubName) + assert.Nil(t, err) + }) +} diff --git a/pkg/mock/runtime/runtime.pb.go b/pkg/mock/runtime/runtime.pb.go index d51dadfdb7..3f46477b5b 100644 --- a/pkg/mock/runtime/runtime.pb.go +++ b/pkg/mock/runtime/runtime.pb.go @@ -1612,3 +1612,308 @@ func (mr *MockRuntime_PutFileServerMockRecorder) SetTrailer(arg0 interface{}) *g mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTrailer", reflect.TypeOf((*MockRuntime_PutFileServer)(nil).SetTrailer), arg0) } + +// SubscribeTopicEvents mocks base method. +func (m *MockRuntimeClient) SubscribeTopicEvents(ctx context.Context, opts ...grpc.CallOption) (runtime.Runtime_SubscribeTopicEventsClient, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "SubscribeTopicEvents", varargs...) + ret0, _ := ret[0].(runtime.Runtime_SubscribeTopicEventsClient) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SubscribeTopicEvents indicates an expected call of SubscribeTopicEvents. +func (mr *MockRuntimeClientMockRecorder) SubscribeTopicEvents(ctx interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SubscribeTopicEvents", reflect.TypeOf((*MockRuntimeClient)(nil).SubscribeTopicEvents), varargs...) +} + +// MockRuntime_SubscribeTopicEventsClient is a mock of Runtime_SubscribeTopicEventsClient interface. +type MockRuntime_SubscribeTopicEventsClient struct { + ctrl *gomock.Controller + recorder *MockRuntime_SubscribeTopicEventsClientMockRecorder +} + +// MockRuntime_SubscribeTopicEventsClientMockRecorder is the mock recorder for MockRuntime_SubscribeTopicEventsClient. +type MockRuntime_SubscribeTopicEventsClientMockRecorder struct { + mock *MockRuntime_SubscribeTopicEventsClient +} + +// NewMockRuntime_SubscribeTopicEventsClient creates a new mock instance. +func NewMockRuntime_SubscribeTopicEventsClient(ctrl *gomock.Controller) *MockRuntime_SubscribeTopicEventsClient { + mock := &MockRuntime_SubscribeTopicEventsClient{ctrl: ctrl} + mock.recorder = &MockRuntime_SubscribeTopicEventsClientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockRuntime_SubscribeTopicEventsClient) EXPECT() *MockRuntime_SubscribeTopicEventsClientMockRecorder { + return m.recorder +} + +// CloseSend mocks base method. +func (m *MockRuntime_SubscribeTopicEventsClient) CloseSend() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CloseSend") + ret0, _ := ret[0].(error) + return ret0 +} + +// CloseSend indicates an expected call of CloseSend. +func (mr *MockRuntime_SubscribeTopicEventsClientMockRecorder) CloseSend() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CloseSend", reflect.TypeOf((*MockRuntime_SubscribeTopicEventsClient)(nil).CloseSend)) +} + +// Context mocks base method. +func (m *MockRuntime_SubscribeTopicEventsClient) Context() context.Context { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Context") + ret0, _ := ret[0].(context.Context) + return ret0 +} + +// Context indicates an expected call of Context. +func (mr *MockRuntime_SubscribeTopicEventsClientMockRecorder) Context() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Context", reflect.TypeOf((*MockRuntime_SubscribeTopicEventsClient)(nil).Context)) +} + +// Header mocks base method. +func (m *MockRuntime_SubscribeTopicEventsClient) Header() (metadata.MD, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Header") + ret0, _ := ret[0].(metadata.MD) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Header indicates an expected call of Header. +func (mr *MockRuntime_SubscribeTopicEventsClientMockRecorder) Header() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Header", reflect.TypeOf((*MockRuntime_SubscribeTopicEventsClient)(nil).Header)) +} + +// Recv mocks base method. +func (m *MockRuntime_SubscribeTopicEventsClient) Recv() (*runtime.SubscribeTopicEventsResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Recv") + ret0, _ := ret[0].(*runtime.SubscribeTopicEventsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Recv indicates an expected call of Recv. +func (mr *MockRuntime_SubscribeTopicEventsClientMockRecorder) Recv() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Recv", reflect.TypeOf((*MockRuntime_SubscribeTopicEventsClient)(nil).Recv)) +} + +// RecvMsg mocks base method. +func (m_2 *MockRuntime_SubscribeTopicEventsClient) RecvMsg(m interface{}) error { + m_2.ctrl.T.Helper() + ret := m_2.ctrl.Call(m_2, "RecvMsg", m) + ret0, _ := ret[0].(error) + return ret0 +} + +// RecvMsg indicates an expected call of RecvMsg. +func (mr *MockRuntime_SubscribeTopicEventsClientMockRecorder) RecvMsg(m interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RecvMsg", reflect.TypeOf((*MockRuntime_SubscribeTopicEventsClient)(nil).RecvMsg), m) +} + +// Send mocks base method. +func (m *MockRuntime_SubscribeTopicEventsClient) Send(arg0 *runtime.SubscribeTopicEventsRequest) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Send", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Send indicates an expected call of Send. +func (mr *MockRuntime_SubscribeTopicEventsClientMockRecorder) Send(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Send", reflect.TypeOf((*MockRuntime_SubscribeTopicEventsClient)(nil).Send), arg0) +} + +// SendMsg mocks base method. +func (m_2 *MockRuntime_SubscribeTopicEventsClient) SendMsg(m interface{}) error { + m_2.ctrl.T.Helper() + ret := m_2.ctrl.Call(m_2, "SendMsg", m) + ret0, _ := ret[0].(error) + return ret0 +} + +// SendMsg indicates an expected call of SendMsg. +func (mr *MockRuntime_SubscribeTopicEventsClientMockRecorder) SendMsg(m interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendMsg", reflect.TypeOf((*MockRuntime_SubscribeTopicEventsClient)(nil).SendMsg), m) +} + +// Trailer mocks base method. +func (m *MockRuntime_SubscribeTopicEventsClient) Trailer() metadata.MD { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Trailer") + ret0, _ := ret[0].(metadata.MD) + return ret0 +} + +// Trailer indicates an expected call of Trailer. +func (mr *MockRuntime_SubscribeTopicEventsClientMockRecorder) Trailer() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Trailer", reflect.TypeOf((*MockRuntime_SubscribeTopicEventsClient)(nil).Trailer)) +} + +// SubscribeTopicEvents mocks base method. +func (m *MockRuntimeServer) SubscribeTopicEvents(arg0 runtime.Runtime_SubscribeTopicEventsServer) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SubscribeTopicEvents", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// SubscribeTopicEvents indicates an expected call of SubscribeTopicEvents. +func (mr *MockRuntimeServerMockRecorder) SubscribeTopicEvents(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SubscribeTopicEvents", reflect.TypeOf((*MockRuntimeServer)(nil).SubscribeTopicEvents), arg0) +} + +// MockRuntime_SubscribeTopicEventsServer is a mock of Runtime_SubscribeTopicEventsServer interface. +type MockRuntime_SubscribeTopicEventsServer struct { + ctrl *gomock.Controller + recorder *MockRuntime_SubscribeTopicEventsServerMockRecorder +} + +// MockRuntime_SubscribeTopicEventsServerMockRecorder is the mock recorder for MockRuntime_SubscribeTopicEventsServer. +type MockRuntime_SubscribeTopicEventsServerMockRecorder struct { + mock *MockRuntime_SubscribeTopicEventsServer +} + +// NewMockRuntime_SubscribeTopicEventsServer creates a new mock instance. +func NewMockRuntime_SubscribeTopicEventsServer(ctrl *gomock.Controller) *MockRuntime_SubscribeTopicEventsServer { + mock := &MockRuntime_SubscribeTopicEventsServer{ctrl: ctrl} + mock.recorder = &MockRuntime_SubscribeTopicEventsServerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockRuntime_SubscribeTopicEventsServer) EXPECT() *MockRuntime_SubscribeTopicEventsServerMockRecorder { + return m.recorder +} + +// Context mocks base method. +func (m *MockRuntime_SubscribeTopicEventsServer) Context() context.Context { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Context") + ret0, _ := ret[0].(context.Context) + return ret0 +} + +// Context indicates an expected call of Context. +func (mr *MockRuntime_SubscribeTopicEventsServerMockRecorder) Context() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Context", reflect.TypeOf((*MockRuntime_SubscribeTopicEventsServer)(nil).Context)) +} + +// Recv mocks base method. +func (m *MockRuntime_SubscribeTopicEventsServer) Recv() (*runtime.SubscribeTopicEventsRequest, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Recv") + ret0, _ := ret[0].(*runtime.SubscribeTopicEventsRequest) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Recv indicates an expected call of Recv. +func (mr *MockRuntime_SubscribeTopicEventsServerMockRecorder) Recv() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Recv", reflect.TypeOf((*MockRuntime_SubscribeTopicEventsServer)(nil).Recv)) +} + +// RecvMsg mocks base method. +func (m_2 *MockRuntime_SubscribeTopicEventsServer) RecvMsg(m interface{}) error { + m_2.ctrl.T.Helper() + ret := m_2.ctrl.Call(m_2, "RecvMsg", m) + ret0, _ := ret[0].(error) + return ret0 +} + +// RecvMsg indicates an expected call of RecvMsg. +func (mr *MockRuntime_SubscribeTopicEventsServerMockRecorder) RecvMsg(m interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RecvMsg", reflect.TypeOf((*MockRuntime_SubscribeTopicEventsServer)(nil).RecvMsg), m) +} + +// Send mocks base method. +func (m *MockRuntime_SubscribeTopicEventsServer) Send(arg0 *runtime.SubscribeTopicEventsResponse) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Send", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Send indicates an expected call of Send. +func (mr *MockRuntime_SubscribeTopicEventsServerMockRecorder) Send(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Send", reflect.TypeOf((*MockRuntime_SubscribeTopicEventsServer)(nil).Send), arg0) +} + +// SendHeader mocks base method. +func (m *MockRuntime_SubscribeTopicEventsServer) SendHeader(arg0 metadata.MD) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SendHeader", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// SendHeader indicates an expected call of SendHeader. +func (mr *MockRuntime_SubscribeTopicEventsServerMockRecorder) SendHeader(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendHeader", reflect.TypeOf((*MockRuntime_SubscribeTopicEventsServer)(nil).SendHeader), arg0) +} + +// SendMsg mocks base method. +func (m_2 *MockRuntime_SubscribeTopicEventsServer) SendMsg(m interface{}) error { + m_2.ctrl.T.Helper() + ret := m_2.ctrl.Call(m_2, "Send", m) + ret0, _ := ret[0].(error) + return ret0 +} + +// SendMsg indicates an expected call of SendMsg. +func (mr *MockRuntime_SubscribeTopicEventsServerMockRecorder) SendMsg(m interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendMsg", reflect.TypeOf((*MockRuntime_SubscribeTopicEventsServer)(nil).SendMsg), m) +} + +// SetHeader mocks base method. +func (m *MockRuntime_SubscribeTopicEventsServer) SetHeader(arg0 metadata.MD) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SetHeader", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// SetHeader indicates an expected call of SetHeader. +func (mr *MockRuntime_SubscribeTopicEventsServerMockRecorder) SetHeader(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetHeader", reflect.TypeOf((*MockRuntime_SubscribeTopicEventsServer)(nil).SetHeader), arg0) +} + +// SetTrailer mocks base method. +func (m *MockRuntime_SubscribeTopicEventsServer) SetTrailer(arg0 metadata.MD) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetTrailer", arg0) +} + +// SetTrailer indicates an expected call of SetTrailer. +func (mr *MockRuntime_SubscribeTopicEventsServerMockRecorder) SetTrailer(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTrailer", reflect.TypeOf((*MockRuntime_SubscribeTopicEventsServer)(nil).SetTrailer), arg0) +} diff --git a/spec/proto/runtime/v1/runtime.pb.go b/spec/proto/runtime/v1/runtime.pb.go index 0981e827fe..84efd3ae6a 100644 --- a/spec/proto/runtime/v1/runtime.pb.go +++ b/spec/proto/runtime/v1/runtime.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.0 +// protoc-gen-go v1.28.1 // protoc v3.17.3 // source: runtime.proto @@ -3595,6 +3595,356 @@ func (x *PublishEventRequest) GetMetadata() map[string]string { return nil } +// SubscribeTopicEventsRequest is a message containing the details for +// subscribing to a topic via streaming. +// The first message must always be the initial request. All subsequent +// messages must be event processed responses. +type SubscribeTopicEventsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to SubscribeTopicEventsRequestType: + // *SubscribeTopicEventsRequest_InitialRequest + // *SubscribeTopicEventsRequest_EventProcessed + SubscribeTopicEventsRequestType isSubscribeTopicEventsRequest_SubscribeTopicEventsRequestType `protobuf_oneof:"subscribe_topic_events_request_type"` +} + +func (x *SubscribeTopicEventsRequest) Reset() { + *x = SubscribeTopicEventsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_runtime_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SubscribeTopicEventsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SubscribeTopicEventsRequest) ProtoMessage() {} + +func (x *SubscribeTopicEventsRequest) ProtoReflect() protoreflect.Message { + mi := &file_runtime_proto_msgTypes[48] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SubscribeTopicEventsRequest.ProtoReflect.Descriptor instead. +func (*SubscribeTopicEventsRequest) Descriptor() ([]byte, []int) { + return file_runtime_proto_rawDescGZIP(), []int{48} +} + +func (m *SubscribeTopicEventsRequest) GetSubscribeTopicEventsRequestType() isSubscribeTopicEventsRequest_SubscribeTopicEventsRequestType { + if m != nil { + return m.SubscribeTopicEventsRequestType + } + return nil +} + +func (x *SubscribeTopicEventsRequest) GetInitialRequest() *SubscribeTopicEventsRequestInitial { + if x, ok := x.GetSubscribeTopicEventsRequestType().(*SubscribeTopicEventsRequest_InitialRequest); ok { + return x.InitialRequest + } + return nil +} + +func (x *SubscribeTopicEventsRequest) GetEventProcessed() *SubscribeTopicEventsRequestProcessed { + if x, ok := x.GetSubscribeTopicEventsRequestType().(*SubscribeTopicEventsRequest_EventProcessed); ok { + return x.EventProcessed + } + return nil +} + +type isSubscribeTopicEventsRequest_SubscribeTopicEventsRequestType interface { + isSubscribeTopicEventsRequest_SubscribeTopicEventsRequestType() +} + +type SubscribeTopicEventsRequest_InitialRequest struct { + InitialRequest *SubscribeTopicEventsRequestInitial `protobuf:"bytes,1,opt,name=initial_request,json=initialRequest,proto3,oneof"` +} + +type SubscribeTopicEventsRequest_EventProcessed struct { + EventProcessed *SubscribeTopicEventsRequestProcessed `protobuf:"bytes,2,opt,name=event_processed,json=eventProcessed,proto3,oneof"` +} + +func (*SubscribeTopicEventsRequest_InitialRequest) isSubscribeTopicEventsRequest_SubscribeTopicEventsRequestType() { +} + +func (*SubscribeTopicEventsRequest_EventProcessed) isSubscribeTopicEventsRequest_SubscribeTopicEventsRequestType() { +} + +// SubscribeTopicEventsRequestInitial is the initial message containing +// the details for subscribing to a topic via streaming. +type SubscribeTopicEventsRequestInitial struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The name of the pubsub component + PubsubName string `protobuf:"bytes,1,opt,name=pubsub_name,json=pubsubName,proto3" json:"pubsub_name,omitempty"` + // The pubsub topic + Topic string `protobuf:"bytes,2,opt,name=topic,proto3" json:"topic,omitempty"` + // The metadata passing to pub components + // + // metadata property: + // - key : the key of the message. + Metadata map[string]string `protobuf:"bytes,3,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // dead_letter_topic is the topic to which messages that fail to be processed + // are sent. + DeadLetterTopic *string `protobuf:"bytes,4,opt,name=dead_letter_topic,json=deadLetterTopic,proto3,oneof" json:"dead_letter_topic,omitempty"` +} + +func (x *SubscribeTopicEventsRequestInitial) Reset() { + *x = SubscribeTopicEventsRequestInitial{} + if protoimpl.UnsafeEnabled { + mi := &file_runtime_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SubscribeTopicEventsRequestInitial) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SubscribeTopicEventsRequestInitial) ProtoMessage() {} + +func (x *SubscribeTopicEventsRequestInitial) ProtoReflect() protoreflect.Message { + mi := &file_runtime_proto_msgTypes[49] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SubscribeTopicEventsRequestInitial.ProtoReflect.Descriptor instead. +func (*SubscribeTopicEventsRequestInitial) Descriptor() ([]byte, []int) { + return file_runtime_proto_rawDescGZIP(), []int{49} +} + +func (x *SubscribeTopicEventsRequestInitial) GetPubsubName() string { + if x != nil { + return x.PubsubName + } + return "" +} + +func (x *SubscribeTopicEventsRequestInitial) GetTopic() string { + if x != nil { + return x.Topic + } + return "" +} + +func (x *SubscribeTopicEventsRequestInitial) GetMetadata() map[string]string { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *SubscribeTopicEventsRequestInitial) GetDeadLetterTopic() string { + if x != nil && x.DeadLetterTopic != nil { + return *x.DeadLetterTopic + } + return "" +} + +// SubscribeTopicEventsRequestProcessed is the message containing the +// subscription to a topic. +type SubscribeTopicEventsRequestProcessed struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // id is the unique identifier for the subscription request. + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // status is the result of the subscription request. + Status *TopicEventResponse `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` +} + +func (x *SubscribeTopicEventsRequestProcessed) Reset() { + *x = SubscribeTopicEventsRequestProcessed{} + if protoimpl.UnsafeEnabled { + mi := &file_runtime_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SubscribeTopicEventsRequestProcessed) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SubscribeTopicEventsRequestProcessed) ProtoMessage() {} + +func (x *SubscribeTopicEventsRequestProcessed) ProtoReflect() protoreflect.Message { + mi := &file_runtime_proto_msgTypes[50] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SubscribeTopicEventsRequestProcessed.ProtoReflect.Descriptor instead. +func (*SubscribeTopicEventsRequestProcessed) Descriptor() ([]byte, []int) { + return file_runtime_proto_rawDescGZIP(), []int{50} +} + +func (x *SubscribeTopicEventsRequestProcessed) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *SubscribeTopicEventsRequestProcessed) GetStatus() *TopicEventResponse { + if x != nil { + return x.Status + } + return nil +} + +// SubscribeTopicEventsResponse is a message returned from layotto +// when subscribing to a topic via streaming. +type SubscribeTopicEventsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to SubscribeTopicEventsResponseType: + // *SubscribeTopicEventsResponse_InitialResponse + // *SubscribeTopicEventsResponse_EventMessage + SubscribeTopicEventsResponseType isSubscribeTopicEventsResponse_SubscribeTopicEventsResponseType `protobuf_oneof:"subscribe_topic_events_response_type"` +} + +func (x *SubscribeTopicEventsResponse) Reset() { + *x = SubscribeTopicEventsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_runtime_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SubscribeTopicEventsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SubscribeTopicEventsResponse) ProtoMessage() {} + +func (x *SubscribeTopicEventsResponse) ProtoReflect() protoreflect.Message { + mi := &file_runtime_proto_msgTypes[51] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SubscribeTopicEventsResponse.ProtoReflect.Descriptor instead. +func (*SubscribeTopicEventsResponse) Descriptor() ([]byte, []int) { + return file_runtime_proto_rawDescGZIP(), []int{51} +} + +func (m *SubscribeTopicEventsResponse) GetSubscribeTopicEventsResponseType() isSubscribeTopicEventsResponse_SubscribeTopicEventsResponseType { + if m != nil { + return m.SubscribeTopicEventsResponseType + } + return nil +} + +func (x *SubscribeTopicEventsResponse) GetInitialResponse() *SubscribeTopicEventsResponseInitial { + if x, ok := x.GetSubscribeTopicEventsResponseType().(*SubscribeTopicEventsResponse_InitialResponse); ok { + return x.InitialResponse + } + return nil +} + +func (x *SubscribeTopicEventsResponse) GetEventMessage() *TopicEventRequest { + if x, ok := x.GetSubscribeTopicEventsResponseType().(*SubscribeTopicEventsResponse_EventMessage); ok { + return x.EventMessage + } + return nil +} + +type isSubscribeTopicEventsResponse_SubscribeTopicEventsResponseType interface { + isSubscribeTopicEventsResponse_SubscribeTopicEventsResponseType() +} + +type SubscribeTopicEventsResponse_InitialResponse struct { + InitialResponse *SubscribeTopicEventsResponseInitial `protobuf:"bytes,1,opt,name=initial_response,json=initialResponse,proto3,oneof"` +} + +type SubscribeTopicEventsResponse_EventMessage struct { + EventMessage *TopicEventRequest `protobuf:"bytes,2,opt,name=event_message,json=eventMessage,proto3,oneof"` +} + +func (*SubscribeTopicEventsResponse_InitialResponse) isSubscribeTopicEventsResponse_SubscribeTopicEventsResponseType() { +} + +func (*SubscribeTopicEventsResponse_EventMessage) isSubscribeTopicEventsResponse_SubscribeTopicEventsResponseType() { +} + +// SubscribeTopicEventsResponseInitialAlpha1 is the initial response from layotto +// when subscribing to a topic. +type SubscribeTopicEventsResponseInitial struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *SubscribeTopicEventsResponseInitial) Reset() { + *x = SubscribeTopicEventsResponseInitial{} + if protoimpl.UnsafeEnabled { + mi := &file_runtime_proto_msgTypes[52] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SubscribeTopicEventsResponseInitial) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SubscribeTopicEventsResponseInitial) ProtoMessage() {} + +func (x *SubscribeTopicEventsResponseInitial) ProtoReflect() protoreflect.Message { + mi := &file_runtime_proto_msgTypes[52] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SubscribeTopicEventsResponseInitial.ProtoReflect.Descriptor instead. +func (*SubscribeTopicEventsResponseInitial) Descriptor() ([]byte, []int) { + return file_runtime_proto_rawDescGZIP(), []int{52} +} + // InvokeBindingRequest is the message to send data to output bindings type InvokeBindingRequest struct { state protoimpl.MessageState @@ -3619,7 +3969,7 @@ type InvokeBindingRequest struct { func (x *InvokeBindingRequest) Reset() { *x = InvokeBindingRequest{} if protoimpl.UnsafeEnabled { - mi := &file_runtime_proto_msgTypes[48] + mi := &file_runtime_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3632,7 +3982,7 @@ func (x *InvokeBindingRequest) String() string { func (*InvokeBindingRequest) ProtoMessage() {} func (x *InvokeBindingRequest) ProtoReflect() protoreflect.Message { - mi := &file_runtime_proto_msgTypes[48] + mi := &file_runtime_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3645,7 +3995,7 @@ func (x *InvokeBindingRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use InvokeBindingRequest.ProtoReflect.Descriptor instead. func (*InvokeBindingRequest) Descriptor() ([]byte, []int) { - return file_runtime_proto_rawDescGZIP(), []int{48} + return file_runtime_proto_rawDescGZIP(), []int{53} } func (x *InvokeBindingRequest) GetName() string { @@ -3691,7 +4041,7 @@ type InvokeBindingResponse struct { func (x *InvokeBindingResponse) Reset() { *x = InvokeBindingResponse{} if protoimpl.UnsafeEnabled { - mi := &file_runtime_proto_msgTypes[49] + mi := &file_runtime_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3704,7 +4054,7 @@ func (x *InvokeBindingResponse) String() string { func (*InvokeBindingResponse) ProtoMessage() {} func (x *InvokeBindingResponse) ProtoReflect() protoreflect.Message { - mi := &file_runtime_proto_msgTypes[49] + mi := &file_runtime_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3717,7 +4067,7 @@ func (x *InvokeBindingResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use InvokeBindingResponse.ProtoReflect.Descriptor instead. func (*InvokeBindingResponse) Descriptor() ([]byte, []int) { - return file_runtime_proto_rawDescGZIP(), []int{49} + return file_runtime_proto_rawDescGZIP(), []int{54} } func (x *InvokeBindingResponse) GetData() []byte { @@ -3752,7 +4102,7 @@ type GetSecretRequest struct { func (x *GetSecretRequest) Reset() { *x = GetSecretRequest{} if protoimpl.UnsafeEnabled { - mi := &file_runtime_proto_msgTypes[50] + mi := &file_runtime_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3765,7 +4115,7 @@ func (x *GetSecretRequest) String() string { func (*GetSecretRequest) ProtoMessage() {} func (x *GetSecretRequest) ProtoReflect() protoreflect.Message { - mi := &file_runtime_proto_msgTypes[50] + mi := &file_runtime_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3778,7 +4128,7 @@ func (x *GetSecretRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSecretRequest.ProtoReflect.Descriptor instead. func (*GetSecretRequest) Descriptor() ([]byte, []int) { - return file_runtime_proto_rawDescGZIP(), []int{50} + return file_runtime_proto_rawDescGZIP(), []int{55} } func (x *GetSecretRequest) GetStoreName() string { @@ -3816,7 +4166,7 @@ type GetSecretResponse struct { func (x *GetSecretResponse) Reset() { *x = GetSecretResponse{} if protoimpl.UnsafeEnabled { - mi := &file_runtime_proto_msgTypes[51] + mi := &file_runtime_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3829,7 +4179,7 @@ func (x *GetSecretResponse) String() string { func (*GetSecretResponse) ProtoMessage() {} func (x *GetSecretResponse) ProtoReflect() protoreflect.Message { - mi := &file_runtime_proto_msgTypes[51] + mi := &file_runtime_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3842,7 +4192,7 @@ func (x *GetSecretResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSecretResponse.ProtoReflect.Descriptor instead. func (*GetSecretResponse) Descriptor() ([]byte, []int) { - return file_runtime_proto_rawDescGZIP(), []int{51} + return file_runtime_proto_rawDescGZIP(), []int{56} } func (x *GetSecretResponse) GetData() map[string]string { @@ -3867,7 +4217,7 @@ type GetBulkSecretRequest struct { func (x *GetBulkSecretRequest) Reset() { *x = GetBulkSecretRequest{} if protoimpl.UnsafeEnabled { - mi := &file_runtime_proto_msgTypes[52] + mi := &file_runtime_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3880,7 +4230,7 @@ func (x *GetBulkSecretRequest) String() string { func (*GetBulkSecretRequest) ProtoMessage() {} func (x *GetBulkSecretRequest) ProtoReflect() protoreflect.Message { - mi := &file_runtime_proto_msgTypes[52] + mi := &file_runtime_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3893,7 +4243,7 @@ func (x *GetBulkSecretRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBulkSecretRequest.ProtoReflect.Descriptor instead. func (*GetBulkSecretRequest) Descriptor() ([]byte, []int) { - return file_runtime_proto_rawDescGZIP(), []int{52} + return file_runtime_proto_rawDescGZIP(), []int{57} } func (x *GetBulkSecretRequest) GetStoreName() string { @@ -3924,7 +4274,7 @@ type GetBulkSecretResponse struct { func (x *GetBulkSecretResponse) Reset() { *x = GetBulkSecretResponse{} if protoimpl.UnsafeEnabled { - mi := &file_runtime_proto_msgTypes[53] + mi := &file_runtime_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3937,7 +4287,7 @@ func (x *GetBulkSecretResponse) String() string { func (*GetBulkSecretResponse) ProtoMessage() {} func (x *GetBulkSecretResponse) ProtoReflect() protoreflect.Message { - mi := &file_runtime_proto_msgTypes[53] + mi := &file_runtime_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3950,7 +4300,7 @@ func (x *GetBulkSecretResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBulkSecretResponse.ProtoReflect.Descriptor instead. func (*GetBulkSecretResponse) Descriptor() ([]byte, []int) { - return file_runtime_proto_rawDescGZIP(), []int{53} + return file_runtime_proto_rawDescGZIP(), []int{58} } func (x *GetBulkSecretResponse) GetData() map[string]*SecretResponse { @@ -3973,7 +4323,7 @@ type SecretResponse struct { func (x *SecretResponse) Reset() { *x = SecretResponse{} if protoimpl.UnsafeEnabled { - mi := &file_runtime_proto_msgTypes[54] + mi := &file_runtime_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3986,7 +4336,7 @@ func (x *SecretResponse) String() string { func (*SecretResponse) ProtoMessage() {} func (x *SecretResponse) ProtoReflect() protoreflect.Message { - mi := &file_runtime_proto_msgTypes[54] + mi := &file_runtime_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3999,7 +4349,7 @@ func (x *SecretResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SecretResponse.ProtoReflect.Descriptor instead. func (*SecretResponse) Descriptor() ([]byte, []int) { - return file_runtime_proto_rawDescGZIP(), []int{54} + return file_runtime_proto_rawDescGZIP(), []int{59} } func (x *SecretResponse) GetSecrets() map[string]string { @@ -4017,329 +4367,321 @@ var file_runtime_proto_rawDesc = []byte{ 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x52, - 0x0a, 0x12, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, - 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x8b, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x23, - 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, - 0x69, 0x65, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, - 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x25, 0x0a, 0x0d, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xb8, 0x01, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, - 0x4d, 0x65, 0x74, 0x61, 0x12, 0x49, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, - 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, - 0x61, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x3a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x24, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0xd1, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4f, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x73, 0x70, 0x65, - 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x11, + 0x61, 0x70, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0x52, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x8b, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, + 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, + 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, + 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, + 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x25, 0x0a, 0x0d, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xb8, 0x01, 0x0a, 0x08, 0x46, + 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x49, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x73, 0x70, 0x65, 0x63, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x1a, 0x61, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, + 0x65, 0x4d, 0x65, 0x74, 0x61, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd1, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4f, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, + 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x25, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x22, 0xe5, 0x01, 0x0a, 0x0e, 0x50, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x4f, 0x0a, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x73, + 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xcb, 0x01, 0x0a, 0x0b, 0x46, 0x69, 0x6c, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4c, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, + 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x25, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xe5, 0x01, - 0x0a, 0x0e, 0x50, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x4f, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x73, 0x70, 0x65, 0x63, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xcb, 0x01, 0x0a, 0x0b, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4c, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x73, 0x70, 0x65, - 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x84, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, - 0x7a, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x22, 0xe8, 0x01, 0x0a, 0x08, 0x46, - 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, - 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x49, 0x0a, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2d, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x80, 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, - 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x35, 0x0a, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, - 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x0a, - 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x74, 0x72, 0x75, 0x6e, - 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x54, - 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x22, 0x4e, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x46, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x84, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, - 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x96, 0x02, 0x0a, 0x10, 0x47, 0x65, 0x74, - 0x4e, 0x65, 0x78, 0x74, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, - 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x41, - 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x27, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, - 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x51, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, - 0x65, 0x78, 0x74, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x8e, 0x01, 0x0a, 0x10, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x72, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x53, 0x0a, 0x09, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x73, 0x70, 0x65, 0x63, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x09, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x25, 0x0a, 0x0d, 0x41, - 0x75, 0x74, 0x6f, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x08, 0x0a, 0x04, - 0x57, 0x45, 0x41, 0x4b, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x4f, 0x4e, 0x47, - 0x10, 0x01, 0x22, 0x30, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x78, 0x74, 0x49, 0x64, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x07, 0x6e, 0x65, 0x78, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x02, 0x30, 0x01, 0x52, 0x06, 0x6e, 0x65, - 0x78, 0x74, 0x49, 0x64, 0x22, 0x87, 0x01, 0x0a, 0x0e, 0x54, 0x72, 0x79, 0x4c, 0x6f, 0x63, 0x6b, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, - 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x63, - 0x6b, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x22, 0x2b, - 0x0a, 0x0f, 0x54, 0x72, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x6e, 0x0a, 0x0d, 0x55, - 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, - 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x22, 0xae, 0x01, 0x0a, 0x0e, - 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, + 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x22, 0xe8, 0x01, + 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, + 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, + 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x12, 0x49, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x80, 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x73, + 0x74, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x35, 0x0a, 0x05, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x74, + 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, + 0x69, 0x73, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x22, 0x4e, 0x0a, 0x0e, 0x44, + 0x65, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, + 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x22, 0x56, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, - 0x0a, 0x07, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x4c, - 0x4f, 0x43, 0x4b, 0x5f, 0x55, 0x4e, 0x45, 0x58, 0x49, 0x53, 0x54, 0x10, 0x01, 0x12, 0x19, 0x0a, - 0x15, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x42, 0x45, 0x4c, 0x4f, 0x4e, 0x47, 0x5f, 0x54, 0x4f, 0x5f, - 0x4f, 0x54, 0x48, 0x45, 0x52, 0x53, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x54, 0x45, - 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x22, 0x8d, 0x01, 0x0a, - 0x14, 0x4c, 0x6f, 0x63, 0x6b, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6f, 0x77, - 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x4f, - 0x77, 0x6e, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x22, 0xbc, 0x01, 0x0a, - 0x15, 0x4c, 0x6f, 0x63, 0x6b, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x33, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, - 0x6f, 0x63, 0x6b, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x22, 0x56, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, - 0x07, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x4c, 0x4f, - 0x43, 0x4b, 0x5f, 0x55, 0x4e, 0x45, 0x58, 0x49, 0x53, 0x54, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, - 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x42, 0x45, 0x4c, 0x4f, 0x4e, 0x47, 0x5f, 0x54, 0x4f, 0x5f, 0x4f, - 0x54, 0x48, 0x45, 0x52, 0x53, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x54, 0x45, 0x52, - 0x4e, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x22, 0x72, 0x0a, 0x0f, 0x53, - 0x61, 0x79, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, - 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, - 0x52, 0x0a, 0x10, 0x53, 0x61, 0x79, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x28, 0x0a, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x04, 0x64, - 0x61, 0x74, 0x61, 0x22, 0x6c, 0x0a, 0x14, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x44, 0x0a, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x73, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x96, 0x02, 0x0a, 0x10, + 0x47, 0x65, 0x74, 0x4e, 0x65, 0x78, 0x74, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x41, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x51, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x4e, 0x65, 0x78, 0x74, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8e, 0x01, 0x0a, 0x10, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, + 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x53, 0x0a, 0x09, 0x69, 0x6e, 0x63, + 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x13, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x6f, - 0x6b, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, - 0x68, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x12, 0x28, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, 0x0c, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x4b, - 0x0a, 0x0e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x48, - 0x54, 0x54, 0x50, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x68, 0x74, - 0x74, 0x70, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xe4, 0x01, 0x0a, 0x0d, - 0x48, 0x54, 0x54, 0x50, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x0a, - 0x04, 0x76, 0x65, 0x72, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x73, 0x70, - 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x2e, 0x56, 0x65, 0x72, 0x62, 0x52, 0x04, 0x76, 0x65, 0x72, 0x62, 0x12, 0x20, 0x0a, 0x0b, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x72, - 0x0a, 0x04, 0x56, 0x65, 0x72, 0x62, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, - 0x12, 0x07, 0x0a, 0x03, 0x47, 0x45, 0x54, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x45, 0x41, - 0x44, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x50, 0x4f, 0x53, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, - 0x03, 0x50, 0x55, 0x54, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, - 0x10, 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x10, 0x06, 0x12, - 0x0b, 0x0a, 0x07, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x07, 0x12, 0x09, 0x0a, 0x05, - 0x54, 0x52, 0x41, 0x43, 0x45, 0x10, 0x08, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x41, 0x54, 0x43, 0x48, - 0x10, 0x09, 0x22, 0x5d, 0x0a, 0x0e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x72, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x09, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x25, + 0x0a, 0x0d, 0x41, 0x75, 0x74, 0x6f, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x08, 0x0a, 0x04, 0x57, 0x45, 0x41, 0x4b, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, + 0x4f, 0x4e, 0x47, 0x10, 0x01, 0x22, 0x30, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x78, 0x74, + 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x07, 0x6e, 0x65, + 0x78, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x02, 0x30, 0x01, 0x52, + 0x06, 0x6e, 0x65, 0x78, 0x74, 0x49, 0x64, 0x22, 0x87, 0x01, 0x0a, 0x0e, 0x54, 0x72, 0x79, 0x4c, + 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x6c, 0x6f, 0x63, 0x6b, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x78, 0x70, + 0x69, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, + 0x65, 0x22, 0x2b, 0x0a, 0x0f, 0x54, 0x72, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x6e, + 0x0a, 0x0d, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, + 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, + 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x22, 0xae, + 0x01, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x44, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x2c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x56, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x10, + 0x0a, 0x0c, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x55, 0x4e, 0x45, 0x58, 0x49, 0x53, 0x54, 0x10, 0x01, + 0x12, 0x19, 0x0a, 0x15, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x42, 0x45, 0x4c, 0x4f, 0x4e, 0x47, 0x5f, + 0x54, 0x4f, 0x5f, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x53, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x49, + 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x22, + 0x8d, 0x01, 0x0a, 0x14, 0x4c, 0x6f, 0x63, 0x6b, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x6b, + 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, + 0x63, 0x6b, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x22, + 0xbc, 0x01, 0x0a, 0x15, 0x4c, 0x6f, 0x63, 0x6b, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x33, 0x2e, 0x73, 0x70, 0x65, 0x63, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x6f, 0x63, 0x6b, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x56, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x10, 0x0a, + 0x0c, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x55, 0x4e, 0x45, 0x58, 0x49, 0x53, 0x54, 0x10, 0x01, 0x12, + 0x19, 0x0a, 0x15, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x42, 0x45, 0x4c, 0x4f, 0x4e, 0x47, 0x5f, 0x54, + 0x4f, 0x5f, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x53, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, + 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x22, 0x72, + 0x0a, 0x0f, 0x53, 0x61, 0x79, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x04, 0x64, 0x61, + 0x74, 0x61, 0x22, 0x52, 0x0a, 0x10, 0x53, 0x61, 0x79, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x28, 0x0a, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, + 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x6c, 0x0a, 0x14, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x44, + 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2a, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, + 0x76, 0x6f, 0x6b, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x13, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, + 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, + 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x12, 0x28, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x21, - 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, + 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x22, 0xfd, 0x02, 0x0a, 0x11, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, - 0x46, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, - 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x52, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x73, 0x70, 0x65, 0x63, + 0x65, 0x12, 0x4b, 0x0a, 0x0e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x74, 0x65, 0x6d, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x54, - 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x31, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x0d, 0x68, 0x74, 0x74, 0x70, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xe4, + 0x01, 0x0a, 0x0d, 0x48, 0x54, 0x54, 0x50, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x3d, 0x0a, 0x04, 0x76, 0x65, 0x72, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, + 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x65, 0x72, 0x62, 0x52, 0x04, 0x76, 0x65, 0x72, 0x62, 0x12, + 0x20, 0x0a, 0x0b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x72, 0x0a, 0x04, 0x56, 0x65, 0x72, 0x62, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, + 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x47, 0x45, 0x54, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, + 0x48, 0x45, 0x41, 0x44, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x50, 0x4f, 0x53, 0x54, 0x10, 0x03, + 0x12, 0x07, 0x0a, 0x03, 0x50, 0x55, 0x54, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, + 0x45, 0x54, 0x45, 0x10, 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, + 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x07, 0x12, + 0x09, 0x0a, 0x05, 0x54, 0x52, 0x41, 0x43, 0x45, 0x10, 0x08, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x41, + 0x54, 0x43, 0x48, 0x10, 0x09, 0x22, 0x5d, 0x0a, 0x0e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x22, 0xfd, 0x02, 0x0a, 0x11, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x14, 0x0a, 0x05, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x12, 0x46, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x32, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x52, 0x0a, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x73, + 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x37, + 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0xd1, 0x02, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, - 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x15, 0x0a, 0x06, - 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, - 0x70, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, - 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6b, - 0x65, 0x79, 0x73, 0x12, 0x58, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x29, 0x0a, - 0x10, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x5a, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x3e, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x28, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, - 0x73, 0x22, 0xb2, 0x02, 0x0a, 0x1d, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, - 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x5e, 0x0a, 0x08, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x73, 0x70, - 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x96, 0x01, 0x0a, 0x1e, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, - 0x3e, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd1, 0x02, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x14, 0x0a, 0x05, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x58, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x12, 0x29, 0x0a, 0x10, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x5f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x73, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x5a, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x22, 0xb2, 0x02, 0x0a, 0x1d, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x5e, 0x0a, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, - 0xa8, 0x02, 0x0a, 0x18, 0x53, 0x61, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x96, 0x01, 0x0a, 0x1e, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, @@ -4347,474 +4689,556 @@ var file_runtime_proto_rawDesc = []byte{ 0x0b, 0x32, 0x28, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, - 0x6d, 0x73, 0x12, 0x59, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x61, 0x76, - 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, - 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xac, 0x02, 0x0a, 0x1a, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6b, - 0x65, 0x79, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, - 0x5b, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x3f, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa9, 0x02, 0x0a, 0x0f, 0x47, 0x65, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, - 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x56, - 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x34, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, - 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x73, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xfd, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6c, - 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, - 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x6b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, - 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, - 0x73, 0x6d, 0x12, 0x54, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x52, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6c, 0x6b, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, - 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x73, - 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, 0x74, - 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0xec, 0x01, 0x0a, 0x0d, 0x42, 0x75, - 0x6c, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, - 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x4e, 0x0a, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, - 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, - 0x74, 0x65, 0x6d, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, + 0x6d, 0x73, 0x22, 0xa8, 0x02, 0x0a, 0x18, 0x53, 0x61, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x15, + 0x0a, 0x06, 0x61, 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x61, 0x70, 0x70, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x59, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x61, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xac, 0x02, + 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x61, + 0x70, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, + 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x12, + 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x65, + 0x79, 0x73, 0x12, 0x5b, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, + 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa9, 0x02, 0x0a, + 0x0f, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x56, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x34, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x0b, 0x63, 0x6f, + 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x73, 0x70, + 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xca, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x51, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xfd, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, + 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6b, + 0x65, 0x79, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, + 0x73, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, + 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x12, 0x54, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x52, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x42, + 0x75, 0x6c, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x3a, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0xec, 0x01, 0x0a, + 0x0d, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x4e, + 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x32, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, + 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xca, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc7, 0x02, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x51, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x73, 0x70, 0x65, + 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc7, 0x02, 0x0a, 0x12, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x2f, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x61, 0x67, 0x52, 0x04, 0x65, 0x74, 0x61, + 0x67, 0x12, 0x3d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x53, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x71, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, - 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x70, + 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x61, 0x67, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x3d, - 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x53, 0x0a, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x37, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x71, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x74, 0x61, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x73, 0x22, 0x6b, 0x0a, 0x10, 0x53, 0x61, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x73, 0x22, 0x6b, 0x0a, 0x10, 0x53, 0x61, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, + 0x65, 0x73, 0x22, 0xac, 0x02, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, 0x74, 0x65, 0x6d, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x74, 0x61, 0x67, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x4a, 0x0a, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x73, 0x70, + 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x1c, 0x0a, 0x04, 0x45, 0x74, 0x61, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x8b, 0x03, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x56, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x34, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x22, - 0xac, 0x02, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x61, 0x67, - 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x4a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x12, 0x3d, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x61, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x0b, 0x63, 0x6f, 0x6e, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x56, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x73, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x34, 0x2e, + 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x63, 0x79, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, + 0x22, 0x68, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x63, 0x79, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x4f, 0x4e, 0x43, 0x55, 0x52, 0x52, 0x45, + 0x4e, 0x43, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x4f, 0x4e, 0x43, 0x55, 0x52, 0x52, 0x45, 0x4e, 0x43, 0x59, + 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x01, 0x12, 0x1a, + 0x0a, 0x16, 0x43, 0x4f, 0x4e, 0x43, 0x55, 0x52, 0x52, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x4c, 0x41, + 0x53, 0x54, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x02, 0x22, 0x61, 0x0a, 0x10, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x1b, + 0x0a, 0x17, 0x43, 0x4f, 0x4e, 0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x55, 0x4e, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x43, + 0x4f, 0x4e, 0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, + 0x55, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x4f, 0x4e, 0x53, 0x49, 0x53, 0x54, + 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x53, 0x54, 0x52, 0x4f, 0x4e, 0x47, 0x10, 0x02, 0x22, 0x7f, 0x0a, + 0x1b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1c, - 0x0a, 0x04, 0x45, 0x74, 0x61, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8b, 0x03, 0x0a, - 0x0c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x56, 0x0a, - 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x34, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x56, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x34, 0x2e, 0x73, 0x70, 0x65, - 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, - 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x68, 0x0a, - 0x10, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, - 0x79, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x4f, 0x4e, 0x43, 0x55, 0x52, 0x52, 0x45, 0x4e, 0x43, 0x59, - 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, - 0x0a, 0x17, 0x43, 0x4f, 0x4e, 0x43, 0x55, 0x52, 0x52, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x46, 0x49, - 0x52, 0x53, 0x54, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x43, - 0x4f, 0x4e, 0x43, 0x55, 0x52, 0x52, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x4c, 0x41, 0x53, 0x54, 0x5f, - 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x02, 0x22, 0x61, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x1b, 0x0a, 0x17, 0x43, - 0x4f, 0x4e, 0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x4f, 0x4e, 0x53, - 0x49, 0x53, 0x54, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x55, 0x41, 0x4c, - 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x4f, 0x4e, 0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x43, - 0x59, 0x5f, 0x53, 0x54, 0x52, 0x4f, 0x4e, 0x47, 0x10, 0x02, 0x22, 0x7f, 0x0a, 0x1b, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x3a, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, 0x74, - 0x65, 0x6d, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb0, 0x02, 0x0a, 0x1e, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, - 0x0a, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x52, 0x0a, 0x0a, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x32, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x5f, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, - 0x02, 0x0a, 0x13, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x75, 0x62, - 0x73, 0x75, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x12, 0x0a, - 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x61, - 0x74, 0x61, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x54, 0x0a, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x38, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, + 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb0, + 0x02, 0x0a, 0x1e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x52, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x5f, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x9f, 0x02, 0x0a, 0x13, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x75, 0x62, + 0x73, 0x75, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, + 0x70, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, + 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x64, 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x54, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x92, 0x02, 0x0a, 0x1b, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x64, 0x0a, 0x0f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x73, + 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x6f, + 0x70, 0x69, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x48, 0x00, 0x52, 0x0e, 0x69, 0x6e, 0x69, 0x74, 0x69, + 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x66, 0x0a, 0x0f, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x48, + 0x00, 0x52, 0x0e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, + 0x64, 0x42, 0x25, 0x0a, 0x23, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x5f, 0x74, + 0x6f, 0x70, 0x69, 0x63, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0xc4, 0x02, 0x0a, 0x22, 0x53, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x12, + 0x1f, 0x0a, 0x0b, 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x63, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x69, 0x74, + 0x69, 0x61, 0x6c, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2f, 0x0a, 0x11, 0x64, + 0x65, 0x61, 0x64, 0x5f, 0x6c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x70, 0x69, 0x63, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0f, 0x64, 0x65, 0x61, 0x64, 0x4c, 0x65, + 0x74, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x88, 0x01, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x64, 0x65, + 0x61, 0x64, 0x5f, 0x6c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x22, + 0x79, 0x0a, 0x24, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x6f, 0x70, 0x69, + 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x41, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x6f, 0x70, 0x69, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x1c, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x10, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, + 0x6c, 0x48, 0x00, 0x52, 0x0f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0d, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x73, 0x70, + 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x26, 0x0a, 0x24, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x5f, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5f, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x25, 0x0a, + 0x23, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x49, 0x6e, 0x69, + 0x74, 0x69, 0x61, 0x6c, 0x22, 0xf0, 0x01, 0x0a, 0x14, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x42, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x55, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1c, 0x0a, 0x09, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc0, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x76, 0x6f, + 0x6b, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x56, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, + 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd3, 0x01, 0x0a, 0x10, 0x47, + 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x51, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0xf0, 0x01, 0x0a, 0x14, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x55, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x6f, - 0x6b, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x22, 0x94, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x37, + 0x0a, 0x09, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x42, + 0x75, 0x6c, 0x6b, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x55, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x39, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6c, + 0x6b, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0xc0, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x69, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x56, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x6f, - 0x6b, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x02, 0x38, 0x01, 0x22, 0xc3, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x53, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x73, 0x70, + 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x5e, 0x0a, 0x09, 0x44, 0x61, 0x74, + 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9a, 0x01, 0x0a, 0x0e, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x07, + 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, + 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd3, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x51, 0x0a, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, - 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, - 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x94, 0x01, 0x0a, - 0x11, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x46, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x32, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x44, 0x61, - 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x53, - 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x55, 0x0a, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, - 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xc3, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x04, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x5e, 0x0a, 0x09, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9a, 0x01, 0x0a, 0x0e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x73, 0x70, 0x65, 0x63, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x73, - 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x32, 0xa2, 0x13, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x5d, - 0x0a, 0x08, 0x53, 0x61, 0x79, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x26, 0x2e, 0x73, 0x70, 0x65, - 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x61, 0x79, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x61, 0x79, 0x48, 0x65, - 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x65, 0x0a, - 0x0d, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2b, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x32, 0xaa, 0x14, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x12, 0x5d, 0x0a, 0x08, 0x53, 0x61, 0x79, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x26, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x73, 0x70, - 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x11, 0x53, - 0x61, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x2f, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x61, 0x76, 0x65, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x13, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x31, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x61, 0x79, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x61, 0x79, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x65, 0x0a, 0x0d, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x2b, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, + 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x25, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x2e, 0x73, + 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x73, + 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x5e, 0x0a, 0x11, 0x53, 0x61, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x61, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, - 0x8b, 0x01, 0x0a, 0x16, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x2e, 0x73, 0x70, 0x65, - 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x35, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5a, 0x0a, - 0x07, 0x54, 0x72, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x12, 0x25, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x54, 0x72, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x26, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x06, 0x55, 0x6e, 0x6c, - 0x6f, 0x63, 0x6b, 0x12, 0x24, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, - 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x73, 0x70, 0x65, 0x63, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x4c, 0x6f, 0x63, 0x6b, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, - 0x69, 0x76, 0x65, 0x12, 0x2b, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x63, 0x6b, - 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x63, 0x6b, 0x4b, 0x65, 0x65, - 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x60, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x78, 0x74, 0x49, 0x64, 0x12, 0x27, 0x2e, - 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x78, 0x74, 0x49, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x4e, 0x65, 0x78, 0x74, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x26, + 0x62, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x00, 0x12, 0x8b, 0x01, 0x0a, 0x16, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x69, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x2a, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, + 0x01, 0x12, 0x5a, 0x0a, 0x07, 0x54, 0x72, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x12, 0x25, 0x2e, 0x73, + 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x79, 0x4c, + 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, + 0x06, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x24, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, + 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x4c, 0x6f, 0x63, 0x6b, 0x4b, 0x65, + 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x2b, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x6f, 0x63, 0x6b, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x63, + 0x6b, 0x4b, 0x65, 0x65, 0x70, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x78, 0x74, 0x49, + 0x64, 0x12, 0x27, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x78, + 0x74, 0x49, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x73, 0x70, 0x65, + 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x78, 0x74, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x26, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x73, 0x70, 0x65, + 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6c, 0x6b, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2b, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6c, - 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, + 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x4e, 0x0a, 0x09, 0x53, 0x61, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x27, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x09, - 0x53, 0x61, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x27, 0x2e, 0x73, 0x70, 0x65, 0x63, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x61, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0b, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x29, 0x2e, 0x73, 0x70, - 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x61, 0x76, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x5a, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x2d, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6a, 0x0a, 0x17, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0c, 0x50, 0x75, 0x62, 0x6c, - 0x69, 0x73, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5c, - 0x0a, 0x07, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x25, 0x2e, 0x73, 0x70, 0x65, 0x63, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x07, - 0x50, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x25, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, + 0x12, 0x52, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x29, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, + 0x6c, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2d, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x28, 0x01, 0x12, 0x59, 0x0a, 0x08, 0x4c, 0x69, - 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x26, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, - 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x07, 0x44, 0x65, 0x6c, 0x46, 0x69, 0x6c, 0x65, - 0x12, 0x25, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x46, 0x69, 0x6c, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x00, 0x12, 0x66, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, - 0x12, 0x29, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, - 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x73, 0x70, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x6a, 0x0a, 0x17, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x49, 0x6e, 0x76, - 0x6f, 0x6b, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x2b, 0x2e, 0x73, 0x70, 0x65, - 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x12, 0x27, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, - 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x47, 0x65, 0x74, - 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x73, 0x70, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0c, + 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x2e, 0x73, + 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x00, 0x12, 0x85, 0x01, 0x0a, 0x14, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, + 0x54, 0x6f, 0x70, 0x69, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x32, 0x2e, 0x73, 0x70, + 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x54, 0x6f, 0x70, + 0x69, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x33, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5c, 0x0a, 0x07, 0x47, 0x65, + 0x74, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x25, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x73, + 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x07, 0x50, 0x75, 0x74, 0x46, + 0x69, 0x6c, 0x65, 0x12, 0x25, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x74, 0x46, + 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x00, 0x28, 0x01, 0x12, 0x59, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, + 0x6c, 0x65, 0x12, 0x26, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, + 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x22, + 0x00, 0x12, 0x4a, 0x0a, 0x07, 0x44, 0x65, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x25, 0x2e, 0x73, + 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, + 0x0b, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x29, 0x2e, 0x73, + 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x15, 0x73, 0x70, 0x65, 0x63, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, - 0x42, 0x0c, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x2d, - 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x69, 0x6f, 0x2f, 0x6c, 0x61, 0x79, 0x6f, 0x74, 0x74, 0x6f, 0x2f, - 0x73, 0x70, 0x65, 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x42, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x2b, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, + 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x6f, + 0x6b, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x12, 0x27, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x73, 0x70, 0x65, 0x63, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x42, 0x75, 0x6c, 0x6b, + 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x2b, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, + 0x75, 0x6c, 0x6b, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x15, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x0c, 0x52, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x2d, 0x6d, 0x6f, 0x73, 0x6e, + 0x2e, 0x69, 0x6f, 0x2f, 0x6c, 0x61, 0x79, 0x6f, 0x74, 0x74, 0x6f, 0x2f, 0x73, 0x70, 0x65, 0x63, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2f, 0x76, + 0x31, 0x3b, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( @@ -4830,215 +5254,231 @@ func file_runtime_proto_rawDescGZIP() []byte { } var file_runtime_proto_enumTypes = make([]protoimpl.EnumInfo, 6) -var file_runtime_proto_msgTypes = make([]protoimpl.MessageInfo, 82) +var file_runtime_proto_msgTypes = make([]protoimpl.MessageInfo, 88) var file_runtime_proto_goTypes = []interface{}{ - (SequencerOptions_AutoIncrement)(0), // 0: spec.proto.runtime.v1.SequencerOptions.AutoIncrement - (UnlockResponse_Status)(0), // 1: spec.proto.runtime.v1.UnlockResponse.Status - (LockKeepAliveResponse_Status)(0), // 2: spec.proto.runtime.v1.LockKeepAliveResponse.Status - (HTTPExtension_Verb)(0), // 3: spec.proto.runtime.v1.HTTPExtension.Verb - (StateOptions_StateConcurrency)(0), // 4: spec.proto.runtime.v1.StateOptions.StateConcurrency - (StateOptions_StateConsistency)(0), // 5: spec.proto.runtime.v1.StateOptions.StateConsistency - (*GetFileMetaRequest)(nil), // 6: spec.proto.runtime.v1.GetFileMetaRequest - (*GetFileMetaResponse)(nil), // 7: spec.proto.runtime.v1.GetFileMetaResponse - (*FileMetaValue)(nil), // 8: spec.proto.runtime.v1.FileMetaValue - (*FileMeta)(nil), // 9: spec.proto.runtime.v1.FileMeta - (*GetFileRequest)(nil), // 10: spec.proto.runtime.v1.GetFileRequest - (*GetFileResponse)(nil), // 11: spec.proto.runtime.v1.GetFileResponse - (*PutFileRequest)(nil), // 12: spec.proto.runtime.v1.PutFileRequest - (*FileRequest)(nil), // 13: spec.proto.runtime.v1.FileRequest - (*ListFileRequest)(nil), // 14: spec.proto.runtime.v1.ListFileRequest - (*FileInfo)(nil), // 15: spec.proto.runtime.v1.FileInfo - (*ListFileResp)(nil), // 16: spec.proto.runtime.v1.ListFileResp - (*DelFileRequest)(nil), // 17: spec.proto.runtime.v1.DelFileRequest - (*GetNextIdRequest)(nil), // 18: spec.proto.runtime.v1.GetNextIdRequest - (*SequencerOptions)(nil), // 19: spec.proto.runtime.v1.SequencerOptions - (*GetNextIdResponse)(nil), // 20: spec.proto.runtime.v1.GetNextIdResponse - (*TryLockRequest)(nil), // 21: spec.proto.runtime.v1.TryLockRequest - (*TryLockResponse)(nil), // 22: spec.proto.runtime.v1.TryLockResponse - (*UnlockRequest)(nil), // 23: spec.proto.runtime.v1.UnlockRequest - (*UnlockResponse)(nil), // 24: spec.proto.runtime.v1.UnlockResponse - (*LockKeepAliveRequest)(nil), // 25: spec.proto.runtime.v1.LockKeepAliveRequest - (*LockKeepAliveResponse)(nil), // 26: spec.proto.runtime.v1.LockKeepAliveResponse - (*SayHelloRequest)(nil), // 27: spec.proto.runtime.v1.SayHelloRequest - (*SayHelloResponse)(nil), // 28: spec.proto.runtime.v1.SayHelloResponse - (*InvokeServiceRequest)(nil), // 29: spec.proto.runtime.v1.InvokeServiceRequest - (*CommonInvokeRequest)(nil), // 30: spec.proto.runtime.v1.CommonInvokeRequest - (*HTTPExtension)(nil), // 31: spec.proto.runtime.v1.HTTPExtension - (*InvokeResponse)(nil), // 32: spec.proto.runtime.v1.InvokeResponse - (*ConfigurationItem)(nil), // 33: spec.proto.runtime.v1.ConfigurationItem - (*GetConfigurationRequest)(nil), // 34: spec.proto.runtime.v1.GetConfigurationRequest - (*GetConfigurationResponse)(nil), // 35: spec.proto.runtime.v1.GetConfigurationResponse - (*SubscribeConfigurationRequest)(nil), // 36: spec.proto.runtime.v1.SubscribeConfigurationRequest - (*SubscribeConfigurationResponse)(nil), // 37: spec.proto.runtime.v1.SubscribeConfigurationResponse - (*SaveConfigurationRequest)(nil), // 38: spec.proto.runtime.v1.SaveConfigurationRequest - (*DeleteConfigurationRequest)(nil), // 39: spec.proto.runtime.v1.DeleteConfigurationRequest - (*GetStateRequest)(nil), // 40: spec.proto.runtime.v1.GetStateRequest - (*GetBulkStateRequest)(nil), // 41: spec.proto.runtime.v1.GetBulkStateRequest - (*GetBulkStateResponse)(nil), // 42: spec.proto.runtime.v1.GetBulkStateResponse - (*BulkStateItem)(nil), // 43: spec.proto.runtime.v1.BulkStateItem - (*GetStateResponse)(nil), // 44: spec.proto.runtime.v1.GetStateResponse - (*DeleteStateRequest)(nil), // 45: spec.proto.runtime.v1.DeleteStateRequest - (*DeleteBulkStateRequest)(nil), // 46: spec.proto.runtime.v1.DeleteBulkStateRequest - (*SaveStateRequest)(nil), // 47: spec.proto.runtime.v1.SaveStateRequest - (*StateItem)(nil), // 48: spec.proto.runtime.v1.StateItem - (*Etag)(nil), // 49: spec.proto.runtime.v1.Etag - (*StateOptions)(nil), // 50: spec.proto.runtime.v1.StateOptions - (*TransactionalStateOperation)(nil), // 51: spec.proto.runtime.v1.TransactionalStateOperation - (*ExecuteStateTransactionRequest)(nil), // 52: spec.proto.runtime.v1.ExecuteStateTransactionRequest - (*PublishEventRequest)(nil), // 53: spec.proto.runtime.v1.PublishEventRequest - (*InvokeBindingRequest)(nil), // 54: spec.proto.runtime.v1.InvokeBindingRequest - (*InvokeBindingResponse)(nil), // 55: spec.proto.runtime.v1.InvokeBindingResponse - (*GetSecretRequest)(nil), // 56: spec.proto.runtime.v1.GetSecretRequest - (*GetSecretResponse)(nil), // 57: spec.proto.runtime.v1.GetSecretResponse - (*GetBulkSecretRequest)(nil), // 58: spec.proto.runtime.v1.GetBulkSecretRequest - (*GetBulkSecretResponse)(nil), // 59: spec.proto.runtime.v1.GetBulkSecretResponse - (*SecretResponse)(nil), // 60: spec.proto.runtime.v1.SecretResponse - nil, // 61: spec.proto.runtime.v1.FileMeta.MetadataEntry - nil, // 62: spec.proto.runtime.v1.GetFileRequest.MetadataEntry - nil, // 63: spec.proto.runtime.v1.PutFileRequest.MetadataEntry - nil, // 64: spec.proto.runtime.v1.FileRequest.MetadataEntry - nil, // 65: spec.proto.runtime.v1.FileInfo.MetadataEntry - nil, // 66: spec.proto.runtime.v1.GetNextIdRequest.MetadataEntry - nil, // 67: spec.proto.runtime.v1.ConfigurationItem.TagsEntry - nil, // 68: spec.proto.runtime.v1.ConfigurationItem.MetadataEntry - nil, // 69: spec.proto.runtime.v1.GetConfigurationRequest.MetadataEntry - nil, // 70: spec.proto.runtime.v1.SubscribeConfigurationRequest.MetadataEntry - nil, // 71: spec.proto.runtime.v1.SaveConfigurationRequest.MetadataEntry - nil, // 72: spec.proto.runtime.v1.DeleteConfigurationRequest.MetadataEntry - nil, // 73: spec.proto.runtime.v1.GetStateRequest.MetadataEntry - nil, // 74: spec.proto.runtime.v1.GetBulkStateRequest.MetadataEntry - nil, // 75: spec.proto.runtime.v1.BulkStateItem.MetadataEntry - nil, // 76: spec.proto.runtime.v1.GetStateResponse.MetadataEntry - nil, // 77: spec.proto.runtime.v1.DeleteStateRequest.MetadataEntry - nil, // 78: spec.proto.runtime.v1.StateItem.MetadataEntry - nil, // 79: spec.proto.runtime.v1.ExecuteStateTransactionRequest.MetadataEntry - nil, // 80: spec.proto.runtime.v1.PublishEventRequest.MetadataEntry - nil, // 81: spec.proto.runtime.v1.InvokeBindingRequest.MetadataEntry - nil, // 82: spec.proto.runtime.v1.InvokeBindingResponse.MetadataEntry - nil, // 83: spec.proto.runtime.v1.GetSecretRequest.MetadataEntry - nil, // 84: spec.proto.runtime.v1.GetSecretResponse.DataEntry - nil, // 85: spec.proto.runtime.v1.GetBulkSecretRequest.MetadataEntry - nil, // 86: spec.proto.runtime.v1.GetBulkSecretResponse.DataEntry - nil, // 87: spec.proto.runtime.v1.SecretResponse.SecretsEntry - (*anypb.Any)(nil), // 88: google.protobuf.Any - (*emptypb.Empty)(nil), // 89: google.protobuf.Empty + (SequencerOptions_AutoIncrement)(0), // 0: spec.proto.runtime.v1.SequencerOptions.AutoIncrement + (UnlockResponse_Status)(0), // 1: spec.proto.runtime.v1.UnlockResponse.Status + (LockKeepAliveResponse_Status)(0), // 2: spec.proto.runtime.v1.LockKeepAliveResponse.Status + (HTTPExtension_Verb)(0), // 3: spec.proto.runtime.v1.HTTPExtension.Verb + (StateOptions_StateConcurrency)(0), // 4: spec.proto.runtime.v1.StateOptions.StateConcurrency + (StateOptions_StateConsistency)(0), // 5: spec.proto.runtime.v1.StateOptions.StateConsistency + (*GetFileMetaRequest)(nil), // 6: spec.proto.runtime.v1.GetFileMetaRequest + (*GetFileMetaResponse)(nil), // 7: spec.proto.runtime.v1.GetFileMetaResponse + (*FileMetaValue)(nil), // 8: spec.proto.runtime.v1.FileMetaValue + (*FileMeta)(nil), // 9: spec.proto.runtime.v1.FileMeta + (*GetFileRequest)(nil), // 10: spec.proto.runtime.v1.GetFileRequest + (*GetFileResponse)(nil), // 11: spec.proto.runtime.v1.GetFileResponse + (*PutFileRequest)(nil), // 12: spec.proto.runtime.v1.PutFileRequest + (*FileRequest)(nil), // 13: spec.proto.runtime.v1.FileRequest + (*ListFileRequest)(nil), // 14: spec.proto.runtime.v1.ListFileRequest + (*FileInfo)(nil), // 15: spec.proto.runtime.v1.FileInfo + (*ListFileResp)(nil), // 16: spec.proto.runtime.v1.ListFileResp + (*DelFileRequest)(nil), // 17: spec.proto.runtime.v1.DelFileRequest + (*GetNextIdRequest)(nil), // 18: spec.proto.runtime.v1.GetNextIdRequest + (*SequencerOptions)(nil), // 19: spec.proto.runtime.v1.SequencerOptions + (*GetNextIdResponse)(nil), // 20: spec.proto.runtime.v1.GetNextIdResponse + (*TryLockRequest)(nil), // 21: spec.proto.runtime.v1.TryLockRequest + (*TryLockResponse)(nil), // 22: spec.proto.runtime.v1.TryLockResponse + (*UnlockRequest)(nil), // 23: spec.proto.runtime.v1.UnlockRequest + (*UnlockResponse)(nil), // 24: spec.proto.runtime.v1.UnlockResponse + (*LockKeepAliveRequest)(nil), // 25: spec.proto.runtime.v1.LockKeepAliveRequest + (*LockKeepAliveResponse)(nil), // 26: spec.proto.runtime.v1.LockKeepAliveResponse + (*SayHelloRequest)(nil), // 27: spec.proto.runtime.v1.SayHelloRequest + (*SayHelloResponse)(nil), // 28: spec.proto.runtime.v1.SayHelloResponse + (*InvokeServiceRequest)(nil), // 29: spec.proto.runtime.v1.InvokeServiceRequest + (*CommonInvokeRequest)(nil), // 30: spec.proto.runtime.v1.CommonInvokeRequest + (*HTTPExtension)(nil), // 31: spec.proto.runtime.v1.HTTPExtension + (*InvokeResponse)(nil), // 32: spec.proto.runtime.v1.InvokeResponse + (*ConfigurationItem)(nil), // 33: spec.proto.runtime.v1.ConfigurationItem + (*GetConfigurationRequest)(nil), // 34: spec.proto.runtime.v1.GetConfigurationRequest + (*GetConfigurationResponse)(nil), // 35: spec.proto.runtime.v1.GetConfigurationResponse + (*SubscribeConfigurationRequest)(nil), // 36: spec.proto.runtime.v1.SubscribeConfigurationRequest + (*SubscribeConfigurationResponse)(nil), // 37: spec.proto.runtime.v1.SubscribeConfigurationResponse + (*SaveConfigurationRequest)(nil), // 38: spec.proto.runtime.v1.SaveConfigurationRequest + (*DeleteConfigurationRequest)(nil), // 39: spec.proto.runtime.v1.DeleteConfigurationRequest + (*GetStateRequest)(nil), // 40: spec.proto.runtime.v1.GetStateRequest + (*GetBulkStateRequest)(nil), // 41: spec.proto.runtime.v1.GetBulkStateRequest + (*GetBulkStateResponse)(nil), // 42: spec.proto.runtime.v1.GetBulkStateResponse + (*BulkStateItem)(nil), // 43: spec.proto.runtime.v1.BulkStateItem + (*GetStateResponse)(nil), // 44: spec.proto.runtime.v1.GetStateResponse + (*DeleteStateRequest)(nil), // 45: spec.proto.runtime.v1.DeleteStateRequest + (*DeleteBulkStateRequest)(nil), // 46: spec.proto.runtime.v1.DeleteBulkStateRequest + (*SaveStateRequest)(nil), // 47: spec.proto.runtime.v1.SaveStateRequest + (*StateItem)(nil), // 48: spec.proto.runtime.v1.StateItem + (*Etag)(nil), // 49: spec.proto.runtime.v1.Etag + (*StateOptions)(nil), // 50: spec.proto.runtime.v1.StateOptions + (*TransactionalStateOperation)(nil), // 51: spec.proto.runtime.v1.TransactionalStateOperation + (*ExecuteStateTransactionRequest)(nil), // 52: spec.proto.runtime.v1.ExecuteStateTransactionRequest + (*PublishEventRequest)(nil), // 53: spec.proto.runtime.v1.PublishEventRequest + (*SubscribeTopicEventsRequest)(nil), // 54: spec.proto.runtime.v1.SubscribeTopicEventsRequest + (*SubscribeTopicEventsRequestInitial)(nil), // 55: spec.proto.runtime.v1.SubscribeTopicEventsRequestInitial + (*SubscribeTopicEventsRequestProcessed)(nil), // 56: spec.proto.runtime.v1.SubscribeTopicEventsRequestProcessed + (*SubscribeTopicEventsResponse)(nil), // 57: spec.proto.runtime.v1.SubscribeTopicEventsResponse + (*SubscribeTopicEventsResponseInitial)(nil), // 58: spec.proto.runtime.v1.SubscribeTopicEventsResponseInitial + (*InvokeBindingRequest)(nil), // 59: spec.proto.runtime.v1.InvokeBindingRequest + (*InvokeBindingResponse)(nil), // 60: spec.proto.runtime.v1.InvokeBindingResponse + (*GetSecretRequest)(nil), // 61: spec.proto.runtime.v1.GetSecretRequest + (*GetSecretResponse)(nil), // 62: spec.proto.runtime.v1.GetSecretResponse + (*GetBulkSecretRequest)(nil), // 63: spec.proto.runtime.v1.GetBulkSecretRequest + (*GetBulkSecretResponse)(nil), // 64: spec.proto.runtime.v1.GetBulkSecretResponse + (*SecretResponse)(nil), // 65: spec.proto.runtime.v1.SecretResponse + nil, // 66: spec.proto.runtime.v1.FileMeta.MetadataEntry + nil, // 67: spec.proto.runtime.v1.GetFileRequest.MetadataEntry + nil, // 68: spec.proto.runtime.v1.PutFileRequest.MetadataEntry + nil, // 69: spec.proto.runtime.v1.FileRequest.MetadataEntry + nil, // 70: spec.proto.runtime.v1.FileInfo.MetadataEntry + nil, // 71: spec.proto.runtime.v1.GetNextIdRequest.MetadataEntry + nil, // 72: spec.proto.runtime.v1.ConfigurationItem.TagsEntry + nil, // 73: spec.proto.runtime.v1.ConfigurationItem.MetadataEntry + nil, // 74: spec.proto.runtime.v1.GetConfigurationRequest.MetadataEntry + nil, // 75: spec.proto.runtime.v1.SubscribeConfigurationRequest.MetadataEntry + nil, // 76: spec.proto.runtime.v1.SaveConfigurationRequest.MetadataEntry + nil, // 77: spec.proto.runtime.v1.DeleteConfigurationRequest.MetadataEntry + nil, // 78: spec.proto.runtime.v1.GetStateRequest.MetadataEntry + nil, // 79: spec.proto.runtime.v1.GetBulkStateRequest.MetadataEntry + nil, // 80: spec.proto.runtime.v1.BulkStateItem.MetadataEntry + nil, // 81: spec.proto.runtime.v1.GetStateResponse.MetadataEntry + nil, // 82: spec.proto.runtime.v1.DeleteStateRequest.MetadataEntry + nil, // 83: spec.proto.runtime.v1.StateItem.MetadataEntry + nil, // 84: spec.proto.runtime.v1.ExecuteStateTransactionRequest.MetadataEntry + nil, // 85: spec.proto.runtime.v1.PublishEventRequest.MetadataEntry + nil, // 86: spec.proto.runtime.v1.SubscribeTopicEventsRequestInitial.MetadataEntry + nil, // 87: spec.proto.runtime.v1.InvokeBindingRequest.MetadataEntry + nil, // 88: spec.proto.runtime.v1.InvokeBindingResponse.MetadataEntry + nil, // 89: spec.proto.runtime.v1.GetSecretRequest.MetadataEntry + nil, // 90: spec.proto.runtime.v1.GetSecretResponse.DataEntry + nil, // 91: spec.proto.runtime.v1.GetBulkSecretRequest.MetadataEntry + nil, // 92: spec.proto.runtime.v1.GetBulkSecretResponse.DataEntry + nil, // 93: spec.proto.runtime.v1.SecretResponse.SecretsEntry + (*anypb.Any)(nil), // 94: google.protobuf.Any + (*TopicEventResponse)(nil), // 95: spec.proto.runtime.v1.TopicEventResponse + (*TopicEventRequest)(nil), // 96: spec.proto.runtime.v1.TopicEventRequest + (*emptypb.Empty)(nil), // 97: google.protobuf.Empty } var file_runtime_proto_depIdxs = []int32{ 13, // 0: spec.proto.runtime.v1.GetFileMetaRequest.request:type_name -> spec.proto.runtime.v1.FileRequest 9, // 1: spec.proto.runtime.v1.GetFileMetaResponse.response:type_name -> spec.proto.runtime.v1.FileMeta - 61, // 2: spec.proto.runtime.v1.FileMeta.metadata:type_name -> spec.proto.runtime.v1.FileMeta.MetadataEntry - 62, // 3: spec.proto.runtime.v1.GetFileRequest.metadata:type_name -> spec.proto.runtime.v1.GetFileRequest.MetadataEntry - 63, // 4: spec.proto.runtime.v1.PutFileRequest.metadata:type_name -> spec.proto.runtime.v1.PutFileRequest.MetadataEntry - 64, // 5: spec.proto.runtime.v1.FileRequest.metadata:type_name -> spec.proto.runtime.v1.FileRequest.MetadataEntry + 66, // 2: spec.proto.runtime.v1.FileMeta.metadata:type_name -> spec.proto.runtime.v1.FileMeta.MetadataEntry + 67, // 3: spec.proto.runtime.v1.GetFileRequest.metadata:type_name -> spec.proto.runtime.v1.GetFileRequest.MetadataEntry + 68, // 4: spec.proto.runtime.v1.PutFileRequest.metadata:type_name -> spec.proto.runtime.v1.PutFileRequest.MetadataEntry + 69, // 5: spec.proto.runtime.v1.FileRequest.metadata:type_name -> spec.proto.runtime.v1.FileRequest.MetadataEntry 13, // 6: spec.proto.runtime.v1.ListFileRequest.request:type_name -> spec.proto.runtime.v1.FileRequest - 65, // 7: spec.proto.runtime.v1.FileInfo.metadata:type_name -> spec.proto.runtime.v1.FileInfo.MetadataEntry + 70, // 7: spec.proto.runtime.v1.FileInfo.metadata:type_name -> spec.proto.runtime.v1.FileInfo.MetadataEntry 15, // 8: spec.proto.runtime.v1.ListFileResp.files:type_name -> spec.proto.runtime.v1.FileInfo 13, // 9: spec.proto.runtime.v1.DelFileRequest.request:type_name -> spec.proto.runtime.v1.FileRequest 19, // 10: spec.proto.runtime.v1.GetNextIdRequest.options:type_name -> spec.proto.runtime.v1.SequencerOptions - 66, // 11: spec.proto.runtime.v1.GetNextIdRequest.metadata:type_name -> spec.proto.runtime.v1.GetNextIdRequest.MetadataEntry + 71, // 11: spec.proto.runtime.v1.GetNextIdRequest.metadata:type_name -> spec.proto.runtime.v1.GetNextIdRequest.MetadataEntry 0, // 12: spec.proto.runtime.v1.SequencerOptions.increment:type_name -> spec.proto.runtime.v1.SequencerOptions.AutoIncrement 1, // 13: spec.proto.runtime.v1.UnlockResponse.status:type_name -> spec.proto.runtime.v1.UnlockResponse.Status 2, // 14: spec.proto.runtime.v1.LockKeepAliveResponse.status:type_name -> spec.proto.runtime.v1.LockKeepAliveResponse.Status - 88, // 15: spec.proto.runtime.v1.SayHelloRequest.data:type_name -> google.protobuf.Any - 88, // 16: spec.proto.runtime.v1.SayHelloResponse.data:type_name -> google.protobuf.Any + 94, // 15: spec.proto.runtime.v1.SayHelloRequest.data:type_name -> google.protobuf.Any + 94, // 16: spec.proto.runtime.v1.SayHelloResponse.data:type_name -> google.protobuf.Any 30, // 17: spec.proto.runtime.v1.InvokeServiceRequest.message:type_name -> spec.proto.runtime.v1.CommonInvokeRequest - 88, // 18: spec.proto.runtime.v1.CommonInvokeRequest.data:type_name -> google.protobuf.Any + 94, // 18: spec.proto.runtime.v1.CommonInvokeRequest.data:type_name -> google.protobuf.Any 31, // 19: spec.proto.runtime.v1.CommonInvokeRequest.http_extension:type_name -> spec.proto.runtime.v1.HTTPExtension 3, // 20: spec.proto.runtime.v1.HTTPExtension.verb:type_name -> spec.proto.runtime.v1.HTTPExtension.Verb - 88, // 21: spec.proto.runtime.v1.InvokeResponse.data:type_name -> google.protobuf.Any - 67, // 22: spec.proto.runtime.v1.ConfigurationItem.tags:type_name -> spec.proto.runtime.v1.ConfigurationItem.TagsEntry - 68, // 23: spec.proto.runtime.v1.ConfigurationItem.metadata:type_name -> spec.proto.runtime.v1.ConfigurationItem.MetadataEntry - 69, // 24: spec.proto.runtime.v1.GetConfigurationRequest.metadata:type_name -> spec.proto.runtime.v1.GetConfigurationRequest.MetadataEntry + 94, // 21: spec.proto.runtime.v1.InvokeResponse.data:type_name -> google.protobuf.Any + 72, // 22: spec.proto.runtime.v1.ConfigurationItem.tags:type_name -> spec.proto.runtime.v1.ConfigurationItem.TagsEntry + 73, // 23: spec.proto.runtime.v1.ConfigurationItem.metadata:type_name -> spec.proto.runtime.v1.ConfigurationItem.MetadataEntry + 74, // 24: spec.proto.runtime.v1.GetConfigurationRequest.metadata:type_name -> spec.proto.runtime.v1.GetConfigurationRequest.MetadataEntry 33, // 25: spec.proto.runtime.v1.GetConfigurationResponse.items:type_name -> spec.proto.runtime.v1.ConfigurationItem - 70, // 26: spec.proto.runtime.v1.SubscribeConfigurationRequest.metadata:type_name -> spec.proto.runtime.v1.SubscribeConfigurationRequest.MetadataEntry + 75, // 26: spec.proto.runtime.v1.SubscribeConfigurationRequest.metadata:type_name -> spec.proto.runtime.v1.SubscribeConfigurationRequest.MetadataEntry 33, // 27: spec.proto.runtime.v1.SubscribeConfigurationResponse.items:type_name -> spec.proto.runtime.v1.ConfigurationItem 33, // 28: spec.proto.runtime.v1.SaveConfigurationRequest.items:type_name -> spec.proto.runtime.v1.ConfigurationItem - 71, // 29: spec.proto.runtime.v1.SaveConfigurationRequest.metadata:type_name -> spec.proto.runtime.v1.SaveConfigurationRequest.MetadataEntry - 72, // 30: spec.proto.runtime.v1.DeleteConfigurationRequest.metadata:type_name -> spec.proto.runtime.v1.DeleteConfigurationRequest.MetadataEntry + 76, // 29: spec.proto.runtime.v1.SaveConfigurationRequest.metadata:type_name -> spec.proto.runtime.v1.SaveConfigurationRequest.MetadataEntry + 77, // 30: spec.proto.runtime.v1.DeleteConfigurationRequest.metadata:type_name -> spec.proto.runtime.v1.DeleteConfigurationRequest.MetadataEntry 5, // 31: spec.proto.runtime.v1.GetStateRequest.consistency:type_name -> spec.proto.runtime.v1.StateOptions.StateConsistency - 73, // 32: spec.proto.runtime.v1.GetStateRequest.metadata:type_name -> spec.proto.runtime.v1.GetStateRequest.MetadataEntry - 74, // 33: spec.proto.runtime.v1.GetBulkStateRequest.metadata:type_name -> spec.proto.runtime.v1.GetBulkStateRequest.MetadataEntry + 78, // 32: spec.proto.runtime.v1.GetStateRequest.metadata:type_name -> spec.proto.runtime.v1.GetStateRequest.MetadataEntry + 79, // 33: spec.proto.runtime.v1.GetBulkStateRequest.metadata:type_name -> spec.proto.runtime.v1.GetBulkStateRequest.MetadataEntry 43, // 34: spec.proto.runtime.v1.GetBulkStateResponse.items:type_name -> spec.proto.runtime.v1.BulkStateItem - 75, // 35: spec.proto.runtime.v1.BulkStateItem.metadata:type_name -> spec.proto.runtime.v1.BulkStateItem.MetadataEntry - 76, // 36: spec.proto.runtime.v1.GetStateResponse.metadata:type_name -> spec.proto.runtime.v1.GetStateResponse.MetadataEntry + 80, // 35: spec.proto.runtime.v1.BulkStateItem.metadata:type_name -> spec.proto.runtime.v1.BulkStateItem.MetadataEntry + 81, // 36: spec.proto.runtime.v1.GetStateResponse.metadata:type_name -> spec.proto.runtime.v1.GetStateResponse.MetadataEntry 49, // 37: spec.proto.runtime.v1.DeleteStateRequest.etag:type_name -> spec.proto.runtime.v1.Etag 50, // 38: spec.proto.runtime.v1.DeleteStateRequest.options:type_name -> spec.proto.runtime.v1.StateOptions - 77, // 39: spec.proto.runtime.v1.DeleteStateRequest.metadata:type_name -> spec.proto.runtime.v1.DeleteStateRequest.MetadataEntry + 82, // 39: spec.proto.runtime.v1.DeleteStateRequest.metadata:type_name -> spec.proto.runtime.v1.DeleteStateRequest.MetadataEntry 48, // 40: spec.proto.runtime.v1.DeleteBulkStateRequest.states:type_name -> spec.proto.runtime.v1.StateItem 48, // 41: spec.proto.runtime.v1.SaveStateRequest.states:type_name -> spec.proto.runtime.v1.StateItem 49, // 42: spec.proto.runtime.v1.StateItem.etag:type_name -> spec.proto.runtime.v1.Etag - 78, // 43: spec.proto.runtime.v1.StateItem.metadata:type_name -> spec.proto.runtime.v1.StateItem.MetadataEntry + 83, // 43: spec.proto.runtime.v1.StateItem.metadata:type_name -> spec.proto.runtime.v1.StateItem.MetadataEntry 50, // 44: spec.proto.runtime.v1.StateItem.options:type_name -> spec.proto.runtime.v1.StateOptions 4, // 45: spec.proto.runtime.v1.StateOptions.concurrency:type_name -> spec.proto.runtime.v1.StateOptions.StateConcurrency 5, // 46: spec.proto.runtime.v1.StateOptions.consistency:type_name -> spec.proto.runtime.v1.StateOptions.StateConsistency 48, // 47: spec.proto.runtime.v1.TransactionalStateOperation.request:type_name -> spec.proto.runtime.v1.StateItem 51, // 48: spec.proto.runtime.v1.ExecuteStateTransactionRequest.operations:type_name -> spec.proto.runtime.v1.TransactionalStateOperation - 79, // 49: spec.proto.runtime.v1.ExecuteStateTransactionRequest.metadata:type_name -> spec.proto.runtime.v1.ExecuteStateTransactionRequest.MetadataEntry - 80, // 50: spec.proto.runtime.v1.PublishEventRequest.metadata:type_name -> spec.proto.runtime.v1.PublishEventRequest.MetadataEntry - 81, // 51: spec.proto.runtime.v1.InvokeBindingRequest.metadata:type_name -> spec.proto.runtime.v1.InvokeBindingRequest.MetadataEntry - 82, // 52: spec.proto.runtime.v1.InvokeBindingResponse.metadata:type_name -> spec.proto.runtime.v1.InvokeBindingResponse.MetadataEntry - 83, // 53: spec.proto.runtime.v1.GetSecretRequest.metadata:type_name -> spec.proto.runtime.v1.GetSecretRequest.MetadataEntry - 84, // 54: spec.proto.runtime.v1.GetSecretResponse.data:type_name -> spec.proto.runtime.v1.GetSecretResponse.DataEntry - 85, // 55: spec.proto.runtime.v1.GetBulkSecretRequest.metadata:type_name -> spec.proto.runtime.v1.GetBulkSecretRequest.MetadataEntry - 86, // 56: spec.proto.runtime.v1.GetBulkSecretResponse.data:type_name -> spec.proto.runtime.v1.GetBulkSecretResponse.DataEntry - 87, // 57: spec.proto.runtime.v1.SecretResponse.secrets:type_name -> spec.proto.runtime.v1.SecretResponse.SecretsEntry - 8, // 58: spec.proto.runtime.v1.FileMeta.MetadataEntry.value:type_name -> spec.proto.runtime.v1.FileMetaValue - 60, // 59: spec.proto.runtime.v1.GetBulkSecretResponse.DataEntry.value:type_name -> spec.proto.runtime.v1.SecretResponse - 27, // 60: spec.proto.runtime.v1.Runtime.SayHello:input_type -> spec.proto.runtime.v1.SayHelloRequest - 29, // 61: spec.proto.runtime.v1.Runtime.InvokeService:input_type -> spec.proto.runtime.v1.InvokeServiceRequest - 34, // 62: spec.proto.runtime.v1.Runtime.GetConfiguration:input_type -> spec.proto.runtime.v1.GetConfigurationRequest - 38, // 63: spec.proto.runtime.v1.Runtime.SaveConfiguration:input_type -> spec.proto.runtime.v1.SaveConfigurationRequest - 39, // 64: spec.proto.runtime.v1.Runtime.DeleteConfiguration:input_type -> spec.proto.runtime.v1.DeleteConfigurationRequest - 36, // 65: spec.proto.runtime.v1.Runtime.SubscribeConfiguration:input_type -> spec.proto.runtime.v1.SubscribeConfigurationRequest - 21, // 66: spec.proto.runtime.v1.Runtime.TryLock:input_type -> spec.proto.runtime.v1.TryLockRequest - 23, // 67: spec.proto.runtime.v1.Runtime.Unlock:input_type -> spec.proto.runtime.v1.UnlockRequest - 25, // 68: spec.proto.runtime.v1.Runtime.LockKeepAlive:input_type -> spec.proto.runtime.v1.LockKeepAliveRequest - 18, // 69: spec.proto.runtime.v1.Runtime.GetNextId:input_type -> spec.proto.runtime.v1.GetNextIdRequest - 40, // 70: spec.proto.runtime.v1.Runtime.GetState:input_type -> spec.proto.runtime.v1.GetStateRequest - 41, // 71: spec.proto.runtime.v1.Runtime.GetBulkState:input_type -> spec.proto.runtime.v1.GetBulkStateRequest - 47, // 72: spec.proto.runtime.v1.Runtime.SaveState:input_type -> spec.proto.runtime.v1.SaveStateRequest - 45, // 73: spec.proto.runtime.v1.Runtime.DeleteState:input_type -> spec.proto.runtime.v1.DeleteStateRequest - 46, // 74: spec.proto.runtime.v1.Runtime.DeleteBulkState:input_type -> spec.proto.runtime.v1.DeleteBulkStateRequest - 52, // 75: spec.proto.runtime.v1.Runtime.ExecuteStateTransaction:input_type -> spec.proto.runtime.v1.ExecuteStateTransactionRequest - 53, // 76: spec.proto.runtime.v1.Runtime.PublishEvent:input_type -> spec.proto.runtime.v1.PublishEventRequest - 10, // 77: spec.proto.runtime.v1.Runtime.GetFile:input_type -> spec.proto.runtime.v1.GetFileRequest - 12, // 78: spec.proto.runtime.v1.Runtime.PutFile:input_type -> spec.proto.runtime.v1.PutFileRequest - 14, // 79: spec.proto.runtime.v1.Runtime.ListFile:input_type -> spec.proto.runtime.v1.ListFileRequest - 17, // 80: spec.proto.runtime.v1.Runtime.DelFile:input_type -> spec.proto.runtime.v1.DelFileRequest - 6, // 81: spec.proto.runtime.v1.Runtime.GetFileMeta:input_type -> spec.proto.runtime.v1.GetFileMetaRequest - 54, // 82: spec.proto.runtime.v1.Runtime.InvokeBinding:input_type -> spec.proto.runtime.v1.InvokeBindingRequest - 56, // 83: spec.proto.runtime.v1.Runtime.GetSecret:input_type -> spec.proto.runtime.v1.GetSecretRequest - 58, // 84: spec.proto.runtime.v1.Runtime.GetBulkSecret:input_type -> spec.proto.runtime.v1.GetBulkSecretRequest - 28, // 85: spec.proto.runtime.v1.Runtime.SayHello:output_type -> spec.proto.runtime.v1.SayHelloResponse - 32, // 86: spec.proto.runtime.v1.Runtime.InvokeService:output_type -> spec.proto.runtime.v1.InvokeResponse - 35, // 87: spec.proto.runtime.v1.Runtime.GetConfiguration:output_type -> spec.proto.runtime.v1.GetConfigurationResponse - 89, // 88: spec.proto.runtime.v1.Runtime.SaveConfiguration:output_type -> google.protobuf.Empty - 89, // 89: spec.proto.runtime.v1.Runtime.DeleteConfiguration:output_type -> google.protobuf.Empty - 37, // 90: spec.proto.runtime.v1.Runtime.SubscribeConfiguration:output_type -> spec.proto.runtime.v1.SubscribeConfigurationResponse - 22, // 91: spec.proto.runtime.v1.Runtime.TryLock:output_type -> spec.proto.runtime.v1.TryLockResponse - 24, // 92: spec.proto.runtime.v1.Runtime.Unlock:output_type -> spec.proto.runtime.v1.UnlockResponse - 26, // 93: spec.proto.runtime.v1.Runtime.LockKeepAlive:output_type -> spec.proto.runtime.v1.LockKeepAliveResponse - 20, // 94: spec.proto.runtime.v1.Runtime.GetNextId:output_type -> spec.proto.runtime.v1.GetNextIdResponse - 44, // 95: spec.proto.runtime.v1.Runtime.GetState:output_type -> spec.proto.runtime.v1.GetStateResponse - 42, // 96: spec.proto.runtime.v1.Runtime.GetBulkState:output_type -> spec.proto.runtime.v1.GetBulkStateResponse - 89, // 97: spec.proto.runtime.v1.Runtime.SaveState:output_type -> google.protobuf.Empty - 89, // 98: spec.proto.runtime.v1.Runtime.DeleteState:output_type -> google.protobuf.Empty - 89, // 99: spec.proto.runtime.v1.Runtime.DeleteBulkState:output_type -> google.protobuf.Empty - 89, // 100: spec.proto.runtime.v1.Runtime.ExecuteStateTransaction:output_type -> google.protobuf.Empty - 89, // 101: spec.proto.runtime.v1.Runtime.PublishEvent:output_type -> google.protobuf.Empty - 11, // 102: spec.proto.runtime.v1.Runtime.GetFile:output_type -> spec.proto.runtime.v1.GetFileResponse - 89, // 103: spec.proto.runtime.v1.Runtime.PutFile:output_type -> google.protobuf.Empty - 16, // 104: spec.proto.runtime.v1.Runtime.ListFile:output_type -> spec.proto.runtime.v1.ListFileResp - 89, // 105: spec.proto.runtime.v1.Runtime.DelFile:output_type -> google.protobuf.Empty - 7, // 106: spec.proto.runtime.v1.Runtime.GetFileMeta:output_type -> spec.proto.runtime.v1.GetFileMetaResponse - 55, // 107: spec.proto.runtime.v1.Runtime.InvokeBinding:output_type -> spec.proto.runtime.v1.InvokeBindingResponse - 57, // 108: spec.proto.runtime.v1.Runtime.GetSecret:output_type -> spec.proto.runtime.v1.GetSecretResponse - 59, // 109: spec.proto.runtime.v1.Runtime.GetBulkSecret:output_type -> spec.proto.runtime.v1.GetBulkSecretResponse - 85, // [85:110] is the sub-list for method output_type - 60, // [60:85] is the sub-list for method input_type - 60, // [60:60] is the sub-list for extension type_name - 60, // [60:60] is the sub-list for extension extendee - 0, // [0:60] is the sub-list for field type_name + 84, // 49: spec.proto.runtime.v1.ExecuteStateTransactionRequest.metadata:type_name -> spec.proto.runtime.v1.ExecuteStateTransactionRequest.MetadataEntry + 85, // 50: spec.proto.runtime.v1.PublishEventRequest.metadata:type_name -> spec.proto.runtime.v1.PublishEventRequest.MetadataEntry + 55, // 51: spec.proto.runtime.v1.SubscribeTopicEventsRequest.initial_request:type_name -> spec.proto.runtime.v1.SubscribeTopicEventsRequestInitial + 56, // 52: spec.proto.runtime.v1.SubscribeTopicEventsRequest.event_processed:type_name -> spec.proto.runtime.v1.SubscribeTopicEventsRequestProcessed + 86, // 53: spec.proto.runtime.v1.SubscribeTopicEventsRequestInitial.metadata:type_name -> spec.proto.runtime.v1.SubscribeTopicEventsRequestInitial.MetadataEntry + 95, // 54: spec.proto.runtime.v1.SubscribeTopicEventsRequestProcessed.status:type_name -> spec.proto.runtime.v1.TopicEventResponse + 58, // 55: spec.proto.runtime.v1.SubscribeTopicEventsResponse.initial_response:type_name -> spec.proto.runtime.v1.SubscribeTopicEventsResponseInitial + 96, // 56: spec.proto.runtime.v1.SubscribeTopicEventsResponse.event_message:type_name -> spec.proto.runtime.v1.TopicEventRequest + 87, // 57: spec.proto.runtime.v1.InvokeBindingRequest.metadata:type_name -> spec.proto.runtime.v1.InvokeBindingRequest.MetadataEntry + 88, // 58: spec.proto.runtime.v1.InvokeBindingResponse.metadata:type_name -> spec.proto.runtime.v1.InvokeBindingResponse.MetadataEntry + 89, // 59: spec.proto.runtime.v1.GetSecretRequest.metadata:type_name -> spec.proto.runtime.v1.GetSecretRequest.MetadataEntry + 90, // 60: spec.proto.runtime.v1.GetSecretResponse.data:type_name -> spec.proto.runtime.v1.GetSecretResponse.DataEntry + 91, // 61: spec.proto.runtime.v1.GetBulkSecretRequest.metadata:type_name -> spec.proto.runtime.v1.GetBulkSecretRequest.MetadataEntry + 92, // 62: spec.proto.runtime.v1.GetBulkSecretResponse.data:type_name -> spec.proto.runtime.v1.GetBulkSecretResponse.DataEntry + 93, // 63: spec.proto.runtime.v1.SecretResponse.secrets:type_name -> spec.proto.runtime.v1.SecretResponse.SecretsEntry + 8, // 64: spec.proto.runtime.v1.FileMeta.MetadataEntry.value:type_name -> spec.proto.runtime.v1.FileMetaValue + 65, // 65: spec.proto.runtime.v1.GetBulkSecretResponse.DataEntry.value:type_name -> spec.proto.runtime.v1.SecretResponse + 27, // 66: spec.proto.runtime.v1.Runtime.SayHello:input_type -> spec.proto.runtime.v1.SayHelloRequest + 29, // 67: spec.proto.runtime.v1.Runtime.InvokeService:input_type -> spec.proto.runtime.v1.InvokeServiceRequest + 34, // 68: spec.proto.runtime.v1.Runtime.GetConfiguration:input_type -> spec.proto.runtime.v1.GetConfigurationRequest + 38, // 69: spec.proto.runtime.v1.Runtime.SaveConfiguration:input_type -> spec.proto.runtime.v1.SaveConfigurationRequest + 39, // 70: spec.proto.runtime.v1.Runtime.DeleteConfiguration:input_type -> spec.proto.runtime.v1.DeleteConfigurationRequest + 36, // 71: spec.proto.runtime.v1.Runtime.SubscribeConfiguration:input_type -> spec.proto.runtime.v1.SubscribeConfigurationRequest + 21, // 72: spec.proto.runtime.v1.Runtime.TryLock:input_type -> spec.proto.runtime.v1.TryLockRequest + 23, // 73: spec.proto.runtime.v1.Runtime.Unlock:input_type -> spec.proto.runtime.v1.UnlockRequest + 25, // 74: spec.proto.runtime.v1.Runtime.LockKeepAlive:input_type -> spec.proto.runtime.v1.LockKeepAliveRequest + 18, // 75: spec.proto.runtime.v1.Runtime.GetNextId:input_type -> spec.proto.runtime.v1.GetNextIdRequest + 40, // 76: spec.proto.runtime.v1.Runtime.GetState:input_type -> spec.proto.runtime.v1.GetStateRequest + 41, // 77: spec.proto.runtime.v1.Runtime.GetBulkState:input_type -> spec.proto.runtime.v1.GetBulkStateRequest + 47, // 78: spec.proto.runtime.v1.Runtime.SaveState:input_type -> spec.proto.runtime.v1.SaveStateRequest + 45, // 79: spec.proto.runtime.v1.Runtime.DeleteState:input_type -> spec.proto.runtime.v1.DeleteStateRequest + 46, // 80: spec.proto.runtime.v1.Runtime.DeleteBulkState:input_type -> spec.proto.runtime.v1.DeleteBulkStateRequest + 52, // 81: spec.proto.runtime.v1.Runtime.ExecuteStateTransaction:input_type -> spec.proto.runtime.v1.ExecuteStateTransactionRequest + 53, // 82: spec.proto.runtime.v1.Runtime.PublishEvent:input_type -> spec.proto.runtime.v1.PublishEventRequest + 54, // 83: spec.proto.runtime.v1.Runtime.SubscribeTopicEvents:input_type -> spec.proto.runtime.v1.SubscribeTopicEventsRequest + 10, // 84: spec.proto.runtime.v1.Runtime.GetFile:input_type -> spec.proto.runtime.v1.GetFileRequest + 12, // 85: spec.proto.runtime.v1.Runtime.PutFile:input_type -> spec.proto.runtime.v1.PutFileRequest + 14, // 86: spec.proto.runtime.v1.Runtime.ListFile:input_type -> spec.proto.runtime.v1.ListFileRequest + 17, // 87: spec.proto.runtime.v1.Runtime.DelFile:input_type -> spec.proto.runtime.v1.DelFileRequest + 6, // 88: spec.proto.runtime.v1.Runtime.GetFileMeta:input_type -> spec.proto.runtime.v1.GetFileMetaRequest + 59, // 89: spec.proto.runtime.v1.Runtime.InvokeBinding:input_type -> spec.proto.runtime.v1.InvokeBindingRequest + 61, // 90: spec.proto.runtime.v1.Runtime.GetSecret:input_type -> spec.proto.runtime.v1.GetSecretRequest + 63, // 91: spec.proto.runtime.v1.Runtime.GetBulkSecret:input_type -> spec.proto.runtime.v1.GetBulkSecretRequest + 28, // 92: spec.proto.runtime.v1.Runtime.SayHello:output_type -> spec.proto.runtime.v1.SayHelloResponse + 32, // 93: spec.proto.runtime.v1.Runtime.InvokeService:output_type -> spec.proto.runtime.v1.InvokeResponse + 35, // 94: spec.proto.runtime.v1.Runtime.GetConfiguration:output_type -> spec.proto.runtime.v1.GetConfigurationResponse + 97, // 95: spec.proto.runtime.v1.Runtime.SaveConfiguration:output_type -> google.protobuf.Empty + 97, // 96: spec.proto.runtime.v1.Runtime.DeleteConfiguration:output_type -> google.protobuf.Empty + 37, // 97: spec.proto.runtime.v1.Runtime.SubscribeConfiguration:output_type -> spec.proto.runtime.v1.SubscribeConfigurationResponse + 22, // 98: spec.proto.runtime.v1.Runtime.TryLock:output_type -> spec.proto.runtime.v1.TryLockResponse + 24, // 99: spec.proto.runtime.v1.Runtime.Unlock:output_type -> spec.proto.runtime.v1.UnlockResponse + 26, // 100: spec.proto.runtime.v1.Runtime.LockKeepAlive:output_type -> spec.proto.runtime.v1.LockKeepAliveResponse + 20, // 101: spec.proto.runtime.v1.Runtime.GetNextId:output_type -> spec.proto.runtime.v1.GetNextIdResponse + 44, // 102: spec.proto.runtime.v1.Runtime.GetState:output_type -> spec.proto.runtime.v1.GetStateResponse + 42, // 103: spec.proto.runtime.v1.Runtime.GetBulkState:output_type -> spec.proto.runtime.v1.GetBulkStateResponse + 97, // 104: spec.proto.runtime.v1.Runtime.SaveState:output_type -> google.protobuf.Empty + 97, // 105: spec.proto.runtime.v1.Runtime.DeleteState:output_type -> google.protobuf.Empty + 97, // 106: spec.proto.runtime.v1.Runtime.DeleteBulkState:output_type -> google.protobuf.Empty + 97, // 107: spec.proto.runtime.v1.Runtime.ExecuteStateTransaction:output_type -> google.protobuf.Empty + 97, // 108: spec.proto.runtime.v1.Runtime.PublishEvent:output_type -> google.protobuf.Empty + 57, // 109: spec.proto.runtime.v1.Runtime.SubscribeTopicEvents:output_type -> spec.proto.runtime.v1.SubscribeTopicEventsResponse + 11, // 110: spec.proto.runtime.v1.Runtime.GetFile:output_type -> spec.proto.runtime.v1.GetFileResponse + 97, // 111: spec.proto.runtime.v1.Runtime.PutFile:output_type -> google.protobuf.Empty + 16, // 112: spec.proto.runtime.v1.Runtime.ListFile:output_type -> spec.proto.runtime.v1.ListFileResp + 97, // 113: spec.proto.runtime.v1.Runtime.DelFile:output_type -> google.protobuf.Empty + 7, // 114: spec.proto.runtime.v1.Runtime.GetFileMeta:output_type -> spec.proto.runtime.v1.GetFileMetaResponse + 60, // 115: spec.proto.runtime.v1.Runtime.InvokeBinding:output_type -> spec.proto.runtime.v1.InvokeBindingResponse + 62, // 116: spec.proto.runtime.v1.Runtime.GetSecret:output_type -> spec.proto.runtime.v1.GetSecretResponse + 64, // 117: spec.proto.runtime.v1.Runtime.GetBulkSecret:output_type -> spec.proto.runtime.v1.GetBulkSecretResponse + 92, // [92:118] is the sub-list for method output_type + 66, // [66:92] is the sub-list for method input_type + 66, // [66:66] is the sub-list for extension type_name + 66, // [66:66] is the sub-list for extension extendee + 0, // [0:66] is the sub-list for field type_name } func init() { file_runtime_proto_init() } @@ -5046,6 +5486,7 @@ func file_runtime_proto_init() { if File_runtime_proto != nil { return } + file_appcallback_proto_init() if !protoimpl.UnsafeEnabled { file_runtime_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetFileMetaRequest); i { @@ -5624,7 +6065,7 @@ func file_runtime_proto_init() { } } file_runtime_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InvokeBindingRequest); i { + switch v := v.(*SubscribeTopicEventsRequest); i { case 0: return &v.state case 1: @@ -5636,7 +6077,7 @@ func file_runtime_proto_init() { } } file_runtime_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InvokeBindingResponse); i { + switch v := v.(*SubscribeTopicEventsRequestInitial); i { case 0: return &v.state case 1: @@ -5648,7 +6089,7 @@ func file_runtime_proto_init() { } } file_runtime_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetSecretRequest); i { + switch v := v.(*SubscribeTopicEventsRequestProcessed); i { case 0: return &v.state case 1: @@ -5660,7 +6101,7 @@ func file_runtime_proto_init() { } } file_runtime_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetSecretResponse); i { + switch v := v.(*SubscribeTopicEventsResponse); i { case 0: return &v.state case 1: @@ -5672,7 +6113,7 @@ func file_runtime_proto_init() { } } file_runtime_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBulkSecretRequest); i { + switch v := v.(*SubscribeTopicEventsResponseInitial); i { case 0: return &v.state case 1: @@ -5684,7 +6125,7 @@ func file_runtime_proto_init() { } } file_runtime_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBulkSecretResponse); i { + switch v := v.(*InvokeBindingRequest); i { case 0: return &v.state case 1: @@ -5696,6 +6137,66 @@ func file_runtime_proto_init() { } } file_runtime_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InvokeBindingResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_runtime_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetSecretRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_runtime_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetSecretResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_runtime_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetBulkSecretRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_runtime_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetBulkSecretResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_runtime_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SecretResponse); i { case 0: return &v.state @@ -5708,13 +6209,22 @@ func file_runtime_proto_init() { } } } + file_runtime_proto_msgTypes[48].OneofWrappers = []interface{}{ + (*SubscribeTopicEventsRequest_InitialRequest)(nil), + (*SubscribeTopicEventsRequest_EventProcessed)(nil), + } + file_runtime_proto_msgTypes[49].OneofWrappers = []interface{}{} + file_runtime_proto_msgTypes[51].OneofWrappers = []interface{}{ + (*SubscribeTopicEventsResponse_InitialResponse)(nil), + (*SubscribeTopicEventsResponse_EventMessage)(nil), + } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_runtime_proto_rawDesc, NumEnums: 6, - NumMessages: 82, + NumMessages: 88, NumExtensions: 0, NumServices: 1, }, diff --git a/spec/proto/runtime/v1/runtime.proto b/spec/proto/runtime/v1/runtime.proto index c975dd6812..bfa14db7f1 100644 --- a/spec/proto/runtime/v1/runtime.proto +++ b/spec/proto/runtime/v1/runtime.proto @@ -4,6 +4,7 @@ package spec.proto.runtime.v1; import "google/protobuf/empty.proto"; import "google/protobuf/any.proto"; +import "spec/proto/runtime/v1/appcallback.proto"; option go_package = "mosn.io/layotto/spec/proto/runtime/v1;runtime"; option java_outer_classname = "RuntimeProto"; @@ -69,6 +70,10 @@ service Runtime { // Publishes events to the specific topic rpc PublishEvent(PublishEventRequest) returns (google.protobuf.Empty) {} + // SubscribeTopicEvents subscribes to a PubSub topic and receives topic + // events from it. + rpc SubscribeTopicEvents(stream SubscribeTopicEventsRequest) returns (stream SubscribeTopicEventsResponse) {} + // Get file with stream rpc GetFile(GetFileRequest) returns (stream GetFileResponse) {} @@ -756,6 +761,66 @@ message PublishEventRequest { map metadata = 5; } +// SubscribeTopicEventsRequest is a message containing the details for +// subscribing to a topic via streaming. +// The first message must always be the initial request. All subsequent +// messages must be event processed responses. +message SubscribeTopicEventsRequest { + // The unique identifier for the subscription request. + oneof subscribe_topic_events_request_type { + // The initial message containing the details for subscribing to a topic. + SubscribeTopicEventsRequestInitial initial_request = 1; + // The message containing the subscription to a topic. + SubscribeTopicEventsRequestProcessed event_processed = 2; + } +} + +// SubscribeTopicEventsRequestInitial is the initial message containing +// the details for subscribing to a topic via streaming. +message SubscribeTopicEventsRequestInitial { + // The name of the pubsub component + string pubsub_name = 1; + + // The pubsub topic + string topic = 2; + + // The metadata passing to pub components + // + // metadata property: + // - key : the key of the message. + map metadata = 3; + + // dead_letter_topic is the topic to which messages that fail to be processed + // are sent. + optional string dead_letter_topic = 4; +} + +// SubscribeTopicEventsRequestProcessed is the message containing the +// subscription to a topic. +message SubscribeTopicEventsRequestProcessed { + // id is the unique identifier for the subscription request. + string id = 1; + + // status is the result of the subscription request. + TopicEventResponse status = 2; +} + +// SubscribeTopicEventsResponse is a message returned from layotto +// when subscribing to a topic via streaming. +message SubscribeTopicEventsResponse { + // The unique identifier for the subscription request. + oneof subscribe_topic_events_response_type { + // The initial response from layotto when subscribing to a topic. + SubscribeTopicEventsResponseInitial initial_response = 1; + // The event message from the topic. + TopicEventRequest event_message = 2; + } +} + +// SubscribeTopicEventsResponseInitialAlpha1 is the initial response from layotto +// when subscribing to a topic. +message SubscribeTopicEventsResponseInitial {} + // InvokeBindingRequest is the message to send data to output bindings message InvokeBindingRequest { // The name of the output binding to invoke. diff --git a/spec/proto/runtime/v1/runtime_grpc.pb.go b/spec/proto/runtime/v1/runtime_grpc.pb.go index a903c863cd..bac5fa0f34 100644 --- a/spec/proto/runtime/v1/runtime_grpc.pb.go +++ b/spec/proto/runtime/v1/runtime_grpc.pb.go @@ -60,6 +60,9 @@ type RuntimeClient interface { ExecuteStateTransaction(ctx context.Context, in *ExecuteStateTransactionRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) // Publishes events to the specific topic PublishEvent(ctx context.Context, in *PublishEventRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // SubscribeTopicEvents subscribes to a PubSub topic and receives topic + // events from it. + SubscribeTopicEvents(ctx context.Context, opts ...grpc.CallOption) (Runtime_SubscribeTopicEventsClient, error) // Get file with stream GetFile(ctx context.Context, in *GetFileRequest, opts ...grpc.CallOption) (Runtime_GetFileClient, error) // Put file with stream @@ -261,8 +264,39 @@ func (c *runtimeClient) PublishEvent(ctx context.Context, in *PublishEventReques return out, nil } +func (c *runtimeClient) SubscribeTopicEvents(ctx context.Context, opts ...grpc.CallOption) (Runtime_SubscribeTopicEventsClient, error) { + stream, err := c.cc.NewStream(ctx, &Runtime_ServiceDesc.Streams[1], "/spec.proto.runtime.v1.Runtime/SubscribeTopicEvents", opts...) + if err != nil { + return nil, err + } + x := &runtimeSubscribeTopicEventsClient{stream} + return x, nil +} + +type Runtime_SubscribeTopicEventsClient interface { + Send(*SubscribeTopicEventsRequest) error + Recv() (*SubscribeTopicEventsResponse, error) + grpc.ClientStream +} + +type runtimeSubscribeTopicEventsClient struct { + grpc.ClientStream +} + +func (x *runtimeSubscribeTopicEventsClient) Send(m *SubscribeTopicEventsRequest) error { + return x.ClientStream.SendMsg(m) +} + +func (x *runtimeSubscribeTopicEventsClient) Recv() (*SubscribeTopicEventsResponse, error) { + m := new(SubscribeTopicEventsResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + func (c *runtimeClient) GetFile(ctx context.Context, in *GetFileRequest, opts ...grpc.CallOption) (Runtime_GetFileClient, error) { - stream, err := c.cc.NewStream(ctx, &Runtime_ServiceDesc.Streams[1], "/spec.proto.runtime.v1.Runtime/GetFile", opts...) + stream, err := c.cc.NewStream(ctx, &Runtime_ServiceDesc.Streams[2], "/spec.proto.runtime.v1.Runtime/GetFile", opts...) if err != nil { return nil, err } @@ -294,7 +328,7 @@ func (x *runtimeGetFileClient) Recv() (*GetFileResponse, error) { } func (c *runtimeClient) PutFile(ctx context.Context, opts ...grpc.CallOption) (Runtime_PutFileClient, error) { - stream, err := c.cc.NewStream(ctx, &Runtime_ServiceDesc.Streams[2], "/spec.proto.runtime.v1.Runtime/PutFile", opts...) + stream, err := c.cc.NewStream(ctx, &Runtime_ServiceDesc.Streams[3], "/spec.proto.runtime.v1.Runtime/PutFile", opts...) if err != nil { return nil, err } @@ -421,6 +455,9 @@ type RuntimeServer interface { ExecuteStateTransaction(context.Context, *ExecuteStateTransactionRequest) (*emptypb.Empty, error) // Publishes events to the specific topic PublishEvent(context.Context, *PublishEventRequest) (*emptypb.Empty, error) + // SubscribeTopicEvents subscribes to a PubSub topic and receives topic + // events from it. + SubscribeTopicEvents(Runtime_SubscribeTopicEventsServer) error // Get file with stream GetFile(*GetFileRequest, Runtime_GetFileServer) error // Put file with stream @@ -494,6 +531,9 @@ func (UnimplementedRuntimeServer) ExecuteStateTransaction(context.Context, *Exec func (UnimplementedRuntimeServer) PublishEvent(context.Context, *PublishEventRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method PublishEvent not implemented") } +func (UnimplementedRuntimeServer) SubscribeTopicEvents(Runtime_SubscribeTopicEventsServer) error { + return status.Errorf(codes.Unimplemented, "method SubscribeTopicEvents not implemented") +} func (UnimplementedRuntimeServer) GetFile(*GetFileRequest, Runtime_GetFileServer) error { return status.Errorf(codes.Unimplemented, "method GetFile not implemented") } @@ -844,6 +884,32 @@ func _Runtime_PublishEvent_Handler(srv interface{}, ctx context.Context, dec fun return interceptor(ctx, in, info, handler) } +func _Runtime_SubscribeTopicEvents_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(RuntimeServer).SubscribeTopicEvents(&runtimeSubscribeTopicEventsServer{stream}) +} + +type Runtime_SubscribeTopicEventsServer interface { + Send(*SubscribeTopicEventsResponse) error + Recv() (*SubscribeTopicEventsRequest, error) + grpc.ServerStream +} + +type runtimeSubscribeTopicEventsServer struct { + grpc.ServerStream +} + +func (x *runtimeSubscribeTopicEventsServer) Send(m *SubscribeTopicEventsResponse) error { + return x.ServerStream.SendMsg(m) +} + +func (x *runtimeSubscribeTopicEventsServer) Recv() (*SubscribeTopicEventsRequest, error) { + m := new(SubscribeTopicEventsRequest) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + func _Runtime_GetFile_Handler(srv interface{}, stream grpc.ServerStream) error { m := new(GetFileRequest) if err := stream.RecvMsg(m); err != nil { @@ -1102,6 +1168,12 @@ var Runtime_ServiceDesc = grpc.ServiceDesc{ ServerStreams: true, ClientStreams: true, }, + { + StreamName: "SubscribeTopicEvents", + Handler: _Runtime_SubscribeTopicEvents_Handler, + ServerStreams: true, + ClientStreams: true, + }, { StreamName: "GetFile", Handler: _Runtime_GetFile_Handler, From 39c3fa42abb6e7ac099990614a027816bdd22cfd Mon Sep 17 00:00:00 2001 From: Jermaine Hua Date: Tue, 17 Dec 2024 19:55:59 +0800 Subject: [PATCH 2/2] feat: Support all component health check (#1094) Co-authored-by: wenxuwan --- components/configstores/etcdv3/etcdv3.go | 29 +++++++++++++- components/configstores/nacos/configstore.go | 26 ++++++++++++- components/cryption/aliyun/kms.go | 26 +++++++++++++ components/cryption/aws/kms.go | 28 ++++++++++++++ .../azure/servicebus/servicebus.go | 1 + components/file/aliyun/file.go | 25 ++++++++++++ components/file/aws/file.go | 24 ++++++++++++ components/file/hdfs/hdfs.go | 24 +++++++++++- components/file/local/file.go | 26 +++++++++++-- components/file/minio/oss.go | 25 +++++++++++- components/file/qiniu/quniu_oss.go | 30 ++++++++++++++- components/file/tencentcloud/oss.go | 21 ++++++++++ components/lock/consul/consul_lock.go | 27 +++++++++++++ components/lock/etcd/etcd_lock.go | 28 ++++++++++++++ components/lock/in-memory/in_memory_lock.go | 22 +++++++++++ components/lock/mongo/mongo_lock.go | 29 ++++++++++++++ components/lock/redis/cluster_redis_lock.go | 27 +++++++++++++ .../lock/redis/standalone_redis_lock.go | 17 +++++++++ components/lock/zookeeper/zookeeper_lock.go | 38 ++++++++++++++++--- components/oss/aliyun/oss.go | 24 ++++++++++++ components/oss/aws/oss.go | 27 +++++++++++++ components/oss/ceph/oss.go | 27 +++++++++++++ components/oss/huaweicloud/oss.go | 29 +++++++++++++- components/sequencer/etcd/store.go | 28 ++++++++++++++ components/sequencer/mongo/mongo_sequencer.go | 34 ++++++++++++++++- components/sequencer/mysql/mysql.go | 27 +++++++++++++ .../redis/standalone_redis_sequencer.go | 27 +++++++++++++ .../snowflake/snowflake_sequencer.go | 27 +++++++++++++ .../zookeeper/zookeeper_sequencer.go | 31 ++++++++++++++- 29 files changed, 733 insertions(+), 21 deletions(-) diff --git a/components/configstores/etcdv3/etcdv3.go b/components/configstores/etcdv3/etcdv3.go index f5e53ae659..c2330d52fb 100644 --- a/components/configstores/etcdv3/etcdv3.go +++ b/components/configstores/etcdv3/etcdv3.go @@ -10,6 +10,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + package etcdv3 import ( @@ -22,6 +23,8 @@ import ( "mosn.io/pkg/utils" + "mosn.io/layotto/components/pkg/actuators" + "go.etcd.io/etcd/api/v3/mvccpb" clientv3 "go.etcd.io/etcd/client/v3" "mosn.io/pkg/log" @@ -31,10 +34,22 @@ import ( ) const ( - defaultGroup = "default" - defaultLabel = "default" + defaultGroup = "default" + defaultLabel = "default" + componentName = "configstore-etcdv3" ) +var ( + once sync.Once + readinessIndicator *actuators.HealthIndicator + livenessIndicator *actuators.HealthIndicator +) + +func init() { + readinessIndicator = actuators.NewHealthIndicator() + livenessIndicator = actuators.NewHealthIndicator() +} + type EtcdV3ConfigStore struct { client *clientv3.Client sync.RWMutex @@ -56,6 +71,10 @@ func (c *EtcdV3ConfigStore) GetDefaultLabel() string { } func NewStore() configstores.Store { + once.Do(func() { + indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} + actuators.SetComponentsIndicator(componentName, indicators) + }) return &EtcdV3ConfigStore{subscribeKey: make(map[string]string), watchRespCh: make(chan *configstores.SubscribeResp)} } @@ -71,6 +90,12 @@ func (c *EtcdV3ConfigStore) Init(config *configstores.StoreConfig) error { DialTimeout: time.Duration(t) * time.Second, }) c.storeName = config.StoreName + if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) + } + readinessIndicator.SetStarted() + livenessIndicator.SetStarted() return err } diff --git a/components/configstores/nacos/configstore.go b/components/configstores/nacos/configstore.go index 2527391795..e658488f96 100644 --- a/components/configstores/nacos/configstore.go +++ b/components/configstores/nacos/configstore.go @@ -30,8 +30,24 @@ import ( "mosn.io/pkg/log" "mosn.io/layotto/components/configstores" + "mosn.io/layotto/components/pkg/actuators" ) +const ( + componentName = "configstore-nacos" +) + +var ( + once sync.Once + readinessIndicator *actuators.HealthIndicator + livenessIndicator *actuators.HealthIndicator +) + +func init() { + readinessIndicator = actuators.NewHealthIndicator() + livenessIndicator = actuators.NewHealthIndicator() +} + type ConfigStore struct { client config_client.IConfigClient storeName string @@ -41,6 +57,10 @@ type ConfigStore struct { } func NewStore() configstores.Store { + once.Do(func() { + indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} + actuators.SetComponentsIndicator(componentName, indicators) + }) return &ConfigStore{} } @@ -91,10 +111,14 @@ func (n *ConfigStore) Init(config *configstores.StoreConfig) (err error) { } else { client, err = n.init(config.Address, timeoutMs, metadata) } + if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } - + readinessIndicator.SetStarted() + livenessIndicator.SetStarted() n.client = client // replace nacos sdk log return n.setupLogger(metadata) diff --git a/components/cryption/aliyun/kms.go b/components/cryption/aliyun/kms.go index 18f76da25e..d30fd15835 100644 --- a/components/cryption/aliyun/kms.go +++ b/components/cryption/aliyun/kms.go @@ -18,6 +18,9 @@ package aliyun import ( "context" "fmt" + "sync" + + "mosn.io/layotto/components/pkg/actuators" openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client" kms20160120 "github.com/alibabacloud-go/kms-20160120/v3/client" @@ -27,6 +30,21 @@ import ( "mosn.io/layotto/components/cryption" ) +const ( + componentName = "kms-aliyun" +) + +var ( + once sync.Once + readinessIndicator *actuators.HealthIndicator + livenessIndicator *actuators.HealthIndicator +) + +func init() { + readinessIndicator = actuators.NewHealthIndicator() + livenessIndicator = actuators.NewHealthIndicator() +} + type cy struct { client *kms20160120.Client keyID string @@ -36,6 +54,10 @@ type cy struct { refer: https://help.aliyun.com/document_detail/611325.html */ func NewCryption() cryption.CryptionService { + once.Do(func() { + indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} + actuators.SetComponentsIndicator(componentName, indicators) + }) return &cy{} } @@ -54,8 +76,12 @@ func (k *cy) Init(ctx context.Context, conf *cryption.Config) error { client, err := kms20160120.NewClient(config) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } + readinessIndicator.SetStarted() + livenessIndicator.SetStarted() k.client = client k.keyID = conf.Metadata[cryption.KeyID] return nil diff --git a/components/cryption/aws/kms.go b/components/cryption/aws/kms.go index fa2a90c599..50cdcb0806 100644 --- a/components/cryption/aws/kms.go +++ b/components/cryption/aws/kms.go @@ -18,6 +18,9 @@ package aws import ( "context" "fmt" + "sync" + + "mosn.io/layotto/components/pkg/actuators" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/credentials" @@ -28,12 +31,31 @@ import ( "mosn.io/layotto/components/cryption" ) +const ( + componentName = "kms-aws" +) + +var ( + once sync.Once + readinessIndicator *actuators.HealthIndicator + livenessIndicator *actuators.HealthIndicator +) + +func init() { + readinessIndicator = actuators.NewHealthIndicator() + livenessIndicator = actuators.NewHealthIndicator() +} + type cy struct { client *kms.KMS keyID string } func NewCryption() cryption.CryptionService { + once.Do(func() { + indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} + actuators.SetComponentsIndicator(componentName, indicators) + }) return &cy{} } @@ -49,6 +71,12 @@ func (k *cy) Init(ctx context.Context, conf *cryption.Config) error { Credentials: staticCredentials, } client := kms.New(session.New(), awsConf) + if client == nil { + readinessIndicator.ReportError("fail to create aws kms client") + livenessIndicator.ReportError("fail to create aws kms client") + } + readinessIndicator.SetStarted() + livenessIndicator.SetStarted() k.client = client k.keyID = keyID return nil diff --git a/components/delay_queue/azure/servicebus/servicebus.go b/components/delay_queue/azure/servicebus/servicebus.go index e3cca942e2..37582e8bda 100644 --- a/components/delay_queue/azure/servicebus/servicebus.go +++ b/components/delay_queue/azure/servicebus/servicebus.go @@ -10,6 +10,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + package servicebus import ( diff --git a/components/file/aliyun/file.go b/components/file/aliyun/file.go index c31151844f..1016c8dc47 100644 --- a/components/file/aliyun/file.go +++ b/components/file/aliyun/file.go @@ -22,6 +22,9 @@ import ( "fmt" "io" "strconv" + "sync" + + "mosn.io/layotto/components/pkg/actuators" "github.com/aliyun/aliyun-oss-go-sdk/oss" @@ -32,14 +35,30 @@ import ( const ( storageTypeKey = "storageType" + componentName = "file-aliyun" +) + +var ( + once sync.Once + readinessIndicator *actuators.HealthIndicator + livenessIndicator *actuators.HealthIndicator ) +func init() { + readinessIndicator = actuators.NewHealthIndicator() + livenessIndicator = actuators.NewHealthIndicator() +} + // AliyunFile is a binding for an AliCloud OSS storage bucketKey type AliyunFile struct { client *oss.Client } func NewAliyunFile() file.File { + once.Do(func() { + indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} + actuators.SetComponentsIndicator(componentName, indicators) + }) oss := &AliyunFile{} return oss } @@ -49,6 +68,8 @@ func (s *AliyunFile) Init(ctx context.Context, metadata *file.FileConfig) error m := make([]*utils.OssMetadata, 0) err := json.Unmarshal(metadata.Metadata, &m) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return file.ErrInvalid } @@ -58,10 +79,14 @@ func (s *AliyunFile) Init(ctx context.Context, metadata *file.FileConfig) error } client, err := oss.New(v.Endpoint, v.AccessKeyID, v.AccessKeySecret) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } s.client = client } + readinessIndicator.SetStarted() + livenessIndicator.SetStarted() return nil } diff --git a/components/file/aws/file.go b/components/file/aws/file.go index 474cefc0c0..09c5d98cf8 100644 --- a/components/file/aws/file.go +++ b/components/file/aws/file.go @@ -23,7 +23,9 @@ import ( "fmt" "io" "strings" + "sync" + "mosn.io/layotto/components/pkg/actuators" "mosn.io/layotto/components/pkg/utils" "github.com/aws/aws-sdk-go-v2/aws" @@ -38,14 +40,30 @@ import ( const ( defaultCredentialsSource = "provider" + componentName = "file-aws" ) +var ( + once sync.Once + readinessIndicator *actuators.HealthIndicator + livenessIndicator *actuators.HealthIndicator +) + +func init() { + readinessIndicator = actuators.NewHealthIndicator() + livenessIndicator = actuators.NewHealthIndicator() +} + // AwsOss is a binding for aws oss storage. type AwsOss struct { client *s3.Client } func NewAwsFile() file.File { + once.Do(func() { + indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} + actuators.SetComponentsIndicator(componentName, indicators) + }) return &AwsOss{} } @@ -54,6 +72,8 @@ func (a *AwsOss) Init(ctx context.Context, config *file.FileConfig) error { m := make([]*utils.OssMetadata, 0) err := json.Unmarshal(config.Metadata, &m) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return errors.New("invalid config for aws oss") } for _, data := range m { @@ -64,6 +84,10 @@ func (a *AwsOss) Init(ctx context.Context, config *file.FileConfig) error { if err != nil { continue } + if client != nil { + readinessIndicator.SetStarted() + livenessIndicator.SetStarted() + } a.client = client } return nil diff --git a/components/file/hdfs/hdfs.go b/components/file/hdfs/hdfs.go index 1620b407b1..c19372ad8e 100644 --- a/components/file/hdfs/hdfs.go +++ b/components/file/hdfs/hdfs.go @@ -25,8 +25,10 @@ import ( "io" "io/ioutil" "strconv" + "sync" "mosn.io/layotto/components/file" + "mosn.io/layotto/components/pkg/actuators" store "go.beyondstorage.io/services/hdfs" "go.beyondstorage.io/v5/pairs" @@ -34,8 +36,9 @@ import ( ) const ( - endpointKey = "endpoint" - fileSize = "filesize" + endpointKey = "endpoint" + fileSize = "filesize" + componentName = "file-hdfs" ) var ( @@ -45,8 +48,16 @@ var ( ErrNotSpecifyEndpoint error = errors.New("other error happend in metadata") ErrHdfsListFail error = errors.New("hdfs list opt failed") ErrInitFailed error = errors.New("hdfs client init failed") + once sync.Once + readinessIndicator *actuators.HealthIndicator + livenessIndicator *actuators.HealthIndicator ) +func init() { + readinessIndicator = actuators.NewHealthIndicator() + livenessIndicator = actuators.NewHealthIndicator() +} + type hdfs struct { client map[string]types.Storager meta map[string]*HdfsMetaData @@ -57,6 +68,10 @@ type HdfsMetaData struct { } func NewHdfs() file.File { + once.Do(func() { + indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} + actuators.SetComponentsIndicator(componentName, indicators) + }) return &hdfs{ client: make(map[string]types.Storager), meta: make(map[string]*HdfsMetaData), @@ -77,6 +92,8 @@ func (h *hdfs) Init(ctx context.Context, config *file.FileConfig) error { client, err := h.createHdfsClient(data) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return ErrInitFailed } @@ -84,6 +101,9 @@ func (h *hdfs) Init(ctx context.Context, config *file.FileConfig) error { h.meta[data.EndPoint] = data } + readinessIndicator.SetStarted() + livenessIndicator.SetStarted() + return nil } diff --git a/components/file/local/file.go b/components/file/local/file.go index 5cdd513631..0900f67f89 100644 --- a/components/file/local/file.go +++ b/components/file/local/file.go @@ -24,24 +24,44 @@ import ( "os" "strconv" "strings" + "sync" "mosn.io/layotto/components/file" + "mosn.io/layotto/components/pkg/actuators" ) const ( - FileMode = "FileMode" - FileFlag = "FileFlag" - FileIsDir = "IsDir" + FileMode = "FileMode" + FileFlag = "FileFlag" + FileIsDir = "IsDir" + componentName = "file-local" ) +var ( + once sync.Once + readinessIndicator *actuators.HealthIndicator + livenessIndicator *actuators.HealthIndicator +) + +func init() { + readinessIndicator = actuators.NewHealthIndicator() + livenessIndicator = actuators.NewHealthIndicator() +} + type LocalStore struct { } func NewLocalStore() file.File { + once.Do(func() { + indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} + actuators.SetComponentsIndicator(componentName, indicators) + }) return &LocalStore{} } func (lf *LocalStore) Init(ctx context.Context, f *file.FileConfig) error { + readinessIndicator.SetStarted() + livenessIndicator.SetStarted() return nil } func (lf *LocalStore) Put(ctx context.Context, f *file.PutFileStu) error { diff --git a/components/file/minio/oss.go b/components/file/minio/oss.go index 5cca66763b..0923943a61 100644 --- a/components/file/minio/oss.go +++ b/components/file/minio/oss.go @@ -23,8 +23,10 @@ import ( "fmt" "io" "strconv" + "sync" "mosn.io/layotto/components/file/util" + "mosn.io/layotto/components/pkg/actuators" "github.com/minio/minio-go/v7/pkg/credentials" @@ -34,8 +36,9 @@ import ( ) const ( - endpointKey = "endpoint" - fileSize = "fileSize" + endpointKey = "endpoint" + fileSize = "fileSize" + componentName = "file-monio" ) var ( @@ -43,8 +46,16 @@ var ( ErrClientNotExist error = errors.New("specific client not exist") ErrInvalidConfig error = errors.New("invalid minio oss config") ErrNotSpecifyEndPoint error = errors.New("not specify endpoint in metadata") + once sync.Once + readinessIndicator *actuators.HealthIndicator + livenessIndicator *actuators.HealthIndicator ) +func init() { + readinessIndicator = actuators.NewHealthIndicator() + livenessIndicator = actuators.NewHealthIndicator() +} + type MinioOss struct { client map[string]*minio.Core meta map[string]*MinioMetaData @@ -59,6 +70,10 @@ type MinioMetaData struct { } func NewMinioOss() file.File { + once.Do(func() { + indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} + actuators.SetComponentsIndicator(componentName, indicators) + }) return &MinioOss{ client: make(map[string]*minio.Core), meta: make(map[string]*MinioMetaData), @@ -69,6 +84,8 @@ func (m *MinioOss) Init(ctx context.Context, config *file.FileConfig) error { md := make([]*MinioMetaData, 0) err := json.Unmarshal(config.Metadata, &md) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return ErrInvalidConfig } for _, data := range md { @@ -79,6 +96,10 @@ func (m *MinioOss) Init(ctx context.Context, config *file.FileConfig) error { if err != nil { continue } + if client != nil { + readinessIndicator.SetStarted() + livenessIndicator.SetStarted() + } m.client[data.EndPoint] = client m.meta[data.EndPoint] = data } diff --git a/components/file/qiniu/quniu_oss.go b/components/file/qiniu/quniu_oss.go index 1c9a853859..72484011d7 100644 --- a/components/file/qiniu/quniu_oss.go +++ b/components/file/qiniu/quniu_oss.go @@ -22,20 +22,31 @@ import ( "errors" "io" "strconv" + "sync" "mosn.io/layotto/components/file" + "mosn.io/layotto/components/pkg/actuators" ) const ( - endpointKey = "endpoint" - fileSizeKey = "filesize" + endpointKey = "endpoint" + fileSizeKey = "filesize" + componentName = "file-qiniu" ) var ( ErrClientNotExist = errors.New("specific client not exist") ErrNotSpecifyEndPoint = errors.New("not specify endpoint in metadata") + once sync.Once + readinessIndicator *actuators.HealthIndicator + livenessIndicator *actuators.HealthIndicator ) +func init() { + readinessIndicator = actuators.NewHealthIndicator() + livenessIndicator = actuators.NewHealthIndicator() +} + type QiniuOSS struct { metadata map[string]*OssMetadata client map[string]*QiniuOSSClient @@ -52,6 +63,10 @@ type OssMetadata struct { } func NewQiniuOSS() file.File { + once.Do(func() { + indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} + actuators.SetComponentsIndicator(componentName, indicators) + }) return &QiniuOSS{ metadata: make(map[string]*OssMetadata), client: make(map[string]*QiniuOSSClient), @@ -62,6 +77,8 @@ func (q *QiniuOSS) Init(ctx context.Context, metadata *file.FileConfig) error { m := make([]*OssMetadata, 0) err := json.Unmarshal(metadata.Metadata, &m) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return file.ErrInvalid } @@ -85,6 +102,15 @@ func (q *QiniuOSS) Init(ctx context.Context, metadata *file.FileConfig) error { v.UseHTTPS, v.UseCdnDomains, ) + + if client != nil { + readinessIndicator.SetStarted() + livenessIndicator.SetStarted() + } else { + readinessIndicator.ReportError("failed to create qiniu oss client") + livenessIndicator.ReportError("failed to create qiniu oss client") + } + q.metadata[v.Endpoint] = v q.client[v.Endpoint] = client } diff --git a/components/file/tencentcloud/oss.go b/components/file/tencentcloud/oss.go index b833fda35a..bb891aa5ae 100644 --- a/components/file/tencentcloud/oss.go +++ b/components/file/tencentcloud/oss.go @@ -25,25 +25,36 @@ import ( "net/url" "strconv" "strings" + "sync" "time" "github.com/pkg/errors" "github.com/tencentyun/cos-go-sdk-v5" "mosn.io/layotto/components/file" + "mosn.io/layotto/components/pkg/actuators" ) const ( endpointKey = "endpoint" aclKey = "ACL" contentTypeKey = "content-type" + componentName = "file-tencentcloud" ) var ( ErrClientNotExist = errors.New("specific client not exist") ErrNotSpecifyEndPoint = errors.New("not specify endpoint in metadata") + once sync.Once + readinessIndicator *actuators.HealthIndicator + livenessIndicator *actuators.HealthIndicator ) +func init() { + readinessIndicator = actuators.NewHealthIndicator() + livenessIndicator = actuators.NewHealthIndicator() +} + type TencentCloudOSS struct { metadata map[string]*OssMetadata client map[string]*cos.Client @@ -58,6 +69,10 @@ type OssMetadata struct { } func NewTencentCloudOSS() file.File { + once.Do(func() { + indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} + actuators.SetComponentsIndicator(componentName, indicators) + }) oss := &TencentCloudOSS{metadata: make(map[string]*OssMetadata), client: make(map[string]*cos.Client)} return oss } @@ -67,6 +82,8 @@ func (t *TencentCloudOSS) Init(ctx context.Context, metadata *file.FileConfig) e m := make([]*OssMetadata, 0) err := json.Unmarshal(metadata.Metadata, &m) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return file.ErrInvalid } @@ -76,11 +93,15 @@ func (t *TencentCloudOSS) Init(ctx context.Context, metadata *file.FileConfig) e } client, err := t.getClient(v) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } t.metadata[v.Endpoint] = v t.client[v.Endpoint] = client } + readinessIndicator.SetStarted() + livenessIndicator.SetStarted() return nil } diff --git a/components/lock/consul/consul_lock.go b/components/lock/consul/consul_lock.go index 5547978c6d..bab45a4799 100644 --- a/components/lock/consul/consul_lock.go +++ b/components/lock/consul/consul_lock.go @@ -10,6 +10,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + package consul import ( @@ -23,9 +24,25 @@ import ( "mosn.io/pkg/log" "mosn.io/layotto/components/lock" + "mosn.io/layotto/components/pkg/actuators" "mosn.io/layotto/components/pkg/utils" ) +const ( + componentName = "lock-consul" +) + +var ( + once sync.Once + readinessIndicator *actuators.HealthIndicator + livenessIndicator *actuators.HealthIndicator +) + +func init() { + readinessIndicator = actuators.NewHealthIndicator() + livenessIndicator = actuators.NewHealthIndicator() +} + type ConsulLock struct { metadata utils.ConsulMetadata logger log.ErrorLogger @@ -37,6 +54,10 @@ type ConsulLock struct { } func NewConsulLock(logger log.ErrorLogger) *ConsulLock { + once.Do(func() { + indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} + actuators.SetComponentsIndicator(componentName, indicators) + }) consulLock := &ConsulLock{logger: logger} return consulLock } @@ -44,6 +65,8 @@ func NewConsulLock(logger log.ErrorLogger) *ConsulLock { func (c *ConsulLock) Init(metadata lock.Metadata) error { consulMetadata, err := utils.ParseConsulMetadata(metadata) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } c.metadata = consulMetadata @@ -52,12 +75,16 @@ func (c *ConsulLock) Init(metadata lock.Metadata) error { Scheme: consulMetadata.Scheme, }) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } c.client = client c.sessionFactory = client.Session() c.kv = client.KV() c.workPool = msync.NewWorkerPool(runtime.NumCPU()) + readinessIndicator.SetStarted() + livenessIndicator.SetStarted() return nil } func (c *ConsulLock) Features() []lock.Feature { diff --git a/components/lock/etcd/etcd_lock.go b/components/lock/etcd/etcd_lock.go index 663c574909..b888d89a38 100644 --- a/components/lock/etcd/etcd_lock.go +++ b/components/lock/etcd/etcd_lock.go @@ -10,11 +10,13 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + package etcd import ( "context" "fmt" + "sync" clientv3 "go.etcd.io/etcd/client/v3" @@ -23,8 +25,24 @@ import ( "mosn.io/pkg/log" "mosn.io/layotto/components/lock" + "mosn.io/layotto/components/pkg/actuators" +) + +const ( + componentName = "lock-etcd" ) +var ( + once sync.Once + readinessIndicator *actuators.HealthIndicator + livenessIndicator *actuators.HealthIndicator +) + +func init() { + readinessIndicator = actuators.NewHealthIndicator() + livenessIndicator = actuators.NewHealthIndicator() +} + // Etcd lock store type EtcdLock struct { client *clientv3.Client @@ -39,6 +57,10 @@ type EtcdLock struct { // NewEtcdLock returns a new etcd lock func NewEtcdLock(logger log.ErrorLogger) *EtcdLock { + once.Do(func() { + indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} + actuators.SetComponentsIndicator(componentName, indicators) + }) s := &EtcdLock{ features: make([]lock.Feature, 0), logger: logger, @@ -52,15 +74,21 @@ func (e *EtcdLock) Init(metadata lock.Metadata) error { // 1. parse config m, err := utils.ParseEtcdMetadata(metadata.Properties) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } e.metadata = m // 2. construct client if e.client, err = utils.NewEtcdClient(m); err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } e.ctx, e.cancel = context.WithCancel(context.Background()) + readinessIndicator.SetStarted() + livenessIndicator.SetStarted() return err } diff --git a/components/lock/in-memory/in_memory_lock.go b/components/lock/in-memory/in_memory_lock.go index 1213f07cb9..bb009e100e 100644 --- a/components/lock/in-memory/in_memory_lock.go +++ b/components/lock/in-memory/in_memory_lock.go @@ -22,8 +22,24 @@ import ( "time" "mosn.io/layotto/components/lock" + "mosn.io/layotto/components/pkg/actuators" ) +const ( + componentName = "lock-memory" +) + +var ( + once sync.Once + readinessIndicator *actuators.HealthIndicator + livenessIndicator *actuators.HealthIndicator +) + +func init() { + readinessIndicator = actuators.NewHealthIndicator() + livenessIndicator = actuators.NewHealthIndicator() +} + type InMemoryLock struct { features []lock.Feature data *lockMap @@ -43,6 +59,10 @@ type lockMap struct { } func NewInMemoryLock() *InMemoryLock { + once.Do(func() { + indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} + actuators.SetComponentsIndicator(componentName, indicators) + }) return &InMemoryLock{ features: make([]lock.Feature, 0), data: &lockMap{ @@ -52,6 +72,8 @@ func NewInMemoryLock() *InMemoryLock { } func (s *InMemoryLock) Init(_ lock.Metadata) error { + readinessIndicator.SetStarted() + livenessIndicator.SetStarted() return nil } diff --git a/components/lock/mongo/mongo_lock.go b/components/lock/mongo/mongo_lock.go index 52f3421149..58818db8e4 100644 --- a/components/lock/mongo/mongo_lock.go +++ b/components/lock/mongo/mongo_lock.go @@ -10,11 +10,13 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + package mongo import ( "context" "fmt" + "sync" "time" "go.mongodb.org/mongo-driver/bson" @@ -26,6 +28,7 @@ import ( "mosn.io/pkg/log" "mosn.io/layotto/components/lock" + "mosn.io/layotto/components/pkg/actuators" "mosn.io/layotto/components/pkg/utils" ) @@ -36,8 +39,20 @@ const ( UNLOCK_UNEXIST = 4 UNLOCK_BELONG_TO_OTHERS = 5 UNLOCK_FAIL = 6 + componentName = "lock-mongo" +) + +var ( + once sync.Once + readinessIndicator *actuators.HealthIndicator + livenessIndicator *actuators.HealthIndicator ) +func init() { + readinessIndicator = actuators.NewHealthIndicator() + livenessIndicator = actuators.NewHealthIndicator() +} + // mongo lock store type MongoLock struct { factory utils.MongoFactory @@ -56,6 +71,10 @@ type MongoLock struct { // NewMongoLock returns a new mongo lock func NewMongoLock(logger log.ErrorLogger) *MongoLock { + once.Do(func() { + indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} + actuators.SetComponentsIndicator(componentName, indicators) + }) s := &MongoLock{ features: make([]lock.Feature, 0), logger: logger, @@ -68,6 +87,8 @@ func (e *MongoLock) Init(metadata lock.Metadata) error { // 1.parse config m, err := utils.ParseMongoMetadata(metadata.Properties) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } e.metadata = m @@ -76,17 +97,23 @@ func (e *MongoLock) Init(metadata lock.Metadata) error { // 2. construct client if client, err = e.factory.NewMongoClient(m); err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } e.ctx, e.cancel = context.WithCancel(context.Background()) if err := client.Ping(e.ctx, nil); err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } // Connections Collection e.collection, err = utils.SetCollection(client, e.factory, e.metadata) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } @@ -99,6 +126,8 @@ func (e *MongoLock) Init(metadata lock.Metadata) error { e.client = client + readinessIndicator.SetStarted() + livenessIndicator.SetStarted() return err } diff --git a/components/lock/redis/cluster_redis_lock.go b/components/lock/redis/cluster_redis_lock.go index 2f38b6dd7f..c2faba95b7 100644 --- a/components/lock/redis/cluster_redis_lock.go +++ b/components/lock/redis/cluster_redis_lock.go @@ -10,6 +10,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + package redis import ( @@ -24,9 +25,25 @@ import ( "mosn.io/pkg/log" "mosn.io/layotto/components/lock" + "mosn.io/layotto/components/pkg/actuators" "mosn.io/layotto/components/pkg/utils" ) +const ( + componentName = "lock-redis-cluster" +) + +var ( + once sync.Once + readinessIndicator *actuators.HealthIndicator + livenessIndicator *actuators.HealthIndicator +) + +func init() { + readinessIndicator = actuators.NewHealthIndicator() + livenessIndicator = actuators.NewHealthIndicator() +} + // RedLock // it will be best to use at least 5 hosts type ClusterRedisLock struct { @@ -43,6 +60,10 @@ type ClusterRedisLock struct { // NewClusterRedisLock returns a new redis lock store func NewClusterRedisLock(logger log.ErrorLogger) *ClusterRedisLock { + once.Do(func() { + indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} + actuators.SetComponentsIndicator(componentName, indicators) + }) s := &ClusterRedisLock{ features: make([]lock.Feature, 0), logger: logger, @@ -62,6 +83,8 @@ func (c *ClusterRedisLock) Init(metadata lock.Metadata) error { m, err := utils.ParseRedisClusterMetadata(metadata.Properties) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } c.metadata = m @@ -70,9 +93,13 @@ func (c *ClusterRedisLock) Init(metadata lock.Metadata) error { c.workpool = msync.NewWorkerPool(m.Concurrency) for i, client := range c.clients { if _, err = client.Ping(c.ctx).Result(); err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return fmt.Errorf("[ClusterRedisLock]: error connecting to redis at %s: %s", c.metadata.Hosts[i], err) } } + readinessIndicator.SetStarted() + livenessIndicator.SetStarted() return err } diff --git a/components/lock/redis/standalone_redis_lock.go b/components/lock/redis/standalone_redis_lock.go index e0977a73f5..eb7e72ba1d 100644 --- a/components/lock/redis/standalone_redis_lock.go +++ b/components/lock/redis/standalone_redis_lock.go @@ -10,6 +10,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + package redis import ( @@ -21,9 +22,15 @@ import ( "mosn.io/pkg/log" "mosn.io/layotto/components/lock" + "mosn.io/layotto/components/pkg/actuators" "mosn.io/layotto/components/pkg/utils" ) +func init() { + readinessIndicator = actuators.NewHealthIndicator() + livenessIndicator = actuators.NewHealthIndicator() +} + // Standalone Redis lock store.Any fail-over related features are not supported,such as Sentinel and Redis Cluster. type StandaloneRedisLock struct { client *redis.Client @@ -38,6 +45,10 @@ type StandaloneRedisLock struct { // NewStandaloneRedisLock returns a new redis lock store func NewStandaloneRedisLock(logger log.ErrorLogger) *StandaloneRedisLock { + once.Do(func() { + indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} + actuators.SetComponentsIndicator("lock-redis-standalone", indicators) + }) s := &StandaloneRedisLock{ features: make([]lock.Feature, 0), logger: logger, @@ -51,6 +62,8 @@ func (p *StandaloneRedisLock) Init(metadata lock.Metadata) error { // 1. parse config m, err := utils.ParseRedisMetadata(metadata.Properties) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } p.metadata = m @@ -59,8 +72,12 @@ func (p *StandaloneRedisLock) Init(metadata lock.Metadata) error { p.ctx, p.cancel = context.WithCancel(context.Background()) // 3. connect to redis if _, err = p.client.Ping(p.ctx).Result(); err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return fmt.Errorf("[standaloneRedisLock]: error connecting to redis at %s: %s", m.Host, err) } + readinessIndicator.SetStarted() + livenessIndicator.SetStarted() return err } diff --git a/components/lock/zookeeper/zookeeper_lock.go b/components/lock/zookeeper/zookeeper_lock.go index e456e4988d..e0b6326c0e 100644 --- a/components/lock/zookeeper/zookeeper_lock.go +++ b/components/lock/zookeeper/zookeeper_lock.go @@ -16,6 +16,7 @@ package zookeeper import ( "context" + "sync" "time" "github.com/go-zookeeper/zk" @@ -23,15 +24,30 @@ import ( util "mosn.io/pkg/utils" "mosn.io/layotto/components/lock" + "mosn.io/layotto/components/pkg/actuators" "mosn.io/layotto/components/pkg/utils" ) -var closeConn = func(conn utils.ZKConnection, expireInSecond int32) { - //can also - //time.Sleep(time.Second * time.Duration(expireInSecond)) - <-time.After(time.Second * time.Duration(expireInSecond)) - // make sure close connecion - conn.Close() +var ( + closeConn = func(conn utils.ZKConnection, expireInSecond int32) { + //can also + //time.Sleep(time.Second * time.Duration(expireInSecond)) + <-time.After(time.Second * time.Duration(expireInSecond)) + // make sure close connecion + conn.Close() + } + once sync.Once + readinessIndicator *actuators.HealthIndicator + livenessIndicator *actuators.HealthIndicator +) + +const ( + componentName = "lock-zookeeper" +) + +func init() { + readinessIndicator = actuators.NewHealthIndicator() + livenessIndicator = actuators.NewHealthIndicator() } // ZookeeperLock lock store @@ -46,6 +62,10 @@ type ZookeeperLock struct { // NewZookeeperLock Create ZookeeperLock func NewZookeeperLock(logger log.ErrorLogger) *ZookeeperLock { + once.Do(func() { + indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} + actuators.SetComponentsIndicator(componentName, indicators) + }) lock := &ZookeeperLock{ logger: logger, } @@ -57,6 +77,8 @@ func (p *ZookeeperLock) Init(metadata lock.Metadata) error { m, err := utils.ParseZookeeperMetadata(metadata.Properties) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } @@ -66,9 +88,13 @@ func (p *ZookeeperLock) Init(metadata lock.Metadata) error { //init unlock connection zkConn, err := p.factory.NewConnection(p.metadata.SessionTimeout, p.metadata) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } p.unlockConn = zkConn + readinessIndicator.SetStarted() + livenessIndicator.SetStarted() return nil } diff --git a/components/oss/aliyun/oss.go b/components/oss/aliyun/oss.go index 1f31ab8a45..2687256d16 100644 --- a/components/oss/aliyun/oss.go +++ b/components/oss/aliyun/oss.go @@ -21,7 +21,9 @@ import ( "encoding/json" "net/http" "strconv" + "sync" + "mosn.io/layotto/components/pkg/actuators" "mosn.io/layotto/components/pkg/utils" l8oss "mosn.io/layotto/components/oss" @@ -32,14 +34,30 @@ import ( const ( connectTimeoutSec = "connectTimeoutSec" readWriteTimeoutSec = "readWriteTimeout" + componentName = "oss-aliyun" ) +var ( + once sync.Once + readinessIndicator *actuators.HealthIndicator + livenessIndicator *actuators.HealthIndicator +) + +func init() { + readinessIndicator = actuators.NewHealthIndicator() + livenessIndicator = actuators.NewHealthIndicator() +} + type AliyunOSS struct { client *oss.Client basicConf json.RawMessage } func NewAliyunOss() l8oss.Oss { + once.Do(func() { + indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} + actuators.SetComponentsIndicator(componentName, indicators) + }) return &AliyunOSS{} } @@ -48,6 +66,8 @@ func (a *AliyunOSS) Init(ctx context.Context, config *l8oss.Config) error { a.basicConf = config.Metadata[l8oss.BasicConfiguration] m := utils.OssMetadata{} if err := json.Unmarshal(a.basicConf, &m); err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return l8oss.ErrInvalid } if t, ok := config.Metadata[connectTimeoutSec]; ok { @@ -63,9 +83,13 @@ func (a *AliyunOSS) Init(ctx context.Context, config *l8oss.Config) error { client, err := oss.New(m.Endpoint, m.AccessKeyID, m.AccessKeySecret, oss.Timeout(int64(connectTimeout), int64(readWriteTimeout))) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } a.client = client + readinessIndicator.SetStarted() + livenessIndicator.SetStarted() return nil } diff --git a/components/oss/aws/oss.go b/components/oss/aws/oss.go index 29fc1dd6d8..a719dec21e 100644 --- a/components/oss/aws/oss.go +++ b/components/oss/aws/oss.go @@ -23,12 +23,14 @@ import ( "fmt" "net/url" "strings" + "sync" "time" "github.com/aws/aws-sdk-go-v2/aws" aws_config "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/credentials" + "mosn.io/layotto/components/pkg/actuators" "mosn.io/layotto/components/pkg/utils" "mosn.io/layotto/components/oss" @@ -41,12 +43,31 @@ import ( "mosn.io/pkg/log" ) +const ( + componentName = "oss-aws" +) + +var ( + once sync.Once + readinessIndicator *actuators.HealthIndicator + livenessIndicator *actuators.HealthIndicator +) + +func init() { + readinessIndicator = actuators.NewHealthIndicator() + livenessIndicator = actuators.NewHealthIndicator() +} + type AwsOss struct { client *s3.Client basicConf json.RawMessage } func NewAwsOss() oss.Oss { + once.Do(func() { + indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} + actuators.SetComponentsIndicator(componentName, indicators) + }) return &AwsOss{} } @@ -55,6 +76,8 @@ func (a *AwsOss) Init(ctx context.Context, config *oss.Config) error { m := &utils.OssMetadata{} err := json.Unmarshal(a.basicConf, &m) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return oss.ErrInvalid } optFunc := []func(options *aws_config.LoadOptions) error{ @@ -68,10 +91,14 @@ func (a *AwsOss) Init(ctx context.Context, config *oss.Config) error { } cfg, err := aws_config.LoadDefaultConfig(context.TODO(), optFunc...) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } client := s3.NewFromConfig(cfg) a.client = client + readinessIndicator.SetStarted() + livenessIndicator.SetStarted() return nil } diff --git a/components/oss/ceph/oss.go b/components/oss/ceph/oss.go index 561d6c320d..20fe565201 100644 --- a/components/oss/ceph/oss.go +++ b/components/oss/ceph/oss.go @@ -22,6 +22,7 @@ import ( "errors" "fmt" "strings" + "sync" "time" "github.com/aws/aws-sdk-go-v2/aws" @@ -35,15 +36,35 @@ import ( "mosn.io/pkg/log" "mosn.io/layotto/components/oss" + "mosn.io/layotto/components/pkg/actuators" "mosn.io/layotto/components/pkg/utils" ) +const ( + componentName = "oss-ceph" +) + +var ( + once sync.Once + readinessIndicator *actuators.HealthIndicator + livenessIndicator *actuators.HealthIndicator +) + +func init() { + readinessIndicator = actuators.NewHealthIndicator() + livenessIndicator = actuators.NewHealthIndicator() +} + type CephOSS struct { client *s3.Client basicConf json.RawMessage } func NewCephOss() oss.Oss { + once.Do(func() { + indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} + actuators.SetComponentsIndicator(componentName, indicators) + }) return &CephOSS{} } @@ -52,6 +73,8 @@ func (c *CephOSS) Init(ctx context.Context, config *oss.Config) error { m := &utils.OssMetadata{} err := json.Unmarshal(c.basicConf, &m) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return oss.ErrInvalid } @@ -72,12 +95,16 @@ func (c *CephOSS) Init(ctx context.Context, config *oss.Config) error { } cfg, err := aws_config.LoadDefaultConfig(context.TODO(), optFunc...) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } client := s3.NewFromConfig(cfg, func(options *s3.Options) { options.UsePathStyle = true }) c.client = client + readinessIndicator.SetStarted() + livenessIndicator.SetStarted() return nil } diff --git a/components/oss/huaweicloud/oss.go b/components/oss/huaweicloud/oss.go index fa941f392e..9ec51f85b1 100644 --- a/components/oss/huaweicloud/oss.go +++ b/components/oss/huaweicloud/oss.go @@ -13,21 +13,38 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package huaweicloud import ( "context" "encoding/json" "strconv" + "sync" "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs" "github.com/jinzhu/copier" "mosn.io/layotto/components/oss" + "mosn.io/layotto/components/pkg/actuators" "mosn.io/layotto/components/pkg/utils" ) -const connectTimeoutSec = "connectTimeoutSec" +const ( + componentName = "oss-huaweicloud" + connectTimeoutSec = "connectTimeoutSec" +) + +var ( + once sync.Once + readinessIndicator *actuators.HealthIndicator + livenessIndicator *actuators.HealthIndicator +) + +func init() { + readinessIndicator = actuators.NewHealthIndicator() + livenessIndicator = actuators.NewHealthIndicator() +} type HuaweicloudOSS struct { client *obs.ObsClient @@ -35,6 +52,10 @@ type HuaweicloudOSS struct { } func NewHuaweicloudOSS() oss.Oss { + once.Do(func() { + indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} + actuators.SetComponentsIndicator(componentName, indicators) + }) return &HuaweicloudOSS{} } @@ -43,6 +64,8 @@ func (h *HuaweicloudOSS) Init(ctx context.Context, config *oss.Config) error { jsonRawMessage := config.Metadata[oss.BasicConfiguration] err := json.Unmarshal(jsonRawMessage, &h.metadata) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return oss.ErrInvalid } if t, ok := config.Metadata[connectTimeoutSec]; ok { @@ -53,9 +76,13 @@ func (h *HuaweicloudOSS) Init(ctx context.Context, config *oss.Config) error { client, err := obs.New(h.metadata.AccessKeyID, h.metadata.AccessKeySecret, h.metadata.Endpoint, obs.WithConnectTimeout(connectTimeout)) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } h.client = client + readinessIndicator.SetStarted() + livenessIndicator.SetStarted() return nil } diff --git a/components/sequencer/etcd/store.go b/components/sequencer/etcd/store.go index 20a211873d..9ee4f191f8 100644 --- a/components/sequencer/etcd/store.go +++ b/components/sequencer/etcd/store.go @@ -10,19 +10,37 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + package etcd import ( "context" "fmt" + "sync" clientv3 "go.etcd.io/etcd/client/v3" "mosn.io/pkg/log" + "mosn.io/layotto/components/pkg/actuators" "mosn.io/layotto/components/pkg/utils" "mosn.io/layotto/components/sequencer" ) +const ( + componentName = "sequencer-etcd" +) + +var ( + once sync.Once + readinessIndicator *actuators.HealthIndicator + livenessIndicator *actuators.HealthIndicator +) + +func init() { + readinessIndicator = actuators.NewHealthIndicator() + livenessIndicator = actuators.NewHealthIndicator() +} + type EtcdSequencer struct { client *clientv3.Client metadata utils.EtcdMetadata @@ -36,6 +54,10 @@ type EtcdSequencer struct { // EtcdSequencer returns a new etcd sequencer func NewEtcdSequencer(logger log.ErrorLogger) *EtcdSequencer { + once.Do(func() { + indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} + actuators.SetComponentsIndicator(componentName, indicators) + }) s := &EtcdSequencer{ logger: logger, } @@ -54,6 +76,8 @@ func (e *EtcdSequencer) Init(config sequencer.Configuration) error { // 2. construct client if e.client, err = utils.NewEtcdClient(m); err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } e.ctx, e.cancel = context.WithCancel(context.Background()) @@ -68,6 +92,8 @@ func (e *EtcdSequencer) Init(config sequencer.Configuration) error { actualKey := e.getKeyInEtcd(k) get, err := kv.Get(e.ctx, actualKey) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } var cur int64 = 0 @@ -80,6 +106,8 @@ func (e *EtcdSequencer) Init(config sequencer.Configuration) error { } } // TODO close component? + readinessIndicator.SetStarted() + livenessIndicator.SetStarted() return nil } diff --git a/components/sequencer/mongo/mongo_sequencer.go b/components/sequencer/mongo/mongo_sequencer.go index 4932504795..5080bfa5ce 100644 --- a/components/sequencer/mongo/mongo_sequencer.go +++ b/components/sequencer/mongo/mongo_sequencer.go @@ -15,6 +15,7 @@ package mongo import ( "context" "fmt" + "sync" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" @@ -23,10 +24,26 @@ import ( "go.mongodb.org/mongo-driver/mongo/writeconcern" "mosn.io/pkg/log" + "mosn.io/layotto/components/pkg/actuators" "mosn.io/layotto/components/pkg/utils" "mosn.io/layotto/components/sequencer" ) +const ( + componentName = "sequencer-mongo" +) + +var ( + once sync.Once + readinessIndicator *actuators.HealthIndicator + livenessIndicator *actuators.HealthIndicator +) + +func init() { + readinessIndicator = actuators.NewHealthIndicator() + livenessIndicator = actuators.NewHealthIndicator() +} + type MongoSequencer struct { factory utils.MongoFactory @@ -50,6 +67,10 @@ type SequencerDocument struct { // MongoSequencer returns a new mongo sequencer func NewMongoSequencer(logger log.ErrorLogger) *MongoSequencer { + once.Do(func() { + indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} + actuators.SetComponentsIndicator(componentName, indicators) + }) m := &MongoSequencer{ logger: logger, } @@ -62,6 +83,8 @@ func (e *MongoSequencer) Init(config sequencer.Configuration) error { // 1.parse config m, err := utils.ParseMongoMetadata(config.Properties) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } e.metadata = m @@ -73,16 +96,22 @@ func (e *MongoSequencer) Init(config sequencer.Configuration) error { e.ctx, e.cancel = context.WithCancel(context.Background()) if e.client, err = e.factory.NewMongoClient(m); err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } if err := e.client.Ping(e.ctx, nil); err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } // Connections Collection e.collection, err = utils.SetCollection(e.client, e.factory, e.metadata) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } @@ -94,6 +123,8 @@ func (e *MongoSequencer) Init(config sequencer.Configuration) error { // find key of biggerThan cursor, err := e.collection.Find(e.ctx, bson.M{"_id": k}) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } if cursor != nil && cursor.RemainingBatchLength() > 0 { @@ -105,7 +136,8 @@ func (e *MongoSequencer) Init(config sequencer.Configuration) error { } } } - + readinessIndicator.SetStarted() + livenessIndicator.SetStarted() return err } diff --git a/components/sequencer/mysql/mysql.go b/components/sequencer/mysql/mysql.go index 255fe86f11..1e8f7dbb2e 100644 --- a/components/sequencer/mysql/mysql.go +++ b/components/sequencer/mysql/mysql.go @@ -15,13 +15,30 @@ package mysql import ( "database/sql" "fmt" + "sync" "mosn.io/pkg/log" + "mosn.io/layotto/components/pkg/actuators" "mosn.io/layotto/components/pkg/utils" "mosn.io/layotto/components/sequencer" ) +const ( + componentName = "sequencer-mysql" +) + +var ( + once sync.Once + readinessIndicator *actuators.HealthIndicator + livenessIndicator *actuators.HealthIndicator +) + +func init() { + readinessIndicator = actuators.NewHealthIndicator() + livenessIndicator = actuators.NewHealthIndicator() +} + type MySQLSequencer struct { metadata utils.MySQLMetadata biggerThan map[string]int64 @@ -30,6 +47,10 @@ type MySQLSequencer struct { } func NewMySQLSequencer(logger log.ErrorLogger) *MySQLSequencer { + once.Do(func() { + indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} + actuators.SetComponentsIndicator(componentName, indicators) + }) s := &MySQLSequencer{ logger: logger, } @@ -42,6 +63,8 @@ func (e *MySQLSequencer) Init(config sequencer.Configuration) error { m, err := utils.ParseMySQLMetadata(config.Properties) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } e.metadata = m @@ -49,6 +72,8 @@ func (e *MySQLSequencer) Init(config sequencer.Configuration) error { e.biggerThan = config.BiggerThan if err = utils.NewMySQLClient(e.metadata); err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } @@ -64,6 +89,8 @@ func (e *MySQLSequencer) Init(config sequencer.Configuration) error { } } } + readinessIndicator.SetStarted() + livenessIndicator.SetStarted() return nil } diff --git a/components/sequencer/redis/standalone_redis_sequencer.go b/components/sequencer/redis/standalone_redis_sequencer.go index cff92f46be..95282fd8ab 100644 --- a/components/sequencer/redis/standalone_redis_sequencer.go +++ b/components/sequencer/redis/standalone_redis_sequencer.go @@ -14,14 +14,31 @@ package redis import ( "context" + "sync" "github.com/go-redis/redis/v8" "mosn.io/pkg/log" + "mosn.io/layotto/components/pkg/actuators" "mosn.io/layotto/components/pkg/utils" "mosn.io/layotto/components/sequencer" ) +const ( + componentName = "sequencer-redis-standalone" +) + +var ( + once sync.Once + readinessIndicator *actuators.HealthIndicator + livenessIndicator *actuators.HealthIndicator +) + +func init() { + readinessIndicator = actuators.NewHealthIndicator() + livenessIndicator = actuators.NewHealthIndicator() +} + type StandaloneRedisSequencer struct { client *redis.Client metadata utils.RedisMetadata @@ -35,6 +52,10 @@ type StandaloneRedisSequencer struct { // NewStandaloneRedisSequencer returns a new redis sequencer func NewStandaloneRedisSequencer(logger log.ErrorLogger) *StandaloneRedisSequencer { + once.Do(func() { + indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} + actuators.SetComponentsIndicator(componentName, indicators) + }) s := &StandaloneRedisSequencer{ logger: logger, } @@ -58,6 +79,8 @@ end func (s *StandaloneRedisSequencer) Init(config sequencer.Configuration) error { m, err := utils.ParseRedisMetadata(config.Properties) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } //init @@ -78,11 +101,15 @@ func (s *StandaloneRedisSequencer) Init(config sequencer.Configuration) error { err = eval.Err() //occur error, such as value is string type if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } //As long as there is no error, the initialization is successful //It may be a reset value or it may be satisfied before } + readinessIndicator.SetStarted() + livenessIndicator.SetStarted() return nil } diff --git a/components/sequencer/snowflake/snowflake_sequencer.go b/components/sequencer/snowflake/snowflake_sequencer.go index bd1d772b6b..22019cadaf 100755 --- a/components/sequencer/snowflake/snowflake_sequencer.go +++ b/components/sequencer/snowflake/snowflake_sequencer.go @@ -10,6 +10,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + package snowflake import ( @@ -21,9 +22,25 @@ import ( "mosn.io/pkg/log" + "mosn.io/layotto/components/pkg/actuators" "mosn.io/layotto/components/sequencer" ) +const ( + componentName = "sequencer-snowflake" +) + +var ( + once sync.Once + readinessIndicator *actuators.HealthIndicator + livenessIndicator *actuators.HealthIndicator +) + +func init() { + readinessIndicator = actuators.NewHealthIndicator() + livenessIndicator = actuators.NewHealthIndicator() +} + type SnowFlakeSequencer struct { metadata SnowflakeMetadata workerId int64 @@ -37,6 +54,10 @@ type SnowFlakeSequencer struct { } func NewSnowFlakeSequencer(logger log.ErrorLogger) *SnowFlakeSequencer { + once.Do(func() { + indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} + actuators.SetComponentsIndicator(componentName, indicators) + }) return &SnowFlakeSequencer{ logger: logger, smap: make(map[string]chan int64), @@ -47,6 +68,8 @@ func (s *SnowFlakeSequencer) Init(config sequencer.Configuration) error { var err error s.metadata, err = ParseSnowflakeMetadata(config.Properties) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } //for unit test @@ -56,8 +79,12 @@ func (s *SnowFlakeSequencer) Init(config sequencer.Configuration) error { s.ctx, s.cancel = context.WithCancel(context.Background()) if s.workerId, err = NewMysqlClient(&s.metadata.MysqlMetadata); err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } + readinessIndicator.SetStarted() + livenessIndicator.SetStarted() return err } diff --git a/components/sequencer/zookeeper/zookeeper_sequencer.go b/components/sequencer/zookeeper/zookeeper_sequencer.go index ab27683509..a69f21f22c 100644 --- a/components/sequencer/zookeeper/zookeeper_sequencer.go +++ b/components/sequencer/zookeeper/zookeeper_sequencer.go @@ -10,20 +10,37 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. + package zookeeper import ( "context" "fmt" + "sync" "github.com/go-zookeeper/zk" "mosn.io/pkg/log" + "mosn.io/layotto/components/pkg/actuators" "mosn.io/layotto/components/pkg/utils" "mosn.io/layotto/components/sequencer" ) -const maxInt32 = 2147483647 +const ( + componentName = "sequencer-zookeeper" + maxInt32 = 2147483647 +) + +var ( + once sync.Once + readinessIndicator *actuators.HealthIndicator + livenessIndicator *actuators.HealthIndicator +) + +func init() { + readinessIndicator = actuators.NewHealthIndicator() + livenessIndicator = actuators.NewHealthIndicator() +} type ZookeeperSequencer struct { client utils.ZKConnection @@ -37,6 +54,10 @@ type ZookeeperSequencer struct { // NewZookeeperSequencer returns a new zookeeper sequencer func NewZookeeperSequencer(logger log.ErrorLogger) *ZookeeperSequencer { + once.Do(func() { + indicators := &actuators.ComponentsIndicator{ReadinessIndicator: readinessIndicator, LivenessIndicator: livenessIndicator} + actuators.SetComponentsIndicator(componentName, indicators) + }) s := &ZookeeperSequencer{ logger: logger, } @@ -47,6 +68,8 @@ func NewZookeeperSequencer(logger log.ErrorLogger) *ZookeeperSequencer { func (s *ZookeeperSequencer) Init(config sequencer.Configuration) error { m, err := utils.ParseZookeeperMetadata(config.Properties) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } //init @@ -55,6 +78,8 @@ func (s *ZookeeperSequencer) Init(config sequencer.Configuration) error { s.factory = &utils.ConnectionFactoryImpl{} connection, err := s.factory.NewConnection(0, s.metadata) if err != nil { + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) return err } s.client = connection @@ -75,6 +100,8 @@ func (s *ZookeeperSequencer) Init(config sequencer.Configuration) error { if err == zk.ErrNoNode { return fmt.Errorf("zookeeper sequencer error: can not satisfy biggerThan guarantee.key: %s, current key does not exist", k) } + readinessIndicator.ReportError(err.Error()) + livenessIndicator.ReportError(err.Error()) //other error return err } @@ -85,6 +112,8 @@ func (s *ZookeeperSequencer) Init(config sequencer.Configuration) error { } } + readinessIndicator.SetStarted() + livenessIndicator.SetStarted() return err }