diff --git a/CHANGELOG.md b/CHANGELOG.md index 77a2437d84..0208c34857 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,8 @@ ### Cleanup * Removed the deprecated crypto.NewSHA256Signer function. * Finish removing the `LogMetadata.GetUnsequencedCounts()` method. - * Removed `TrillianLog.GetLeavesByHash` API. + * Removed `TrillianLog.GetLeavesByHash` and `TrillianLog.GetLeavesByIndex` + API. ### Storage refactoring * `NodeReader.GetMerkleNodes` does not accept revisions anymore. The diff --git a/README.md b/README.md index 5030003873..f2da7b5010 100644 --- a/README.md +++ b/README.md @@ -287,8 +287,8 @@ similar to those available for Certificate Transparency logs - `GetLatestSignedLogRoot` returns information about the current root of the Merkle tree for the log, including the tree size, hash value, timestamp and signature. - - `GetLeavesByIndex` and `GetLeavesByRange` return leaf information for - particular leaves, specified by their index in the log. + - `GetLeavesByRange` returns leaf information for particular leaves, + specified by their index in the log. - `QueueLeaves` requests inclusion of specified items into the log. - For a pre-ordered log, `AddSequencedLeaves` requests the inclusion of specified items into the log at specified places in the tree. diff --git a/client/log_client.go b/client/log_client.go index cd37462f9b..127257c8b1 100644 --- a/client/log_client.go +++ b/client/log_client.go @@ -74,21 +74,6 @@ func (c *LogClient) AddLeaf(ctx context.Context, data []byte) error { return nil } -// GetByIndex returns a single leaf at the requested index. -func (c *LogClient) GetByIndex(ctx context.Context, index int64) (*trillian.LogLeaf, error) { - resp, err := c.client.GetLeavesByIndex(ctx, &trillian.GetLeavesByIndexRequest{ - LogId: c.LogID, - LeafIndex: []int64{index}, - }) - if err != nil { - return nil, err - } - if got, want := len(resp.Leaves), 1; got != want { - return nil, fmt.Errorf("len(leaves): %v, want %v", got, want) - } - return resp.Leaves[0], nil -} - // ListByIndex returns the requested leaves by index. func (c *LogClient) ListByIndex(ctx context.Context, start, count int64) ([]*trillian.LogLeaf, error) { resp, err := c.client.GetLeavesByRange(ctx, diff --git a/client/log_client_test.go b/client/log_client_test.go index f994a8ad3f..41666a5e1a 100644 --- a/client/log_client_test.go +++ b/client/log_client_test.go @@ -71,34 +71,6 @@ func clientEnvForTest(ctx context.Context, t *testing.T, template *trillian.Tree return env, client } -func TestGetByIndex(t *testing.T) { - ctx := context.Background() - env, client := clientEnvForTest(ctx, t, stestonly.PreorderedLogTree) - defer env.Close() - - // Add a few test leaves. - leafData := [][]byte{ - []byte("A"), - []byte("B"), - []byte("C"), - } - - if err := addSequencedLeaves(ctx, env, client, leafData); err != nil { - t.Fatalf("Failed to add leaves: %v", err) - } - - for i, l := range leafData { - leaf, err := client.GetByIndex(ctx, int64(i)) - if err != nil { - t.Errorf("Failed to GetByIndex(%v): %v", i, err) - continue - } - if got, want := leaf.LeafValue, l; !bytes.Equal(got, want) { - t.Errorf("GetByIndex(%v) = %x, want %x", i, got, want) - } - } -} - func TestListByIndex(t *testing.T) { ctx := context.Background() env, client := clientEnvForTest(ctx, t, stestonly.PreorderedLogTree) diff --git a/docs/api.md b/docs/api.md index b6ee6c8f57..d9608598c0 100644 --- a/docs/api.md +++ b/docs/api.md @@ -19,8 +19,6 @@ - [GetInclusionProofResponse](#trillian.GetInclusionProofResponse) - [GetLatestSignedLogRootRequest](#trillian.GetLatestSignedLogRootRequest) - [GetLatestSignedLogRootResponse](#trillian.GetLatestSignedLogRootResponse) - - [GetLeavesByIndexRequest](#trillian.GetLeavesByIndexRequest) - - [GetLeavesByIndexResponse](#trillian.GetLeavesByIndexResponse) - [GetLeavesByRangeRequest](#trillian.GetLeavesByRangeRequest) - [GetLeavesByRangeResponse](#trillian.GetLeavesByRangeResponse) - [InitLogRequest](#trillian.InitLogRequest) @@ -319,39 +317,6 @@ As an example, a Certificate Transparency frontend might set the following user - - -### GetLeavesByIndexRequest - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| log_id | [int64](#int64) | | | -| leaf_index | [int64](#int64) | repeated | | -| charge_to | [ChargeTo](#trillian.ChargeTo) | | | - - - - - - - - -### GetLeavesByIndexResponse - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| leaves | [LogLeaf](#trillian.LogLeaf) | repeated | TODO(gbelvin): Response syntax does not allow for some requested leaves to be available, and some not (but using QueuedLogLeaf might) | -| signed_log_root | [SignedLogRoot](#trillian.SignedLogRoot) | | | - - - - - - ### GetLeavesByRangeRequest @@ -595,7 +560,6 @@ If the requested tree size is unavailable but the leaf is in scope for the curre | InitLog | [InitLogRequest](#trillian.InitLogRequest) | [InitLogResponse](#trillian.InitLogResponse) | InitLog initializes a particular tree, creating the initial signed log root (which will be of size 0). | | QueueLeaves | [QueueLeavesRequest](#trillian.QueueLeavesRequest) | [QueueLeavesResponse](#trillian.QueueLeavesResponse) | QueueLeaf adds a batch of leaves to the queue of pending leaves for a normal log. | | AddSequencedLeaves | [AddSequencedLeavesRequest](#trillian.AddSequencedLeavesRequest) | [AddSequencedLeavesResponse](#trillian.AddSequencedLeavesResponse) | AddSequencedLeaves adds a batch of leaves with assigned sequence numbers to a pre-ordered log. The indices of the provided leaves must be contiguous. | -| GetLeavesByIndex | [GetLeavesByIndexRequest](#trillian.GetLeavesByIndexRequest) | [GetLeavesByIndexResponse](#trillian.GetLeavesByIndexResponse) | GetLeavesByIndex returns a batch of leaves whose leaf indices are provided in the request. | | GetLeavesByRange | [GetLeavesByRangeRequest](#trillian.GetLeavesByRangeRequest) | [GetLeavesByRangeResponse](#trillian.GetLeavesByRangeResponse) | GetLeavesByRange returns a batch of leaves whose leaf indices are in a sequential range. | diff --git a/server/interceptor/interceptor.go b/server/interceptor/interceptor.go index c5572a0096..8f2bcc6f3c 100644 --- a/server/interceptor/interceptor.go +++ b/server/interceptor/interceptor.go @@ -388,9 +388,6 @@ func newRPCInfoForRequest(req interface{}) (*rpcInfo, error) { *trillian.GetLatestSignedLogRootRequest: info.treeTypes = []trillian.TreeType{trillian.TreeType_LOG, trillian.TreeType_PREORDERED_LOG} info.tokens = 1 - case *trillian.GetLeavesByIndexRequest: - info.treeTypes = []trillian.TreeType{trillian.TreeType_LOG, trillian.TreeType_PREORDERED_LOG} - info.tokens = len(req.GetLeafIndex()) case *trillian.GetLeavesByRangeRequest: info.treeTypes = []trillian.TreeType{trillian.TreeType_LOG, trillian.TreeType_PREORDERED_LOG} info.tokens = 1 diff --git a/server/interceptor/interceptor_test.go b/server/interceptor/interceptor_test.go index 8a0a8f74b2..98fc692f16 100644 --- a/server/interceptor/interceptor_test.go +++ b/server/interceptor/interceptor_test.go @@ -212,16 +212,6 @@ func TestTrillianInterceptor_QuotaInterception(t *testing.T) { }, wantTokens: 1, }, - { - desc: "logReadIndices", - method: "/trillian.TrillianLog/GetLeavesByIndex", - req: &trillian.GetLeavesByIndexRequest{LogId: logTree.TreeId, LeafIndex: []int64{1, 2, 3}}, - specs: []quota.Spec{ - {Group: quota.Tree, Kind: quota.Read, TreeID: logTree.TreeId}, - {Group: quota.Global, Kind: quota.Read, Refundable: true}, - }, - wantTokens: 3, - }, { desc: "logReadRange", method: "/trillian.TrillianLog/GetLeavesByRange", diff --git a/server/log_rpc_server.go b/server/log_rpc_server.go index 8bc6d8b6bb..955dce913a 100644 --- a/server/log_rpc_server.go +++ b/server/log_rpc_server.go @@ -463,49 +463,6 @@ func tryGetConsistencyProof(ctx context.Context, firstTreeSize, secondTreeSize, return proof, nil } -// GetLeavesByIndex obtains one or more leaves based on their sequence number within the -// tree. It is not possible to fetch leaves that have been queued but not yet integrated. -// TODO: Validate indices against published tree size in case we implement write sharding that -// can get ahead of this point. Not currently clear what component should own this state. -func (t *TrillianLogRPCServer) GetLeavesByIndex(ctx context.Context, req *trillian.GetLeavesByIndexRequest) (*trillian.GetLeavesByIndexResponse, error) { - ctx, spanEnd := spanFor(ctx, "GetLeavesByIndex") - defer spanEnd() - if err := validateGetLeavesByIndexRequest(req); err != nil { - return nil, err - } - - tree, ctx, err := t.getTreeAndContext(ctx, req.LogId, optsLogRead) - if err != nil { - return nil, err - } - tx, err := t.snapshotForTree(ctx, tree, "GetLeavesByIndex") - if err != nil { - return nil, err - } - defer t.closeAndLog(ctx, tree.TreeId, tx, "GetLeavesByIndex") - - leaves, err := tx.GetLeavesByIndex(ctx, req.LeafIndex) - if err != nil { - return nil, err - } - t.fetchedLeaves.Add(float64(len(leaves))) - - if err := t.commitAndLog(ctx, req.LogId, tx, "GetLeavesByIndex"); err != nil { - return nil, err - } - - slr, err := tx.LatestSignedLogRoot(ctx) - if err != nil { - return nil, err - } - var root types.LogRootV1 - if err := root.UnmarshalBinary(slr.LogRoot); err != nil { - return nil, status.Errorf(codes.Internal, "Could not read current log root: %v", err) - } - - return &trillian.GetLeavesByIndexResponse{Leaves: leaves, SignedLogRoot: slr}, nil -} - // GetLeavesByRange obtains leaves based on a range of sequence numbers within the tree. // This only fetches sequenced leaves; leaves that have been queued but not yet integrated // are not visible. diff --git a/server/log_rpc_server_test.go b/server/log_rpc_server_test.go index 2726b68cfa..591bfc8147 100644 --- a/server/log_rpc_server_test.go +++ b/server/log_rpc_server_test.go @@ -83,9 +83,6 @@ var ( leafHash2 = []byte("\x05\x37\xd4\x81\xf7\x3a\x75\x73\x34\x32\x80\x52\xda\x3a\xf9\x62\x6c\xed\x97\x02\x8e\x20\xb8\x49\xf6\x11\x5c\x22\xcd\x76\x51\x97") leaf3 = newTestLeaf([]byte("value3"), []byte("extra3"), 3) - leaf0Request = trillian.GetLeavesByIndexRequest{LogId: logID1, LeafIndex: []int64{0}} - leaf03Request = trillian.GetLeavesByIndexRequest{LogId: logID1, LeafIndex: []int64{0, 3}} - queueRequest0 = trillian.QueueLeavesRequest{LogId: logID1, Leaves: []*trillian.LogLeaf{leaf1}} queueRequest0Log2 = trillian.QueueLeavesRequest{LogId: logID2, Leaves: []*trillian.LogLeaf{leaf1}} @@ -124,161 +121,6 @@ var ( corruptLogRoot = &trillian.SignedLogRoot{LogRoot: []byte("this is not tls encoded data")} ) -func TestGetLeavesByIndex(t *testing.T) { - for _, tc := range []struct { - name string - setupStorage func(*gomock.Controller, *storage.MockLogStorage) - snapErr error - treeErr error - req *trillian.GetLeavesByIndexRequest - errStr string - wantResp *trillian.GetLeavesByIndexResponse - }{ - { - name: "admin snapshot fails", - setupStorage: func(_ *gomock.Controller, s *storage.MockLogStorage) { - }, - req: &leaf0Request, - snapErr: errors.New("admin snap"), - errStr: "admin snap", - }, - { - name: "get tree fails", - setupStorage: func(_ *gomock.Controller, s *storage.MockLogStorage) { - }, - req: &leaf0Request, - treeErr: errors.New("tree error"), - errStr: "tree error", - }, - { - name: "begin fails", - setupStorage: func(_ *gomock.Controller, s *storage.MockLogStorage) { - s.EXPECT().SnapshotForTree(gomock.Any(), cmpMatcher{tree1}).Return(nil, errors.New("TX")) - }, - req: &leaf0Request, - errStr: "TX", - }, - { - name: "not initialized", - setupStorage: func(c *gomock.Controller, s *storage.MockLogStorage) { - tx := storage.NewMockLogTreeTX(c) - s.EXPECT().SnapshotForTree(gomock.Any(), cmpMatcher{tree1}).Return(tx, storage.ErrTreeNeedsInit) - tx.EXPECT().Close().Return(nil) - }, - req: &leaf0Request, - errStr: "tree needs init", - }, - { - name: "storage error", - setupStorage: func(c *gomock.Controller, s *storage.MockLogStorage) { - tx := storage.NewMockLogTreeTX(c) - s.EXPECT().SnapshotForTree(gomock.Any(), cmpMatcher{tree1}).Return(tx, nil) - tx.EXPECT().GetLeavesByIndex(gomock.Any(), []int64{0}).Return(nil, errors.New("STORAGE")) - tx.EXPECT().Close().Return(nil) - }, - req: &leaf0Request, - errStr: "STORAGE", - }, - { - name: "commit fails", - setupStorage: func(c *gomock.Controller, s *storage.MockLogStorage) { - tx := storage.NewMockLogTreeTX(c) - s.EXPECT().SnapshotForTree(gomock.Any(), cmpMatcher{tree1}).Return(tx, nil) - tx.EXPECT().GetLeavesByIndex(gomock.Any(), []int64{0}).Return([]*trillian.LogLeaf{leaf1}, nil) - tx.EXPECT().Commit(gomock.Any()).Return(errors.New("COMMIT")) - tx.EXPECT().Close().Return(nil) - }, - req: &leaf0Request, - errStr: "COMMIT", - }, - { - name: "log root fails", - setupStorage: func(c *gomock.Controller, s *storage.MockLogStorage) { - tx := storage.NewMockLogTreeTX(c) - s.EXPECT().SnapshotForTree(gomock.Any(), cmpMatcher{tree1}).Return(tx, nil) - tx.EXPECT().GetLeavesByIndex(gomock.Any(), []int64{0}).Return([]*trillian.LogLeaf{leaf1}, nil) - tx.EXPECT().LatestSignedLogRoot(gomock.Any()).Return(signedRoot1, errors.New("SLR")) - tx.EXPECT().Commit(gomock.Any()).Return(nil) - tx.EXPECT().Close().Return(nil) - tx.EXPECT().IsOpen().AnyTimes().Return(false) - }, - req: &leaf0Request, - errStr: "SLR", - }, - { - name: "bad log root", - setupStorage: func(c *gomock.Controller, s *storage.MockLogStorage) { - tx := storage.NewMockLogTreeTX(c) - s.EXPECT().SnapshotForTree(gomock.Any(), cmpMatcher{tree1}).Return(tx, nil) - tx.EXPECT().GetLeavesByIndex(gomock.Any(), []int64{0}).Return([]*trillian.LogLeaf{leaf1}, nil) - tx.EXPECT().LatestSignedLogRoot(gomock.Any()).Return(corruptLogRoot, nil) - tx.EXPECT().Commit(gomock.Any()).Return(nil) - tx.EXPECT().Close().Return(nil) - tx.EXPECT().IsOpen().AnyTimes().Return(false) - }, - req: &leaf0Request, - errStr: "not read current log root", - }, - { - name: "ok", - setupStorage: func(c *gomock.Controller, s *storage.MockLogStorage) { - tx := storage.NewMockLogTreeTX(c) - s.EXPECT().SnapshotForTree(gomock.Any(), cmpMatcher{tree1}).Return(tx, nil) - tx.EXPECT().GetLeavesByIndex(gomock.Any(), []int64{0}).Return([]*trillian.LogLeaf{leaf1}, nil) - tx.EXPECT().LatestSignedLogRoot(gomock.Any()).Return(signedRoot1, nil) - tx.EXPECT().Commit(gomock.Any()).Return(nil) - tx.EXPECT().Close().Return(nil) - tx.EXPECT().IsOpen().AnyTimes().Return(false) - }, - req: &leaf0Request, - wantResp: &trillian.GetLeavesByIndexResponse{ - SignedLogRoot: signedRoot1, - Leaves: []*trillian.LogLeaf{leaf1}, - }, - }, - { - name: "ok multiple", - setupStorage: func(c *gomock.Controller, s *storage.MockLogStorage) { - tx := storage.NewMockLogTreeTX(c) - s.EXPECT().SnapshotForTree(gomock.Any(), cmpMatcher{tree1}).Return(tx, nil) - tx.EXPECT().GetLeavesByIndex(gomock.Any(), []int64{0, 3}).Return([]*trillian.LogLeaf{leaf1, leaf3}, nil) - tx.EXPECT().LatestSignedLogRoot(gomock.Any()).Return(signedRoot1, nil) - tx.EXPECT().Commit(gomock.Any()).Return(nil) - tx.EXPECT().Close().Return(nil) - tx.EXPECT().IsOpen().AnyTimes().Return(false) - }, - req: &leaf03Request, - wantResp: &trillian.GetLeavesByIndexResponse{ - SignedLogRoot: signedRoot1, - Leaves: []*trillian.LogLeaf{leaf1, leaf3}, - }, - }, - } { - t.Run(tc.name, func(t *testing.T) { - ctrl := gomock.NewController(t) - defer ctrl.Finish() - fakeStorage := storage.NewMockLogStorage(ctrl) - tc.setupStorage(ctrl, fakeStorage) - registry := extension.Registry{ - AdminStorage: fakeAdminStorage(ctrl, storageParams{treeID: leaf0Request.LogId, numSnapshots: 1, snapErr: tc.snapErr, treeErr: tc.treeErr}), - LogStorage: fakeStorage, - } - server := NewTrillianLogRPCServer(registry, fakeTimeSource) - resp, err := server.GetLeavesByIndex(context.Background(), tc.req) - if len(tc.errStr) > 0 { - if err == nil || !strings.Contains(err.Error(), tc.errStr) { - t.Errorf("GetLeavesByIndex(%v)=%v, %v want nil, err containing: %s", tc.req, resp, err, tc.errStr) - } - return - } - - if err != nil || !proto.Equal(tc.wantResp, resp) { - t.Errorf("GetLeavesByIndex(%v)=%v, %v, want: %v, nil", tc.req, resp, err, tc.wantResp) - } - }) - } -} - func TestGetLeavesByRange(t *testing.T) { ctx := context.Background() ctrl := gomock.NewController(t) @@ -838,7 +680,7 @@ func TestGetProofByHashErrors(t *testing.T) { tc.setupStorage(ctrl, fakeStorage) } registry := extension.Registry{ - AdminStorage: fakeAdminStorage(ctrl, storageParams{treeID: leaf0Request.LogId, numSnapshots: 1, snapErr: tc.snapErr, treeErr: tc.treeErr}), + AdminStorage: fakeAdminStorage(ctrl, storageParams{treeID: logID1, numSnapshots: 1, snapErr: tc.snapErr, treeErr: tc.treeErr}), LogStorage: fakeStorage, } server := NewTrillianLogRPCServer(registry, fakeTimeSource) @@ -1093,7 +935,7 @@ func TestGetProofByIndex(t *testing.T) { fakeStorage := storage.NewMockLogStorage(ctrl) tc.setupStorage(ctrl, fakeStorage) registry := extension.Registry{ - AdminStorage: fakeAdminStorage(ctrl, storageParams{treeID: leaf0Request.LogId, numSnapshots: 1, snapErr: tc.snapErr, treeErr: tc.treeErr}), + AdminStorage: fakeAdminStorage(ctrl, storageParams{treeID: logID1, numSnapshots: 1, snapErr: tc.snapErr, treeErr: tc.treeErr}), LogStorage: fakeStorage, } server := NewTrillianLogRPCServer(registry, fakeTimeSource) @@ -1312,7 +1154,7 @@ func TestGetEntryAndProof(t *testing.T) { fakeStorage := storage.NewMockLogStorage(ctrl) tc.setupStorage(ctrl, fakeStorage) registry := extension.Registry{ - AdminStorage: fakeAdminStorage(ctrl, storageParams{treeID: leaf0Request.LogId, numSnapshots: 1, snapErr: tc.snapErr, treeErr: tc.treeErr}), + AdminStorage: fakeAdminStorage(ctrl, storageParams{treeID: logID1, numSnapshots: 1, snapErr: tc.snapErr, treeErr: tc.treeErr}), LogStorage: fakeStorage, } server := NewTrillianLogRPCServer(registry, fakeTimeSource) @@ -1656,36 +1498,6 @@ func TestTrillianLogRPCServer_GetInclusionProofByHashErrors(t *testing.T) { } } -func TestTrillianLogRPCServer_GetLeavesByIndexErrors(t *testing.T) { - tests := []struct { - desc string - req *trillian.GetLeavesByIndexRequest - }{ - { - desc: "nilLeafIndex", - req: &trillian.GetLeavesByIndexRequest{ - LogId: 1, - }, - }, - { - desc: "badLeadIndex", - req: &trillian.GetLeavesByIndexRequest{ - LogId: 1, - LeafIndex: []int64{10, -11, 12}, - }, - }, - } - - logServer := NewTrillianLogRPCServer(extension.Registry{}, fakeTimeSource) - ctx := context.Background() - for _, test := range tests { - _, err := logServer.GetLeavesByIndex(ctx, test.req) - if s, ok := status.FromError(err); !ok || s.Code() != codes.InvalidArgument { - t.Errorf("%v: GetLeavesByIndex() returned err = %v, wantCode = %s", test.desc, err, codes.InvalidArgument) - } - } -} - func TestTrillianLogRPCServer_QueueLeafErrors(t *testing.T) { leafValue := []byte("leaf value") diff --git a/server/validate.go b/server/validate.go index 6fe959f2c9..149c74c4d9 100644 --- a/server/validate.go +++ b/server/validate.go @@ -46,18 +46,6 @@ func validateGetInclusionProofByHashRequest(req *trillian.GetInclusionProofByHas return nil } -func validateGetLeavesByIndexRequest(req *trillian.GetLeavesByIndexRequest) error { - if len(req.LeafIndex) == 0 { - return status.Error(codes.InvalidArgument, "GetLeavesByIndexRequest.LeafIndex empty") - } - for i, leafIndex := range req.LeafIndex { - if leafIndex < 0 { - return status.Errorf(codes.InvalidArgument, "GetLeavesByIndexRequest.LeafIndex[%v]: %v, want >= 0", i, leafIndex) - } - } - return nil -} - func validateGetLeavesByRangeRequest(req *trillian.GetLeavesByRangeRequest) error { if req.StartIndex < 0 { return status.Errorf(codes.InvalidArgument, "GetLeavesByRangeRequest.StartIndex: %v, want >= 0", req.StartIndex) diff --git a/testonly/tmock/mock_log_server.go b/testonly/tmock/mock_log_server.go index dfc2a2ffba..103c50b767 100644 --- a/testonly/tmock/mock_log_server.go +++ b/testonly/tmock/mock_log_server.go @@ -140,21 +140,6 @@ func (mr *MockTrillianLogServerMockRecorder) GetLatestSignedLogRoot(arg0, arg1 i return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetLatestSignedLogRoot", reflect.TypeOf((*MockTrillianLogServer)(nil).GetLatestSignedLogRoot), arg0, arg1) } -// GetLeavesByIndex mocks base method. -func (m *MockTrillianLogServer) GetLeavesByIndex(arg0 context.Context, arg1 *trillian.GetLeavesByIndexRequest) (*trillian.GetLeavesByIndexResponse, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetLeavesByIndex", arg0, arg1) - ret0, _ := ret[0].(*trillian.GetLeavesByIndexResponse) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetLeavesByIndex indicates an expected call of GetLeavesByIndex. -func (mr *MockTrillianLogServerMockRecorder) GetLeavesByIndex(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetLeavesByIndex", reflect.TypeOf((*MockTrillianLogServer)(nil).GetLeavesByIndex), arg0, arg1) -} - // GetLeavesByRange mocks base method. func (m *MockTrillianLogServer) GetLeavesByRange(arg0 context.Context, arg1 *trillian.GetLeavesByRangeRequest) (*trillian.GetLeavesByRangeResponse, error) { m.ctrl.T.Helper() diff --git a/trillian_log_api.pb.go b/trillian_log_api.pb.go index 78e6c1c2ae..f88ae56513 100644 --- a/trillian_log_api.pb.go +++ b/trillian_log_api.pb.go @@ -1318,125 +1318,6 @@ func (x *AddSequencedLeavesResponse) GetResults() []*QueuedLogLeaf { return nil } -type GetLeavesByIndexRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - LogId int64 `protobuf:"varint,1,opt,name=log_id,json=logId,proto3" json:"log_id,omitempty"` - LeafIndex []int64 `protobuf:"varint,2,rep,packed,name=leaf_index,json=leafIndex,proto3" json:"leaf_index,omitempty"` - ChargeTo *ChargeTo `protobuf:"bytes,5,opt,name=charge_to,json=chargeTo,proto3" json:"charge_to,omitempty"` -} - -func (x *GetLeavesByIndexRequest) Reset() { - *x = GetLeavesByIndexRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_trillian_log_api_proto_msgTypes[21] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetLeavesByIndexRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetLeavesByIndexRequest) ProtoMessage() {} - -func (x *GetLeavesByIndexRequest) ProtoReflect() protoreflect.Message { - mi := &file_trillian_log_api_proto_msgTypes[21] - 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 GetLeavesByIndexRequest.ProtoReflect.Descriptor instead. -func (*GetLeavesByIndexRequest) Descriptor() ([]byte, []int) { - return file_trillian_log_api_proto_rawDescGZIP(), []int{21} -} - -func (x *GetLeavesByIndexRequest) GetLogId() int64 { - if x != nil { - return x.LogId - } - return 0 -} - -func (x *GetLeavesByIndexRequest) GetLeafIndex() []int64 { - if x != nil { - return x.LeafIndex - } - return nil -} - -func (x *GetLeavesByIndexRequest) GetChargeTo() *ChargeTo { - if x != nil { - return x.ChargeTo - } - return nil -} - -type GetLeavesByIndexResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // TODO(gbelvin): Response syntax does not allow for some requested leaves to be available, and some not (but using QueuedLogLeaf might) - Leaves []*LogLeaf `protobuf:"bytes,2,rep,name=leaves,proto3" json:"leaves,omitempty"` - SignedLogRoot *SignedLogRoot `protobuf:"bytes,3,opt,name=signed_log_root,json=signedLogRoot,proto3" json:"signed_log_root,omitempty"` -} - -func (x *GetLeavesByIndexResponse) Reset() { - *x = GetLeavesByIndexResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_trillian_log_api_proto_msgTypes[22] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetLeavesByIndexResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetLeavesByIndexResponse) ProtoMessage() {} - -func (x *GetLeavesByIndexResponse) ProtoReflect() protoreflect.Message { - mi := &file_trillian_log_api_proto_msgTypes[22] - 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 GetLeavesByIndexResponse.ProtoReflect.Descriptor instead. -func (*GetLeavesByIndexResponse) Descriptor() ([]byte, []int) { - return file_trillian_log_api_proto_rawDescGZIP(), []int{22} -} - -func (x *GetLeavesByIndexResponse) GetLeaves() []*LogLeaf { - if x != nil { - return x.Leaves - } - return nil -} - -func (x *GetLeavesByIndexResponse) GetSignedLogRoot() *SignedLogRoot { - if x != nil { - return x.SignedLogRoot - } - return nil -} - type GetLeavesByRangeRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1451,7 +1332,7 @@ type GetLeavesByRangeRequest struct { func (x *GetLeavesByRangeRequest) Reset() { *x = GetLeavesByRangeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_trillian_log_api_proto_msgTypes[23] + mi := &file_trillian_log_api_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1464,7 +1345,7 @@ func (x *GetLeavesByRangeRequest) String() string { func (*GetLeavesByRangeRequest) ProtoMessage() {} func (x *GetLeavesByRangeRequest) ProtoReflect() protoreflect.Message { - mi := &file_trillian_log_api_proto_msgTypes[23] + mi := &file_trillian_log_api_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1477,7 +1358,7 @@ func (x *GetLeavesByRangeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetLeavesByRangeRequest.ProtoReflect.Descriptor instead. func (*GetLeavesByRangeRequest) Descriptor() ([]byte, []int) { - return file_trillian_log_api_proto_rawDescGZIP(), []int{23} + return file_trillian_log_api_proto_rawDescGZIP(), []int{21} } func (x *GetLeavesByRangeRequest) GetLogId() int64 { @@ -1524,7 +1405,7 @@ type GetLeavesByRangeResponse struct { func (x *GetLeavesByRangeResponse) Reset() { *x = GetLeavesByRangeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_trillian_log_api_proto_msgTypes[24] + mi := &file_trillian_log_api_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1537,7 +1418,7 @@ func (x *GetLeavesByRangeResponse) String() string { func (*GetLeavesByRangeResponse) ProtoMessage() {} func (x *GetLeavesByRangeResponse) ProtoReflect() protoreflect.Message { - mi := &file_trillian_log_api_proto_msgTypes[24] + mi := &file_trillian_log_api_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1550,7 +1431,7 @@ func (x *GetLeavesByRangeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetLeavesByRangeResponse.ProtoReflect.Descriptor instead. func (*GetLeavesByRangeResponse) Descriptor() ([]byte, []int) { - return file_trillian_log_api_proto_rawDescGZIP(), []int{24} + return file_trillian_log_api_proto_rawDescGZIP(), []int{22} } func (x *GetLeavesByRangeResponse) GetLeaves() []*LogLeaf { @@ -1592,7 +1473,7 @@ type QueuedLogLeaf struct { func (x *QueuedLogLeaf) Reset() { *x = QueuedLogLeaf{} if protoimpl.UnsafeEnabled { - mi := &file_trillian_log_api_proto_msgTypes[25] + mi := &file_trillian_log_api_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1605,7 +1486,7 @@ func (x *QueuedLogLeaf) String() string { func (*QueuedLogLeaf) ProtoMessage() {} func (x *QueuedLogLeaf) ProtoReflect() protoreflect.Message { - mi := &file_trillian_log_api_proto_msgTypes[25] + mi := &file_trillian_log_api_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1618,7 +1499,7 @@ func (x *QueuedLogLeaf) ProtoReflect() protoreflect.Message { // Deprecated: Use QueuedLogLeaf.ProtoReflect.Descriptor instead. func (*QueuedLogLeaf) Descriptor() ([]byte, []int) { - return file_trillian_log_api_proto_rawDescGZIP(), []int{25} + return file_trillian_log_api_proto_rawDescGZIP(), []int{23} } func (x *QueuedLogLeaf) GetLeaf() *LogLeaf { @@ -1709,7 +1590,7 @@ type LogLeaf struct { func (x *LogLeaf) Reset() { *x = LogLeaf{} if protoimpl.UnsafeEnabled { - mi := &file_trillian_log_api_proto_msgTypes[26] + mi := &file_trillian_log_api_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1722,7 +1603,7 @@ func (x *LogLeaf) String() string { func (*LogLeaf) ProtoMessage() {} func (x *LogLeaf) ProtoReflect() protoreflect.Message { - mi := &file_trillian_log_api_proto_msgTypes[26] + mi := &file_trillian_log_api_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1735,7 +1616,7 @@ func (x *LogLeaf) ProtoReflect() protoreflect.Message { // Deprecated: Use LogLeaf.ProtoReflect.Descriptor instead. func (*LogLeaf) Descriptor() ([]byte, []int) { - return file_trillian_log_api_proto_rawDescGZIP(), []int{26} + return file_trillian_log_api_proto_rawDescGZIP(), []int{24} } func (x *LogLeaf) GetMerkleLeafHash() []byte { @@ -1964,170 +1845,147 @@ var file_trillian_log_api_proto_rawDesc = []byte{ 0x65, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x51, 0x75, 0x65, 0x75, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x07, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x76, - 0x65, 0x73, 0x42, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x75, 0x6c, 0x74, 0x73, 0x22, 0x98, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x76, + 0x65, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x65, 0x61, 0x66, 0x5f, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x03, 0x28, 0x03, 0x52, 0x09, 0x6c, 0x65, 0x61, - 0x66, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, - 0x5f, 0x74, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x72, 0x69, 0x6c, - 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x54, 0x6f, 0x52, 0x08, 0x63, - 0x68, 0x61, 0x72, 0x67, 0x65, 0x54, 0x6f, 0x22, 0x86, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x4c, - 0x65, 0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, - 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x06, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x12, - 0x3f, 0x0a, 0x0f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x72, 0x6f, - 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, - 0x69, 0x61, 0x6e, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x52, 0x6f, 0x6f, - 0x74, 0x52, 0x0d, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x52, 0x6f, 0x6f, 0x74, - 0x22, 0x98, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x42, 0x79, - 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, - 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6c, 0x6f, - 0x67, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x68, - 0x61, 0x72, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x54, - 0x6f, 0x52, 0x08, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x54, 0x6f, 0x22, 0x86, 0x01, 0x0a, 0x18, - 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x6c, 0x65, 0x61, 0x76, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, - 0x69, 0x61, 0x6e, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x06, 0x6c, 0x65, 0x61, - 0x76, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x0f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x6c, 0x6f, - 0x67, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, - 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x6f, - 0x67, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x0d, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x6f, 0x67, - 0x52, 0x6f, 0x6f, 0x74, 0x22, 0x62, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x75, 0x65, 0x64, 0x4c, 0x6f, - 0x67, 0x4c, 0x65, 0x61, 0x66, 0x12, 0x25, 0x0a, 0x04, 0x6c, 0x65, 0x61, 0x66, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x4c, - 0x6f, 0x67, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x04, 0x6c, 0x65, 0x61, 0x66, 0x12, 0x2a, 0x0a, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xd0, 0x02, 0x0a, 0x07, 0x4c, 0x6f, 0x67, - 0x4c, 0x65, 0x61, 0x66, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x5f, 0x6c, - 0x65, 0x61, 0x66, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, - 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x4c, 0x65, 0x61, 0x66, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1d, - 0x0a, 0x0a, 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x09, 0x6c, 0x65, 0x61, 0x66, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1d, 0x0a, - 0x0a, 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x09, 0x65, 0x78, 0x74, 0x72, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1d, 0x0a, 0x0a, - 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x09, 0x6c, 0x65, 0x61, 0x66, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x2c, 0x0a, 0x12, 0x6c, - 0x65, 0x61, 0x66, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x68, 0x61, 0x73, - 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x6c, 0x65, 0x61, 0x66, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x48, 0x61, 0x73, 0x68, 0x12, 0x43, 0x0a, 0x0f, 0x71, 0x75, 0x65, - 0x75, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0e, - 0x71, 0x75, 0x65, 0x75, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x4b, - 0x0a, 0x13, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x12, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x32, 0xec, 0x0b, 0x0a, 0x0b, - 0x54, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x4c, 0x6f, 0x67, 0x12, 0x6e, 0x0a, 0x09, 0x51, - 0x75, 0x65, 0x75, 0x65, 0x4c, 0x65, 0x61, 0x66, 0x12, 0x1a, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, - 0x69, 0x61, 0x6e, 0x2e, 0x51, 0x75, 0x65, 0x75, 0x65, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, - 0x51, 0x75, 0x65, 0x75, 0x65, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x22, 0x1d, 0x2f, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, - 0x7d, 0x2f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x8d, 0x01, 0x0a, 0x10, + 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2f, + 0x0a, 0x09, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x43, 0x68, 0x61, + 0x72, 0x67, 0x65, 0x54, 0x6f, 0x52, 0x08, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x54, 0x6f, 0x22, + 0x86, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x52, + 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, + 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, + 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x61, 0x66, 0x52, + 0x06, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x0f, 0x73, 0x69, 0x67, 0x6e, 0x65, + 0x64, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x53, 0x69, 0x67, 0x6e, + 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x0d, 0x73, 0x69, 0x67, 0x6e, 0x65, + 0x64, 0x4c, 0x6f, 0x67, 0x52, 0x6f, 0x6f, 0x74, 0x22, 0x62, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x75, + 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x61, 0x66, 0x12, 0x25, 0x0a, 0x04, 0x6c, 0x65, 0x61, + 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, + 0x61, 0x6e, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x04, 0x6c, 0x65, 0x61, 0x66, + 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xd0, 0x02, 0x0a, + 0x07, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x61, 0x66, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x65, 0x72, 0x6b, + 0x6c, 0x65, 0x5f, 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0e, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x4c, 0x65, 0x61, 0x66, 0x48, 0x61, + 0x73, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x6c, 0x65, 0x61, 0x66, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x65, 0x78, 0x74, 0x72, 0x61, 0x44, 0x61, 0x74, 0x61, + 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6c, 0x65, 0x61, 0x66, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, + 0x2c, 0x0a, 0x12, 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x6c, 0x65, 0x61, + 0x66, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x48, 0x61, 0x73, 0x68, 0x12, 0x43, 0x0a, + 0x0f, 0x71, 0x75, 0x65, 0x75, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x12, 0x4b, 0x0a, 0x13, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x12, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x32, + 0x8f, 0x0b, 0x0a, 0x0b, 0x54, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x4c, 0x6f, 0x67, 0x12, + 0x6e, 0x0a, 0x09, 0x51, 0x75, 0x65, 0x75, 0x65, 0x4c, 0x65, 0x61, 0x66, 0x12, 0x1a, 0x2e, 0x74, + 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x51, 0x75, 0x65, 0x75, 0x65, 0x4c, 0x65, 0x61, + 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, + 0x69, 0x61, 0x6e, 0x2e, 0x51, 0x75, 0x65, 0x75, 0x65, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x22, 0x1d, 0x2f, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x6f, + 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, + 0x8d, 0x01, 0x0a, 0x10, 0x41, 0x64, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, + 0x4c, 0x65, 0x61, 0x66, 0x12, 0x21, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x41, 0x64, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4c, 0x65, 0x61, 0x66, - 0x12, 0x21, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x41, 0x64, 0x64, 0x53, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x41, - 0x64, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4c, 0x65, 0x61, 0x66, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x22, - 0x27, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x7b, - 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x3a, 0x73, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0xa0, 0x01, 0x0a, 0x11, - 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x12, 0x22, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, - 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, + 0x61, 0x6e, 0x2e, 0x41, 0x64, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4c, + 0x65, 0x61, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x2c, 0x22, 0x27, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x6c, 0x6f, + 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x65, 0x61, 0x76, + 0x65, 0x73, 0x3a, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x3a, 0x01, 0x2a, 0x12, + 0xa0, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x22, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x42, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x3c, 0x12, 0x3a, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x6c, 0x6f, 0x67, + 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x74, 0x72, 0x69, 0x6c, + 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, + 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x42, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3c, 0x12, 0x3a, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, + 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6c, + 0x65, 0x61, 0x76, 0x65, 0x73, 0x2f, 0x7b, 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x7d, 0x3a, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, + 0x6f, 0x66, 0x12, 0xa7, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, + 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x12, 0x28, + 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, + 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x79, 0x48, 0x61, 0x73, + 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, + 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x37, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x12, 0x2f, 0x2f, 0x76, 0x31, + 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x6f, 0x67, 0x5f, + 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x3a, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x79, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x12, 0x94, 0x01, 0x0a, + 0x13, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x24, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, + 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x74, 0x72, 0x69, + 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x12, 0x28, 0x2f, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, + 0x7d, 0x3a, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x70, 0x72, + 0x6f, 0x6f, 0x66, 0x12, 0x98, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, + 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x27, + 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, + 0x65, 0x73, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x52, 0x6f, 0x6f, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, + 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x53, 0x69, 0x67, 0x6e, + 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, + 0x7d, 0x2f, 0x72, 0x6f, 0x6f, 0x74, 0x73, 0x3a, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x12, 0x8d, + 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x41, 0x6e, 0x64, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x12, 0x21, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, + 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x2c, 0x12, 0x2a, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x65, 0x61, 0x76, 0x65, - 0x73, 0x2f, 0x7b, 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x3a, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0xa7, - 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x12, 0x28, 0x2e, 0x74, 0x72, 0x69, - 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, - 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, - 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x37, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x12, 0x2f, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, - 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x3a, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, - 0x5f, 0x62, 0x79, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x12, 0x94, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, - 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x12, 0x24, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x43, - 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, - 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x12, 0x28, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, - 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x3a, 0x63, 0x6f, - 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, - 0x98, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x53, 0x69, 0x67, - 0x6e, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x27, 0x2e, 0x74, 0x72, 0x69, - 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x53, - 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, - 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x6f, - 0x67, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, - 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x6f, - 0x6f, 0x74, 0x73, 0x3a, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x12, 0x8d, 0x01, 0x0a, 0x10, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, - 0x21, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x12, 0x2a, - 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x7b, 0x6c, - 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x2f, 0x7b, 0x6c, - 0x65, 0x61, 0x66, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x12, 0x63, 0x0a, 0x07, 0x49, 0x6e, - 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x12, 0x18, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, - 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x19, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x4c, - 0x6f, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x1d, 0x22, 0x1b, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x6c, 0x6f, 0x67, - 0x73, 0x2f, 0x7b, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x3a, 0x69, 0x6e, 0x69, 0x74, 0x12, - 0x4c, 0x0a, 0x0b, 0x51, 0x75, 0x65, 0x75, 0x65, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x12, 0x1c, - 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x51, 0x75, 0x65, 0x75, 0x65, 0x4c, - 0x65, 0x61, 0x76, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x74, - 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x51, 0x75, 0x65, 0x75, 0x65, 0x4c, 0x65, 0x61, - 0x76, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, - 0x12, 0x41, 0x64, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4c, 0x65, 0x61, - 0x76, 0x65, 0x73, 0x12, 0x23, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x41, - 0x64, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4c, 0x65, 0x61, 0x76, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, - 0x69, 0x61, 0x6e, 0x2e, 0x41, 0x64, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, - 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x5b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x12, 0x21, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, - 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, - 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, - 0x10, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, - 0x65, 0x12, 0x21, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, - 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, - 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x4e, 0x0a, 0x19, 0x63, 0x6f, - 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x42, 0x13, 0x54, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, - 0x6e, 0x4c, 0x6f, 0x67, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1a, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2f, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x73, 0x2f, 0x7b, 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x12, 0x63, + 0x0a, 0x07, 0x49, 0x6e, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x12, 0x18, 0x2e, 0x74, 0x72, 0x69, 0x6c, + 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x49, + 0x6e, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x22, 0x1b, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, + 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x3a, 0x69, + 0x6e, 0x69, 0x74, 0x12, 0x4c, 0x0a, 0x0b, 0x51, 0x75, 0x65, 0x75, 0x65, 0x4c, 0x65, 0x61, 0x76, + 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x51, 0x75, + 0x65, 0x75, 0x65, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1d, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x51, 0x75, 0x65, 0x75, + 0x65, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x61, 0x0a, 0x12, 0x41, 0x64, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, + 0x64, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x12, 0x23, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, + 0x61, 0x6e, 0x2e, 0x41, 0x64, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4c, + 0x65, 0x61, 0x76, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x74, + 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x41, 0x64, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x65, 0x64, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, + 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x21, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, + 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x52, + 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x74, 0x72, + 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, + 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x42, 0x4e, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x42, 0x13, + 0x54, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x4c, 0x6f, 0x67, 0x41, 0x70, 0x69, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, + 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2142,7 +2000,7 @@ func file_trillian_log_api_proto_rawDescGZIP() []byte { return file_trillian_log_api_proto_rawDescData } -var file_trillian_log_api_proto_msgTypes = make([]protoimpl.MessageInfo, 27) +var file_trillian_log_api_proto_msgTypes = make([]protoimpl.MessageInfo, 25) var file_trillian_log_api_proto_goTypes = []interface{}{ (*ChargeTo)(nil), // 0: trillian.ChargeTo (*QueueLeafRequest)(nil), // 1: trillian.QueueLeafRequest @@ -2165,87 +2023,80 @@ var file_trillian_log_api_proto_goTypes = []interface{}{ (*QueueLeavesResponse)(nil), // 18: trillian.QueueLeavesResponse (*AddSequencedLeavesRequest)(nil), // 19: trillian.AddSequencedLeavesRequest (*AddSequencedLeavesResponse)(nil), // 20: trillian.AddSequencedLeavesResponse - (*GetLeavesByIndexRequest)(nil), // 21: trillian.GetLeavesByIndexRequest - (*GetLeavesByIndexResponse)(nil), // 22: trillian.GetLeavesByIndexResponse - (*GetLeavesByRangeRequest)(nil), // 23: trillian.GetLeavesByRangeRequest - (*GetLeavesByRangeResponse)(nil), // 24: trillian.GetLeavesByRangeResponse - (*QueuedLogLeaf)(nil), // 25: trillian.QueuedLogLeaf - (*LogLeaf)(nil), // 26: trillian.LogLeaf - (*Proof)(nil), // 27: trillian.Proof - (*SignedLogRoot)(nil), // 28: trillian.SignedLogRoot - (*status.Status)(nil), // 29: google.rpc.Status - (*timestamp.Timestamp)(nil), // 30: google.protobuf.Timestamp + (*GetLeavesByRangeRequest)(nil), // 21: trillian.GetLeavesByRangeRequest + (*GetLeavesByRangeResponse)(nil), // 22: trillian.GetLeavesByRangeResponse + (*QueuedLogLeaf)(nil), // 23: trillian.QueuedLogLeaf + (*LogLeaf)(nil), // 24: trillian.LogLeaf + (*Proof)(nil), // 25: trillian.Proof + (*SignedLogRoot)(nil), // 26: trillian.SignedLogRoot + (*status.Status)(nil), // 27: google.rpc.Status + (*timestamp.Timestamp)(nil), // 28: google.protobuf.Timestamp } var file_trillian_log_api_proto_depIdxs = []int32{ - 26, // 0: trillian.QueueLeafRequest.leaf:type_name -> trillian.LogLeaf + 24, // 0: trillian.QueueLeafRequest.leaf:type_name -> trillian.LogLeaf 0, // 1: trillian.QueueLeafRequest.charge_to:type_name -> trillian.ChargeTo - 25, // 2: trillian.QueueLeafResponse.queued_leaf:type_name -> trillian.QueuedLogLeaf - 26, // 3: trillian.AddSequencedLeafRequest.leaf:type_name -> trillian.LogLeaf + 23, // 2: trillian.QueueLeafResponse.queued_leaf:type_name -> trillian.QueuedLogLeaf + 24, // 3: trillian.AddSequencedLeafRequest.leaf:type_name -> trillian.LogLeaf 0, // 4: trillian.AddSequencedLeafRequest.charge_to:type_name -> trillian.ChargeTo - 25, // 5: trillian.AddSequencedLeafResponse.result:type_name -> trillian.QueuedLogLeaf + 23, // 5: trillian.AddSequencedLeafResponse.result:type_name -> trillian.QueuedLogLeaf 0, // 6: trillian.GetInclusionProofRequest.charge_to:type_name -> trillian.ChargeTo - 27, // 7: trillian.GetInclusionProofResponse.proof:type_name -> trillian.Proof - 28, // 8: trillian.GetInclusionProofResponse.signed_log_root:type_name -> trillian.SignedLogRoot + 25, // 7: trillian.GetInclusionProofResponse.proof:type_name -> trillian.Proof + 26, // 8: trillian.GetInclusionProofResponse.signed_log_root:type_name -> trillian.SignedLogRoot 0, // 9: trillian.GetInclusionProofByHashRequest.charge_to:type_name -> trillian.ChargeTo - 27, // 10: trillian.GetInclusionProofByHashResponse.proof:type_name -> trillian.Proof - 28, // 11: trillian.GetInclusionProofByHashResponse.signed_log_root:type_name -> trillian.SignedLogRoot + 25, // 10: trillian.GetInclusionProofByHashResponse.proof:type_name -> trillian.Proof + 26, // 11: trillian.GetInclusionProofByHashResponse.signed_log_root:type_name -> trillian.SignedLogRoot 0, // 12: trillian.GetConsistencyProofRequest.charge_to:type_name -> trillian.ChargeTo - 27, // 13: trillian.GetConsistencyProofResponse.proof:type_name -> trillian.Proof - 28, // 14: trillian.GetConsistencyProofResponse.signed_log_root:type_name -> trillian.SignedLogRoot + 25, // 13: trillian.GetConsistencyProofResponse.proof:type_name -> trillian.Proof + 26, // 14: trillian.GetConsistencyProofResponse.signed_log_root:type_name -> trillian.SignedLogRoot 0, // 15: trillian.GetLatestSignedLogRootRequest.charge_to:type_name -> trillian.ChargeTo - 28, // 16: trillian.GetLatestSignedLogRootResponse.signed_log_root:type_name -> trillian.SignedLogRoot - 27, // 17: trillian.GetLatestSignedLogRootResponse.proof:type_name -> trillian.Proof + 26, // 16: trillian.GetLatestSignedLogRootResponse.signed_log_root:type_name -> trillian.SignedLogRoot + 25, // 17: trillian.GetLatestSignedLogRootResponse.proof:type_name -> trillian.Proof 0, // 18: trillian.GetEntryAndProofRequest.charge_to:type_name -> trillian.ChargeTo - 27, // 19: trillian.GetEntryAndProofResponse.proof:type_name -> trillian.Proof - 26, // 20: trillian.GetEntryAndProofResponse.leaf:type_name -> trillian.LogLeaf - 28, // 21: trillian.GetEntryAndProofResponse.signed_log_root:type_name -> trillian.SignedLogRoot + 25, // 19: trillian.GetEntryAndProofResponse.proof:type_name -> trillian.Proof + 24, // 20: trillian.GetEntryAndProofResponse.leaf:type_name -> trillian.LogLeaf + 26, // 21: trillian.GetEntryAndProofResponse.signed_log_root:type_name -> trillian.SignedLogRoot 0, // 22: trillian.InitLogRequest.charge_to:type_name -> trillian.ChargeTo - 28, // 23: trillian.InitLogResponse.created:type_name -> trillian.SignedLogRoot - 26, // 24: trillian.QueueLeavesRequest.leaves:type_name -> trillian.LogLeaf + 26, // 23: trillian.InitLogResponse.created:type_name -> trillian.SignedLogRoot + 24, // 24: trillian.QueueLeavesRequest.leaves:type_name -> trillian.LogLeaf 0, // 25: trillian.QueueLeavesRequest.charge_to:type_name -> trillian.ChargeTo - 25, // 26: trillian.QueueLeavesResponse.queued_leaves:type_name -> trillian.QueuedLogLeaf - 26, // 27: trillian.AddSequencedLeavesRequest.leaves:type_name -> trillian.LogLeaf + 23, // 26: trillian.QueueLeavesResponse.queued_leaves:type_name -> trillian.QueuedLogLeaf + 24, // 27: trillian.AddSequencedLeavesRequest.leaves:type_name -> trillian.LogLeaf 0, // 28: trillian.AddSequencedLeavesRequest.charge_to:type_name -> trillian.ChargeTo - 25, // 29: trillian.AddSequencedLeavesResponse.results:type_name -> trillian.QueuedLogLeaf - 0, // 30: trillian.GetLeavesByIndexRequest.charge_to:type_name -> trillian.ChargeTo - 26, // 31: trillian.GetLeavesByIndexResponse.leaves:type_name -> trillian.LogLeaf - 28, // 32: trillian.GetLeavesByIndexResponse.signed_log_root:type_name -> trillian.SignedLogRoot - 0, // 33: trillian.GetLeavesByRangeRequest.charge_to:type_name -> trillian.ChargeTo - 26, // 34: trillian.GetLeavesByRangeResponse.leaves:type_name -> trillian.LogLeaf - 28, // 35: trillian.GetLeavesByRangeResponse.signed_log_root:type_name -> trillian.SignedLogRoot - 26, // 36: trillian.QueuedLogLeaf.leaf:type_name -> trillian.LogLeaf - 29, // 37: trillian.QueuedLogLeaf.status:type_name -> google.rpc.Status - 30, // 38: trillian.LogLeaf.queue_timestamp:type_name -> google.protobuf.Timestamp - 30, // 39: trillian.LogLeaf.integrate_timestamp:type_name -> google.protobuf.Timestamp - 1, // 40: trillian.TrillianLog.QueueLeaf:input_type -> trillian.QueueLeafRequest - 3, // 41: trillian.TrillianLog.AddSequencedLeaf:input_type -> trillian.AddSequencedLeafRequest - 5, // 42: trillian.TrillianLog.GetInclusionProof:input_type -> trillian.GetInclusionProofRequest - 7, // 43: trillian.TrillianLog.GetInclusionProofByHash:input_type -> trillian.GetInclusionProofByHashRequest - 9, // 44: trillian.TrillianLog.GetConsistencyProof:input_type -> trillian.GetConsistencyProofRequest - 11, // 45: trillian.TrillianLog.GetLatestSignedLogRoot:input_type -> trillian.GetLatestSignedLogRootRequest - 13, // 46: trillian.TrillianLog.GetEntryAndProof:input_type -> trillian.GetEntryAndProofRequest - 15, // 47: trillian.TrillianLog.InitLog:input_type -> trillian.InitLogRequest - 17, // 48: trillian.TrillianLog.QueueLeaves:input_type -> trillian.QueueLeavesRequest - 19, // 49: trillian.TrillianLog.AddSequencedLeaves:input_type -> trillian.AddSequencedLeavesRequest - 21, // 50: trillian.TrillianLog.GetLeavesByIndex:input_type -> trillian.GetLeavesByIndexRequest - 23, // 51: trillian.TrillianLog.GetLeavesByRange:input_type -> trillian.GetLeavesByRangeRequest - 2, // 52: trillian.TrillianLog.QueueLeaf:output_type -> trillian.QueueLeafResponse - 4, // 53: trillian.TrillianLog.AddSequencedLeaf:output_type -> trillian.AddSequencedLeafResponse - 6, // 54: trillian.TrillianLog.GetInclusionProof:output_type -> trillian.GetInclusionProofResponse - 8, // 55: trillian.TrillianLog.GetInclusionProofByHash:output_type -> trillian.GetInclusionProofByHashResponse - 10, // 56: trillian.TrillianLog.GetConsistencyProof:output_type -> trillian.GetConsistencyProofResponse - 12, // 57: trillian.TrillianLog.GetLatestSignedLogRoot:output_type -> trillian.GetLatestSignedLogRootResponse - 14, // 58: trillian.TrillianLog.GetEntryAndProof:output_type -> trillian.GetEntryAndProofResponse - 16, // 59: trillian.TrillianLog.InitLog:output_type -> trillian.InitLogResponse - 18, // 60: trillian.TrillianLog.QueueLeaves:output_type -> trillian.QueueLeavesResponse - 20, // 61: trillian.TrillianLog.AddSequencedLeaves:output_type -> trillian.AddSequencedLeavesResponse - 22, // 62: trillian.TrillianLog.GetLeavesByIndex:output_type -> trillian.GetLeavesByIndexResponse - 24, // 63: trillian.TrillianLog.GetLeavesByRange:output_type -> trillian.GetLeavesByRangeResponse - 52, // [52:64] is the sub-list for method output_type - 40, // [40:52] is the sub-list for method input_type - 40, // [40:40] is the sub-list for extension type_name - 40, // [40:40] is the sub-list for extension extendee - 0, // [0:40] is the sub-list for field type_name + 23, // 29: trillian.AddSequencedLeavesResponse.results:type_name -> trillian.QueuedLogLeaf + 0, // 30: trillian.GetLeavesByRangeRequest.charge_to:type_name -> trillian.ChargeTo + 24, // 31: trillian.GetLeavesByRangeResponse.leaves:type_name -> trillian.LogLeaf + 26, // 32: trillian.GetLeavesByRangeResponse.signed_log_root:type_name -> trillian.SignedLogRoot + 24, // 33: trillian.QueuedLogLeaf.leaf:type_name -> trillian.LogLeaf + 27, // 34: trillian.QueuedLogLeaf.status:type_name -> google.rpc.Status + 28, // 35: trillian.LogLeaf.queue_timestamp:type_name -> google.protobuf.Timestamp + 28, // 36: trillian.LogLeaf.integrate_timestamp:type_name -> google.protobuf.Timestamp + 1, // 37: trillian.TrillianLog.QueueLeaf:input_type -> trillian.QueueLeafRequest + 3, // 38: trillian.TrillianLog.AddSequencedLeaf:input_type -> trillian.AddSequencedLeafRequest + 5, // 39: trillian.TrillianLog.GetInclusionProof:input_type -> trillian.GetInclusionProofRequest + 7, // 40: trillian.TrillianLog.GetInclusionProofByHash:input_type -> trillian.GetInclusionProofByHashRequest + 9, // 41: trillian.TrillianLog.GetConsistencyProof:input_type -> trillian.GetConsistencyProofRequest + 11, // 42: trillian.TrillianLog.GetLatestSignedLogRoot:input_type -> trillian.GetLatestSignedLogRootRequest + 13, // 43: trillian.TrillianLog.GetEntryAndProof:input_type -> trillian.GetEntryAndProofRequest + 15, // 44: trillian.TrillianLog.InitLog:input_type -> trillian.InitLogRequest + 17, // 45: trillian.TrillianLog.QueueLeaves:input_type -> trillian.QueueLeavesRequest + 19, // 46: trillian.TrillianLog.AddSequencedLeaves:input_type -> trillian.AddSequencedLeavesRequest + 21, // 47: trillian.TrillianLog.GetLeavesByRange:input_type -> trillian.GetLeavesByRangeRequest + 2, // 48: trillian.TrillianLog.QueueLeaf:output_type -> trillian.QueueLeafResponse + 4, // 49: trillian.TrillianLog.AddSequencedLeaf:output_type -> trillian.AddSequencedLeafResponse + 6, // 50: trillian.TrillianLog.GetInclusionProof:output_type -> trillian.GetInclusionProofResponse + 8, // 51: trillian.TrillianLog.GetInclusionProofByHash:output_type -> trillian.GetInclusionProofByHashResponse + 10, // 52: trillian.TrillianLog.GetConsistencyProof:output_type -> trillian.GetConsistencyProofResponse + 12, // 53: trillian.TrillianLog.GetLatestSignedLogRoot:output_type -> trillian.GetLatestSignedLogRootResponse + 14, // 54: trillian.TrillianLog.GetEntryAndProof:output_type -> trillian.GetEntryAndProofResponse + 16, // 55: trillian.TrillianLog.InitLog:output_type -> trillian.InitLogResponse + 18, // 56: trillian.TrillianLog.QueueLeaves:output_type -> trillian.QueueLeavesResponse + 20, // 57: trillian.TrillianLog.AddSequencedLeaves:output_type -> trillian.AddSequencedLeavesResponse + 22, // 58: trillian.TrillianLog.GetLeavesByRange:output_type -> trillian.GetLeavesByRangeResponse + 48, // [48:59] is the sub-list for method output_type + 37, // [37:48] is the sub-list for method input_type + 37, // [37:37] is the sub-list for extension type_name + 37, // [37:37] is the sub-list for extension extendee + 0, // [0:37] is the sub-list for field type_name } func init() { file_trillian_log_api_proto_init() } @@ -2508,30 +2359,6 @@ func file_trillian_log_api_proto_init() { } } file_trillian_log_api_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLeavesByIndexRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_trillian_log_api_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLeavesByIndexResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_trillian_log_api_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetLeavesByRangeRequest); i { case 0: return &v.state @@ -2543,7 +2370,7 @@ func file_trillian_log_api_proto_init() { return nil } } - file_trillian_log_api_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_trillian_log_api_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetLeavesByRangeResponse); i { case 0: return &v.state @@ -2555,7 +2382,7 @@ func file_trillian_log_api_proto_init() { return nil } } - file_trillian_log_api_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_trillian_log_api_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*QueuedLogLeaf); i { case 0: return &v.state @@ -2567,7 +2394,7 @@ func file_trillian_log_api_proto_init() { return nil } } - file_trillian_log_api_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + file_trillian_log_api_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LogLeaf); i { case 0: return &v.state @@ -2586,7 +2413,7 @@ func file_trillian_log_api_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_trillian_log_api_proto_rawDesc, NumEnums: 0, - NumMessages: 27, + NumMessages: 25, NumExtensions: 0, NumServices: 1, }, @@ -2659,9 +2486,6 @@ type TrillianLogClient interface { // AddSequencedLeaves adds a batch of leaves with assigned sequence numbers // to a pre-ordered log. The indices of the provided leaves must be contiguous. AddSequencedLeaves(ctx context.Context, in *AddSequencedLeavesRequest, opts ...grpc.CallOption) (*AddSequencedLeavesResponse, error) - // GetLeavesByIndex returns a batch of leaves whose leaf indices are provided - // in the request. - GetLeavesByIndex(ctx context.Context, in *GetLeavesByIndexRequest, opts ...grpc.CallOption) (*GetLeavesByIndexResponse, error) // GetLeavesByRange returns a batch of leaves whose leaf indices are in a // sequential range. GetLeavesByRange(ctx context.Context, in *GetLeavesByRangeRequest, opts ...grpc.CallOption) (*GetLeavesByRangeResponse, error) @@ -2765,15 +2589,6 @@ func (c *trillianLogClient) AddSequencedLeaves(ctx context.Context, in *AddSeque return out, nil } -func (c *trillianLogClient) GetLeavesByIndex(ctx context.Context, in *GetLeavesByIndexRequest, opts ...grpc.CallOption) (*GetLeavesByIndexResponse, error) { - out := new(GetLeavesByIndexResponse) - err := c.cc.Invoke(ctx, "/trillian.TrillianLog/GetLeavesByIndex", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *trillianLogClient) GetLeavesByRange(ctx context.Context, in *GetLeavesByRangeRequest, opts ...grpc.CallOption) (*GetLeavesByRangeResponse, error) { out := new(GetLeavesByRangeResponse) err := c.cc.Invoke(ctx, "/trillian.TrillianLog/GetLeavesByRange", in, out, opts...) @@ -2832,9 +2647,6 @@ type TrillianLogServer interface { // AddSequencedLeaves adds a batch of leaves with assigned sequence numbers // to a pre-ordered log. The indices of the provided leaves must be contiguous. AddSequencedLeaves(context.Context, *AddSequencedLeavesRequest) (*AddSequencedLeavesResponse, error) - // GetLeavesByIndex returns a batch of leaves whose leaf indices are provided - // in the request. - GetLeavesByIndex(context.Context, *GetLeavesByIndexRequest) (*GetLeavesByIndexResponse, error) // GetLeavesByRange returns a batch of leaves whose leaf indices are in a // sequential range. GetLeavesByRange(context.Context, *GetLeavesByRangeRequest) (*GetLeavesByRangeResponse, error) @@ -2874,9 +2686,6 @@ func (*UnimplementedTrillianLogServer) QueueLeaves(context.Context, *QueueLeaves func (*UnimplementedTrillianLogServer) AddSequencedLeaves(context.Context, *AddSequencedLeavesRequest) (*AddSequencedLeavesResponse, error) { return nil, status1.Errorf(codes.Unimplemented, "method AddSequencedLeaves not implemented") } -func (*UnimplementedTrillianLogServer) GetLeavesByIndex(context.Context, *GetLeavesByIndexRequest) (*GetLeavesByIndexResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method GetLeavesByIndex not implemented") -} func (*UnimplementedTrillianLogServer) GetLeavesByRange(context.Context, *GetLeavesByRangeRequest) (*GetLeavesByRangeResponse, error) { return nil, status1.Errorf(codes.Unimplemented, "method GetLeavesByRange not implemented") } @@ -3065,24 +2874,6 @@ func _TrillianLog_AddSequencedLeaves_Handler(srv interface{}, ctx context.Contex return interceptor(ctx, in, info, handler) } -func _TrillianLog_GetLeavesByIndex_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetLeavesByIndexRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(TrillianLogServer).GetLeavesByIndex(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/trillian.TrillianLog/GetLeavesByIndex", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TrillianLogServer).GetLeavesByIndex(ctx, req.(*GetLeavesByIndexRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _TrillianLog_GetLeavesByRange_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetLeavesByRangeRequest) if err := dec(in); err != nil { @@ -3145,10 +2936,6 @@ var _TrillianLog_serviceDesc = grpc.ServiceDesc{ MethodName: "AddSequencedLeaves", Handler: _TrillianLog_AddSequencedLeaves_Handler, }, - { - MethodName: "GetLeavesByIndex", - Handler: _TrillianLog_GetLeavesByIndex_Handler, - }, { MethodName: "GetLeavesByRange", Handler: _TrillianLog_GetLeavesByRange_Handler, diff --git a/trillian_log_api.proto b/trillian_log_api.proto index 1dcb3e9f9f..1a87bdf4b0 100644 --- a/trillian_log_api.proto +++ b/trillian_log_api.proto @@ -155,11 +155,6 @@ service TrillianLog { rpc AddSequencedLeaves(AddSequencedLeavesRequest) returns (AddSequencedLeavesResponse) {} - // GetLeavesByIndex returns a batch of leaves whose leaf indices are provided - // in the request. - rpc GetLeavesByIndex(GetLeavesByIndexRequest) - returns (GetLeavesByIndexResponse) {} - // GetLeavesByRange returns a batch of leaves whose leaf indices are in a // sequential range. rpc GetLeavesByRange(GetLeavesByRangeRequest) @@ -325,18 +320,6 @@ message AddSequencedLeavesResponse { repeated QueuedLogLeaf results = 2; } -message GetLeavesByIndexRequest { - int64 log_id = 1; - repeated int64 leaf_index = 2; - ChargeTo charge_to = 5; -} - -message GetLeavesByIndexResponse { - // TODO(gbelvin): Response syntax does not allow for some requested leaves to be available, and some not (but using QueuedLogLeaf might) - repeated LogLeaf leaves = 2; - SignedLogRoot signed_log_root = 3; -} - message GetLeavesByRangeRequest { int64 log_id = 1; int64 start_index = 2;