From 099fbde8099246448f28b22d4d2985d43dca6948 Mon Sep 17 00:00:00 2001 From: Gyu-Ho Lee Date: Mon, 14 Aug 2017 11:19:09 -0700 Subject: [PATCH 1/9] lease: add 'Leases' method Signed-off-by: Gyu-Ho Lee --- lease/lessor.go | 27 ++++++++++++++++++++++----- lease/lessor_test.go | 11 +++++++++++ 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/lease/lessor.go b/lease/lessor.go index 3418cf565ed..815e10c0f65 100644 --- a/lease/lessor.go +++ b/lease/lessor.go @@ -99,6 +99,9 @@ type Lessor interface { // Lookup gives the lease at a given lease id, if any Lookup(id LeaseID) *Lease + // Leases lists all leases. + Leases() []*Lease + // ExpiredLeasesC returns a chan that is used to receive expired leases. ExpiredLeasesC() <-chan []*Lease @@ -317,6 +320,22 @@ func (le *lessor) Lookup(id LeaseID) *Lease { return le.leaseMap[id] } +func (le *lessor) unsafeLeases() []*Lease { + leases := make([]*Lease, 0, len(le.leaseMap)) + for _, l := range le.leaseMap { + leases = append(leases, l) + } + sort.Sort(leasesByExpiry(leases)) + return leases +} + +func (le *lessor) Leases() []*Lease { + le.mu.Lock() + ls := le.unsafeLeases() + le.mu.Unlock() + return ls +} + func (le *lessor) Promote(extend time.Duration) { le.mu.Lock() defer le.mu.Unlock() @@ -334,11 +353,7 @@ func (le *lessor) Promote(extend time.Duration) { } // adjust expiries in case of overlap - leases := make([]*Lease, 0, len(le.leaseMap)) - for _, l := range le.leaseMap { - leases = append(leases, l) - } - sort.Sort(leasesByExpiry(leases)) + leases := le.unsafeLeases() baseWindow := leases[0].Remaining() nextWindow := baseWindow + time.Second @@ -636,6 +651,8 @@ func (fl *FakeLessor) Renew(id LeaseID) (int64, error) { return 10, nil } func (le *FakeLessor) Lookup(id LeaseID) *Lease { return nil } +func (le *FakeLessor) Leases() []*Lease { return nil } + func (fl *FakeLessor) ExpiredLeasesC() <-chan []*Lease { return nil } func (fl *FakeLessor) Recover(b backend.Backend, rd RangeDeleter) {} diff --git a/lease/lessor_test.go b/lease/lessor_test.go index 7ea2972a91a..4d040a2465a 100644 --- a/lease/lessor_test.go +++ b/lease/lessor_test.go @@ -72,6 +72,17 @@ func TestLessorGrant(t *testing.T) { t.Errorf("new lease.id = %x, want != %x", nl.ID, l.ID) } + lss := []*Lease{gl, nl} + leases := le.Leases() + for i := range lss { + if lss[i].ID != leases[i].ID { + t.Fatalf("lease ID expected %d, got %d", lss[i].ID, leases[i].ID) + } + if lss[i].ttl != leases[i].ttl { + t.Fatalf("ttl expected %d, got %d", lss[i].ttl, leases[i].ttl) + } + } + be.BatchTx().Lock() _, vs := be.BatchTx().UnsafeRange(leaseBucketName, int64ToBytes(int64(l.ID)), nil, 0) if len(vs) != 1 { From a7413bbf283d4927873b87ffde721db5e01417b3 Mon Sep 17 00:00:00 2001 From: Gyu-Ho Lee Date: Mon, 14 Aug 2017 11:21:13 -0700 Subject: [PATCH 2/9] etcdserverpb: define LeaseLeases API Signed-off-by: Gyu-Ho Lee --- etcdserver/etcdserverpb/rpc.proto | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/etcdserver/etcdserverpb/rpc.proto b/etcdserver/etcdserverpb/rpc.proto index c0a6999f517..be1b9ab15fa 100644 --- a/etcdserver/etcdserverpb/rpc.proto +++ b/etcdserver/etcdserverpb/rpc.proto @@ -112,7 +112,13 @@ service Lease { }; } - // TODO(xiangli) List all existing Leases? + // LeaseLeases lists all existing leases. + rpc LeaseLeases(LeaseLeasesRequest) returns (LeaseLeasesResponse) { + option (google.api.http) = { + post: "/v3alpha/kv/lease/leases" + body: "*" + }; + } } service Cluster { @@ -184,7 +190,7 @@ service Maintenance { }; } - // HashKV computes the hash of all MVCC keys up to a given revision. + // HashKV computes the hash of all MVCC keys up to a given revision. rpc HashKV(HashKVRequest) returns (HashKVResponse) { option (google.api.http) = { post: "/v3alpha/maintenance/hash" @@ -757,6 +763,19 @@ message LeaseTimeToLiveResponse { repeated bytes keys = 5; } +message LeaseLeasesRequest { +} + +message LeaseStatus { + int64 ID = 1; + // TODO: int64 TTL = 2; +} + +message LeaseLeasesResponse { + ResponseHeader header = 1; + repeated LeaseStatus leases = 2; +} + message Member { // ID is the member ID for this member. uint64 ID = 1; From 8005f00bcfd7788c428b7c08108300a686f25439 Mon Sep 17 00:00:00 2001 From: Gyu-Ho Lee Date: Mon, 14 Aug 2017 11:23:18 -0700 Subject: [PATCH 3/9] *: regenerate proto Signed-off-by: Gyu-Ho Lee --- Documentation/dev-guide/api_reference_v3.md | 24 + .../apispec/swagger/rpc.swagger.json | 53 + etcdserver/etcdserverpb/etcdserver.pb.go | 3 + etcdserver/etcdserverpb/gw/rpc.pb.gw.go | 45 + etcdserver/etcdserverpb/rpc.pb.go | 1094 ++++++++++++----- 5 files changed, 889 insertions(+), 330 deletions(-) diff --git a/Documentation/dev-guide/api_reference_v3.md b/Documentation/dev-guide/api_reference_v3.md index bacc6c586c0..960cc9999b4 100644 --- a/Documentation/dev-guide/api_reference_v3.md +++ b/Documentation/dev-guide/api_reference_v3.md @@ -58,6 +58,7 @@ This is a generated documentation. Please read the proto files for more. | LeaseRevoke | LeaseRevokeRequest | LeaseRevokeResponse | LeaseRevoke revokes a lease. All keys attached to the lease will expire and be deleted. | | LeaseKeepAlive | LeaseKeepAliveRequest | LeaseKeepAliveResponse | LeaseKeepAlive keeps the lease alive by streaming keep alive requests from the client to the server and streaming keep alive responses from the server to the client. | | LeaseTimeToLive | LeaseTimeToLiveRequest | LeaseTimeToLiveResponse | LeaseTimeToLive retrieves lease information. | +| LeaseLeases | LeaseLeasesRequest | LeaseLeasesResponse | LeaseLeases lists all existing leases. | @@ -513,6 +514,21 @@ Empty field. +##### message `LeaseLeasesRequest` (etcdserver/etcdserverpb/rpc.proto) + +Empty field. + + + +##### message `LeaseLeasesResponse` (etcdserver/etcdserverpb/rpc.proto) + +| Field | Description | Type | +| ----- | ----------- | ---- | +| header | | ResponseHeader | +| leases | | (slice of) LeaseStatus | + + + ##### message `LeaseRevokeRequest` (etcdserver/etcdserverpb/rpc.proto) | Field | Description | Type | @@ -529,6 +545,14 @@ Empty field. +##### message `LeaseStatus` (etcdserver/etcdserverpb/rpc.proto) + +| Field | Description | Type | +| ----- | ----------- | ---- | +| ID | | int64 | + + + ##### message `LeaseTimeToLiveRequest` (etcdserver/etcdserverpb/rpc.proto) | Field | Description | Type | diff --git a/Documentation/dev-guide/apispec/swagger/rpc.swagger.json b/Documentation/dev-guide/apispec/swagger/rpc.swagger.json index af74c446b44..28a88b899fe 100644 --- a/Documentation/dev-guide/apispec/swagger/rpc.swagger.json +++ b/Documentation/dev-guide/apispec/swagger/rpc.swagger.json @@ -609,6 +609,33 @@ } } }, + "/v3alpha/kv/lease/leases": { + "post": { + "tags": [ + "Lease" + ], + "summary": "LeaseLeases lists all existing leases.", + "operationId": "LeaseLeases", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/etcdserverpbLeaseLeasesRequest" + } + } + ], + "responses": { + "200": { + "description": "(empty)", + "schema": { + "$ref": "#/definitions/etcdserverpbLeaseLeasesResponse" + } + } + } + } + }, "/v3alpha/kv/lease/revoke": { "post": { "tags": [ @@ -1666,6 +1693,23 @@ } } }, + "etcdserverpbLeaseLeasesRequest": { + "type": "object" + }, + "etcdserverpbLeaseLeasesResponse": { + "type": "object", + "properties": { + "header": { + "$ref": "#/definitions/etcdserverpbResponseHeader" + }, + "leases": { + "type": "array", + "items": { + "$ref": "#/definitions/etcdserverpbLeaseStatus" + } + } + } + }, "etcdserverpbLeaseRevokeRequest": { "type": "object", "properties": { @@ -1684,6 +1728,15 @@ } } }, + "etcdserverpbLeaseStatus": { + "type": "object", + "properties": { + "ID": { + "type": "string", + "format": "int64" + } + } + }, "etcdserverpbLeaseTimeToLiveRequest": { "type": "object", "properties": { diff --git a/etcdserver/etcdserverpb/etcdserver.pb.go b/etcdserver/etcdserverpb/etcdserver.pb.go index b0d00e26f61..e4007f5de73 100644 --- a/etcdserver/etcdserverpb/etcdserver.pb.go +++ b/etcdserver/etcdserverpb/etcdserver.pb.go @@ -49,6 +49,9 @@ LeaseKeepAliveResponse LeaseTimeToLiveRequest LeaseTimeToLiveResponse + LeaseLeasesRequest + LeaseStatus + LeaseLeasesResponse Member MemberAddRequest MemberAddResponse diff --git a/etcdserver/etcdserverpb/gw/rpc.pb.gw.go b/etcdserver/etcdserverpb/gw/rpc.pb.gw.go index 190eff5863a..18dc1f87bab 100644 --- a/etcdserver/etcdserverpb/gw/rpc.pb.gw.go +++ b/etcdserver/etcdserverpb/gw/rpc.pb.gw.go @@ -236,6 +236,19 @@ func request_Lease_LeaseTimeToLive_0(ctx context.Context, marshaler runtime.Mars } +func request_Lease_LeaseLeases_0(ctx context.Context, marshaler runtime.Marshaler, client etcdserverpb.LeaseClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq etcdserverpb.LeaseLeasesRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil { + return nil, metadata, grpc.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.LeaseLeases(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + func request_Cluster_MemberAdd_0(ctx context.Context, marshaler runtime.Marshaler, client etcdserverpb.ClusterClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq etcdserverpb.MemberAddRequest var metadata runtime.ServerMetadata @@ -1003,6 +1016,34 @@ func RegisterLeaseHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc }) + mux.Handle("POST", pattern_Lease_LeaseLeases_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, req) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + } + resp, md, err := request_Lease_LeaseLeases_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, outboundMarshaler, w, req, err) + return + } + + forward_Lease_LeaseLeases_0(ctx, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -1014,6 +1055,8 @@ var ( pattern_Lease_LeaseKeepAlive_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v3alpha", "lease", "keepalive"}, "")) pattern_Lease_LeaseTimeToLive_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3alpha", "kv", "lease", "timetolive"}, "")) + + pattern_Lease_LeaseLeases_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v3alpha", "kv", "lease", "leases"}, "")) ) var ( @@ -1024,6 +1067,8 @@ var ( forward_Lease_LeaseKeepAlive_0 = runtime.ForwardResponseStream forward_Lease_LeaseTimeToLive_0 = runtime.ForwardResponseMessage + + forward_Lease_LeaseLeases_0 = runtime.ForwardResponseMessage ) // RegisterClusterHandlerFromEndpoint is same as RegisterClusterHandler but diff --git a/etcdserver/etcdserverpb/rpc.pb.go b/etcdserver/etcdserverpb/rpc.pb.go index 5e79fa13a02..7e32e0ffe46 100644 --- a/etcdserver/etcdserverpb/rpc.pb.go +++ b/etcdserver/etcdserverpb/rpc.pb.go @@ -207,7 +207,7 @@ func (x AlarmRequest_AlarmAction) String() string { return proto.EnumName(AlarmRequest_AlarmAction_name, int32(x)) } func (AlarmRequest_AlarmAction) EnumDescriptor() ([]byte, []int) { - return fileDescriptorRpc, []int{45, 0} + return fileDescriptorRpc, []int{48, 0} } type ResponseHeader struct { @@ -1992,6 +1992,54 @@ func (m *LeaseTimeToLiveResponse) GetKeys() [][]byte { return nil } +type LeaseLeasesRequest struct { +} + +func (m *LeaseLeasesRequest) Reset() { *m = LeaseLeasesRequest{} } +func (m *LeaseLeasesRequest) String() string { return proto.CompactTextString(m) } +func (*LeaseLeasesRequest) ProtoMessage() {} +func (*LeaseLeasesRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{32} } + +type LeaseStatus struct { + ID int64 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` +} + +func (m *LeaseStatus) Reset() { *m = LeaseStatus{} } +func (m *LeaseStatus) String() string { return proto.CompactTextString(m) } +func (*LeaseStatus) ProtoMessage() {} +func (*LeaseStatus) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{33} } + +func (m *LeaseStatus) GetID() int64 { + if m != nil { + return m.ID + } + return 0 +} + +type LeaseLeasesResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` + Leases []*LeaseStatus `protobuf:"bytes,2,rep,name=leases" json:"leases,omitempty"` +} + +func (m *LeaseLeasesResponse) Reset() { *m = LeaseLeasesResponse{} } +func (m *LeaseLeasesResponse) String() string { return proto.CompactTextString(m) } +func (*LeaseLeasesResponse) ProtoMessage() {} +func (*LeaseLeasesResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{34} } + +func (m *LeaseLeasesResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *LeaseLeasesResponse) GetLeases() []*LeaseStatus { + if m != nil { + return m.Leases + } + return nil +} + type Member struct { // ID is the member ID for this member. ID uint64 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` @@ -2006,7 +2054,7 @@ type Member struct { func (m *Member) Reset() { *m = Member{} } func (m *Member) String() string { return proto.CompactTextString(m) } func (*Member) ProtoMessage() {} -func (*Member) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{32} } +func (*Member) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{35} } func (m *Member) GetID() uint64 { if m != nil { @@ -2044,7 +2092,7 @@ type MemberAddRequest struct { func (m *MemberAddRequest) Reset() { *m = MemberAddRequest{} } func (m *MemberAddRequest) String() string { return proto.CompactTextString(m) } func (*MemberAddRequest) ProtoMessage() {} -func (*MemberAddRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{33} } +func (*MemberAddRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{36} } func (m *MemberAddRequest) GetPeerURLs() []string { if m != nil { @@ -2064,7 +2112,7 @@ type MemberAddResponse struct { func (m *MemberAddResponse) Reset() { *m = MemberAddResponse{} } func (m *MemberAddResponse) String() string { return proto.CompactTextString(m) } func (*MemberAddResponse) ProtoMessage() {} -func (*MemberAddResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{34} } +func (*MemberAddResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{37} } func (m *MemberAddResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2095,7 +2143,7 @@ type MemberRemoveRequest struct { func (m *MemberRemoveRequest) Reset() { *m = MemberRemoveRequest{} } func (m *MemberRemoveRequest) String() string { return proto.CompactTextString(m) } func (*MemberRemoveRequest) ProtoMessage() {} -func (*MemberRemoveRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{35} } +func (*MemberRemoveRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{38} } func (m *MemberRemoveRequest) GetID() uint64 { if m != nil { @@ -2113,7 +2161,7 @@ type MemberRemoveResponse struct { func (m *MemberRemoveResponse) Reset() { *m = MemberRemoveResponse{} } func (m *MemberRemoveResponse) String() string { return proto.CompactTextString(m) } func (*MemberRemoveResponse) ProtoMessage() {} -func (*MemberRemoveResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{36} } +func (*MemberRemoveResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{39} } func (m *MemberRemoveResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2139,7 +2187,7 @@ type MemberUpdateRequest struct { func (m *MemberUpdateRequest) Reset() { *m = MemberUpdateRequest{} } func (m *MemberUpdateRequest) String() string { return proto.CompactTextString(m) } func (*MemberUpdateRequest) ProtoMessage() {} -func (*MemberUpdateRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{37} } +func (*MemberUpdateRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{40} } func (m *MemberUpdateRequest) GetID() uint64 { if m != nil { @@ -2164,7 +2212,7 @@ type MemberUpdateResponse struct { func (m *MemberUpdateResponse) Reset() { *m = MemberUpdateResponse{} } func (m *MemberUpdateResponse) String() string { return proto.CompactTextString(m) } func (*MemberUpdateResponse) ProtoMessage() {} -func (*MemberUpdateResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{38} } +func (*MemberUpdateResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{41} } func (m *MemberUpdateResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2186,7 +2234,7 @@ type MemberListRequest struct { func (m *MemberListRequest) Reset() { *m = MemberListRequest{} } func (m *MemberListRequest) String() string { return proto.CompactTextString(m) } func (*MemberListRequest) ProtoMessage() {} -func (*MemberListRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{39} } +func (*MemberListRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{42} } type MemberListResponse struct { Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` @@ -2197,7 +2245,7 @@ type MemberListResponse struct { func (m *MemberListResponse) Reset() { *m = MemberListResponse{} } func (m *MemberListResponse) String() string { return proto.CompactTextString(m) } func (*MemberListResponse) ProtoMessage() {} -func (*MemberListResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{40} } +func (*MemberListResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{43} } func (m *MemberListResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2219,7 +2267,7 @@ type DefragmentRequest struct { func (m *DefragmentRequest) Reset() { *m = DefragmentRequest{} } func (m *DefragmentRequest) String() string { return proto.CompactTextString(m) } func (*DefragmentRequest) ProtoMessage() {} -func (*DefragmentRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{41} } +func (*DefragmentRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{44} } type DefragmentResponse struct { Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` @@ -2228,7 +2276,7 @@ type DefragmentResponse struct { func (m *DefragmentResponse) Reset() { *m = DefragmentResponse{} } func (m *DefragmentResponse) String() string { return proto.CompactTextString(m) } func (*DefragmentResponse) ProtoMessage() {} -func (*DefragmentResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{42} } +func (*DefragmentResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{45} } func (m *DefragmentResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2245,7 +2293,7 @@ type MoveLeaderRequest struct { func (m *MoveLeaderRequest) Reset() { *m = MoveLeaderRequest{} } func (m *MoveLeaderRequest) String() string { return proto.CompactTextString(m) } func (*MoveLeaderRequest) ProtoMessage() {} -func (*MoveLeaderRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{43} } +func (*MoveLeaderRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{46} } func (m *MoveLeaderRequest) GetTargetID() uint64 { if m != nil { @@ -2261,7 +2309,7 @@ type MoveLeaderResponse struct { func (m *MoveLeaderResponse) Reset() { *m = MoveLeaderResponse{} } func (m *MoveLeaderResponse) String() string { return proto.CompactTextString(m) } func (*MoveLeaderResponse) ProtoMessage() {} -func (*MoveLeaderResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{44} } +func (*MoveLeaderResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{47} } func (m *MoveLeaderResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2285,7 +2333,7 @@ type AlarmRequest struct { func (m *AlarmRequest) Reset() { *m = AlarmRequest{} } func (m *AlarmRequest) String() string { return proto.CompactTextString(m) } func (*AlarmRequest) ProtoMessage() {} -func (*AlarmRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{45} } +func (*AlarmRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{48} } func (m *AlarmRequest) GetAction() AlarmRequest_AlarmAction { if m != nil { @@ -2318,7 +2366,7 @@ type AlarmMember struct { func (m *AlarmMember) Reset() { *m = AlarmMember{} } func (m *AlarmMember) String() string { return proto.CompactTextString(m) } func (*AlarmMember) ProtoMessage() {} -func (*AlarmMember) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{46} } +func (*AlarmMember) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{49} } func (m *AlarmMember) GetMemberID() uint64 { if m != nil { @@ -2343,7 +2391,7 @@ type AlarmResponse struct { func (m *AlarmResponse) Reset() { *m = AlarmResponse{} } func (m *AlarmResponse) String() string { return proto.CompactTextString(m) } func (*AlarmResponse) ProtoMessage() {} -func (*AlarmResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{47} } +func (*AlarmResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{50} } func (m *AlarmResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2365,7 +2413,7 @@ type StatusRequest struct { func (m *StatusRequest) Reset() { *m = StatusRequest{} } func (m *StatusRequest) String() string { return proto.CompactTextString(m) } func (*StatusRequest) ProtoMessage() {} -func (*StatusRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{48} } +func (*StatusRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{51} } type StatusResponse struct { Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` @@ -2384,7 +2432,7 @@ type StatusResponse struct { func (m *StatusResponse) Reset() { *m = StatusResponse{} } func (m *StatusResponse) String() string { return proto.CompactTextString(m) } func (*StatusResponse) ProtoMessage() {} -func (*StatusResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{49} } +func (*StatusResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{52} } func (m *StatusResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2434,7 +2482,7 @@ type AuthEnableRequest struct { func (m *AuthEnableRequest) Reset() { *m = AuthEnableRequest{} } func (m *AuthEnableRequest) String() string { return proto.CompactTextString(m) } func (*AuthEnableRequest) ProtoMessage() {} -func (*AuthEnableRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{50} } +func (*AuthEnableRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{53} } type AuthDisableRequest struct { } @@ -2442,7 +2490,7 @@ type AuthDisableRequest struct { func (m *AuthDisableRequest) Reset() { *m = AuthDisableRequest{} } func (m *AuthDisableRequest) String() string { return proto.CompactTextString(m) } func (*AuthDisableRequest) ProtoMessage() {} -func (*AuthDisableRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{51} } +func (*AuthDisableRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{54} } type AuthenticateRequest struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` @@ -2452,7 +2500,7 @@ type AuthenticateRequest struct { func (m *AuthenticateRequest) Reset() { *m = AuthenticateRequest{} } func (m *AuthenticateRequest) String() string { return proto.CompactTextString(m) } func (*AuthenticateRequest) ProtoMessage() {} -func (*AuthenticateRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{52} } +func (*AuthenticateRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{55} } func (m *AuthenticateRequest) GetName() string { if m != nil { @@ -2476,7 +2524,7 @@ type AuthUserAddRequest struct { func (m *AuthUserAddRequest) Reset() { *m = AuthUserAddRequest{} } func (m *AuthUserAddRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserAddRequest) ProtoMessage() {} -func (*AuthUserAddRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{53} } +func (*AuthUserAddRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{56} } func (m *AuthUserAddRequest) GetName() string { if m != nil { @@ -2499,7 +2547,7 @@ type AuthUserGetRequest struct { func (m *AuthUserGetRequest) Reset() { *m = AuthUserGetRequest{} } func (m *AuthUserGetRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserGetRequest) ProtoMessage() {} -func (*AuthUserGetRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{54} } +func (*AuthUserGetRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{57} } func (m *AuthUserGetRequest) GetName() string { if m != nil { @@ -2516,7 +2564,7 @@ type AuthUserDeleteRequest struct { func (m *AuthUserDeleteRequest) Reset() { *m = AuthUserDeleteRequest{} } func (m *AuthUserDeleteRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserDeleteRequest) ProtoMessage() {} -func (*AuthUserDeleteRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{55} } +func (*AuthUserDeleteRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{58} } func (m *AuthUserDeleteRequest) GetName() string { if m != nil { @@ -2536,7 +2584,7 @@ func (m *AuthUserChangePasswordRequest) Reset() { *m = AuthUserChangePas func (m *AuthUserChangePasswordRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserChangePasswordRequest) ProtoMessage() {} func (*AuthUserChangePasswordRequest) Descriptor() ([]byte, []int) { - return fileDescriptorRpc, []int{56} + return fileDescriptorRpc, []int{59} } func (m *AuthUserChangePasswordRequest) GetName() string { @@ -2563,7 +2611,7 @@ type AuthUserGrantRoleRequest struct { func (m *AuthUserGrantRoleRequest) Reset() { *m = AuthUserGrantRoleRequest{} } func (m *AuthUserGrantRoleRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserGrantRoleRequest) ProtoMessage() {} -func (*AuthUserGrantRoleRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{57} } +func (*AuthUserGrantRoleRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{60} } func (m *AuthUserGrantRoleRequest) GetUser() string { if m != nil { @@ -2587,7 +2635,7 @@ type AuthUserRevokeRoleRequest struct { func (m *AuthUserRevokeRoleRequest) Reset() { *m = AuthUserRevokeRoleRequest{} } func (m *AuthUserRevokeRoleRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserRevokeRoleRequest) ProtoMessage() {} -func (*AuthUserRevokeRoleRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{58} } +func (*AuthUserRevokeRoleRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{61} } func (m *AuthUserRevokeRoleRequest) GetName() string { if m != nil { @@ -2611,7 +2659,7 @@ type AuthRoleAddRequest struct { func (m *AuthRoleAddRequest) Reset() { *m = AuthRoleAddRequest{} } func (m *AuthRoleAddRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleAddRequest) ProtoMessage() {} -func (*AuthRoleAddRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{59} } +func (*AuthRoleAddRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{62} } func (m *AuthRoleAddRequest) GetName() string { if m != nil { @@ -2627,7 +2675,7 @@ type AuthRoleGetRequest struct { func (m *AuthRoleGetRequest) Reset() { *m = AuthRoleGetRequest{} } func (m *AuthRoleGetRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleGetRequest) ProtoMessage() {} -func (*AuthRoleGetRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{60} } +func (*AuthRoleGetRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{63} } func (m *AuthRoleGetRequest) GetRole() string { if m != nil { @@ -2642,7 +2690,7 @@ type AuthUserListRequest struct { func (m *AuthUserListRequest) Reset() { *m = AuthUserListRequest{} } func (m *AuthUserListRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserListRequest) ProtoMessage() {} -func (*AuthUserListRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{61} } +func (*AuthUserListRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{64} } type AuthRoleListRequest struct { } @@ -2650,7 +2698,7 @@ type AuthRoleListRequest struct { func (m *AuthRoleListRequest) Reset() { *m = AuthRoleListRequest{} } func (m *AuthRoleListRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleListRequest) ProtoMessage() {} -func (*AuthRoleListRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{62} } +func (*AuthRoleListRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{65} } type AuthRoleDeleteRequest struct { Role string `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` @@ -2659,7 +2707,7 @@ type AuthRoleDeleteRequest struct { func (m *AuthRoleDeleteRequest) Reset() { *m = AuthRoleDeleteRequest{} } func (m *AuthRoleDeleteRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleDeleteRequest) ProtoMessage() {} -func (*AuthRoleDeleteRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{63} } +func (*AuthRoleDeleteRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{66} } func (m *AuthRoleDeleteRequest) GetRole() string { if m != nil { @@ -2679,7 +2727,7 @@ func (m *AuthRoleGrantPermissionRequest) Reset() { *m = AuthRoleGrantPer func (m *AuthRoleGrantPermissionRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleGrantPermissionRequest) ProtoMessage() {} func (*AuthRoleGrantPermissionRequest) Descriptor() ([]byte, []int) { - return fileDescriptorRpc, []int{64} + return fileDescriptorRpc, []int{67} } func (m *AuthRoleGrantPermissionRequest) GetName() string { @@ -2706,7 +2754,7 @@ func (m *AuthRoleRevokePermissionRequest) Reset() { *m = AuthRoleRevokeP func (m *AuthRoleRevokePermissionRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleRevokePermissionRequest) ProtoMessage() {} func (*AuthRoleRevokePermissionRequest) Descriptor() ([]byte, []int) { - return fileDescriptorRpc, []int{65} + return fileDescriptorRpc, []int{68} } func (m *AuthRoleRevokePermissionRequest) GetRole() string { @@ -2737,7 +2785,7 @@ type AuthEnableResponse struct { func (m *AuthEnableResponse) Reset() { *m = AuthEnableResponse{} } func (m *AuthEnableResponse) String() string { return proto.CompactTextString(m) } func (*AuthEnableResponse) ProtoMessage() {} -func (*AuthEnableResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{66} } +func (*AuthEnableResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{69} } func (m *AuthEnableResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2753,7 +2801,7 @@ type AuthDisableResponse struct { func (m *AuthDisableResponse) Reset() { *m = AuthDisableResponse{} } func (m *AuthDisableResponse) String() string { return proto.CompactTextString(m) } func (*AuthDisableResponse) ProtoMessage() {} -func (*AuthDisableResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{67} } +func (*AuthDisableResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{70} } func (m *AuthDisableResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2771,7 +2819,7 @@ type AuthenticateResponse struct { func (m *AuthenticateResponse) Reset() { *m = AuthenticateResponse{} } func (m *AuthenticateResponse) String() string { return proto.CompactTextString(m) } func (*AuthenticateResponse) ProtoMessage() {} -func (*AuthenticateResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{68} } +func (*AuthenticateResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{71} } func (m *AuthenticateResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2794,7 +2842,7 @@ type AuthUserAddResponse struct { func (m *AuthUserAddResponse) Reset() { *m = AuthUserAddResponse{} } func (m *AuthUserAddResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserAddResponse) ProtoMessage() {} -func (*AuthUserAddResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{69} } +func (*AuthUserAddResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{72} } func (m *AuthUserAddResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2811,7 +2859,7 @@ type AuthUserGetResponse struct { func (m *AuthUserGetResponse) Reset() { *m = AuthUserGetResponse{} } func (m *AuthUserGetResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserGetResponse) ProtoMessage() {} -func (*AuthUserGetResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{70} } +func (*AuthUserGetResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{73} } func (m *AuthUserGetResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2834,7 +2882,7 @@ type AuthUserDeleteResponse struct { func (m *AuthUserDeleteResponse) Reset() { *m = AuthUserDeleteResponse{} } func (m *AuthUserDeleteResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserDeleteResponse) ProtoMessage() {} -func (*AuthUserDeleteResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{71} } +func (*AuthUserDeleteResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{74} } func (m *AuthUserDeleteResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2851,7 +2899,7 @@ func (m *AuthUserChangePasswordResponse) Reset() { *m = AuthUserChangePa func (m *AuthUserChangePasswordResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserChangePasswordResponse) ProtoMessage() {} func (*AuthUserChangePasswordResponse) Descriptor() ([]byte, []int) { - return fileDescriptorRpc, []int{72} + return fileDescriptorRpc, []int{75} } func (m *AuthUserChangePasswordResponse) GetHeader() *ResponseHeader { @@ -2868,7 +2916,7 @@ type AuthUserGrantRoleResponse struct { func (m *AuthUserGrantRoleResponse) Reset() { *m = AuthUserGrantRoleResponse{} } func (m *AuthUserGrantRoleResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserGrantRoleResponse) ProtoMessage() {} -func (*AuthUserGrantRoleResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{73} } +func (*AuthUserGrantRoleResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{76} } func (m *AuthUserGrantRoleResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2884,7 +2932,7 @@ type AuthUserRevokeRoleResponse struct { func (m *AuthUserRevokeRoleResponse) Reset() { *m = AuthUserRevokeRoleResponse{} } func (m *AuthUserRevokeRoleResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserRevokeRoleResponse) ProtoMessage() {} -func (*AuthUserRevokeRoleResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{74} } +func (*AuthUserRevokeRoleResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{77} } func (m *AuthUserRevokeRoleResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2900,7 +2948,7 @@ type AuthRoleAddResponse struct { func (m *AuthRoleAddResponse) Reset() { *m = AuthRoleAddResponse{} } func (m *AuthRoleAddResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleAddResponse) ProtoMessage() {} -func (*AuthRoleAddResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{75} } +func (*AuthRoleAddResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{78} } func (m *AuthRoleAddResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2917,7 +2965,7 @@ type AuthRoleGetResponse struct { func (m *AuthRoleGetResponse) Reset() { *m = AuthRoleGetResponse{} } func (m *AuthRoleGetResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleGetResponse) ProtoMessage() {} -func (*AuthRoleGetResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{76} } +func (*AuthRoleGetResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{79} } func (m *AuthRoleGetResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2941,7 +2989,7 @@ type AuthRoleListResponse struct { func (m *AuthRoleListResponse) Reset() { *m = AuthRoleListResponse{} } func (m *AuthRoleListResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleListResponse) ProtoMessage() {} -func (*AuthRoleListResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{77} } +func (*AuthRoleListResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{80} } func (m *AuthRoleListResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2965,7 +3013,7 @@ type AuthUserListResponse struct { func (m *AuthUserListResponse) Reset() { *m = AuthUserListResponse{} } func (m *AuthUserListResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserListResponse) ProtoMessage() {} -func (*AuthUserListResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{78} } +func (*AuthUserListResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{81} } func (m *AuthUserListResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2988,7 +3036,7 @@ type AuthRoleDeleteResponse struct { func (m *AuthRoleDeleteResponse) Reset() { *m = AuthRoleDeleteResponse{} } func (m *AuthRoleDeleteResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleDeleteResponse) ProtoMessage() {} -func (*AuthRoleDeleteResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{79} } +func (*AuthRoleDeleteResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{82} } func (m *AuthRoleDeleteResponse) GetHeader() *ResponseHeader { if m != nil { @@ -3005,7 +3053,7 @@ func (m *AuthRoleGrantPermissionResponse) Reset() { *m = AuthRoleGrantPe func (m *AuthRoleGrantPermissionResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleGrantPermissionResponse) ProtoMessage() {} func (*AuthRoleGrantPermissionResponse) Descriptor() ([]byte, []int) { - return fileDescriptorRpc, []int{80} + return fileDescriptorRpc, []int{83} } func (m *AuthRoleGrantPermissionResponse) GetHeader() *ResponseHeader { @@ -3023,7 +3071,7 @@ func (m *AuthRoleRevokePermissionResponse) Reset() { *m = AuthRoleRevoke func (m *AuthRoleRevokePermissionResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleRevokePermissionResponse) ProtoMessage() {} func (*AuthRoleRevokePermissionResponse) Descriptor() ([]byte, []int) { - return fileDescriptorRpc, []int{81} + return fileDescriptorRpc, []int{84} } func (m *AuthRoleRevokePermissionResponse) GetHeader() *ResponseHeader { @@ -3066,6 +3114,9 @@ func init() { proto.RegisterType((*LeaseKeepAliveResponse)(nil), "etcdserverpb.LeaseKeepAliveResponse") proto.RegisterType((*LeaseTimeToLiveRequest)(nil), "etcdserverpb.LeaseTimeToLiveRequest") proto.RegisterType((*LeaseTimeToLiveResponse)(nil), "etcdserverpb.LeaseTimeToLiveResponse") + proto.RegisterType((*LeaseLeasesRequest)(nil), "etcdserverpb.LeaseLeasesRequest") + proto.RegisterType((*LeaseStatus)(nil), "etcdserverpb.LeaseStatus") + proto.RegisterType((*LeaseLeasesResponse)(nil), "etcdserverpb.LeaseLeasesResponse") proto.RegisterType((*Member)(nil), "etcdserverpb.Member") proto.RegisterType((*MemberAddRequest)(nil), "etcdserverpb.MemberAddRequest") proto.RegisterType((*MemberAddResponse)(nil), "etcdserverpb.MemberAddResponse") @@ -3477,6 +3528,8 @@ type LeaseClient interface { LeaseKeepAlive(ctx context.Context, opts ...grpc.CallOption) (Lease_LeaseKeepAliveClient, error) // LeaseTimeToLive retrieves lease information. LeaseTimeToLive(ctx context.Context, in *LeaseTimeToLiveRequest, opts ...grpc.CallOption) (*LeaseTimeToLiveResponse, error) + // LeaseLeases lists all existing leases. + LeaseLeases(ctx context.Context, in *LeaseLeasesRequest, opts ...grpc.CallOption) (*LeaseLeasesResponse, error) } type leaseClient struct { @@ -3545,6 +3598,15 @@ func (c *leaseClient) LeaseTimeToLive(ctx context.Context, in *LeaseTimeToLiveRe return out, nil } +func (c *leaseClient) LeaseLeases(ctx context.Context, in *LeaseLeasesRequest, opts ...grpc.CallOption) (*LeaseLeasesResponse, error) { + out := new(LeaseLeasesResponse) + err := grpc.Invoke(ctx, "/etcdserverpb.Lease/LeaseLeases", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // Server API for Lease service type LeaseServer interface { @@ -3559,6 +3621,8 @@ type LeaseServer interface { LeaseKeepAlive(Lease_LeaseKeepAliveServer) error // LeaseTimeToLive retrieves lease information. LeaseTimeToLive(context.Context, *LeaseTimeToLiveRequest) (*LeaseTimeToLiveResponse, error) + // LeaseLeases lists all existing leases. + LeaseLeases(context.Context, *LeaseLeasesRequest) (*LeaseLeasesResponse, error) } func RegisterLeaseServer(s *grpc.Server, srv LeaseServer) { @@ -3645,6 +3709,24 @@ func _Lease_LeaseTimeToLive_Handler(srv interface{}, ctx context.Context, dec fu return interceptor(ctx, in, info, handler) } +func _Lease_LeaseLeases_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(LeaseLeasesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LeaseServer).LeaseLeases(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/etcdserverpb.Lease/LeaseLeases", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LeaseServer).LeaseLeases(ctx, req.(*LeaseLeasesRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Lease_serviceDesc = grpc.ServiceDesc{ ServiceName: "etcdserverpb.Lease", HandlerType: (*LeaseServer)(nil), @@ -3661,6 +3743,10 @@ var _Lease_serviceDesc = grpc.ServiceDesc{ MethodName: "LeaseTimeToLive", Handler: _Lease_LeaseTimeToLive_Handler, }, + { + MethodName: "LeaseLeases", + Handler: _Lease_LeaseLeases_Handler, + }, }, Streams: []grpc.StreamDesc{ { @@ -6199,6 +6285,87 @@ func (m *LeaseTimeToLiveResponse) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *LeaseLeasesRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LeaseLeasesRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + return i, nil +} + +func (m *LeaseStatus) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LeaseStatus) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.ID != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.ID)) + } + return i, nil +} + +func (m *LeaseLeasesResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LeaseLeasesResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n31, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n31 + } + if len(m.Leases) > 0 { + for _, msg := range m.Leases { + dAtA[i] = 0x12 + i++ + i = encodeVarintRpc(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + func (m *Member) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -6310,21 +6477,21 @@ func (m *MemberAddResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n31, err := m.Header.MarshalTo(dAtA[i:]) + n32, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n31 + i += n32 } if m.Member != nil { dAtA[i] = 0x12 i++ i = encodeVarintRpc(dAtA, i, uint64(m.Member.Size())) - n32, err := m.Member.MarshalTo(dAtA[i:]) + n33, err := m.Member.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n32 + i += n33 } if len(m.Members) > 0 { for _, msg := range m.Members { @@ -6383,11 +6550,11 @@ func (m *MemberRemoveResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n33, err := m.Header.MarshalTo(dAtA[i:]) + n34, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n33 + i += n34 } if len(m.Members) > 0 { for _, msg := range m.Members { @@ -6461,11 +6628,11 @@ func (m *MemberUpdateResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n34, err := m.Header.MarshalTo(dAtA[i:]) + n35, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n34 + i += n35 } if len(m.Members) > 0 { for _, msg := range m.Members { @@ -6519,11 +6686,11 @@ func (m *MemberListResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n35, err := m.Header.MarshalTo(dAtA[i:]) + n36, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n35 + i += n36 } if len(m.Members) > 0 { for _, msg := range m.Members { @@ -6577,11 +6744,11 @@ func (m *DefragmentResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n36, err := m.Header.MarshalTo(dAtA[i:]) + n37, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n36 + i += n37 } return i, nil } @@ -6628,11 +6795,11 @@ func (m *MoveLeaderResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n37, err := m.Header.MarshalTo(dAtA[i:]) + n38, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n37 + i += n38 } return i, nil } @@ -6717,11 +6884,11 @@ func (m *AlarmResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n38, err := m.Header.MarshalTo(dAtA[i:]) + n39, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n38 + i += n39 } if len(m.Alarms) > 0 { for _, msg := range m.Alarms { @@ -6775,11 +6942,11 @@ func (m *StatusResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n39, err := m.Header.MarshalTo(dAtA[i:]) + n40, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n39 + i += n40 } if len(m.Version) > 0 { dAtA[i] = 0x12 @@ -7177,11 +7344,11 @@ func (m *AuthRoleGrantPermissionRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintRpc(dAtA, i, uint64(m.Perm.Size())) - n40, err := m.Perm.MarshalTo(dAtA[i:]) + n41, err := m.Perm.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n40 + i += n41 } return i, nil } @@ -7241,11 +7408,11 @@ func (m *AuthEnableResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n41, err := m.Header.MarshalTo(dAtA[i:]) + n42, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n41 + i += n42 } return i, nil } @@ -7269,11 +7436,11 @@ func (m *AuthDisableResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n42, err := m.Header.MarshalTo(dAtA[i:]) + n43, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n42 + i += n43 } return i, nil } @@ -7297,11 +7464,11 @@ func (m *AuthenticateResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n43, err := m.Header.MarshalTo(dAtA[i:]) + n44, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n43 + i += n44 } if len(m.Token) > 0 { dAtA[i] = 0x12 @@ -7331,11 +7498,11 @@ func (m *AuthUserAddResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n44, err := m.Header.MarshalTo(dAtA[i:]) + n45, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n44 + i += n45 } return i, nil } @@ -7359,11 +7526,11 @@ func (m *AuthUserGetResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n45, err := m.Header.MarshalTo(dAtA[i:]) + n46, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n45 + i += n46 } if len(m.Roles) > 0 { for _, s := range m.Roles { @@ -7402,11 +7569,11 @@ func (m *AuthUserDeleteResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n46, err := m.Header.MarshalTo(dAtA[i:]) + n47, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n46 + i += n47 } return i, nil } @@ -7430,11 +7597,11 @@ func (m *AuthUserChangePasswordResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n47, err := m.Header.MarshalTo(dAtA[i:]) + n48, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n47 + i += n48 } return i, nil } @@ -7458,11 +7625,11 @@ func (m *AuthUserGrantRoleResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n48, err := m.Header.MarshalTo(dAtA[i:]) + n49, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n48 + i += n49 } return i, nil } @@ -7486,11 +7653,11 @@ func (m *AuthUserRevokeRoleResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n49, err := m.Header.MarshalTo(dAtA[i:]) + n50, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n49 + i += n50 } return i, nil } @@ -7514,11 +7681,11 @@ func (m *AuthRoleAddResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n50, err := m.Header.MarshalTo(dAtA[i:]) + n51, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n50 + i += n51 } return i, nil } @@ -7542,11 +7709,11 @@ func (m *AuthRoleGetResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n51, err := m.Header.MarshalTo(dAtA[i:]) + n52, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n51 + i += n52 } if len(m.Perm) > 0 { for _, msg := range m.Perm { @@ -7582,11 +7749,11 @@ func (m *AuthRoleListResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n52, err := m.Header.MarshalTo(dAtA[i:]) + n53, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n52 + i += n53 } if len(m.Roles) > 0 { for _, s := range m.Roles { @@ -7625,11 +7792,11 @@ func (m *AuthUserListResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n53, err := m.Header.MarshalTo(dAtA[i:]) + n54, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n53 + i += n54 } if len(m.Users) > 0 { for _, s := range m.Users { @@ -7668,11 +7835,11 @@ func (m *AuthRoleDeleteResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n54, err := m.Header.MarshalTo(dAtA[i:]) + n55, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n54 + i += n55 } return i, nil } @@ -7696,11 +7863,11 @@ func (m *AuthRoleGrantPermissionResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n55, err := m.Header.MarshalTo(dAtA[i:]) + n56, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n55 + i += n56 } return i, nil } @@ -7724,11 +7891,11 @@ func (m *AuthRoleRevokePermissionResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n56, err := m.Header.MarshalTo(dAtA[i:]) + n57, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n56 + i += n57 } return i, nil } @@ -8412,6 +8579,37 @@ func (m *LeaseTimeToLiveResponse) Size() (n int) { return n } +func (m *LeaseLeasesRequest) Size() (n int) { + var l int + _ = l + return n +} + +func (m *LeaseStatus) Size() (n int) { + var l int + _ = l + if m.ID != 0 { + n += 1 + sovRpc(uint64(m.ID)) + } + return n +} + +func (m *LeaseLeasesResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + if len(m.Leases) > 0 { + for _, e := range m.Leases { + l = e.Size() + n += 1 + l + sovRpc(uint64(l)) + } + } + return n +} + func (m *Member) Size() (n int) { var l int _ = l @@ -13274,6 +13472,239 @@ func (m *LeaseTimeToLiveResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *LeaseLeasesRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LeaseLeasesRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LeaseLeasesRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LeaseStatus) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LeaseStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LeaseStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + m.ID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ID |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LeaseLeasesResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LeaseLeasesResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LeaseLeasesResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Leases", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Leases = append(m.Leases, &LeaseStatus{}) + if err := m.Leases[len(m.Leases)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Member) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -18014,231 +18445,234 @@ var ( func init() { proto.RegisterFile("rpc.proto", fileDescriptorRpc) } var fileDescriptorRpc = []byte{ - // 3604 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x5b, 0xdd, 0x6f, 0x1b, 0xc7, - 0x11, 0xd7, 0x91, 0x22, 0x29, 0x0e, 0x3f, 0x44, 0xad, 0x64, 0x9b, 0xa2, 0x6d, 0x59, 0x5e, 0x7f, - 0xc9, 0x76, 0x2c, 0x25, 0x4a, 0xda, 0x07, 0xb7, 0x08, 0x22, 0x4b, 0x8c, 0xa5, 0x48, 0x96, 0x9c, - 0x93, 0xac, 0xa4, 0x40, 0x50, 0xe2, 0x44, 0xae, 0xa5, 0x83, 0xc8, 0x3b, 0xe6, 0xee, 0x48, 0x4b, - 0x69, 0x0a, 0x14, 0x69, 0x82, 0xa2, 0x05, 0xfa, 0xd2, 0x3c, 0xf4, 0xeb, 0xb1, 0x28, 0x8a, 0xbc, - 0xf4, 0xad, 0xe8, 0xbf, 0x50, 0xf4, 0xa5, 0x05, 0xfa, 0x0f, 0x14, 0x69, 0x5f, 0xfa, 0x47, 0x14, - 0x2d, 0xf6, 0xeb, 0x6e, 0xef, 0x78, 0x47, 0x29, 0x61, 0x92, 0x17, 0xeb, 0x76, 0x76, 0x76, 0x7e, - 0xb3, 0xb3, 0x3b, 0x33, 0xbb, 0xb3, 0x34, 0xe4, 0x9d, 0x6e, 0x73, 0xb1, 0xeb, 0xd8, 0x9e, 0x8d, - 0x8a, 0xc4, 0x6b, 0xb6, 0x5c, 0xe2, 0xf4, 0x89, 0xd3, 0x3d, 0xa8, 0xcd, 0x1c, 0xda, 0x87, 0x36, - 0xeb, 0x58, 0xa2, 0x5f, 0x9c, 0xa7, 0x36, 0x4b, 0x79, 0x96, 0x3a, 0xfd, 0x66, 0x93, 0xfd, 0xd3, - 0x3d, 0x58, 0x3a, 0xee, 0x8b, 0xae, 0xcb, 0xac, 0xcb, 0xe8, 0x79, 0x47, 0xec, 0x9f, 0xee, 0x01, - 0xfb, 0x23, 0x3a, 0xaf, 0x1c, 0xda, 0xf6, 0x61, 0x9b, 0x2c, 0x19, 0x5d, 0x73, 0xc9, 0xb0, 0x2c, - 0xdb, 0x33, 0x3c, 0xd3, 0xb6, 0x5c, 0xde, 0x8b, 0x3f, 0xd1, 0xa0, 0xac, 0x13, 0xb7, 0x6b, 0x5b, - 0x2e, 0x59, 0x27, 0x46, 0x8b, 0x38, 0xe8, 0x2a, 0x40, 0xb3, 0xdd, 0x73, 0x3d, 0xe2, 0x34, 0xcc, - 0x56, 0x55, 0x9b, 0xd7, 0x16, 0xc6, 0xf5, 0xbc, 0xa0, 0x6c, 0xb4, 0xd0, 0x65, 0xc8, 0x77, 0x48, - 0xe7, 0x80, 0xf7, 0xa6, 0x58, 0xef, 0x04, 0x27, 0x6c, 0xb4, 0x50, 0x0d, 0x26, 0x1c, 0xd2, 0x37, - 0x5d, 0xd3, 0xb6, 0xaa, 0xe9, 0x79, 0x6d, 0x21, 0xad, 0xfb, 0x6d, 0x3a, 0xd0, 0x31, 0x9e, 0x7b, - 0x0d, 0x8f, 0x38, 0x9d, 0xea, 0x38, 0x1f, 0x48, 0x09, 0x7b, 0xc4, 0xe9, 0xe0, 0x8f, 0x33, 0x50, - 0xd4, 0x0d, 0xeb, 0x90, 0xe8, 0xe4, 0xfd, 0x1e, 0x71, 0x3d, 0x54, 0x81, 0xf4, 0x31, 0x39, 0x65, - 0xf0, 0x45, 0x9d, 0x7e, 0xf2, 0xf1, 0xd6, 0x21, 0x69, 0x10, 0x8b, 0x03, 0x17, 0xe9, 0x78, 0xeb, - 0x90, 0xd4, 0xad, 0x16, 0x9a, 0x81, 0x4c, 0xdb, 0xec, 0x98, 0x9e, 0x40, 0xe5, 0x8d, 0x90, 0x3a, - 0xe3, 0x11, 0x75, 0x56, 0x01, 0x5c, 0xdb, 0xf1, 0x1a, 0xb6, 0xd3, 0x22, 0x4e, 0x35, 0x33, 0xaf, - 0x2d, 0x94, 0x97, 0x6f, 0x2e, 0xaa, 0x0b, 0xb1, 0xa8, 0x2a, 0xb4, 0xb8, 0x6b, 0x3b, 0xde, 0x0e, - 0xe5, 0xd5, 0xf3, 0xae, 0xfc, 0x44, 0x6f, 0x42, 0x81, 0x09, 0xf1, 0x0c, 0xe7, 0x90, 0x78, 0xd5, - 0x2c, 0x93, 0x72, 0xeb, 0x0c, 0x29, 0x7b, 0x8c, 0x59, 0x67, 0xf0, 0xfc, 0x1b, 0x61, 0x28, 0xba, - 0xc4, 0x31, 0x8d, 0xb6, 0xf9, 0x81, 0x71, 0xd0, 0x26, 0xd5, 0xdc, 0xbc, 0xb6, 0x30, 0xa1, 0x87, - 0x68, 0x74, 0xfe, 0xc7, 0xe4, 0xd4, 0x6d, 0xd8, 0x56, 0xfb, 0xb4, 0x3a, 0xc1, 0x18, 0x26, 0x28, - 0x61, 0xc7, 0x6a, 0x9f, 0xb2, 0x45, 0xb3, 0x7b, 0x96, 0xc7, 0x7b, 0xf3, 0xac, 0x37, 0xcf, 0x28, - 0xac, 0x7b, 0x01, 0x2a, 0x1d, 0xd3, 0x6a, 0x74, 0xec, 0x56, 0xc3, 0x37, 0x08, 0x30, 0x83, 0x94, - 0x3b, 0xa6, 0xf5, 0xc4, 0x6e, 0xe9, 0xd2, 0x2c, 0x94, 0xd3, 0x38, 0x09, 0x73, 0x16, 0x04, 0xa7, - 0x71, 0xa2, 0x72, 0x2e, 0xc2, 0x34, 0x95, 0xd9, 0x74, 0x88, 0xe1, 0x91, 0x80, 0xb9, 0xc8, 0x98, - 0xa7, 0x3a, 0xa6, 0xb5, 0xca, 0x7a, 0x42, 0xfc, 0xc6, 0xc9, 0x00, 0x7f, 0x49, 0xf0, 0x1b, 0x27, - 0x61, 0x7e, 0xbc, 0x08, 0x79, 0xdf, 0xe6, 0x68, 0x02, 0xc6, 0xb7, 0x77, 0xb6, 0xeb, 0x95, 0x31, - 0x04, 0x90, 0x5d, 0xd9, 0x5d, 0xad, 0x6f, 0xaf, 0x55, 0x34, 0x54, 0x80, 0xdc, 0x5a, 0x9d, 0x37, - 0x52, 0xf8, 0x11, 0x40, 0x60, 0x5d, 0x94, 0x83, 0xf4, 0x66, 0xfd, 0x7b, 0x95, 0x31, 0xca, 0xb3, - 0x5f, 0xd7, 0x77, 0x37, 0x76, 0xb6, 0x2b, 0x1a, 0x1d, 0xbc, 0xaa, 0xd7, 0x57, 0xf6, 0xea, 0x95, - 0x14, 0xe5, 0x78, 0xb2, 0xb3, 0x56, 0x49, 0xa3, 0x3c, 0x64, 0xf6, 0x57, 0xb6, 0x9e, 0xd5, 0x2b, - 0xe3, 0xf8, 0x53, 0x0d, 0x4a, 0x62, 0xbd, 0xb8, 0x4f, 0xa0, 0xd7, 0x20, 0x7b, 0xc4, 0xfc, 0x82, - 0x6d, 0xc5, 0xc2, 0xf2, 0x95, 0xc8, 0xe2, 0x86, 0x7c, 0x47, 0x17, 0xbc, 0x08, 0x43, 0xfa, 0xb8, - 0xef, 0x56, 0x53, 0xf3, 0xe9, 0x85, 0xc2, 0x72, 0x65, 0x91, 0x3b, 0xec, 0xe2, 0x26, 0x39, 0xdd, - 0x37, 0xda, 0x3d, 0xa2, 0xd3, 0x4e, 0x84, 0x60, 0xbc, 0x63, 0x3b, 0x84, 0xed, 0xd8, 0x09, 0x9d, - 0x7d, 0xd3, 0x6d, 0xcc, 0x16, 0x4d, 0xec, 0x56, 0xde, 0xc0, 0x9f, 0x69, 0x00, 0x4f, 0x7b, 0x5e, - 0xb2, 0x6b, 0xcc, 0x40, 0xa6, 0x4f, 0x05, 0x0b, 0xb7, 0xe0, 0x0d, 0xe6, 0x13, 0xc4, 0x70, 0x89, - 0xef, 0x13, 0xb4, 0x81, 0x2e, 0x41, 0xae, 0xeb, 0x90, 0x7e, 0xe3, 0xb8, 0xcf, 0x40, 0x26, 0xf4, - 0x2c, 0x6d, 0x6e, 0xf6, 0xd1, 0x75, 0x28, 0x9a, 0x87, 0x96, 0xed, 0x90, 0x06, 0x97, 0x95, 0x61, - 0xbd, 0x05, 0x4e, 0x63, 0x7a, 0x2b, 0x2c, 0x5c, 0x70, 0x56, 0x65, 0xd9, 0xa2, 0x24, 0x6c, 0x41, - 0x81, 0xa9, 0x3a, 0x92, 0xf9, 0xee, 0x06, 0x3a, 0xa6, 0xd8, 0xb0, 0x41, 0x13, 0x0a, 0xad, 0xf1, - 0x7b, 0x80, 0xd6, 0x48, 0x9b, 0x78, 0x64, 0x94, 0xe8, 0xa1, 0xd8, 0x24, 0xad, 0xda, 0x04, 0xff, - 0x42, 0x83, 0xe9, 0x90, 0xf8, 0x91, 0xa6, 0x55, 0x85, 0x5c, 0x8b, 0x09, 0xe3, 0x1a, 0xa4, 0x75, - 0xd9, 0x44, 0xf7, 0x61, 0x42, 0x28, 0xe0, 0x56, 0xd3, 0x09, 0x9b, 0x26, 0xc7, 0x75, 0x72, 0xf1, - 0x67, 0x29, 0xc8, 0x8b, 0x89, 0xee, 0x74, 0xd1, 0x0a, 0x94, 0x1c, 0xde, 0x68, 0xb0, 0xf9, 0x08, - 0x8d, 0x6a, 0xc9, 0x41, 0x68, 0x7d, 0x4c, 0x2f, 0x8a, 0x21, 0x8c, 0x8c, 0xbe, 0x03, 0x05, 0x29, - 0xa2, 0xdb, 0xf3, 0x84, 0xc9, 0xab, 0x61, 0x01, 0xc1, 0xfe, 0x5b, 0x1f, 0xd3, 0x41, 0xb0, 0x3f, - 0xed, 0x79, 0x68, 0x0f, 0x66, 0xe4, 0x60, 0x3e, 0x1b, 0xa1, 0x46, 0x9a, 0x49, 0x99, 0x0f, 0x4b, - 0x19, 0x5c, 0xaa, 0xf5, 0x31, 0x1d, 0x89, 0xf1, 0x4a, 0xa7, 0xaa, 0x92, 0x77, 0xc2, 0x83, 0xf7, - 0x80, 0x4a, 0x7b, 0x27, 0xd6, 0xa0, 0x4a, 0x7b, 0x27, 0xd6, 0xa3, 0x3c, 0xe4, 0x44, 0x0b, 0xff, - 0x39, 0x05, 0x20, 0x57, 0x63, 0xa7, 0x8b, 0xd6, 0xa0, 0xec, 0x88, 0x56, 0xc8, 0x5a, 0x97, 0x63, - 0xad, 0x25, 0x16, 0x71, 0x4c, 0x2f, 0xc9, 0x41, 0x5c, 0xb9, 0xd7, 0xa1, 0xe8, 0x4b, 0x09, 0x0c, - 0x36, 0x1b, 0x63, 0x30, 0x5f, 0x42, 0x41, 0x0e, 0xa0, 0x26, 0x7b, 0x07, 0x2e, 0xf8, 0xe3, 0x63, - 0x6c, 0x76, 0x7d, 0x88, 0xcd, 0x7c, 0x81, 0xd3, 0x52, 0x82, 0x6a, 0x35, 0x55, 0xb1, 0xc0, 0x6c, - 0xb3, 0x31, 0x66, 0x1b, 0x54, 0x8c, 0x1a, 0x0e, 0x68, 0xbe, 0xe4, 0x4d, 0xfc, 0x9f, 0x34, 0xe4, - 0x56, 0xed, 0x4e, 0xd7, 0x70, 0xe8, 0x6a, 0x64, 0x1d, 0xe2, 0xf6, 0xda, 0x1e, 0x33, 0x57, 0x79, - 0xf9, 0x46, 0x58, 0xa2, 0x60, 0x93, 0x7f, 0x75, 0xc6, 0xaa, 0x8b, 0x21, 0x74, 0xb0, 0x48, 0x8f, - 0xa9, 0x73, 0x0c, 0x16, 0xc9, 0x51, 0x0c, 0x91, 0x8e, 0x9c, 0x0e, 0x1c, 0xb9, 0x06, 0xb9, 0x3e, - 0x71, 0x82, 0x94, 0xbe, 0x3e, 0xa6, 0x4b, 0x02, 0xba, 0x0b, 0x93, 0xd1, 0xf4, 0x92, 0x11, 0x3c, - 0xe5, 0x66, 0x38, 0x1b, 0xdd, 0x80, 0x62, 0x28, 0xc7, 0x65, 0x05, 0x5f, 0xa1, 0xa3, 0xa4, 0xb8, - 0x8b, 0x32, 0xae, 0xd2, 0x7c, 0x5c, 0x5c, 0x1f, 0x93, 0x91, 0xf5, 0xa2, 0x8c, 0xac, 0x13, 0x62, - 0x94, 0x88, 0xad, 0xa1, 0x20, 0xf3, 0x46, 0x38, 0xc8, 0xe0, 0x37, 0xa0, 0x14, 0x32, 0x10, 0xcd, - 0x3b, 0xf5, 0xb7, 0x9f, 0xad, 0x6c, 0xf1, 0x24, 0xf5, 0x98, 0xe5, 0x25, 0xbd, 0xa2, 0xd1, 0x5c, - 0xb7, 0x55, 0xdf, 0xdd, 0xad, 0xa4, 0x50, 0x09, 0xf2, 0xdb, 0x3b, 0x7b, 0x0d, 0xce, 0x95, 0xc6, - 0x8f, 0x7d, 0x09, 0x22, 0xc9, 0x29, 0xb9, 0x6d, 0x4c, 0xc9, 0x6d, 0x9a, 0xcc, 0x6d, 0xa9, 0x20, - 0xb7, 0xb1, 0x34, 0xb7, 0x55, 0x5f, 0xd9, 0xad, 0x57, 0xc6, 0x1f, 0x95, 0xa1, 0xc8, 0xed, 0xdb, - 0xe8, 0x59, 0x34, 0xd5, 0xfe, 0x4e, 0x03, 0x08, 0xbc, 0x09, 0x2d, 0x41, 0xae, 0xc9, 0x71, 0xaa, - 0x1a, 0x0b, 0x46, 0x17, 0x62, 0x97, 0x4c, 0x97, 0x5c, 0xe8, 0x15, 0xc8, 0xb9, 0xbd, 0x66, 0x93, - 0xb8, 0x32, 0xe5, 0x5d, 0x8a, 0xc6, 0x43, 0x11, 0xad, 0x74, 0xc9, 0x47, 0x87, 0x3c, 0x37, 0xcc, - 0x76, 0x8f, 0x25, 0xc0, 0xe1, 0x43, 0x04, 0x1f, 0xfe, 0xb5, 0x06, 0x05, 0x65, 0xf3, 0x7e, 0xc9, - 0x20, 0x7c, 0x05, 0xf2, 0x4c, 0x07, 0xd2, 0x12, 0x61, 0x78, 0x42, 0x0f, 0x08, 0xe8, 0xdb, 0x90, - 0x97, 0x1e, 0x20, 0x23, 0x71, 0x35, 0x5e, 0xec, 0x4e, 0x57, 0x0f, 0x58, 0xf1, 0x26, 0x4c, 0x31, - 0xab, 0x34, 0xe9, 0xe1, 0x5a, 0xda, 0x51, 0x3d, 0x7e, 0x6a, 0x91, 0xe3, 0x67, 0x0d, 0x26, 0xba, - 0x47, 0xa7, 0xae, 0xd9, 0x34, 0xda, 0x42, 0x0b, 0xbf, 0x8d, 0xdf, 0x02, 0xa4, 0x0a, 0x1b, 0x65, - 0xba, 0xb8, 0x04, 0x85, 0x75, 0xc3, 0x3d, 0x12, 0x2a, 0xe1, 0xfb, 0x50, 0xa2, 0xcd, 0xcd, 0xfd, - 0x73, 0xe8, 0xc8, 0x2e, 0x07, 0x92, 0x7b, 0x24, 0x9b, 0x23, 0x18, 0x3f, 0x32, 0xdc, 0x23, 0x36, - 0xd1, 0x92, 0xce, 0xbe, 0xd1, 0x5d, 0xa8, 0x34, 0xf9, 0x24, 0x1b, 0x91, 0x2b, 0xc3, 0xa4, 0xa0, - 0xfb, 0x27, 0xc1, 0x77, 0xa1, 0xc8, 0xe7, 0xf0, 0x55, 0x2b, 0x81, 0xa7, 0x60, 0x72, 0xd7, 0x32, - 0xba, 0xee, 0x91, 0x2d, 0xb3, 0x1b, 0x9d, 0x74, 0x25, 0xa0, 0x8d, 0x84, 0x78, 0x07, 0x26, 0x1d, - 0xd2, 0x31, 0x4c, 0xcb, 0xb4, 0x0e, 0x1b, 0x07, 0xa7, 0x1e, 0x71, 0xc5, 0x85, 0xa9, 0xec, 0x93, - 0x1f, 0x51, 0x2a, 0x55, 0xed, 0xa0, 0x6d, 0x1f, 0x88, 0x30, 0xc7, 0xbe, 0xf1, 0x9f, 0x34, 0x28, - 0xbe, 0x63, 0x78, 0x4d, 0xb9, 0x74, 0x68, 0x03, 0xca, 0x7e, 0x70, 0x63, 0x14, 0xa1, 0x4b, 0x24, - 0xc5, 0xb2, 0x31, 0xf2, 0x28, 0x2d, 0xb3, 0x63, 0xa9, 0xa9, 0x12, 0x98, 0x28, 0xc3, 0x6a, 0x92, - 0xb6, 0x2f, 0x2a, 0x95, 0x2c, 0x8a, 0x31, 0xaa, 0xa2, 0x54, 0xc2, 0xa3, 0xc9, 0xe0, 0xf8, 0xc1, - 0x63, 0xc9, 0x6f, 0x52, 0x80, 0x06, 0x75, 0xf8, 0xa2, 0x27, 0xb2, 0x5b, 0x50, 0x76, 0x3d, 0xc3, - 0x19, 0xd8, 0x1b, 0x25, 0x46, 0xf5, 0x03, 0xf4, 0x1d, 0x98, 0xec, 0x3a, 0xf6, 0xa1, 0x43, 0x5c, - 0xb7, 0x61, 0xd9, 0x9e, 0xf9, 0xfc, 0x54, 0x1c, 0x6a, 0xcb, 0x92, 0xbc, 0xcd, 0xa8, 0xa8, 0x0e, - 0xb9, 0xe7, 0x66, 0xdb, 0x23, 0x8e, 0x5b, 0xcd, 0xcc, 0xa7, 0x17, 0xca, 0xcb, 0xf7, 0xcf, 0xb2, - 0xda, 0xe2, 0x9b, 0x8c, 0x7f, 0xef, 0xb4, 0x4b, 0x74, 0x39, 0x56, 0x3d, 0x28, 0x66, 0x43, 0x07, - 0xc5, 0x5b, 0x00, 0x01, 0x3f, 0x0d, 0xb5, 0xdb, 0x3b, 0x4f, 0x9f, 0xed, 0x55, 0xc6, 0x50, 0x11, - 0x26, 0xb6, 0x77, 0xd6, 0xea, 0x5b, 0x75, 0x1a, 0x97, 0xf1, 0x92, 0xb4, 0x8d, 0x6a, 0x43, 0x34, - 0x0b, 0x13, 0x2f, 0x28, 0x55, 0xde, 0xb7, 0xd3, 0x7a, 0x8e, 0xb5, 0x37, 0x5a, 0xf8, 0xe7, 0x29, - 0x28, 0x89, 0x5d, 0x30, 0xd2, 0x56, 0x54, 0x21, 0x52, 0x21, 0x08, 0x7a, 0x2a, 0xe5, 0xbb, 0xa3, - 0x25, 0x0e, 0xbf, 0xb2, 0x49, 0x63, 0x03, 0x5f, 0x6c, 0xd2, 0x12, 0x66, 0xf5, 0xdb, 0xb1, 0xee, - 0x9b, 0x89, 0x75, 0x5f, 0x74, 0x03, 0x4a, 0xfe, 0x6e, 0x33, 0x5c, 0x91, 0x6b, 0xf3, 0x7a, 0x51, - 0x6e, 0x24, 0x4a, 0x43, 0xb7, 0x20, 0x4b, 0xfa, 0xc4, 0xf2, 0xdc, 0x6a, 0x81, 0x45, 0xdd, 0x92, - 0x3c, 0xff, 0xd6, 0x29, 0x55, 0x17, 0x9d, 0xf8, 0x5b, 0x30, 0xc5, 0xee, 0x19, 0x8f, 0x1d, 0xc3, - 0x52, 0x2f, 0x44, 0x7b, 0x7b, 0x5b, 0xc2, 0x74, 0xf4, 0x13, 0x95, 0x21, 0xb5, 0xb1, 0x26, 0x26, - 0x9a, 0xda, 0x58, 0xc3, 0x1f, 0x69, 0x80, 0xd4, 0x71, 0x23, 0xd9, 0x32, 0x22, 0x5c, 0xc2, 0xa7, - 0x03, 0xf8, 0x19, 0xc8, 0x10, 0xc7, 0xb1, 0x1d, 0x66, 0xb5, 0xbc, 0xce, 0x1b, 0xf8, 0xa6, 0xd0, - 0x41, 0x27, 0x7d, 0xfb, 0xd8, 0x77, 0x0c, 0x2e, 0x4d, 0xf3, 0x55, 0xdd, 0x84, 0xe9, 0x10, 0xd7, - 0x48, 0xd1, 0xff, 0x0e, 0x5c, 0x60, 0xc2, 0x36, 0x09, 0xe9, 0xae, 0xb4, 0xcd, 0x7e, 0x22, 0x6a, - 0x17, 0x2e, 0x46, 0x19, 0xbf, 0x5e, 0x1b, 0xe1, 0xef, 0x0a, 0xc4, 0x3d, 0xb3, 0x43, 0xf6, 0xec, - 0xad, 0x64, 0xdd, 0x68, 0x74, 0x3c, 0x26, 0xa7, 0xae, 0x48, 0x93, 0xec, 0x1b, 0xff, 0x5e, 0x83, - 0x4b, 0x03, 0xc3, 0xbf, 0xe6, 0x55, 0x9d, 0x03, 0x38, 0xa4, 0xdb, 0x87, 0xb4, 0x68, 0x07, 0xbf, - 0xa1, 0x2b, 0x14, 0x5f, 0x4f, 0x1a, 0x60, 0x8a, 0x42, 0xcf, 0x23, 0xc8, 0x3e, 0x61, 0xc5, 0x31, - 0x65, 0x56, 0xe3, 0x72, 0x56, 0x96, 0xd1, 0xe1, 0x57, 0xf6, 0xbc, 0xce, 0xbe, 0xd9, 0xa1, 0x80, - 0x10, 0xe7, 0x99, 0xbe, 0xc5, 0x0f, 0x1f, 0x79, 0xdd, 0x6f, 0x53, 0xf4, 0x66, 0xdb, 0x24, 0x96, - 0xc7, 0x7a, 0xc7, 0x59, 0xaf, 0x42, 0xc1, 0x8b, 0x50, 0xe1, 0x48, 0x2b, 0xad, 0x96, 0x92, 0xdc, - 0x7d, 0x79, 0x5a, 0x58, 0x1e, 0xfe, 0x83, 0x06, 0x53, 0xca, 0x80, 0x91, 0x6c, 0xf7, 0x12, 0x64, - 0x79, 0x09, 0x50, 0xe4, 0x91, 0x99, 0xf0, 0x28, 0x0e, 0xa3, 0x0b, 0x1e, 0xb4, 0x08, 0x39, 0xfe, - 0x25, 0x4f, 0x58, 0xf1, 0xec, 0x92, 0x09, 0xdf, 0x82, 0x69, 0x41, 0x22, 0x1d, 0x3b, 0x6e, 0x9b, - 0x30, 0x83, 0xe2, 0x0f, 0x61, 0x26, 0xcc, 0x36, 0xd2, 0x94, 0x14, 0x25, 0x53, 0xe7, 0x51, 0x72, - 0x45, 0x2a, 0xf9, 0xac, 0xdb, 0x52, 0xd2, 0x5e, 0x74, 0xd5, 0xd5, 0x15, 0x49, 0x45, 0x56, 0xc4, - 0x9f, 0x80, 0x14, 0xf1, 0x8d, 0x4e, 0x60, 0x5a, 0x6e, 0x87, 0x2d, 0xd3, 0xf5, 0x0f, 0x43, 0x1f, - 0x00, 0x52, 0x89, 0xdf, 0xb4, 0x42, 0x6b, 0xe4, 0xb9, 0x63, 0x1c, 0x76, 0x88, 0x1f, 0xea, 0xe9, - 0xd1, 0x58, 0x25, 0x8e, 0x14, 0x1c, 0x97, 0x60, 0xea, 0x89, 0xdd, 0x27, 0x5b, 0x9c, 0x1a, 0xb8, - 0x0c, 0xbf, 0x1a, 0xf9, 0xcb, 0xe6, 0xb7, 0x29, 0xb8, 0x3a, 0x60, 0x24, 0xf0, 0xbf, 0x69, 0x50, - 0x5c, 0x69, 0x1b, 0x4e, 0x47, 0x02, 0xbf, 0x0e, 0x59, 0x7e, 0xe0, 0x17, 0x77, 0xec, 0xdb, 0x61, - 0x31, 0x2a, 0x2f, 0x6f, 0xac, 0xf0, 0xeb, 0x81, 0x18, 0x45, 0x15, 0x17, 0x65, 0xf8, 0xb5, 0x48, - 0x59, 0x7e, 0x0d, 0x3d, 0x80, 0x8c, 0x41, 0x87, 0xb0, 0x68, 0x56, 0x8e, 0x5e, 0xb5, 0x98, 0x34, - 0x76, 0xce, 0xe1, 0x5c, 0xf8, 0x35, 0x28, 0x28, 0x08, 0xf4, 0x32, 0xf9, 0xb8, 0x2e, 0xce, 0x32, - 0x2b, 0xab, 0x7b, 0x1b, 0xfb, 0xfc, 0x8e, 0x59, 0x06, 0x58, 0xab, 0xfb, 0xed, 0x14, 0x7e, 0x57, - 0x8c, 0x12, 0xf1, 0x4e, 0xd5, 0x47, 0x4b, 0xd2, 0x27, 0x75, 0x2e, 0x7d, 0x4e, 0xa0, 0x24, 0xa6, - 0x3f, 0xd2, 0x06, 0x7c, 0x05, 0xb2, 0x4c, 0x9e, 0xdc, 0x7f, 0xb3, 0x31, 0xb0, 0x32, 0x54, 0x71, - 0x46, 0x3c, 0x09, 0xa5, 0x5d, 0xcf, 0xf0, 0x7a, 0xae, 0xdc, 0x7f, 0x7f, 0xd5, 0xa0, 0x2c, 0x29, - 0xa3, 0xd6, 0x02, 0x65, 0x19, 0x83, 0x67, 0x00, 0xbf, 0x88, 0x71, 0x11, 0xb2, 0xad, 0x83, 0x5d, - 0xf3, 0x03, 0x59, 0xb7, 0x15, 0x2d, 0x4a, 0x6f, 0x73, 0x1c, 0xfe, 0x78, 0x22, 0x5a, 0xf4, 0x42, - 0xeb, 0x18, 0xcf, 0xbd, 0x0d, 0xab, 0x45, 0x4e, 0xd8, 0x11, 0x6c, 0x5c, 0x0f, 0x08, 0xec, 0x7e, - 0x27, 0x1e, 0x59, 0xd8, 0xb9, 0x4b, 0x7d, 0x74, 0x99, 0x86, 0xa9, 0x95, 0x9e, 0x77, 0x54, 0xb7, - 0x8c, 0x83, 0xb6, 0x8c, 0x58, 0x78, 0x06, 0x10, 0x25, 0xae, 0x99, 0xae, 0x4a, 0xad, 0xc3, 0x34, - 0xa5, 0x12, 0xcb, 0x33, 0x9b, 0x4a, 0x78, 0x93, 0x49, 0x4c, 0x8b, 0x24, 0x31, 0xc3, 0x75, 0x5f, - 0xd8, 0x4e, 0x4b, 0x4c, 0xcd, 0x6f, 0xe3, 0x35, 0x2e, 0xfc, 0x99, 0x1b, 0x4a, 0x53, 0x5f, 0x54, - 0xca, 0x42, 0x20, 0xe5, 0x31, 0xf1, 0x86, 0x48, 0xc1, 0xf7, 0xe1, 0x82, 0xe4, 0x14, 0x75, 0xb2, - 0x21, 0xcc, 0x3b, 0x70, 0x55, 0x32, 0xaf, 0x1e, 0xd1, 0x8b, 0xc8, 0x53, 0x01, 0xf8, 0x65, 0xf5, - 0x7c, 0x04, 0x55, 0x5f, 0x4f, 0x76, 0xee, 0xb4, 0xdb, 0xaa, 0x02, 0x3d, 0x57, 0xec, 0x99, 0xbc, - 0xce, 0xbe, 0x29, 0xcd, 0xb1, 0xdb, 0xfe, 0x91, 0x80, 0x7e, 0xe3, 0x55, 0x98, 0x95, 0x32, 0xc4, - 0x89, 0x30, 0x2c, 0x64, 0x40, 0xa1, 0x38, 0x21, 0xc2, 0x60, 0x74, 0xe8, 0x70, 0xb3, 0xab, 0x9c, - 0x61, 0xd3, 0x32, 0x99, 0x9a, 0x22, 0xf3, 0x02, 0xdf, 0x11, 0x54, 0x31, 0x35, 0x63, 0x08, 0x32, - 0x15, 0xa0, 0x92, 0xc5, 0x42, 0x50, 0xf2, 0xc0, 0x42, 0x0c, 0x88, 0x7e, 0x0f, 0xe6, 0x7c, 0x25, - 0xa8, 0xdd, 0x9e, 0x12, 0xa7, 0x63, 0xba, 0xae, 0x52, 0x59, 0x89, 0x9b, 0xf8, 0x6d, 0x18, 0xef, - 0x12, 0x11, 0x53, 0x0a, 0xcb, 0x68, 0x91, 0x3f, 0x85, 0x2e, 0x2a, 0x83, 0x59, 0x3f, 0x6e, 0xc1, - 0x35, 0x29, 0x9d, 0x5b, 0x34, 0x56, 0x7c, 0x54, 0x29, 0x79, 0x81, 0xe5, 0x66, 0x1d, 0xbc, 0xc0, - 0xa6, 0xf9, 0xda, 0xfb, 0xd5, 0xbe, 0xb7, 0xb8, 0x21, 0xa5, 0x6f, 0x8d, 0x94, 0x2b, 0x36, 0xb9, - 0x4d, 0x7d, 0x97, 0x1c, 0x49, 0xd8, 0x01, 0xcc, 0x84, 0x3d, 0x79, 0xa4, 0x30, 0x36, 0x03, 0x19, - 0xcf, 0x3e, 0x26, 0x32, 0x88, 0xf1, 0x86, 0x54, 0xd8, 0x77, 0xf3, 0x91, 0x14, 0x36, 0x02, 0x61, - 0x6c, 0x4b, 0x8e, 0xaa, 0x2f, 0x5d, 0x4d, 0x79, 0xf8, 0xe2, 0x0d, 0xbc, 0x0d, 0x17, 0xa3, 0x61, - 0x62, 0x24, 0x95, 0xf7, 0xf9, 0x06, 0x8e, 0x8b, 0x24, 0x23, 0xc9, 0x7d, 0x3b, 0x08, 0x06, 0x4a, - 0x40, 0x19, 0x49, 0xa4, 0x0e, 0xb5, 0xb8, 0xf8, 0xf2, 0x55, 0xec, 0x57, 0x3f, 0xdc, 0x8c, 0x24, - 0xcc, 0x0d, 0x84, 0x8d, 0xbe, 0xfc, 0x41, 0x8c, 0x48, 0x0f, 0x8d, 0x11, 0xc2, 0x49, 0x82, 0x28, - 0xf6, 0x35, 0x6c, 0x3a, 0x81, 0x11, 0x04, 0xd0, 0x51, 0x31, 0x68, 0x0e, 0xf1, 0x31, 0x58, 0x43, - 0x6e, 0x6c, 0x35, 0xec, 0x8e, 0xb4, 0x18, 0xef, 0x04, 0xb1, 0x73, 0x20, 0x32, 0x8f, 0x24, 0xf8, - 0x5d, 0x98, 0x4f, 0x0e, 0xca, 0xa3, 0x48, 0xbe, 0x87, 0x21, 0xef, 0x1f, 0x28, 0x95, 0x9f, 0x11, - 0x14, 0x20, 0xb7, 0xbd, 0xb3, 0xfb, 0x74, 0x65, 0xb5, 0x5e, 0xd1, 0x96, 0xff, 0x9b, 0x86, 0xd4, - 0xe6, 0x3e, 0xfa, 0x3e, 0x64, 0xf8, 0x3b, 0xda, 0x90, 0xc7, 0xd3, 0xda, 0xb0, 0xa7, 0x42, 0x7c, - 0xe5, 0xa3, 0x7f, 0xfc, 0xfb, 0xd3, 0xd4, 0x45, 0x3c, 0xb5, 0xd4, 0x7f, 0xd5, 0x68, 0x77, 0x8f, - 0x8c, 0xa5, 0xe3, 0xfe, 0x12, 0xcb, 0x09, 0x0f, 0xb5, 0x7b, 0x68, 0x1f, 0xd2, 0x4f, 0x7b, 0x1e, - 0x4a, 0x7c, 0x59, 0xad, 0x25, 0x3f, 0x21, 0xe2, 0x1a, 0x93, 0x3c, 0x83, 0x27, 0x55, 0xc9, 0xdd, - 0x9e, 0x47, 0xe5, 0xf6, 0xa1, 0xa0, 0xbe, 0x02, 0x9e, 0xf9, 0xe6, 0x5a, 0x3b, 0xfb, 0x85, 0x11, - 0x63, 0x86, 0x77, 0x05, 0x5f, 0x52, 0xf1, 0xf8, 0x63, 0xa5, 0x3a, 0x9f, 0xbd, 0x13, 0x0b, 0x25, - 0x3e, 0xcb, 0xd6, 0x92, 0x5f, 0x1e, 0xe3, 0xe7, 0xe3, 0x9d, 0x58, 0x54, 0xae, 0x2d, 0x5e, 0x1e, - 0x9b, 0x1e, 0xba, 0x16, 0xf3, 0xf2, 0xa4, 0xbe, 0xb1, 0xd4, 0xe6, 0x93, 0x19, 0x04, 0xd2, 0x75, - 0x86, 0x74, 0x19, 0x5f, 0x54, 0x91, 0x9a, 0x3e, 0xdf, 0x43, 0xed, 0xde, 0xf2, 0x11, 0x64, 0x58, - 0x91, 0x15, 0x35, 0xe4, 0x47, 0x2d, 0xa6, 0x3c, 0x9c, 0xb0, 0x03, 0x42, 0xe5, 0x59, 0x3c, 0xcb, - 0xd0, 0xa6, 0x71, 0xd9, 0x47, 0x63, 0x75, 0xd6, 0x87, 0xda, 0xbd, 0x05, 0xed, 0x65, 0x6d, 0xf9, - 0xc7, 0xe3, 0x90, 0x61, 0x75, 0x2b, 0xd4, 0x05, 0x08, 0x2a, 0x92, 0xd1, 0x79, 0x0e, 0xd4, 0x38, - 0xa3, 0xf3, 0x1c, 0x2c, 0x66, 0xe2, 0x6b, 0x0c, 0x79, 0x16, 0xcf, 0xf8, 0xc8, 0xec, 0x51, 0x72, - 0x89, 0x55, 0xa8, 0xa8, 0x59, 0x5f, 0x40, 0x41, 0xa9, 0x2c, 0xa2, 0x38, 0x89, 0xa1, 0xd2, 0x64, - 0x74, 0x9b, 0xc4, 0x94, 0x25, 0xf1, 0x0d, 0x06, 0x7a, 0x15, 0x57, 0x55, 0xe3, 0x72, 0x5c, 0x87, - 0x71, 0x52, 0xe0, 0x8f, 0x35, 0x28, 0x87, 0xab, 0x8b, 0xe8, 0x46, 0x8c, 0xe8, 0x68, 0x91, 0xb2, - 0x76, 0x73, 0x38, 0x53, 0xa2, 0x0a, 0x1c, 0xff, 0x98, 0x90, 0xae, 0x41, 0x39, 0x85, 0xed, 0xd1, - 0x4f, 0x34, 0x98, 0x8c, 0xd4, 0x0c, 0x51, 0x1c, 0xc4, 0x40, 0x45, 0xb2, 0x76, 0xeb, 0x0c, 0x2e, - 0xa1, 0xc9, 0x1d, 0xa6, 0xc9, 0x75, 0x7c, 0x65, 0xd0, 0x18, 0x9e, 0xd9, 0x21, 0x9e, 0x2d, 0xb4, - 0x59, 0xfe, 0x5f, 0x1a, 0x72, 0xab, 0xfc, 0x17, 0x75, 0xc8, 0x83, 0xbc, 0x5f, 0x86, 0x43, 0x73, - 0x71, 0x25, 0x91, 0xe0, 0xc8, 0x5e, 0xbb, 0x96, 0xd8, 0x2f, 0x54, 0xb8, 0xcd, 0x54, 0x98, 0xc7, - 0x97, 0x7d, 0x15, 0xc4, 0x2f, 0xf7, 0x96, 0xf8, 0xe5, 0x7b, 0xc9, 0x68, 0xb5, 0xe8, 0x92, 0xfc, - 0x48, 0x83, 0xa2, 0x5a, 0x2d, 0x43, 0xd7, 0x63, 0x8b, 0x31, 0x6a, 0xc1, 0xad, 0x86, 0x87, 0xb1, - 0x08, 0xfc, 0xbb, 0x0c, 0xff, 0x06, 0x9e, 0x4b, 0xc2, 0x77, 0x18, 0x7f, 0x58, 0x05, 0x5e, 0xef, - 0x8a, 0x57, 0x21, 0x54, 0x4e, 0x8b, 0x57, 0x21, 0x5c, 0x2e, 0x3b, 0x5b, 0x85, 0x1e, 0xe3, 0xa7, - 0x2a, 0x9c, 0x00, 0x04, 0xe5, 0x2d, 0x14, 0x6b, 0x5c, 0xe5, 0x12, 0x13, 0xf5, 0xc1, 0xc1, 0xca, - 0x58, 0xcc, 0x0e, 0x88, 0x60, 0xb7, 0x4d, 0x97, 0xfa, 0xe2, 0xf2, 0x1f, 0xb3, 0x50, 0x78, 0x62, - 0x98, 0x96, 0x47, 0x2c, 0xc3, 0x6a, 0x12, 0x74, 0x08, 0x19, 0x96, 0xa5, 0xa2, 0x81, 0x47, 0x2d, - 0xfb, 0x44, 0x03, 0x4f, 0xa8, 0x26, 0x82, 0x6f, 0x31, 0xe8, 0x6b, 0xb8, 0xe6, 0x43, 0x77, 0x02, - 0xf9, 0x4b, 0xac, 0x9e, 0x41, 0xa7, 0x7c, 0x0c, 0x59, 0x5e, 0xbf, 0x40, 0x11, 0x69, 0xa1, 0x3a, - 0x47, 0xed, 0x4a, 0x7c, 0x67, 0xe2, 0x2e, 0x53, 0xb1, 0x5c, 0xc6, 0x4c, 0xc1, 0x7e, 0x00, 0x10, - 0x54, 0xeb, 0xa2, 0xf6, 0x1d, 0x28, 0xee, 0xd5, 0xe6, 0x93, 0x19, 0x04, 0xf0, 0x3d, 0x06, 0x7c, - 0x13, 0x5f, 0x8b, 0x05, 0x6e, 0xf9, 0x03, 0x28, 0x78, 0x13, 0xc6, 0xd7, 0x0d, 0xf7, 0x08, 0x45, - 0x92, 0x90, 0xf2, 0x1a, 0x5e, 0xab, 0xc5, 0x75, 0x09, 0xa8, 0x9b, 0x0c, 0x6a, 0x0e, 0xcf, 0xc6, - 0x42, 0x1d, 0x19, 0x2e, 0x8d, 0xe9, 0xc8, 0x84, 0x2c, 0x7f, 0x21, 0x8f, 0x9a, 0x33, 0xf4, 0xca, - 0x1e, 0x35, 0x67, 0xf8, 0x51, 0xfd, 0x9c, 0x50, 0x3d, 0x98, 0x90, 0xef, 0xd2, 0xe8, 0x6a, 0x64, - 0x79, 0xc2, 0x6f, 0xd8, 0xb5, 0xb9, 0xa4, 0x6e, 0x01, 0xb8, 0xc0, 0x00, 0x31, 0xbe, 0x1a, 0xbf, - 0x7e, 0x82, 0xfd, 0xa1, 0x76, 0xef, 0x65, 0x8d, 0x06, 0x6f, 0x08, 0xaa, 0x9e, 0x03, 0x4e, 0x12, - 0x2d, 0xa0, 0x0e, 0x38, 0xc9, 0x40, 0xc1, 0x14, 0xbf, 0xca, 0xd0, 0x1f, 0xe0, 0x85, 0x58, 0x74, - 0xcf, 0x31, 0x2c, 0xf7, 0x39, 0x71, 0x1e, 0xf0, 0xf2, 0x96, 0x7b, 0x64, 0x76, 0xa9, 0xc3, 0xfc, - 0xac, 0x02, 0xe3, 0xf4, 0x84, 0x48, 0xf3, 0x66, 0x70, 0xb1, 0x8e, 0xaa, 0x33, 0x50, 0xce, 0x8a, - 0xaa, 0x33, 0x78, 0x27, 0x8f, 0xc9, 0x9b, 0xec, 0x97, 0xd4, 0x84, 0x71, 0x51, 0xc3, 0x7b, 0x50, - 0x50, 0xae, 0xdf, 0x28, 0x46, 0x62, 0xb8, 0x58, 0x16, 0xcd, 0x9b, 0x31, 0x77, 0x77, 0x3c, 0xcf, - 0x40, 0x6b, 0xf8, 0x42, 0x18, 0xb4, 0xc5, 0xd9, 0x28, 0xea, 0x87, 0x50, 0x54, 0xef, 0xe9, 0x28, - 0x46, 0x68, 0xa4, 0x1a, 0x17, 0x8d, 0x8e, 0x71, 0xd7, 0xfc, 0x98, 0x30, 0xe1, 0xff, 0x6e, 0x5c, - 0xf2, 0x52, 0xf4, 0xf7, 0x21, 0x27, 0x6e, 0xef, 0x71, 0xf3, 0x0d, 0xd7, 0xef, 0xe2, 0xe6, 0x1b, - 0xb9, 0xfa, 0xc7, 0x1c, 0xc2, 0x18, 0x2c, 0xbd, 0xa5, 0xc8, 0x94, 0x24, 0x20, 0x1f, 0x13, 0x2f, - 0x09, 0x32, 0xa8, 0x48, 0x25, 0x41, 0x2a, 0x37, 0xc4, 0xa1, 0x90, 0x87, 0xc4, 0x13, 0x2e, 0x25, - 0xaf, 0x5f, 0x28, 0x41, 0xa2, 0x1a, 0xff, 0xf1, 0x30, 0x96, 0xc4, 0x73, 0x73, 0x80, 0x2a, 0x82, - 0x3f, 0xfa, 0x21, 0x40, 0x50, 0x6a, 0x88, 0x1e, 0x85, 0x62, 0xeb, 0x95, 0xd1, 0xa3, 0x50, 0x7c, - 0xb5, 0x22, 0x26, 0x90, 0x04, 0xe0, 0xfc, 0xec, 0x4e, 0xe1, 0x7f, 0xa9, 0x01, 0x1a, 0x2c, 0x4d, - 0xa0, 0xfb, 0xf1, 0x10, 0xb1, 0xa5, 0xd0, 0xda, 0x4b, 0xe7, 0x63, 0x4e, 0xcc, 0x17, 0x81, 0x5e, - 0x4d, 0x36, 0xa4, 0xfb, 0x82, 0x6a, 0xf6, 0x89, 0x06, 0xa5, 0x50, 0x71, 0x03, 0xdd, 0x4e, 0x58, - 0xe7, 0x48, 0x39, 0xb5, 0x76, 0xe7, 0x4c, 0xbe, 0xc4, 0xd3, 0xa2, 0xb2, 0x2b, 0xe4, 0x49, 0xf9, - 0xa7, 0x1a, 0x94, 0xc3, 0x15, 0x11, 0x94, 0x00, 0x30, 0x50, 0x93, 0xad, 0x2d, 0x9c, 0xcd, 0x78, - 0x8e, 0xd5, 0x0a, 0x0e, 0xcf, 0xef, 0x43, 0x4e, 0x14, 0x52, 0xe2, 0xdc, 0x22, 0x5c, 0xd2, 0x8d, - 0x73, 0x8b, 0x48, 0x15, 0x26, 0xc9, 0x2d, 0x1c, 0xbb, 0x4d, 0x14, 0x4f, 0x14, 0xe5, 0x96, 0x24, - 0xc8, 0xe1, 0x9e, 0x18, 0xa9, 0xd5, 0x0c, 0x85, 0x0c, 0x3c, 0x51, 0x16, 0x5b, 0x50, 0x82, 0xc4, - 0x33, 0x3c, 0x31, 0x5a, 0xab, 0x49, 0xf2, 0x44, 0x86, 0xaa, 0x78, 0x62, 0x50, 0x1b, 0x89, 0xf3, - 0xc4, 0x81, 0x82, 0x75, 0x9c, 0x27, 0x0e, 0x96, 0x57, 0x92, 0xd6, 0x96, 0x81, 0x87, 0x3c, 0x71, - 0x3a, 0xa6, 0x96, 0x82, 0x5e, 0x4a, 0xb0, 0x69, 0x6c, 0x31, 0xbc, 0xf6, 0xe0, 0x9c, 0xdc, 0xc3, - 0x3d, 0x80, 0xaf, 0x86, 0xf4, 0x80, 0xdf, 0x6a, 0x30, 0x13, 0x57, 0x8c, 0x41, 0x09, 0x60, 0x09, - 0x95, 0xf4, 0xda, 0xe2, 0x79, 0xd9, 0xcf, 0x61, 0x37, 0xdf, 0x27, 0x1e, 0x55, 0xfe, 0xf2, 0xf9, - 0x9c, 0xf6, 0xf7, 0xcf, 0xe7, 0xb4, 0x7f, 0x7e, 0x3e, 0xa7, 0xfd, 0xea, 0x5f, 0x73, 0x63, 0x07, - 0x59, 0xf6, 0xdf, 0x99, 0x5e, 0xfd, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x46, 0xd0, 0x19, 0xf7, - 0x55, 0x35, 0x00, 0x00, + // 3663 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x5b, 0x5b, 0x6f, 0x1b, 0xc7, + 0xf5, 0xd7, 0x92, 0x22, 0x29, 0x1e, 0x5e, 0x44, 0x8d, 0x64, 0x9b, 0xa2, 0x6d, 0x59, 0x1e, 0xdf, + 0x64, 0x3b, 0x96, 0x12, 0x25, 0xff, 0xff, 0x83, 0x5b, 0x04, 0x91, 0x25, 0xc6, 0x52, 0x24, 0x4b, + 0xce, 0x4a, 0x56, 0x52, 0x20, 0x28, 0xb1, 0x22, 0xc7, 0xd2, 0x42, 0xe4, 0x2e, 0xb3, 0xbb, 0xa4, + 0xa5, 0x34, 0x2d, 0x8a, 0x20, 0x41, 0xd1, 0x02, 0x7d, 0x69, 0x1e, 0x7a, 0x7b, 0x2c, 0x8a, 0x22, + 0x2f, 0x7d, 0x2b, 0xfa, 0x15, 0x8a, 0xbe, 0xb4, 0x40, 0xbf, 0x40, 0x91, 0xf6, 0xa5, 0xdf, 0xa1, + 0x45, 0x8b, 0xb9, 0xed, 0xce, 0x2e, 0x77, 0x29, 0x25, 0x4c, 0xf2, 0x22, 0xef, 0x9c, 0x39, 0x73, + 0xce, 0x99, 0x33, 0x73, 0xce, 0x99, 0xf9, 0x0d, 0x0d, 0x79, 0xa7, 0xdb, 0x5c, 0xec, 0x3a, 0xb6, + 0x67, 0xa3, 0x22, 0xf1, 0x9a, 0x2d, 0x97, 0x38, 0x7d, 0xe2, 0x74, 0x0f, 0x6a, 0x33, 0x87, 0xf6, + 0xa1, 0xcd, 0x3a, 0x96, 0xe8, 0x17, 0xe7, 0xa9, 0xcd, 0x52, 0x9e, 0xa5, 0x4e, 0xbf, 0xd9, 0x64, + 0x7f, 0xba, 0x07, 0x4b, 0xc7, 0x7d, 0xd1, 0x75, 0x99, 0x75, 0x19, 0x3d, 0xef, 0x88, 0xfd, 0xe9, + 0x1e, 0xb0, 0x7f, 0x44, 0xe7, 0x95, 0x43, 0xdb, 0x3e, 0x6c, 0x93, 0x25, 0xa3, 0x6b, 0x2e, 0x19, + 0x96, 0x65, 0x7b, 0x86, 0x67, 0xda, 0x96, 0xcb, 0x7b, 0xf1, 0x27, 0x1a, 0x94, 0x75, 0xe2, 0x76, + 0x6d, 0xcb, 0x25, 0xeb, 0xc4, 0x68, 0x11, 0x07, 0x5d, 0x05, 0x68, 0xb6, 0x7b, 0xae, 0x47, 0x9c, + 0x86, 0xd9, 0xaa, 0x6a, 0xf3, 0xda, 0xc2, 0xb8, 0x9e, 0x17, 0x94, 0x8d, 0x16, 0xba, 0x0c, 0xf9, + 0x0e, 0xe9, 0x1c, 0xf0, 0xde, 0x14, 0xeb, 0x9d, 0xe0, 0x84, 0x8d, 0x16, 0xaa, 0xc1, 0x84, 0x43, + 0xfa, 0xa6, 0x6b, 0xda, 0x56, 0x35, 0x3d, 0xaf, 0x2d, 0xa4, 0x75, 0xbf, 0x4d, 0x07, 0x3a, 0xc6, + 0x73, 0xaf, 0xe1, 0x11, 0xa7, 0x53, 0x1d, 0xe7, 0x03, 0x29, 0x61, 0x8f, 0x38, 0x1d, 0xfc, 0x71, + 0x06, 0x8a, 0xba, 0x61, 0x1d, 0x12, 0x9d, 0xbc, 0xdf, 0x23, 0xae, 0x87, 0x2a, 0x90, 0x3e, 0x26, + 0xa7, 0x4c, 0x7d, 0x51, 0xa7, 0x9f, 0x7c, 0xbc, 0x75, 0x48, 0x1a, 0xc4, 0xe2, 0x8a, 0x8b, 0x74, + 0xbc, 0x75, 0x48, 0xea, 0x56, 0x0b, 0xcd, 0x40, 0xa6, 0x6d, 0x76, 0x4c, 0x4f, 0x68, 0xe5, 0x8d, + 0x90, 0x39, 0xe3, 0x11, 0x73, 0x56, 0x01, 0x5c, 0xdb, 0xf1, 0x1a, 0xb6, 0xd3, 0x22, 0x4e, 0x35, + 0x33, 0xaf, 0x2d, 0x94, 0x97, 0x6f, 0x2e, 0xaa, 0x0b, 0xb1, 0xa8, 0x1a, 0xb4, 0xb8, 0x6b, 0x3b, + 0xde, 0x0e, 0xe5, 0xd5, 0xf3, 0xae, 0xfc, 0x44, 0x6f, 0x42, 0x81, 0x09, 0xf1, 0x0c, 0xe7, 0x90, + 0x78, 0xd5, 0x2c, 0x93, 0x72, 0xeb, 0x0c, 0x29, 0x7b, 0x8c, 0x59, 0x67, 0xea, 0xf9, 0x37, 0xc2, + 0x50, 0x74, 0x89, 0x63, 0x1a, 0x6d, 0xf3, 0x03, 0xe3, 0xa0, 0x4d, 0xaa, 0xb9, 0x79, 0x6d, 0x61, + 0x42, 0x0f, 0xd1, 0xe8, 0xfc, 0x8f, 0xc9, 0xa9, 0xdb, 0xb0, 0xad, 0xf6, 0x69, 0x75, 0x82, 0x31, + 0x4c, 0x50, 0xc2, 0x8e, 0xd5, 0x3e, 0x65, 0x8b, 0x66, 0xf7, 0x2c, 0x8f, 0xf7, 0xe6, 0x59, 0x6f, + 0x9e, 0x51, 0x58, 0xf7, 0x02, 0x54, 0x3a, 0xa6, 0xd5, 0xe8, 0xd8, 0xad, 0x86, 0xef, 0x10, 0x60, + 0x0e, 0x29, 0x77, 0x4c, 0xeb, 0x89, 0xdd, 0xd2, 0xa5, 0x5b, 0x28, 0xa7, 0x71, 0x12, 0xe6, 0x2c, + 0x08, 0x4e, 0xe3, 0x44, 0xe5, 0x5c, 0x84, 0x69, 0x2a, 0xb3, 0xe9, 0x10, 0xc3, 0x23, 0x01, 0x73, + 0x91, 0x31, 0x4f, 0x75, 0x4c, 0x6b, 0x95, 0xf5, 0x84, 0xf8, 0x8d, 0x93, 0x01, 0xfe, 0x92, 0xe0, + 0x37, 0x4e, 0xc2, 0xfc, 0x78, 0x11, 0xf2, 0xbe, 0xcf, 0xd1, 0x04, 0x8c, 0x6f, 0xef, 0x6c, 0xd7, + 0x2b, 0x63, 0x08, 0x20, 0xbb, 0xb2, 0xbb, 0x5a, 0xdf, 0x5e, 0xab, 0x68, 0xa8, 0x00, 0xb9, 0xb5, + 0x3a, 0x6f, 0xa4, 0xf0, 0x23, 0x80, 0xc0, 0xbb, 0x28, 0x07, 0xe9, 0xcd, 0xfa, 0x77, 0x2a, 0x63, + 0x94, 0x67, 0xbf, 0xae, 0xef, 0x6e, 0xec, 0x6c, 0x57, 0x34, 0x3a, 0x78, 0x55, 0xaf, 0xaf, 0xec, + 0xd5, 0x2b, 0x29, 0xca, 0xf1, 0x64, 0x67, 0xad, 0x92, 0x46, 0x79, 0xc8, 0xec, 0xaf, 0x6c, 0x3d, + 0xab, 0x57, 0xc6, 0xf1, 0xa7, 0x1a, 0x94, 0xc4, 0x7a, 0xf1, 0x98, 0x40, 0xaf, 0x41, 0xf6, 0x88, + 0xc5, 0x05, 0xdb, 0x8a, 0x85, 0xe5, 0x2b, 0x91, 0xc5, 0x0d, 0xc5, 0x8e, 0x2e, 0x78, 0x11, 0x86, + 0xf4, 0x71, 0xdf, 0xad, 0xa6, 0xe6, 0xd3, 0x0b, 0x85, 0xe5, 0xca, 0x22, 0x0f, 0xd8, 0xc5, 0x4d, + 0x72, 0xba, 0x6f, 0xb4, 0x7b, 0x44, 0xa7, 0x9d, 0x08, 0xc1, 0x78, 0xc7, 0x76, 0x08, 0xdb, 0xb1, + 0x13, 0x3a, 0xfb, 0xa6, 0xdb, 0x98, 0x2d, 0x9a, 0xd8, 0xad, 0xbc, 0x81, 0x3f, 0xd3, 0x00, 0x9e, + 0xf6, 0xbc, 0xe4, 0xd0, 0x98, 0x81, 0x4c, 0x9f, 0x0a, 0x16, 0x61, 0xc1, 0x1b, 0x2c, 0x26, 0x88, + 0xe1, 0x12, 0x3f, 0x26, 0x68, 0x03, 0x5d, 0x82, 0x5c, 0xd7, 0x21, 0xfd, 0xc6, 0x71, 0x9f, 0x29, + 0x99, 0xd0, 0xb3, 0xb4, 0xb9, 0xd9, 0x47, 0xd7, 0xa1, 0x68, 0x1e, 0x5a, 0xb6, 0x43, 0x1a, 0x5c, + 0x56, 0x86, 0xf5, 0x16, 0x38, 0x8d, 0xd9, 0xad, 0xb0, 0x70, 0xc1, 0x59, 0x95, 0x65, 0x8b, 0x92, + 0xb0, 0x05, 0x05, 0x66, 0xea, 0x48, 0xee, 0xbb, 0x1b, 0xd8, 0x98, 0x62, 0xc3, 0x06, 0x5d, 0x28, + 0xac, 0xc6, 0xef, 0x01, 0x5a, 0x23, 0x6d, 0xe2, 0x91, 0x51, 0xb2, 0x87, 0xe2, 0x93, 0xb4, 0xea, + 0x13, 0xfc, 0x33, 0x0d, 0xa6, 0x43, 0xe2, 0x47, 0x9a, 0x56, 0x15, 0x72, 0x2d, 0x26, 0x8c, 0x5b, + 0x90, 0xd6, 0x65, 0x13, 0xdd, 0x87, 0x09, 0x61, 0x80, 0x5b, 0x4d, 0x27, 0x6c, 0x9a, 0x1c, 0xb7, + 0xc9, 0xc5, 0x9f, 0xa5, 0x20, 0x2f, 0x26, 0xba, 0xd3, 0x45, 0x2b, 0x50, 0x72, 0x78, 0xa3, 0xc1, + 0xe6, 0x23, 0x2c, 0xaa, 0x25, 0x27, 0xa1, 0xf5, 0x31, 0xbd, 0x28, 0x86, 0x30, 0x32, 0xfa, 0x16, + 0x14, 0xa4, 0x88, 0x6e, 0xcf, 0x13, 0x2e, 0xaf, 0x86, 0x05, 0x04, 0xfb, 0x6f, 0x7d, 0x4c, 0x07, + 0xc1, 0xfe, 0xb4, 0xe7, 0xa1, 0x3d, 0x98, 0x91, 0x83, 0xf9, 0x6c, 0x84, 0x19, 0x69, 0x26, 0x65, + 0x3e, 0x2c, 0x65, 0x70, 0xa9, 0xd6, 0xc7, 0x74, 0x24, 0xc6, 0x2b, 0x9d, 0xaa, 0x49, 0xde, 0x09, + 0x4f, 0xde, 0x03, 0x26, 0xed, 0x9d, 0x58, 0x83, 0x26, 0xed, 0x9d, 0x58, 0x8f, 0xf2, 0x90, 0x13, + 0x2d, 0xfc, 0xc7, 0x14, 0x80, 0x5c, 0x8d, 0x9d, 0x2e, 0x5a, 0x83, 0xb2, 0x23, 0x5a, 0x21, 0x6f, + 0x5d, 0x8e, 0xf5, 0x96, 0x58, 0xc4, 0x31, 0xbd, 0x24, 0x07, 0x71, 0xe3, 0x5e, 0x87, 0xa2, 0x2f, + 0x25, 0x70, 0xd8, 0x6c, 0x8c, 0xc3, 0x7c, 0x09, 0x05, 0x39, 0x80, 0xba, 0xec, 0x1d, 0xb8, 0xe0, + 0x8f, 0x8f, 0xf1, 0xd9, 0xf5, 0x21, 0x3e, 0xf3, 0x05, 0x4e, 0x4b, 0x09, 0xaa, 0xd7, 0x54, 0xc3, + 0x02, 0xb7, 0xcd, 0xc6, 0xb8, 0x6d, 0xd0, 0x30, 0xea, 0x38, 0xa0, 0xf5, 0x92, 0x37, 0xf1, 0xbf, + 0xd2, 0x90, 0x5b, 0xb5, 0x3b, 0x5d, 0xc3, 0xa1, 0xab, 0x91, 0x75, 0x88, 0xdb, 0x6b, 0x7b, 0xcc, + 0x5d, 0xe5, 0xe5, 0x1b, 0x61, 0x89, 0x82, 0x4d, 0xfe, 0xab, 0x33, 0x56, 0x5d, 0x0c, 0xa1, 0x83, + 0x45, 0x79, 0x4c, 0x9d, 0x63, 0xb0, 0x28, 0x8e, 0x62, 0x88, 0x0c, 0xe4, 0x74, 0x10, 0xc8, 0x35, + 0xc8, 0xf5, 0x89, 0x13, 0x94, 0xf4, 0xf5, 0x31, 0x5d, 0x12, 0xd0, 0x5d, 0x98, 0x8c, 0x96, 0x97, + 0x8c, 0xe0, 0x29, 0x37, 0xc3, 0xd5, 0xe8, 0x06, 0x14, 0x43, 0x35, 0x2e, 0x2b, 0xf8, 0x0a, 0x1d, + 0xa5, 0xc4, 0x5d, 0x94, 0x79, 0x95, 0xd6, 0xe3, 0xe2, 0xfa, 0x98, 0xcc, 0xac, 0x17, 0x65, 0x66, + 0x9d, 0x10, 0xa3, 0x44, 0x6e, 0x0d, 0x25, 0x99, 0x37, 0xc2, 0x49, 0x06, 0xbf, 0x01, 0xa5, 0x90, + 0x83, 0x68, 0xdd, 0xa9, 0xbf, 0xfd, 0x6c, 0x65, 0x8b, 0x17, 0xa9, 0xc7, 0xac, 0x2e, 0xe9, 0x15, + 0x8d, 0xd6, 0xba, 0xad, 0xfa, 0xee, 0x6e, 0x25, 0x85, 0x4a, 0x90, 0xdf, 0xde, 0xd9, 0x6b, 0x70, + 0xae, 0x34, 0x7e, 0xec, 0x4b, 0x10, 0x45, 0x4e, 0xa9, 0x6d, 0x63, 0x4a, 0x6d, 0xd3, 0x64, 0x6d, + 0x4b, 0x05, 0xb5, 0x8d, 0x95, 0xb9, 0xad, 0xfa, 0xca, 0x6e, 0xbd, 0x32, 0xfe, 0xa8, 0x0c, 0x45, + 0xee, 0xdf, 0x46, 0xcf, 0xa2, 0xa5, 0xf6, 0x37, 0x1a, 0x40, 0x10, 0x4d, 0x68, 0x09, 0x72, 0x4d, + 0xae, 0xa7, 0xaa, 0xb1, 0x64, 0x74, 0x21, 0x76, 0xc9, 0x74, 0xc9, 0x85, 0x5e, 0x81, 0x9c, 0xdb, + 0x6b, 0x36, 0x89, 0x2b, 0x4b, 0xde, 0xa5, 0x68, 0x3e, 0x14, 0xd9, 0x4a, 0x97, 0x7c, 0x74, 0xc8, + 0x73, 0xc3, 0x6c, 0xf7, 0x58, 0x01, 0x1c, 0x3e, 0x44, 0xf0, 0xe1, 0x5f, 0x6a, 0x50, 0x50, 0x36, + 0xef, 0x97, 0x4c, 0xc2, 0x57, 0x20, 0xcf, 0x6c, 0x20, 0x2d, 0x91, 0x86, 0x27, 0xf4, 0x80, 0x80, + 0xfe, 0x1f, 0xf2, 0x32, 0x02, 0x64, 0x26, 0xae, 0xc6, 0x8b, 0xdd, 0xe9, 0xea, 0x01, 0x2b, 0xde, + 0x84, 0x29, 0xe6, 0x95, 0x26, 0x3d, 0x5c, 0x4b, 0x3f, 0xaa, 0xc7, 0x4f, 0x2d, 0x72, 0xfc, 0xac, + 0xc1, 0x44, 0xf7, 0xe8, 0xd4, 0x35, 0x9b, 0x46, 0x5b, 0x58, 0xe1, 0xb7, 0xf1, 0x5b, 0x80, 0x54, + 0x61, 0xa3, 0x4c, 0x17, 0x97, 0xa0, 0xb0, 0x6e, 0xb8, 0x47, 0xc2, 0x24, 0x7c, 0x1f, 0x4a, 0xb4, + 0xb9, 0xb9, 0x7f, 0x0e, 0x1b, 0xd9, 0xe5, 0x40, 0x72, 0x8f, 0xe4, 0x73, 0x04, 0xe3, 0x47, 0x86, + 0x7b, 0xc4, 0x26, 0x5a, 0xd2, 0xd9, 0x37, 0xba, 0x0b, 0x95, 0x26, 0x9f, 0x64, 0x23, 0x72, 0x65, + 0x98, 0x14, 0x74, 0xff, 0x24, 0xf8, 0x2e, 0x14, 0xf9, 0x1c, 0xbe, 0x6a, 0x23, 0xf0, 0x14, 0x4c, + 0xee, 0x5a, 0x46, 0xd7, 0x3d, 0xb2, 0x65, 0x75, 0xa3, 0x93, 0xae, 0x04, 0xb4, 0x91, 0x34, 0xde, + 0x81, 0x49, 0x87, 0x74, 0x0c, 0xd3, 0x32, 0xad, 0xc3, 0xc6, 0xc1, 0xa9, 0x47, 0x5c, 0x71, 0x61, + 0x2a, 0xfb, 0xe4, 0x47, 0x94, 0x4a, 0x4d, 0x3b, 0x68, 0xdb, 0x07, 0x22, 0xcd, 0xb1, 0x6f, 0xfc, + 0x07, 0x0d, 0x8a, 0xef, 0x18, 0x5e, 0x53, 0x2e, 0x1d, 0xda, 0x80, 0xb2, 0x9f, 0xdc, 0x18, 0x45, + 0xd8, 0x12, 0x29, 0xb1, 0x6c, 0x8c, 0x3c, 0x4a, 0xcb, 0xea, 0x58, 0x6a, 0xaa, 0x04, 0x26, 0xca, + 0xb0, 0x9a, 0xa4, 0xed, 0x8b, 0x4a, 0x25, 0x8b, 0x62, 0x8c, 0xaa, 0x28, 0x95, 0xf0, 0x68, 0x32, + 0x38, 0x7e, 0xf0, 0x5c, 0xf2, 0xab, 0x14, 0xa0, 0x41, 0x1b, 0xbe, 0xe8, 0x89, 0xec, 0x16, 0x94, + 0x5d, 0xcf, 0x70, 0x06, 0xf6, 0x46, 0x89, 0x51, 0xfd, 0x04, 0x7d, 0x07, 0x26, 0xbb, 0x8e, 0x7d, + 0xe8, 0x10, 0xd7, 0x6d, 0x58, 0xb6, 0x67, 0x3e, 0x3f, 0x15, 0x87, 0xda, 0xb2, 0x24, 0x6f, 0x33, + 0x2a, 0xaa, 0x43, 0xee, 0xb9, 0xd9, 0xf6, 0x88, 0xe3, 0x56, 0x33, 0xf3, 0xe9, 0x85, 0xf2, 0xf2, + 0xfd, 0xb3, 0xbc, 0xb6, 0xf8, 0x26, 0xe3, 0xdf, 0x3b, 0xed, 0x12, 0x5d, 0x8e, 0x55, 0x0f, 0x8a, + 0xd9, 0xd0, 0x41, 0xf1, 0x16, 0x40, 0xc0, 0x4f, 0x53, 0xed, 0xf6, 0xce, 0xd3, 0x67, 0x7b, 0x95, + 0x31, 0x54, 0x84, 0x89, 0xed, 0x9d, 0xb5, 0xfa, 0x56, 0x9d, 0xe6, 0x65, 0xbc, 0x24, 0x7d, 0xa3, + 0xfa, 0x10, 0xcd, 0xc2, 0xc4, 0x0b, 0x4a, 0x95, 0xf7, 0xed, 0xb4, 0x9e, 0x63, 0xed, 0x8d, 0x16, + 0xfe, 0x69, 0x0a, 0x4a, 0x62, 0x17, 0x8c, 0xb4, 0x15, 0x55, 0x15, 0xa9, 0x90, 0x0a, 0x7a, 0x2a, + 0xe5, 0xbb, 0xa3, 0x25, 0x0e, 0xbf, 0xb2, 0x49, 0x73, 0x03, 0x5f, 0x6c, 0xd2, 0x12, 0x6e, 0xf5, + 0xdb, 0xb1, 0xe1, 0x9b, 0x89, 0x0d, 0x5f, 0x74, 0x03, 0x4a, 0xfe, 0x6e, 0x33, 0x5c, 0x51, 0x6b, + 0xf3, 0x7a, 0x51, 0x6e, 0x24, 0x4a, 0x43, 0xb7, 0x20, 0x4b, 0xfa, 0xc4, 0xf2, 0xdc, 0x6a, 0x81, + 0x65, 0xdd, 0x92, 0x3c, 0xff, 0xd6, 0x29, 0x55, 0x17, 0x9d, 0xf8, 0xff, 0x60, 0x8a, 0xdd, 0x33, + 0x1e, 0x3b, 0x86, 0xa5, 0x5e, 0x88, 0xf6, 0xf6, 0xb6, 0x84, 0xeb, 0xe8, 0x27, 0x2a, 0x43, 0x6a, + 0x63, 0x4d, 0x4c, 0x34, 0xb5, 0xb1, 0x86, 0x3f, 0xd2, 0x00, 0xa9, 0xe3, 0x46, 0xf2, 0x65, 0x44, + 0xb8, 0x54, 0x9f, 0x0e, 0xd4, 0xcf, 0x40, 0x86, 0x38, 0x8e, 0xed, 0x30, 0xaf, 0xe5, 0x75, 0xde, + 0xc0, 0x37, 0x85, 0x0d, 0x3a, 0xe9, 0xdb, 0xc7, 0x7e, 0x60, 0x70, 0x69, 0x9a, 0x6f, 0xea, 0x26, + 0x4c, 0x87, 0xb8, 0x46, 0xca, 0xfe, 0x77, 0xe0, 0x02, 0x13, 0xb6, 0x49, 0x48, 0x77, 0xa5, 0x6d, + 0xf6, 0x13, 0xb5, 0x76, 0xe1, 0x62, 0x94, 0xf1, 0xeb, 0xf5, 0x11, 0xfe, 0xb6, 0xd0, 0xb8, 0x67, + 0x76, 0xc8, 0x9e, 0xbd, 0x95, 0x6c, 0x1b, 0xcd, 0x8e, 0xc7, 0xe4, 0xd4, 0x15, 0x65, 0x92, 0x7d, + 0xe3, 0xdf, 0x6a, 0x70, 0x69, 0x60, 0xf8, 0xd7, 0xbc, 0xaa, 0x73, 0x00, 0x87, 0x74, 0xfb, 0x90, + 0x16, 0xed, 0xe0, 0x37, 0x74, 0x85, 0xe2, 0xdb, 0x49, 0x13, 0x4c, 0x51, 0xd8, 0x39, 0x23, 0xd6, + 0x9c, 0xfd, 0x71, 0x65, 0x8d, 0xb9, 0x0a, 0x05, 0x46, 0xd8, 0xf5, 0x0c, 0xaf, 0xe7, 0x0e, 0x2c, + 0xc6, 0x0f, 0xc4, 0x16, 0x90, 0x83, 0x46, 0x9a, 0xd7, 0x2b, 0x90, 0x65, 0x87, 0x53, 0x79, 0x34, + 0x8b, 0xdc, 0x06, 0x14, 0x3b, 0x74, 0xc1, 0x88, 0x8f, 0x20, 0xfb, 0x84, 0x21, 0x7a, 0x8a, 0x65, + 0xe3, 0x72, 0x29, 0x2c, 0xa3, 0xc3, 0x71, 0x86, 0xbc, 0xce, 0xbe, 0xd9, 0x49, 0x86, 0x10, 0xe7, + 0x99, 0xbe, 0xc5, 0x4f, 0x4c, 0x79, 0xdd, 0x6f, 0x53, 0x97, 0x35, 0xdb, 0x26, 0xb1, 0x3c, 0xd6, + 0x3b, 0xce, 0x7a, 0x15, 0x0a, 0x5e, 0x84, 0x0a, 0xd7, 0xb4, 0xd2, 0x6a, 0x29, 0x27, 0x12, 0x5f, + 0x9e, 0x16, 0x96, 0x87, 0x7f, 0xa7, 0xc1, 0x94, 0x32, 0x60, 0x24, 0xc7, 0xbc, 0x04, 0x59, 0x8e, + 0x5b, 0x8a, 0xe2, 0x37, 0x13, 0x1e, 0xc5, 0xd5, 0xe8, 0x82, 0x07, 0x2d, 0x42, 0x8e, 0x7f, 0xc9, + 0x63, 0x61, 0x3c, 0xbb, 0x64, 0xc2, 0xb7, 0x60, 0x5a, 0x90, 0x48, 0xc7, 0x8e, 0xdb, 0xdb, 0xcc, + 0xa1, 0xf8, 0x43, 0x98, 0x09, 0xb3, 0x8d, 0x34, 0x25, 0xc5, 0xc8, 0xd4, 0x79, 0x8c, 0x5c, 0x91, + 0x46, 0x3e, 0xeb, 0xb6, 0x94, 0x5a, 0x1d, 0x5d, 0x75, 0x75, 0x45, 0x52, 0x91, 0x15, 0xf1, 0x27, + 0x20, 0x45, 0x7c, 0xa3, 0x13, 0x98, 0x96, 0xdb, 0x61, 0xcb, 0x74, 0xfd, 0x13, 0xdc, 0x07, 0x80, + 0x54, 0xe2, 0x37, 0x6d, 0xd0, 0x1a, 0x79, 0xee, 0x18, 0x87, 0x1d, 0xe2, 0xd7, 0x27, 0x7a, 0x9e, + 0x57, 0x89, 0x23, 0x65, 0xf4, 0x25, 0x98, 0x7a, 0x62, 0xf7, 0x69, 0x6a, 0xa0, 0xd4, 0x20, 0x64, + 0xf8, 0x7d, 0xce, 0x5f, 0x36, 0xbf, 0x4d, 0x95, 0xab, 0x03, 0x46, 0x52, 0xfe, 0x17, 0x0d, 0x8a, + 0x2b, 0x6d, 0xc3, 0xe9, 0x48, 0xc5, 0xaf, 0x43, 0x96, 0xdf, 0x52, 0x04, 0x30, 0x70, 0x3b, 0x2c, + 0x46, 0xe5, 0xe5, 0x8d, 0x15, 0x7e, 0xa7, 0x11, 0xa3, 0xa8, 0xe1, 0xe2, 0xed, 0x60, 0x2d, 0xf2, + 0x96, 0xb0, 0x86, 0x1e, 0x40, 0xc6, 0xa0, 0x43, 0x58, 0x0a, 0x2e, 0x47, 0xef, 0x87, 0x4c, 0x1a, + 0x3b, 0x9c, 0x71, 0x2e, 0xfc, 0x1a, 0x14, 0x14, 0x0d, 0xf4, 0x06, 0xfc, 0xb8, 0x2e, 0x0e, 0x60, + 0x2b, 0xab, 0x7b, 0x1b, 0xfb, 0xfc, 0x62, 0x5c, 0x06, 0x58, 0xab, 0xfb, 0xed, 0x14, 0x7e, 0x57, + 0x8c, 0x12, 0xf9, 0x4e, 0xb5, 0x47, 0x4b, 0xb2, 0x27, 0x75, 0x2e, 0x7b, 0x4e, 0xa0, 0x24, 0xa6, + 0x3f, 0x6a, 0xfa, 0x66, 0xf2, 0x12, 0xd2, 0xb7, 0x62, 0xbc, 0x2e, 0x18, 0xf1, 0x24, 0x94, 0x44, + 0x42, 0x17, 0xfb, 0xef, 0xcf, 0x1a, 0x94, 0x25, 0x65, 0x54, 0x00, 0x53, 0x62, 0x2f, 0xbc, 0x02, + 0xf8, 0xc8, 0xcb, 0x45, 0xc8, 0xb6, 0x0e, 0x76, 0xcd, 0x0f, 0x24, 0xd8, 0x2c, 0x5a, 0x94, 0xde, + 0xe6, 0x7a, 0xf8, 0x8b, 0x8f, 0x68, 0xd1, 0x5b, 0xb8, 0x63, 0x3c, 0xf7, 0x36, 0xac, 0x16, 0x39, + 0x61, 0xe7, 0xc6, 0x71, 0x3d, 0x20, 0xb0, 0x4b, 0xa9, 0x78, 0x19, 0x62, 0x87, 0x45, 0xf5, 0xa5, + 0x68, 0x1a, 0xa6, 0x56, 0x7a, 0xde, 0x51, 0xdd, 0x32, 0x0e, 0xda, 0x32, 0x63, 0xd1, 0x32, 0x4b, + 0x89, 0x6b, 0xa6, 0xab, 0x52, 0xeb, 0x30, 0x4d, 0xa9, 0xc4, 0xf2, 0xcc, 0xa6, 0x92, 0xde, 0x64, + 0x11, 0xd3, 0x22, 0x45, 0xcc, 0x70, 0xdd, 0x17, 0xb6, 0xd3, 0x12, 0x53, 0xf3, 0xdb, 0x78, 0x8d, + 0x0b, 0x7f, 0xe6, 0x86, 0xca, 0xd4, 0x17, 0x95, 0xb2, 0x10, 0x48, 0x79, 0x4c, 0xbc, 0x21, 0x52, + 0xf0, 0x7d, 0xb8, 0x20, 0x39, 0x05, 0xb8, 0x37, 0x84, 0x79, 0x07, 0xae, 0x4a, 0xe6, 0xd5, 0x23, + 0x7a, 0x7b, 0x7a, 0x2a, 0x14, 0x7e, 0x59, 0x3b, 0x1f, 0x41, 0xd5, 0xb7, 0x93, 0x1d, 0x96, 0xed, + 0xb6, 0x6a, 0x40, 0xcf, 0x15, 0x7b, 0x26, 0xaf, 0xb3, 0x6f, 0x4a, 0x73, 0xec, 0xb6, 0x7f, 0x24, + 0xa0, 0xdf, 0x78, 0x15, 0x66, 0xa5, 0x0c, 0x71, 0x8c, 0x0d, 0x0b, 0x19, 0x30, 0x28, 0x4e, 0x88, + 0x70, 0x18, 0x1d, 0x3a, 0xdc, 0xed, 0x2a, 0x67, 0xd8, 0xb5, 0x4c, 0xa6, 0xa6, 0xc8, 0xbc, 0xc0, + 0x77, 0x04, 0x35, 0x4c, 0xad, 0x18, 0x82, 0x4c, 0x05, 0xa8, 0x64, 0xb1, 0x10, 0x94, 0x3c, 0xb0, + 0x10, 0x03, 0xa2, 0xdf, 0x83, 0x39, 0xdf, 0x08, 0xea, 0xb7, 0xa7, 0xc4, 0xe9, 0x98, 0xae, 0xab, + 0xc0, 0x41, 0x71, 0x13, 0xbf, 0x0d, 0xe3, 0x5d, 0x22, 0x72, 0x4a, 0x61, 0x19, 0x2d, 0xf2, 0xf7, + 0xdb, 0x45, 0x65, 0x30, 0xeb, 0xc7, 0x2d, 0xb8, 0x26, 0xa5, 0x73, 0x8f, 0xc6, 0x8a, 0x8f, 0x1a, + 0x25, 0x6f, 0xdd, 0xdc, 0xad, 0x83, 0xb7, 0xee, 0x34, 0x5f, 0x7b, 0x1f, 0xa2, 0x7c, 0x8b, 0x3b, + 0x52, 0xc6, 0xd6, 0x48, 0xb5, 0x62, 0x93, 0xfb, 0xd4, 0x0f, 0xc9, 0x91, 0x84, 0x1d, 0xc0, 0x4c, + 0x38, 0x92, 0x47, 0x4a, 0x63, 0x33, 0x90, 0xf1, 0xec, 0x63, 0x22, 0x93, 0x18, 0x6f, 0x48, 0x83, + 0xfd, 0x30, 0x1f, 0xc9, 0x60, 0x23, 0x10, 0xc6, 0xb6, 0xe4, 0xa8, 0xf6, 0xd2, 0xd5, 0x94, 0x87, + 0x2f, 0xde, 0xc0, 0xdb, 0x70, 0x31, 0x9a, 0x26, 0x46, 0x32, 0x79, 0x9f, 0x6f, 0xe0, 0xb8, 0x4c, + 0x32, 0x92, 0xdc, 0xb7, 0x83, 0x64, 0xa0, 0x24, 0x94, 0x91, 0x44, 0xea, 0x50, 0x8b, 0xcb, 0x2f, + 0x5f, 0xc5, 0x7e, 0xf5, 0xd3, 0xcd, 0x48, 0xc2, 0xdc, 0x40, 0xd8, 0xe8, 0xcb, 0x1f, 0xe4, 0x88, + 0xf4, 0xd0, 0x1c, 0x21, 0x82, 0x24, 0xc8, 0x62, 0x5f, 0xc3, 0xa6, 0x13, 0x3a, 0x82, 0x04, 0x3a, + 0xaa, 0x0e, 0x5a, 0x43, 0x7c, 0x1d, 0xac, 0x21, 0x37, 0xb6, 0x9a, 0x76, 0x47, 0x5a, 0x8c, 0x77, + 0x82, 0xdc, 0x39, 0x90, 0x99, 0x47, 0x12, 0xfc, 0x2e, 0xcc, 0x27, 0x27, 0xe5, 0x51, 0x24, 0xdf, + 0xc3, 0x90, 0xf7, 0x0f, 0x94, 0xca, 0x6f, 0x1f, 0x0a, 0x90, 0xdb, 0xde, 0xd9, 0x7d, 0xba, 0xb2, + 0x5a, 0xaf, 0x68, 0xcb, 0xff, 0x49, 0x43, 0x6a, 0x73, 0x1f, 0x7d, 0x17, 0x32, 0xfc, 0xf1, 0x6f, + 0xc8, 0x8b, 0x6f, 0x6d, 0xd8, 0xfb, 0x26, 0xbe, 0xf2, 0xd1, 0xdf, 0xfe, 0xf9, 0x69, 0xea, 0x22, + 0x9e, 0x5a, 0xea, 0xbf, 0x6a, 0xb4, 0xbb, 0x47, 0xc6, 0xd2, 0x71, 0x7f, 0x89, 0xd5, 0x84, 0x87, + 0xda, 0x3d, 0xb4, 0x0f, 0xe9, 0xa7, 0x3d, 0x0f, 0x25, 0x3e, 0x07, 0xd7, 0x92, 0xdf, 0x3d, 0x71, + 0x8d, 0x49, 0x9e, 0xc1, 0x93, 0xaa, 0xe4, 0x6e, 0xcf, 0xa3, 0x72, 0xfb, 0x50, 0x50, 0x9f, 0x2e, + 0xcf, 0x7c, 0x28, 0xae, 0x9d, 0xfd, 0x2c, 0x8a, 0x31, 0xd3, 0x77, 0x05, 0x5f, 0x52, 0xf5, 0xf1, + 0x17, 0x56, 0x75, 0x3e, 0x7b, 0x27, 0x16, 0x4a, 0x7c, 0x4b, 0xae, 0x25, 0x3f, 0x97, 0xc6, 0xcf, + 0xc7, 0x3b, 0xb1, 0xa8, 0x5c, 0x5b, 0x3c, 0x97, 0x36, 0x3d, 0x74, 0x2d, 0xe6, 0xb9, 0x4c, 0x7d, + 0x18, 0xaa, 0xcd, 0x27, 0x33, 0x08, 0x4d, 0xd7, 0x99, 0xa6, 0xcb, 0xf8, 0xa2, 0xaa, 0xa9, 0xe9, + 0xf3, 0x3d, 0xd4, 0xee, 0x2d, 0x1f, 0x41, 0x86, 0x21, 0xc3, 0xa8, 0x21, 0x3f, 0x6a, 0x31, 0x98, + 0x76, 0xc2, 0x0e, 0x08, 0x61, 0xca, 0x78, 0x96, 0x69, 0x9b, 0xc6, 0x65, 0x5f, 0x1b, 0x03, 0x87, + 0x1f, 0x6a, 0xf7, 0x16, 0xb4, 0x97, 0xb5, 0xe5, 0x7f, 0x8f, 0x43, 0x86, 0xe1, 0x44, 0xa8, 0x0b, + 0x10, 0xc0, 0xa8, 0xd1, 0x79, 0x0e, 0x00, 0xb3, 0xd1, 0x79, 0x0e, 0x22, 0xb0, 0xf8, 0x1a, 0xd3, + 0x3c, 0x8b, 0x67, 0x7c, 0xcd, 0x0c, 0x83, 0x5a, 0x62, 0xb0, 0x1a, 0x75, 0xeb, 0x0b, 0x01, 0x95, + 0xf1, 0x00, 0x43, 0x71, 0x12, 0x43, 0x78, 0x6a, 0x74, 0x9b, 0xc4, 0x60, 0xa9, 0xf8, 0x06, 0x53, + 0x7a, 0x15, 0x57, 0x55, 0xe7, 0x72, 0xbd, 0x0e, 0xe3, 0xa4, 0x8a, 0x3f, 0xd6, 0xa0, 0x1c, 0x86, + 0x44, 0xd1, 0x8d, 0x18, 0xd1, 0x51, 0x64, 0xb5, 0x76, 0x73, 0x38, 0x53, 0xa2, 0x09, 0x5c, 0xff, + 0x31, 0x21, 0x5d, 0x83, 0x72, 0x0a, 0xdf, 0xa3, 0x1f, 0x69, 0x30, 0x19, 0x01, 0x3a, 0x51, 0x9c, + 0x8a, 0x01, 0x18, 0xb5, 0x76, 0xeb, 0x0c, 0x2e, 0x61, 0xc9, 0x1d, 0x66, 0xc9, 0x75, 0x7c, 0x65, + 0xd0, 0x19, 0x9e, 0xd9, 0x21, 0x9e, 0x2d, 0xac, 0xf1, 0x57, 0x82, 0xa3, 0x92, 0xb1, 0x2b, 0x11, + 0x42, 0x39, 0x63, 0x57, 0x22, 0x0c, 0x69, 0x0e, 0x5b, 0x09, 0x8e, 0x45, 0xd2, 0x8d, 0xfe, 0xdf, + 0x34, 0xe4, 0x56, 0xf9, 0xef, 0x0f, 0x91, 0x07, 0x79, 0x1f, 0xff, 0x43, 0x73, 0x71, 0x58, 0x4c, + 0x70, 0x57, 0xa8, 0x5d, 0x4b, 0xec, 0x17, 0xea, 0x6f, 0x33, 0xf5, 0xf3, 0xf8, 0xb2, 0xaf, 0x5e, + 0xfc, 0xce, 0x71, 0x89, 0xdf, 0xfa, 0x97, 0x8c, 0x56, 0x8b, 0x4e, 0xfd, 0x87, 0x1a, 0x14, 0x55, + 0x98, 0x0e, 0x5d, 0x8f, 0x45, 0x81, 0x54, 0xa4, 0xaf, 0x86, 0x87, 0xb1, 0x08, 0xfd, 0x77, 0x99, + 0xfe, 0x1b, 0x78, 0x2e, 0x49, 0xbf, 0xc3, 0xf8, 0xc3, 0x26, 0x70, 0xa0, 0x2d, 0xde, 0x84, 0x10, + 0x8e, 0x17, 0x6f, 0x42, 0x18, 0xa7, 0x3b, 0xdb, 0x84, 0x1e, 0xe3, 0xa7, 0x26, 0x9c, 0x00, 0x04, + 0xb8, 0x1a, 0x8a, 0x75, 0xae, 0x72, 0x7b, 0x8a, 0x06, 0xff, 0x20, 0x24, 0x17, 0xb3, 0xf5, 0x22, + 0xba, 0xdb, 0xa6, 0x4b, 0x93, 0xc0, 0xf2, 0xef, 0xb3, 0x50, 0x78, 0x62, 0x98, 0x96, 0x47, 0x2c, + 0xc3, 0x6a, 0x12, 0x74, 0x08, 0x19, 0x56, 0x1e, 0xa3, 0x19, 0x4f, 0xc5, 0x9b, 0xa2, 0x19, 0x2f, + 0x04, 0xc6, 0xe0, 0x5b, 0x4c, 0xf5, 0x35, 0x5c, 0xf3, 0x55, 0x77, 0x02, 0xf9, 0x4b, 0x0c, 0x48, + 0xa1, 0x53, 0x3e, 0x86, 0xac, 0xc0, 0xe8, 0x23, 0xd2, 0x42, 0x00, 0x4b, 0xed, 0x4a, 0x7c, 0x67, + 0xe2, 0x2e, 0x53, 0x75, 0xb9, 0x8c, 0x99, 0x2a, 0xfb, 0x1e, 0x40, 0x00, 0x13, 0x46, 0xfd, 0x3b, + 0x80, 0x2a, 0xd6, 0xe6, 0x93, 0x19, 0x84, 0xe2, 0x7b, 0x4c, 0xf1, 0x4d, 0x7c, 0x2d, 0x56, 0x71, + 0xcb, 0x1f, 0x40, 0x95, 0x37, 0x61, 0x7c, 0xdd, 0x70, 0x8f, 0x50, 0xa4, 0xfa, 0x29, 0xbf, 0x1d, + 0xa8, 0xd5, 0xe2, 0xba, 0x84, 0xaa, 0x9b, 0x4c, 0xd5, 0x1c, 0x9e, 0x8d, 0x55, 0x75, 0x64, 0xb8, + 0xb4, 0x98, 0x20, 0x13, 0xb2, 0xfc, 0xf7, 0x04, 0x51, 0x77, 0x86, 0x7e, 0x93, 0x10, 0x75, 0x67, + 0xf8, 0x27, 0x08, 0xe7, 0x54, 0xd5, 0x83, 0x09, 0xf9, 0x8a, 0x8f, 0xae, 0x46, 0x96, 0x27, 0xfc, + 0xe2, 0x5f, 0x9b, 0x4b, 0xea, 0x16, 0x0a, 0x17, 0x98, 0x42, 0x8c, 0xaf, 0xc6, 0xaf, 0x9f, 0x60, + 0x7f, 0xa8, 0xdd, 0x7b, 0x59, 0xa3, 0x55, 0x03, 0x02, 0xb8, 0x75, 0x20, 0x48, 0xa2, 0xc8, 0xed, + 0x40, 0x90, 0x0c, 0x20, 0xb5, 0xf8, 0x55, 0xa6, 0xfd, 0x01, 0x5e, 0x88, 0xd5, 0xee, 0x39, 0x86, + 0xe5, 0x3e, 0x27, 0xce, 0x03, 0x8e, 0xab, 0xb9, 0x47, 0x66, 0x97, 0x06, 0xcc, 0x4f, 0x2a, 0x30, + 0x4e, 0x8f, 0xa6, 0xb4, 0x60, 0x07, 0x37, 0xfa, 0xa8, 0x39, 0x03, 0x38, 0x5a, 0xd4, 0x9c, 0x41, + 0x30, 0x20, 0xa6, 0x60, 0xb3, 0xdf, 0x9d, 0x13, 0xc6, 0x45, 0x1d, 0xef, 0x41, 0x41, 0xb9, 0xf7, + 0xa3, 0x18, 0x89, 0x61, 0x94, 0x2e, 0x5a, 0x26, 0x62, 0x40, 0x03, 0x3c, 0xcf, 0x94, 0xd6, 0xf0, + 0x85, 0xb0, 0xd2, 0x16, 0x67, 0xa3, 0x5a, 0x3f, 0x84, 0xa2, 0x0a, 0x10, 0xa0, 0x18, 0xa1, 0x11, + 0x18, 0x30, 0x9a, 0x1d, 0xe3, 0xf0, 0x85, 0x98, 0x34, 0xe1, 0xff, 0xca, 0x5e, 0xf2, 0x52, 0xed, + 0xef, 0x43, 0x4e, 0xc0, 0x06, 0x71, 0xf3, 0x0d, 0x03, 0x87, 0x71, 0xf3, 0x8d, 0x60, 0x0e, 0x31, + 0xa7, 0x3f, 0xa6, 0x96, 0x5e, 0x8f, 0x64, 0x49, 0x12, 0x2a, 0x1f, 0x13, 0x2f, 0x49, 0x65, 0x00, + 0x85, 0x25, 0xa9, 0x54, 0xae, 0xa6, 0x43, 0x55, 0x1e, 0x12, 0x4f, 0x84, 0x94, 0xbc, 0xf7, 0xa1, + 0x04, 0x89, 0x6a, 0xfe, 0xc7, 0xc3, 0x58, 0x12, 0x0f, 0xec, 0x81, 0x56, 0x91, 0xfc, 0xd1, 0xf7, + 0x01, 0x02, 0x8c, 0x23, 0x7a, 0x06, 0x8b, 0x05, 0x4a, 0xa3, 0x67, 0xb0, 0x78, 0x98, 0x24, 0x26, + 0x91, 0x04, 0xca, 0xf9, 0xa5, 0x81, 0xaa, 0xff, 0xb9, 0x06, 0x68, 0x10, 0x13, 0x41, 0xf7, 0xe3, + 0x55, 0xc4, 0x62, 0xb0, 0xb5, 0x97, 0xce, 0xc7, 0x9c, 0x58, 0x2f, 0x02, 0xbb, 0x9a, 0x6c, 0x48, + 0xf7, 0x05, 0xb5, 0xec, 0x13, 0x0d, 0x4a, 0x21, 0x54, 0x05, 0xdd, 0x4e, 0x58, 0xe7, 0x08, 0x8e, + 0x5b, 0xbb, 0x73, 0x26, 0x5f, 0xe2, 0xf9, 0x4c, 0xd9, 0x15, 0xf2, 0x88, 0xfe, 0x63, 0x0d, 0xca, + 0x61, 0x28, 0x06, 0x25, 0x28, 0x18, 0x00, 0x83, 0x6b, 0x0b, 0x67, 0x33, 0x9e, 0x63, 0xb5, 0x82, + 0x53, 0xfb, 0xfb, 0x90, 0x13, 0x08, 0x4e, 0x5c, 0x58, 0x84, 0xb1, 0xe4, 0xb8, 0xb0, 0x88, 0xc0, + 0x3f, 0x49, 0x61, 0xe1, 0xd8, 0x6d, 0xa2, 0x44, 0xa2, 0xc0, 0x79, 0x92, 0x54, 0x0e, 0x8f, 0xc4, + 0x08, 0x48, 0x34, 0x54, 0x65, 0x10, 0x89, 0x12, 0xe5, 0x41, 0x09, 0x12, 0xcf, 0x88, 0xc4, 0x28, + 0x48, 0x94, 0x14, 0x89, 0x4c, 0xab, 0x12, 0x89, 0x01, 0x28, 0x13, 0x17, 0x89, 0x03, 0x48, 0x79, + 0x5c, 0x24, 0x0e, 0xe2, 0x3a, 0x49, 0x6b, 0xcb, 0x94, 0x87, 0x22, 0x71, 0x3a, 0x06, 0xc4, 0x41, + 0x2f, 0x25, 0xf8, 0x34, 0x16, 0x85, 0xaf, 0x3d, 0x38, 0x27, 0xf7, 0xf0, 0x08, 0xe0, 0xab, 0x21, + 0x23, 0xe0, 0xd7, 0x1a, 0xcc, 0xc4, 0xa1, 0x40, 0x28, 0x41, 0x59, 0x02, 0x84, 0x5f, 0x5b, 0x3c, + 0x2f, 0xfb, 0x39, 0xfc, 0xe6, 0xc7, 0xc4, 0xa3, 0xca, 0x9f, 0x3e, 0x9f, 0xd3, 0xfe, 0xfa, 0xf9, + 0x9c, 0xf6, 0xf7, 0xcf, 0xe7, 0xb4, 0x5f, 0xfc, 0x63, 0x6e, 0xec, 0x20, 0xcb, 0xfe, 0xf3, 0xd7, + 0xab, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x93, 0x8b, 0xaf, 0x54, 0x83, 0x36, 0x00, 0x00, } From d25ae50c0208665945f886d57c177b33d930576d Mon Sep 17 00:00:00 2001 From: Gyu-Ho Lee Date: Mon, 14 Aug 2017 11:25:19 -0700 Subject: [PATCH 4/9] etcdserver: implement LeaseLeases API Signed-off-by: Gyu-Ho Lee --- etcdserver/api/v3rpc/lease.go | 15 +++++++++++++++ etcdserver/v3_server.go | 12 ++++++++++++ 2 files changed, 27 insertions(+) diff --git a/etcdserver/api/v3rpc/lease.go b/etcdserver/api/v3rpc/lease.go index a25d0ce6ad8..6c267da7575 100644 --- a/etcdserver/api/v3rpc/lease.go +++ b/etcdserver/api/v3rpc/lease.go @@ -68,6 +68,21 @@ func (ls *LeaseServer) LeaseTimeToLive(ctx context.Context, rr *pb.LeaseTimeToLi return resp, nil } +func (ls *LeaseServer) LeaseLeases(ctx context.Context, rr *pb.LeaseLeasesRequest) (*pb.LeaseLeasesResponse, error) { + resp, err := ls.le.LeaseLeases(ctx, rr) + if err != nil && err != lease.ErrLeaseNotFound { + return nil, togRPCError(err) + } + if err == lease.ErrLeaseNotFound { + resp = &pb.LeaseLeasesResponse{ + Header: &pb.ResponseHeader{}, + Leases: []*pb.LeaseStatus{}, + } + } + ls.hdr.fill(resp.Header) + return resp, nil +} + func (ls *LeaseServer) LeaseKeepAlive(stream pb.Lease_LeaseKeepAliveServer) (err error) { errc := make(chan error, 1) go func() { diff --git a/etcdserver/v3_server.go b/etcdserver/v3_server.go index ae449bbf22f..6b80468f45b 100644 --- a/etcdserver/v3_server.go +++ b/etcdserver/v3_server.go @@ -60,6 +60,9 @@ type Lessor interface { // LeaseTimeToLive retrieves lease information. LeaseTimeToLive(ctx context.Context, r *pb.LeaseTimeToLiveRequest) (*pb.LeaseTimeToLiveResponse, error) + + // LeaseLeases lists all leases. + LeaseLeases(ctx context.Context, r *pb.LeaseLeasesRequest) (*pb.LeaseLeasesResponse, error) } type Authenticator interface { @@ -291,6 +294,15 @@ func (s *EtcdServer) LeaseTimeToLive(ctx context.Context, r *pb.LeaseTimeToLiveR return nil, ErrTimeout } +func (s *EtcdServer) LeaseLeases(ctx context.Context, r *pb.LeaseLeasesRequest) (*pb.LeaseLeasesResponse, error) { + ls := s.lessor.Leases() + lss := make([]*pb.LeaseStatus, len(ls)) + for i := range ls { + lss[i] = &pb.LeaseStatus{ID: int64(ls[i].ID)} + } + return &pb.LeaseLeasesResponse{Header: newHeader(s), Leases: lss}, nil +} + func (s *EtcdServer) waitLeader(ctx context.Context) (*membership.Member, error) { leader := s.cluster.Member(s.Leader()) for leader == nil { From 15ef98a4ee499bbd475911b6e5e944b137b9a393 Mon Sep 17 00:00:00 2001 From: Gyu-Ho Lee Date: Mon, 14 Aug 2017 11:27:30 -0700 Subject: [PATCH 5/9] clientv3: implement LeaseLeases API Signed-off-by: Gyu-Ho Lee --- clientv3/lease.go | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/clientv3/lease.go b/clientv3/lease.go index f624793c4bc..f3c950914c1 100644 --- a/clientv3/lease.go +++ b/clientv3/lease.go @@ -60,6 +60,18 @@ type LeaseTimeToLiveResponse struct { Keys [][]byte `json:"keys"` } +// LeaseStatus represents a lease status. +type LeaseStatus struct { + ID LeaseID `json:"id"` + // TODO: TTL int64 +} + +// LeaseLeasesResponse is used to convert the protobuf lease list response. +type LeaseLeasesResponse struct { + *pb.ResponseHeader + Leases []LeaseStatus `json:"leases"` +} + const ( // defaultTTL is the assumed lease TTL used for the first keepalive // deadline before the actual TTL is known to the client. @@ -98,6 +110,9 @@ type Lease interface { // TimeToLive retrieves the lease information of the given lease ID. TimeToLive(ctx context.Context, id LeaseID, opts ...LeaseOption) (*LeaseTimeToLiveResponse, error) + // Leases retrieves all leases. + Leases(ctx context.Context) (*LeaseLeasesResponse, error) + // KeepAlive keeps the given lease alive forever. KeepAlive(ctx context.Context, id LeaseID) (<-chan *LeaseKeepAliveResponse, error) @@ -219,6 +234,22 @@ func (l *lessor) TimeToLive(ctx context.Context, id LeaseID, opts ...LeaseOption } } +func (l *lessor) Leases(ctx context.Context) (*LeaseLeasesResponse, error) { + for { + resp, err := l.remote.LeaseLeases(ctx, &pb.LeaseLeasesRequest{}, grpc.FailFast(false)) + if err == nil { + leases := make([]LeaseStatus, len(resp.Leases)) + for i := range resp.Leases { + leases[i] = LeaseStatus{ID: LeaseID(resp.Leases[i].ID)} + } + return &LeaseLeasesResponse{ResponseHeader: resp.GetHeader(), Leases: leases}, nil + } + if isHaltErr(ctx, err) { + return nil, toErr(ctx, err) + } + } +} + func (l *lessor) KeepAlive(ctx context.Context, id LeaseID) (<-chan *LeaseKeepAliveResponse, error) { ch := make(chan *LeaseKeepAliveResponse, leaseResponseChSize) From f8141db2c74f4852cc8cd1f6aa76aae00874a411 Mon Sep 17 00:00:00 2001 From: Gyu-Ho Lee Date: Mon, 14 Aug 2017 11:28:47 -0700 Subject: [PATCH 6/9] proxy/grpcproxy: implement LeaseLeases API Signed-off-by: Gyu-Ho Lee --- proxy/grpcproxy/adapter/lease_client_adapter.go | 4 ++++ proxy/grpcproxy/lease.go | 16 ++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/proxy/grpcproxy/adapter/lease_client_adapter.go b/proxy/grpcproxy/adapter/lease_client_adapter.go index d471fd9144b..c8c67ce6e13 100644 --- a/proxy/grpcproxy/adapter/lease_client_adapter.go +++ b/proxy/grpcproxy/adapter/lease_client_adapter.go @@ -48,6 +48,10 @@ func (c *ls2lc) LeaseTimeToLive(ctx context.Context, in *pb.LeaseTimeToLiveReque return c.leaseServer.LeaseTimeToLive(ctx, in) } +func (c *ls2lc) LeaseLeases(ctx context.Context, in *pb.LeaseLeasesRequest, opts ...grpc.CallOption) (*pb.LeaseLeasesResponse, error) { + return c.leaseServer.LeaseLeases(ctx, in) +} + // ls2lcClientStream implements Lease_LeaseKeepAliveClient type ls2lcClientStream struct{ chanClientStream } diff --git a/proxy/grpcproxy/lease.go b/proxy/grpcproxy/lease.go index cd7481da8a1..cad013f6f4a 100644 --- a/proxy/grpcproxy/lease.go +++ b/proxy/grpcproxy/lease.go @@ -113,6 +113,22 @@ func (lp *leaseProxy) LeaseTimeToLive(ctx context.Context, rr *pb.LeaseTimeToLiv return rp, err } +func (lp *leaseProxy) LeaseLeases(ctx context.Context, rr *pb.LeaseLeasesRequest) (*pb.LeaseLeasesResponse, error) { + r, err := lp.lessor.Leases(ctx) + if err != nil { + return nil, err + } + leases := make([]*pb.LeaseStatus, len(r.Leases)) + for i := range r.Leases { + leases[i] = &pb.LeaseStatus{ID: int64(r.Leases[i].ID)} + } + rp := &pb.LeaseLeasesResponse{ + Header: r.ResponseHeader, + Leases: leases, + } + return rp, err +} + func (lp *leaseProxy) LeaseKeepAlive(stream pb.Lease_LeaseKeepAliveServer) error { lp.mu.Lock() select { From 556c1a1fe0a13757de796db4e5f33931a990627c Mon Sep 17 00:00:00 2001 From: Gyu-Ho Lee Date: Mon, 14 Aug 2017 11:31:15 -0700 Subject: [PATCH 7/9] integration,clientv3/integration: test LeaseLeases API Signed-off-by: Gyu-Ho Lee --- clientv3/integration/lease_test.go | 31 +++++++++++++++++++++++++ integration/v3_lease_test.go | 37 ++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/clientv3/integration/lease_test.go b/clientv3/integration/lease_test.go index 8bdb0ff3f34..ec59cf62530 100644 --- a/clientv3/integration/lease_test.go +++ b/clientv3/integration/lease_test.go @@ -574,6 +574,37 @@ func TestLeaseTimeToLiveLeaseNotFound(t *testing.T) { } } +func TestLeaseLeases(t *testing.T) { + defer testutil.AfterTest(t) + + clus := integration.NewClusterV3(t, &integration.ClusterConfig{Size: 1}) + defer clus.Terminate(t) + + cli := clus.RandClient() + + ids := []clientv3.LeaseID{} + for i := 0; i < 5; i++ { + resp, err := cli.Grant(context.Background(), 10) + if err != nil { + t.Errorf("failed to create lease %v", err) + } + ids = append(ids, resp.ID) + } + + resp, err := cli.Leases(context.Background()) + if err != nil { + t.Fatal(err) + } + if len(resp.Leases) != 5 { + t.Fatalf("len(resp.Leases) expected 5, got %d", len(resp.Leases)) + } + for i := range resp.Leases { + if ids[i] != resp.Leases[i].ID { + t.Fatalf("#%d: lease ID expected %d, got %d", i, ids[i], resp.Leases[i].ID) + } + } +} + // TestLeaseRenewLostQuorum ensures keepalives work after losing quorum // for a while. func TestLeaseRenewLostQuorum(t *testing.T) { diff --git a/integration/v3_lease_test.go b/integration/v3_lease_test.go index 7bb72ba131f..7ea873f86bf 100644 --- a/integration/v3_lease_test.go +++ b/integration/v3_lease_test.go @@ -234,6 +234,43 @@ func TestV3LeaseExists(t *testing.T) { } } +// TestV3LeaseLeases creates leases and confirms list RPC fetches created ones. +func TestV3LeaseLeases(t *testing.T) { + defer testutil.AfterTest(t) + clus := NewClusterV3(t, &ClusterConfig{Size: 1}) + defer clus.Terminate(t) + + ctx0, cancel0 := context.WithCancel(context.Background()) + defer cancel0() + + // create leases + ids := []int64{} + for i := 0; i < 5; i++ { + lresp, err := toGRPC(clus.RandClient()).Lease.LeaseGrant( + ctx0, + &pb.LeaseGrantRequest{TTL: 30}) + if err != nil { + t.Fatal(err) + } + if lresp.Error != "" { + t.Fatal(lresp.Error) + } + ids = append(ids, lresp.ID) + } + + lresp, err := toGRPC(clus.RandClient()).Lease.LeaseLeases( + context.Background(), + &pb.LeaseLeasesRequest{}) + if err != nil { + t.Fatal(err) + } + for i := range lresp.Leases { + if lresp.Leases[i].ID != ids[i] { + t.Fatalf("#%d: lease ID expected %d, got %d", i, ids[i], lresp.Leases[i].ID) + } + } +} + // TestV3LeaseRenewStress keeps creating lease and renewing it immediately to ensure the renewal goes through. // it was oberserved that the immediate lease renewal after granting a lease from follower resulted lease not found. // related issue https://github.com/coreos/etcd/issues/6978 From 1f20d5d9241817e938fcd8f964b1dc3ec1fe720f Mon Sep 17 00:00:00 2001 From: Gyu-Ho Lee Date: Mon, 14 Aug 2017 12:17:38 -0700 Subject: [PATCH 8/9] etcdctl/ctlv3: add 'lease list' command Signed-off-by: Gyu-Ho Lee --- etcdctl/README.md | 26 ++++++++++++++++++++++--- etcdctl/ctlv3/command/lease_command.go | 20 +++++++++++++++++++ etcdctl/ctlv3/command/printer.go | 2 ++ etcdctl/ctlv3/command/printer_fields.go | 7 +++++++ etcdctl/ctlv3/command/printer_simple.go | 7 +++++++ 5 files changed, 59 insertions(+), 3 deletions(-) diff --git a/etcdctl/README.md b/etcdctl/README.md index c6525887916..4c9d43db9a0 100644 --- a/etcdctl/README.md +++ b/etcdctl/README.md @@ -439,6 +439,26 @@ Prints lease information. # {"cluster_id":17186838941855831277,"member_id":4845372305070271874,"revision":3,"raft_term":2,"id":3279279168933706764,"ttl":459,"granted-ttl":500,"keys":["Zm9vMQ==","Zm9vMg=="]} ``` +### LEASE LIST + +LEASE LIST lists all active leases. + +RPC: LeaseLeases + +#### Output + +Prints a message with a list of active leases. + +#### Example + +```bash +./etcdctl lease grant 10 +# lease 32695410dcc0ca06 granted with TTL(10s) + +./etcdctl lease list +32695410dcc0ca06 +``` + ### LEASE KEEP-ALIVE \ LEASE KEEP-ALIVE periodically refreshes a lease so it does not expire. @@ -736,9 +756,9 @@ If NOSPACE alarm is present: ### DEFRAG [options] -DEFRAG defragments the backend database file for a set of given endpoints while etcd is running, or directly defragments an -etcd data directory while etcd is not running. When an etcd member reclaims storage space from deleted and compacted keys, the -space is kept in a free list and the database file remains the same size. By defragmenting the database, the etcd member +DEFRAG defragments the backend database file for a set of given endpoints while etcd is running, or directly defragments an +etcd data directory while etcd is not running. When an etcd member reclaims storage space from deleted and compacted keys, the +space is kept in a free list and the database file remains the same size. By defragmenting the database, the etcd member releases this free space back to the file system. #### Options diff --git a/etcdctl/ctlv3/command/lease_command.go b/etcdctl/ctlv3/command/lease_command.go index 0afb3d69c7c..fe6fa3634a0 100644 --- a/etcdctl/ctlv3/command/lease_command.go +++ b/etcdctl/ctlv3/command/lease_command.go @@ -33,6 +33,7 @@ func NewLeaseCommand() *cobra.Command { lc.AddCommand(NewLeaseGrantCommand()) lc.AddCommand(NewLeaseRevokeCommand()) lc.AddCommand(NewLeaseTimeToLiveCommand()) + lc.AddCommand(NewLeaseListCommand()) lc.AddCommand(NewLeaseKeepAliveCommand()) return lc @@ -129,6 +130,25 @@ func leaseTimeToLiveCommandFunc(cmd *cobra.Command, args []string) { display.TimeToLive(*resp, timeToLiveKeys) } +// NewLeaseListCommand returns the cobra command for "lease list". +func NewLeaseListCommand() *cobra.Command { + lc := &cobra.Command{ + Use: "list", + Short: "List all active leases", + Run: leaseListCommandFunc, + } + return lc +} + +// leaseListCommandFunc executes the "lease list" command. +func leaseListCommandFunc(cmd *cobra.Command, args []string) { + resp, rerr := mustClientFromCmd(cmd).Leases(context.TODO()) + if rerr != nil { + ExitWithError(ExitBadConnection, rerr) + } + display.Leases(*resp) +} + // NewLeaseKeepAliveCommand returns the cobra command for "lease keep-alive". func NewLeaseKeepAliveCommand() *cobra.Command { lc := &cobra.Command{ diff --git a/etcdctl/ctlv3/command/printer.go b/etcdctl/ctlv3/command/printer.go index 613c555ebe6..64c0fb72e5a 100644 --- a/etcdctl/ctlv3/command/printer.go +++ b/etcdctl/ctlv3/command/printer.go @@ -36,6 +36,7 @@ type printer interface { Revoke(id v3.LeaseID, r v3.LeaseRevokeResponse) KeepAlive(r v3.LeaseKeepAliveResponse) TimeToLive(r v3.LeaseTimeToLiveResponse, keys bool) + Leases(r v3.LeaseLeasesResponse) MemberAdd(v3.MemberAddResponse) MemberRemove(id uint64, r v3.MemberRemoveResponse) @@ -96,6 +97,7 @@ func (p *printerRPC) Grant(r v3.LeaseGrantResponse) { p.p(r func (p *printerRPC) Revoke(id v3.LeaseID, r v3.LeaseRevokeResponse) { p.p(r) } func (p *printerRPC) KeepAlive(r v3.LeaseKeepAliveResponse) { p.p(r) } func (p *printerRPC) TimeToLive(r v3.LeaseTimeToLiveResponse, keys bool) { p.p(&r) } +func (p *printerRPC) Leases(r v3.LeaseLeasesResponse) { p.p(&r) } func (p *printerRPC) MemberAdd(r v3.MemberAddResponse) { p.p((*pb.MemberAddResponse)(&r)) } func (p *printerRPC) MemberRemove(id uint64, r v3.MemberRemoveResponse) { diff --git a/etcdctl/ctlv3/command/printer_fields.go b/etcdctl/ctlv3/command/printer_fields.go index f7d1cae5915..24ff283a8ca 100644 --- a/etcdctl/ctlv3/command/printer_fields.go +++ b/etcdctl/ctlv3/command/printer_fields.go @@ -118,6 +118,13 @@ func (p *fieldsPrinter) TimeToLive(r v3.LeaseTimeToLiveResponse, keys bool) { } } +func (p *fieldsPrinter) Leases(r v3.LeaseLeasesResponse) { + p.hdr(r.ResponseHeader) + for _, item := range r.Leases { + fmt.Println(`"ID" :`, item.ID) + } +} + func (p *fieldsPrinter) MemberList(r v3.MemberListResponse) { p.hdr(r.Header) for _, m := range r.Members { diff --git a/etcdctl/ctlv3/command/printer_simple.go b/etcdctl/ctlv3/command/printer_simple.go index 5e0ae9d3fd2..fc1c66dfbc1 100644 --- a/etcdctl/ctlv3/command/printer_simple.go +++ b/etcdctl/ctlv3/command/printer_simple.go @@ -104,6 +104,13 @@ func (s *simplePrinter) TimeToLive(resp v3.LeaseTimeToLiveResponse, keys bool) { fmt.Println(txt) } +func (s *simplePrinter) Leases(resp v3.LeaseLeasesResponse) { + fmt.Printf("found %d leases\n", len(resp.Leases)) + for _, item := range resp.Leases { + fmt.Printf("%016x\n", item.ID) + } +} + func (s *simplePrinter) Alarm(resp v3.AlarmResponse) { for _, e := range resp.Alarms { fmt.Printf("%+v\n", e) From 01f101320329c44c4eca638870bd0f6f08cb2761 Mon Sep 17 00:00:00 2001 From: Gyu-Ho Lee Date: Mon, 14 Aug 2017 12:18:43 -0700 Subject: [PATCH 9/9] e2e: test 'lease list' command Signed-off-by: Gyu-Ho Lee --- e2e/ctl_v3_lease_test.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/e2e/ctl_v3_lease_test.go b/e2e/ctl_v3_lease_test.go index d27060a6430..34571ac9f17 100644 --- a/e2e/ctl_v3_lease_test.go +++ b/e2e/ctl_v3_lease_test.go @@ -22,6 +22,7 @@ import ( ) func TestCtlV3LeaseGrantTimeToLive(t *testing.T) { testCtl(t, leaseTestGrantTimeToLive) } +func TestCtlV3LeaseGrantLeases(t *testing.T) { testCtl(t, leaseTestGrantLeasesList) } func TestCtlV3LeaseKeepAlive(t *testing.T) { testCtl(t, leaseTestKeepAlive) } func TestCtlV3LeaseRevoke(t *testing.T) { testCtl(t, leaseTestRevoke) } @@ -51,6 +52,26 @@ func leaseTestGrantTimeToLive(cx ctlCtx) { } } +func leaseTestGrantLeasesList(cx ctlCtx) { + id, err := ctlV3LeaseGrant(cx, 10) + if err != nil { + cx.t.Fatal(err) + } + + cmdArgs := append(cx.PrefixArgs(), "lease", "list") + proc, err := spawnCmd(cmdArgs) + if err != nil { + cx.t.Fatal(err) + } + _, err = proc.Expect(id) + if err != nil { + cx.t.Fatal(err) + } + if err = proc.Close(); err != nil { + cx.t.Fatal(err) + } +} + func leaseTestKeepAlive(cx ctlCtx) { // put with TTL 10 seconds and keep-alive leaseID, err := ctlV3LeaseGrant(cx, 10)