From 0431c0f0fbc1d27f93e9428bb545f0ff4e8553fa Mon Sep 17 00:00:00 2001 From: Brian Joerger Date: Fri, 3 Jun 2022 11:15:49 -0700 Subject: [PATCH] Remove deprecated node http endpoints (#12970) --- api/client/client.go | 121 -- api/client/client_test.go | 37 - api/client/proto/authservice.pb.go | 2076 +++++++--------------- api/client/proto/authservice.proto | 29 +- e | 2 +- lib/auth/api.go | 9 +- lib/auth/apiserver.go | 83 - lib/auth/auth.go | 35 +- lib/auth/auth_with_roles.go | 73 +- lib/auth/auth_with_roles_test.go | 61 - lib/auth/clt.go | 18 - lib/auth/grpcserver.go | 46 - lib/auth/grpcserver_test.go | 46 - lib/auth/httpfallback.go | 108 -- lib/cache/cache.go | 76 +- lib/cache/cache_test.go | 82 - lib/client/client.go | 30 - lib/datalog/access_test.go | 2 +- lib/reversetunnel/localsite_test.go | 3 +- lib/services/local/perf_test.go | 4 +- lib/services/local/presence.go | 98 +- lib/services/local/presence_test.go | 51 - lib/services/presence.go | 7 +- lib/teleterm/clusters/cluster_servers.go | 5 +- lib/web/apiserver_test.go | 2 +- lib/web/terminal.go | 3 +- lib/web/ui/cluster.go | 2 +- lib/web/ui/perf_test.go | 4 +- 28 files changed, 685 insertions(+), 2428 deletions(-) diff --git a/api/client/client.go b/api/client/client.go index 82418dffb83..755169bd26d 100644 --- a/api/client/client.go +++ b/api/client/client.go @@ -1707,17 +1707,6 @@ func (c *Client) GetNodes(ctx context.Context, namespace string) ([]types.Server Namespace: namespace, }) if err != nil { - // Underlying ListResources for nodes was not available, use fallback. - // - // DELETE IN 11.0.0 - if trace.IsNotImplemented(err) { - servers, err := GetNodesWithLabels(ctx, c, namespace, nil) - if err != nil { - return nil, trace.Wrap(err) - } - return servers, nil - } - return nil, trace.Wrap(err) } @@ -1729,116 +1718,6 @@ func (c *Client) GetNodes(ctx context.Context, namespace string) ([]types.Server return servers, nil } -// NodeClient is an interface used by GetNodesWithLabels to abstract over implementations of -// the ListNodes method. -// -// DELETE IN 11.0.0 with GetNodesWithLabels (used in both api/client/client.go and lib/auth/httpfallback.go) -// replaced by ListResourcesClient -type NodeClient interface { - ListNodes(ctx context.Context, req proto.ListNodesRequest) (nodes []types.Server, nextKey string, err error) -} - -// GetNodesWithLabels is a helper for getting a list of nodes with optional label-based filtering. In addition to -// iterating pages, it also correctly handles downsizing pages when LimitExceeded errors are encountered. -// -// DELETE IN 11.0.0 replaced by GetResourcesWithFilters. -func GetNodesWithLabels(ctx context.Context, clt NodeClient, namespace string, labels map[string]string) ([]types.Server, error) { - // Retrieve the complete list of nodes in chunks. - var ( - nodes []types.Server - startKey string - chunkSize = int32(defaults.DefaultChunkSize) - ) - for { - resp, nextKey, err := clt.ListNodes(ctx, proto.ListNodesRequest{ - Namespace: namespace, - Limit: chunkSize, - StartKey: startKey, - Labels: labels, - }) - if trace.IsLimitExceeded(err) { - // Cut chunkSize in half if gRPC max message size is exceeded. - chunkSize = chunkSize / 2 - // This is an extremely unlikely scenario, but better to cover it anyways. - if chunkSize == 0 { - return nil, trace.Wrap(trail.FromGRPC(err), "Node is too large to retrieve over gRPC (over 4MiB).") - } - continue - } else if err != nil { - return nil, trail.FromGRPC(err) - } - - // perform client-side filtering in case we're dealing with an older auth server which - // does not support server-side filtering. - for _, node := range resp { - if node.MatchAgainst(labels) { - nodes = append(nodes, node) - } - } - - startKey = nextKey - if startKey == "" { - return nodes, nil - } - } -} - -// ListNodes returns a paginated list of nodes that the user has access to in the given namespace. -// nextKey can be used as startKey in another call to ListNodes to retrieve the next page of nodes. -// ListNodes will return a trace.LimitExceeded error if the page of nodes retrieved exceeds 4MiB. -func (c *Client) ListNodes(ctx context.Context, req proto.ListNodesRequest) ([]types.Server, string, error) { - resp, err := c.ListResources(ctx, proto.ListResourcesRequest{ - ResourceType: types.KindNode, - Namespace: req.Namespace, - StartKey: req.StartKey, - Limit: req.Limit, - Labels: req.Labels, - }) - if err != nil { - if trace.IsNotImplemented(err) { - return c.listNodesFallback(ctx, req) - } - - return nil, "", trace.Wrap(err) - } - - servers := make([]types.Server, len(resp.Resources)) - for i, resource := range resp.Resources { - server, ok := resource.(*types.ServerV2) - if !ok { - return nil, "", trace.BadParameter("invalid node type %T", resource) - } - - servers[i] = server - } - - return servers, resp.NextKey, nil -} - -// listNodesFallback previous implementation of `ListNodes` function using -// `ListNodes` RPC call. -// DELETE IN 10.0 -func (c *Client) listNodesFallback(ctx context.Context, req proto.ListNodesRequest) (nodes []types.Server, nextKey string, err error) { - if req.Namespace == "" { - return nil, "", trace.BadParameter("missing parameter namespace") - } - if req.Limit <= 0 { - return nil, "", trace.BadParameter("nonpositive parameter limit") - } - - resp, err := c.grpc.ListNodes(ctx, &req, c.callOpts...) - if err != nil { - return nil, "", trail.FromGRPC(err) - } - - nodes = make([]types.Server, len(resp.Servers)) - for i, node := range resp.Servers { - nodes[i] = node - } - - return nodes, resp.NextKey, nil -} - // UpsertNode is used by SSH servers to report their presence // to the auth servers in form of heartbeat expiring after ttl period. func (c *Client) UpsertNode(ctx context.Context, node types.Server) (*types.KeepAlive, error) { diff --git a/api/client/client_test.go b/api/client/client_test.go index e4b182307a0..5767f6de5ba 100644 --- a/api/client/client_test.go +++ b/api/client/client_test.go @@ -482,43 +482,6 @@ func TestWaitForConnectionReady(t *testing.T) { require.Error(t, clt.waitForConnectionReady(ctx)) } -func TestLimitExceeded(t *testing.T) { - t.Parallel() - ctx := context.Background() - srv := startMockServer(t) - - // Create client - clt, err := srv.NewClient(ctx) - require.NoError(t, err) - - // ListNodes should return a limit exceeded error when exceeding gRPC message size limit. - _, _, err = clt.ListNodes(ctx, proto.ListNodesRequest{ - Namespace: defaults.Namespace, - Limit: 50, - }) - require.IsType(t, &trace.LimitExceededError{}, err.(*trace.TraceErr).OrigError()) - - // GetNodes should retrieve all nodes and transparently handle limit exceeded errors. - expectedResources, err := testResources(types.KindNode, defaults.Namespace) - require.NoError(t, err) - - expectedNodes := make([]types.Server, len(expectedResources)) - for i, expectedResource := range expectedResources { - var ok bool - expectedNodes[i], ok = expectedResource.(*types.ServerV2) - require.True(t, ok) - } - - resp, err := clt.GetNodes(ctx, defaults.Namespace) - require.NoError(t, err) - require.EqualValues(t, expectedNodes, resp) - - // GetNodes should fail with a limit exceeded error if a - // single node is too big to send over gRPC (over 4MB). - _, err = clt.GetNodes(ctx, fiveMBNode) - require.IsType(t, &trace.LimitExceededError{}, err.(*trace.TraceErr).OrigError()) -} - func TestListResources(t *testing.T) { t.Parallel() ctx := context.Background() diff --git a/api/client/proto/authservice.pb.go b/api/client/proto/authservice.pb.go index 1731f1e6bfe..7e7fa3c275d 100644 --- a/api/client/proto/authservice.pb.go +++ b/api/client/proto/authservice.pb.go @@ -7303,142 +7303,6 @@ func (m *Events) GetLastKey() string { return "" } -// DELETE IN 10.0 -type ListNodesRequest struct { - // Namespace is the namespace of resources. - Namespace string `protobuf:"bytes,1,opt,name=Namespace,proto3" json:"Namespace,omitempty"` - // Limit is the maximum amount of nodes to retrieve. - Limit int32 `protobuf:"varint,2,opt,name=Limit,proto3" json:"Limit,omitempty"` - // StartKey is used to start listing nodes from a specific spot. This should - // be set to the previous NextKey value if using pagination, or left empty. - StartKey string `protobuf:"bytes,3,opt,name=StartKey,proto3" json:"StartKey,omitempty"` - // Labels is a label-based matcher if non-empty. - Labels map[string]string `protobuf:"bytes,4,rep,name=Labels,proto3" json:"Labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListNodesRequest) Reset() { *m = ListNodesRequest{} } -func (m *ListNodesRequest) String() string { return proto.CompactTextString(m) } -func (*ListNodesRequest) ProtoMessage() {} -func (*ListNodesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{104} -} -func (m *ListNodesRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ListNodesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ListNodesRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *ListNodesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListNodesRequest.Merge(m, src) -} -func (m *ListNodesRequest) XXX_Size() int { - return m.Size() -} -func (m *ListNodesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListNodesRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ListNodesRequest proto.InternalMessageInfo - -func (m *ListNodesRequest) GetNamespace() string { - if m != nil { - return m.Namespace - } - return "" -} - -func (m *ListNodesRequest) GetLimit() int32 { - if m != nil { - return m.Limit - } - return 0 -} - -func (m *ListNodesRequest) GetStartKey() string { - if m != nil { - return m.StartKey - } - return "" -} - -func (m *ListNodesRequest) GetLabels() map[string]string { - if m != nil { - return m.Labels - } - return nil -} - -// DELETE IN 10.0 -type ListNodesResponse struct { - // Servers is a list of servers. - Servers []*types.ServerV2 `protobuf:"bytes,1,rep,name=Servers,proto3" json:"Servers,omitempty"` - // NextKey is the next Key to use as StartKey in a ListNodesRequest to continue - // retrieving pages of nodes. If NextKey is empty, there are no more pages. - NextKey string `protobuf:"bytes,2,opt,name=NextKey,proto3" json:"NextKey,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListNodesResponse) Reset() { *m = ListNodesResponse{} } -func (m *ListNodesResponse) String() string { return proto.CompactTextString(m) } -func (*ListNodesResponse) ProtoMessage() {} -func (*ListNodesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{105} -} -func (m *ListNodesResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ListNodesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ListNodesResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *ListNodesResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListNodesResponse.Merge(m, src) -} -func (m *ListNodesResponse) XXX_Size() int { - return m.Size() -} -func (m *ListNodesResponse) XXX_DiscardUnknown() { - xxx_messageInfo_ListNodesResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_ListNodesResponse proto.InternalMessageInfo - -func (m *ListNodesResponse) GetServers() []*types.ServerV2 { - if m != nil { - return m.Servers - } - return nil -} - -func (m *ListNodesResponse) GetNextKey() string { - if m != nil { - return m.NextKey - } - return "" -} - type GetLocksRequest struct { // Targets is a list of targets. Every returned lock must match at least // one of the targets. @@ -7454,7 +7318,7 @@ func (m *GetLocksRequest) Reset() { *m = GetLocksRequest{} } func (m *GetLocksRequest) String() string { return proto.CompactTextString(m) } func (*GetLocksRequest) ProtoMessage() {} func (*GetLocksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{106} + return fileDescriptor_ce8bd90b12161215, []int{104} } func (m *GetLocksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7509,7 +7373,7 @@ func (m *GetLocksResponse) Reset() { *m = GetLocksResponse{} } func (m *GetLocksResponse) String() string { return proto.CompactTextString(m) } func (*GetLocksResponse) ProtoMessage() {} func (*GetLocksResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{107} + return fileDescriptor_ce8bd90b12161215, []int{105} } func (m *GetLocksResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7557,7 +7421,7 @@ func (m *GetLockRequest) Reset() { *m = GetLockRequest{} } func (m *GetLockRequest) String() string { return proto.CompactTextString(m) } func (*GetLockRequest) ProtoMessage() {} func (*GetLockRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{108} + return fileDescriptor_ce8bd90b12161215, []int{106} } func (m *GetLockRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7605,7 +7469,7 @@ func (m *DeleteLockRequest) Reset() { *m = DeleteLockRequest{} } func (m *DeleteLockRequest) String() string { return proto.CompactTextString(m) } func (*DeleteLockRequest) ProtoMessage() {} func (*DeleteLockRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{109} + return fileDescriptor_ce8bd90b12161215, []int{107} } func (m *DeleteLockRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7655,7 +7519,7 @@ func (m *ReplaceRemoteLocksRequest) Reset() { *m = ReplaceRemoteLocksReq func (m *ReplaceRemoteLocksRequest) String() string { return proto.CompactTextString(m) } func (*ReplaceRemoteLocksRequest) ProtoMessage() {} func (*ReplaceRemoteLocksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{110} + return fileDescriptor_ce8bd90b12161215, []int{108} } func (m *ReplaceRemoteLocksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7711,7 +7575,7 @@ func (m *GetWindowsDesktopServicesResponse) Reset() { *m = GetWindowsDes func (m *GetWindowsDesktopServicesResponse) String() string { return proto.CompactTextString(m) } func (*GetWindowsDesktopServicesResponse) ProtoMessage() {} func (*GetWindowsDesktopServicesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{111} + return fileDescriptor_ce8bd90b12161215, []int{109} } func (m *GetWindowsDesktopServicesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7760,7 +7624,7 @@ func (m *GetWindowsDesktopServiceRequest) Reset() { *m = GetWindowsDeskt func (m *GetWindowsDesktopServiceRequest) String() string { return proto.CompactTextString(m) } func (*GetWindowsDesktopServiceRequest) ProtoMessage() {} func (*GetWindowsDesktopServiceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{112} + return fileDescriptor_ce8bd90b12161215, []int{110} } func (m *GetWindowsDesktopServiceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7809,7 +7673,7 @@ func (m *GetWindowsDesktopServiceResponse) Reset() { *m = GetWindowsDesk func (m *GetWindowsDesktopServiceResponse) String() string { return proto.CompactTextString(m) } func (*GetWindowsDesktopServiceResponse) ProtoMessage() {} func (*GetWindowsDesktopServiceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{113} + return fileDescriptor_ce8bd90b12161215, []int{111} } func (m *GetWindowsDesktopServiceResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7858,7 +7722,7 @@ func (m *DeleteWindowsDesktopServiceRequest) Reset() { *m = DeleteWindow func (m *DeleteWindowsDesktopServiceRequest) String() string { return proto.CompactTextString(m) } func (*DeleteWindowsDesktopServiceRequest) ProtoMessage() {} func (*DeleteWindowsDesktopServiceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{114} + return fileDescriptor_ce8bd90b12161215, []int{112} } func (m *DeleteWindowsDesktopServiceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7907,7 +7771,7 @@ func (m *GetWindowsDesktopsResponse) Reset() { *m = GetWindowsDesktopsRe func (m *GetWindowsDesktopsResponse) String() string { return proto.CompactTextString(m) } func (*GetWindowsDesktopsResponse) ProtoMessage() {} func (*GetWindowsDesktopsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{115} + return fileDescriptor_ce8bd90b12161215, []int{113} } func (m *GetWindowsDesktopsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7960,7 +7824,7 @@ func (m *DeleteWindowsDesktopRequest) Reset() { *m = DeleteWindowsDeskto func (m *DeleteWindowsDesktopRequest) String() string { return proto.CompactTextString(m) } func (*DeleteWindowsDesktopRequest) ProtoMessage() {} func (*DeleteWindowsDesktopRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{116} + return fileDescriptor_ce8bd90b12161215, []int{114} } func (m *DeleteWindowsDesktopRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8021,7 +7885,7 @@ func (m *WindowsDesktopCertRequest) Reset() { *m = WindowsDesktopCertReq func (m *WindowsDesktopCertRequest) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopCertRequest) ProtoMessage() {} func (*WindowsDesktopCertRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{117} + return fileDescriptor_ce8bd90b12161215, []int{115} } func (m *WindowsDesktopCertRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8084,7 +7948,7 @@ func (m *WindowsDesktopCertResponse) Reset() { *m = WindowsDesktopCertRe func (m *WindowsDesktopCertResponse) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopCertResponse) ProtoMessage() {} func (*WindowsDesktopCertResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{118} + return fileDescriptor_ce8bd90b12161215, []int{116} } func (m *WindowsDesktopCertResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8133,7 +7997,7 @@ func (m *CertAuthorityRequest) Reset() { *m = CertAuthorityRequest{} } func (m *CertAuthorityRequest) String() string { return proto.CompactTextString(m) } func (*CertAuthorityRequest) ProtoMessage() {} func (*CertAuthorityRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{119} + return fileDescriptor_ce8bd90b12161215, []int{117} } func (m *CertAuthorityRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8182,7 +8046,7 @@ func (m *CRL) Reset() { *m = CRL{} } func (m *CRL) String() string { return proto.CompactTextString(m) } func (*CRL) ProtoMessage() {} func (*CRL) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{120} + return fileDescriptor_ce8bd90b12161215, []int{118} } func (m *CRL) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8250,7 +8114,7 @@ func (m *ChangeUserAuthenticationRequest) Reset() { *m = ChangeUserAuthe func (m *ChangeUserAuthenticationRequest) String() string { return proto.CompactTextString(m) } func (*ChangeUserAuthenticationRequest) ProtoMessage() {} func (*ChangeUserAuthenticationRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{121} + return fileDescriptor_ce8bd90b12161215, []int{119} } func (m *ChangeUserAuthenticationRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8326,7 +8190,7 @@ func (m *ChangeUserAuthenticationResponse) Reset() { *m = ChangeUserAuth func (m *ChangeUserAuthenticationResponse) String() string { return proto.CompactTextString(m) } func (*ChangeUserAuthenticationResponse) ProtoMessage() {} func (*ChangeUserAuthenticationResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{122} + return fileDescriptor_ce8bd90b12161215, []int{120} } func (m *ChangeUserAuthenticationResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8392,7 +8256,7 @@ func (m *StartAccountRecoveryRequest) Reset() { *m = StartAccountRecover func (m *StartAccountRecoveryRequest) String() string { return proto.CompactTextString(m) } func (*StartAccountRecoveryRequest) ProtoMessage() {} func (*StartAccountRecoveryRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{123} + return fileDescriptor_ce8bd90b12161215, []int{121} } func (m *StartAccountRecoveryRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8467,7 +8331,7 @@ func (m *VerifyAccountRecoveryRequest) Reset() { *m = VerifyAccountRecov func (m *VerifyAccountRecoveryRequest) String() string { return proto.CompactTextString(m) } func (*VerifyAccountRecoveryRequest) ProtoMessage() {} func (*VerifyAccountRecoveryRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{124} + return fileDescriptor_ce8bd90b12161215, []int{122} } func (m *VerifyAccountRecoveryRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8582,7 +8446,7 @@ func (m *CompleteAccountRecoveryRequest) Reset() { *m = CompleteAccountR func (m *CompleteAccountRecoveryRequest) String() string { return proto.CompactTextString(m) } func (*CompleteAccountRecoveryRequest) ProtoMessage() {} func (*CompleteAccountRecoveryRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{125} + return fileDescriptor_ce8bd90b12161215, []int{123} } func (m *CompleteAccountRecoveryRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8688,7 +8552,7 @@ func (m *RecoveryCodes) Reset() { *m = RecoveryCodes{} } func (m *RecoveryCodes) String() string { return proto.CompactTextString(m) } func (*RecoveryCodes) ProtoMessage() {} func (*RecoveryCodes) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{126} + return fileDescriptor_ce8bd90b12161215, []int{124} } func (m *RecoveryCodes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8751,7 +8615,7 @@ func (m *CreateAccountRecoveryCodesRequest) Reset() { *m = CreateAccount func (m *CreateAccountRecoveryCodesRequest) String() string { return proto.CompactTextString(m) } func (*CreateAccountRecoveryCodesRequest) ProtoMessage() {} func (*CreateAccountRecoveryCodesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{127} + return fileDescriptor_ce8bd90b12161215, []int{125} } func (m *CreateAccountRecoveryCodesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8802,7 +8666,7 @@ func (m *GetAccountRecoveryTokenRequest) Reset() { *m = GetAccountRecove func (m *GetAccountRecoveryTokenRequest) String() string { return proto.CompactTextString(m) } func (*GetAccountRecoveryTokenRequest) ProtoMessage() {} func (*GetAccountRecoveryTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{128} + return fileDescriptor_ce8bd90b12161215, []int{126} } func (m *GetAccountRecoveryTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8850,7 +8714,7 @@ func (m *GetAccountRecoveryCodesRequest) Reset() { *m = GetAccountRecove func (m *GetAccountRecoveryCodesRequest) String() string { return proto.CompactTextString(m) } func (*GetAccountRecoveryCodesRequest) ProtoMessage() {} func (*GetAccountRecoveryCodesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{129} + return fileDescriptor_ce8bd90b12161215, []int{127} } func (m *GetAccountRecoveryCodesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8892,7 +8756,7 @@ func (m *UserCredentials) Reset() { *m = UserCredentials{} } func (m *UserCredentials) String() string { return proto.CompactTextString(m) } func (*UserCredentials) ProtoMessage() {} func (*UserCredentials) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{130} + return fileDescriptor_ce8bd90b12161215, []int{128} } func (m *UserCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8946,7 +8810,7 @@ func (m *ContextUser) Reset() { *m = ContextUser{} } func (m *ContextUser) String() string { return proto.CompactTextString(m) } func (*ContextUser) ProtoMessage() {} func (*ContextUser) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{131} + return fileDescriptor_ce8bd90b12161215, []int{129} } func (m *ContextUser) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8986,7 +8850,7 @@ func (m *Passwordless) Reset() { *m = Passwordless{} } func (m *Passwordless) String() string { return proto.CompactTextString(m) } func (*Passwordless) ProtoMessage() {} func (*Passwordless) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{132} + return fileDescriptor_ce8bd90b12161215, []int{130} } func (m *Passwordless) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9036,7 +8900,7 @@ func (m *CreateAuthenticateChallengeRequest) Reset() { *m = CreateAuthen func (m *CreateAuthenticateChallengeRequest) String() string { return proto.CompactTextString(m) } func (*CreateAuthenticateChallengeRequest) ProtoMessage() {} func (*CreateAuthenticateChallengeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{133} + return fileDescriptor_ce8bd90b12161215, []int{131} } func (m *CreateAuthenticateChallengeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9156,7 +9020,7 @@ func (m *CreatePrivilegeTokenRequest) Reset() { *m = CreatePrivilegeToke func (m *CreatePrivilegeTokenRequest) String() string { return proto.CompactTextString(m) } func (*CreatePrivilegeTokenRequest) ProtoMessage() {} func (*CreatePrivilegeTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{134} + return fileDescriptor_ce8bd90b12161215, []int{132} } func (m *CreatePrivilegeTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9212,7 +9076,7 @@ func (m *CreateRegisterChallengeRequest) Reset() { *m = CreateRegisterCh func (m *CreateRegisterChallengeRequest) String() string { return proto.CompactTextString(m) } func (*CreateRegisterChallengeRequest) ProtoMessage() {} func (*CreateRegisterChallengeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{135} + return fileDescriptor_ce8bd90b12161215, []int{133} } func (m *CreateRegisterChallengeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9283,7 +9147,7 @@ func (m *PaginatedResource) Reset() { *m = PaginatedResource{} } func (m *PaginatedResource) String() string { return proto.CompactTextString(m) } func (*PaginatedResource) ProtoMessage() {} func (*PaginatedResource) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{136} + return fileDescriptor_ce8bd90b12161215, []int{134} } func (m *PaginatedResource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9409,6 +9273,7 @@ func (*PaginatedResource) XXX_OneofWrappers() []interface{} { // one type of resource can be retrieved per request. type ListResourcesRequest struct { // ResourceType is the resource that is going to be retrieved. + // This only needs to be set explicitly for the `ListResources` rpc. ResourceType string `protobuf:"bytes,1,opt,name=ResourceType,proto3" json:"resource_type,omitempty"` // Namespace is the namespace of resources. Namespace string `protobuf:"bytes,2,opt,name=Namespace,proto3" json:"namespace,omitempty"` @@ -9443,7 +9308,7 @@ func (m *ListResourcesRequest) Reset() { *m = ListResourcesRequest{} } func (m *ListResourcesRequest) String() string { return proto.CompactTextString(m) } func (*ListResourcesRequest) ProtoMessage() {} func (*ListResourcesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{137} + return fileDescriptor_ce8bd90b12161215, []int{135} } func (m *ListResourcesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9568,7 +9433,7 @@ func (m *ListResourcesResponse) Reset() { *m = ListResourcesResponse{} } func (m *ListResourcesResponse) String() string { return proto.CompactTextString(m) } func (*ListResourcesResponse) ProtoMessage() {} func (*ListResourcesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{138} + return fileDescriptor_ce8bd90b12161215, []int{136} } func (m *ListResourcesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9679,7 +9544,7 @@ func (m *CreateSessionTrackerRequest) Reset() { *m = CreateSessionTracke func (m *CreateSessionTrackerRequest) String() string { return proto.CompactTextString(m) } func (*CreateSessionTrackerRequest) ProtoMessage() {} func (*CreateSessionTrackerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{139} + return fileDescriptor_ce8bd90b12161215, []int{137} } func (m *CreateSessionTrackerRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9826,7 +9691,7 @@ func (m *GetSessionTrackerRequest) Reset() { *m = GetSessionTrackerReque func (m *GetSessionTrackerRequest) String() string { return proto.CompactTextString(m) } func (*GetSessionTrackerRequest) ProtoMessage() {} func (*GetSessionTrackerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{140} + return fileDescriptor_ce8bd90b12161215, []int{138} } func (m *GetSessionTrackerRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9875,7 +9740,7 @@ func (m *RemoveSessionTrackerRequest) Reset() { *m = RemoveSessionTracke func (m *RemoveSessionTrackerRequest) String() string { return proto.CompactTextString(m) } func (*RemoveSessionTrackerRequest) ProtoMessage() {} func (*RemoveSessionTrackerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{141} + return fileDescriptor_ce8bd90b12161215, []int{139} } func (m *RemoveSessionTrackerRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9923,7 +9788,7 @@ func (m *SessionTrackerUpdateState) Reset() { *m = SessionTrackerUpdateS func (m *SessionTrackerUpdateState) String() string { return proto.CompactTextString(m) } func (*SessionTrackerUpdateState) ProtoMessage() {} func (*SessionTrackerUpdateState) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{142} + return fileDescriptor_ce8bd90b12161215, []int{140} } func (m *SessionTrackerUpdateState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9971,7 +9836,7 @@ func (m *SessionTrackerAddParticipant) Reset() { *m = SessionTrackerAddP func (m *SessionTrackerAddParticipant) String() string { return proto.CompactTextString(m) } func (*SessionTrackerAddParticipant) ProtoMessage() {} func (*SessionTrackerAddParticipant) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{143} + return fileDescriptor_ce8bd90b12161215, []int{141} } func (m *SessionTrackerAddParticipant) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10019,7 +9884,7 @@ func (m *SessionTrackerRemoveParticipant) Reset() { *m = SessionTrackerR func (m *SessionTrackerRemoveParticipant) String() string { return proto.CompactTextString(m) } func (*SessionTrackerRemoveParticipant) ProtoMessage() {} func (*SessionTrackerRemoveParticipant) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{144} + return fileDescriptor_ce8bd90b12161215, []int{142} } func (m *SessionTrackerRemoveParticipant) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10068,7 +9933,7 @@ func (m *SessionTrackerUpdateExpiry) Reset() { *m = SessionTrackerUpdate func (m *SessionTrackerUpdateExpiry) String() string { return proto.CompactTextString(m) } func (*SessionTrackerUpdateExpiry) ProtoMessage() {} func (*SessionTrackerUpdateExpiry) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{145} + return fileDescriptor_ce8bd90b12161215, []int{143} } func (m *SessionTrackerUpdateExpiry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10123,7 +9988,7 @@ func (m *UpdateSessionTrackerRequest) Reset() { *m = UpdateSessionTracke func (m *UpdateSessionTrackerRequest) String() string { return proto.CompactTextString(m) } func (*UpdateSessionTrackerRequest) ProtoMessage() {} func (*UpdateSessionTrackerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{146} + return fileDescriptor_ce8bd90b12161215, []int{144} } func (m *UpdateSessionTrackerRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10241,7 +10106,7 @@ func (m *PresenceMFAChallengeRequest) Reset() { *m = PresenceMFAChalleng func (m *PresenceMFAChallengeRequest) String() string { return proto.CompactTextString(m) } func (*PresenceMFAChallengeRequest) ProtoMessage() {} func (*PresenceMFAChallengeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{147} + return fileDescriptor_ce8bd90b12161215, []int{145} } func (m *PresenceMFAChallengeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10292,7 +10157,7 @@ func (m *PresenceMFAChallengeSend) Reset() { *m = PresenceMFAChallengeSe func (m *PresenceMFAChallengeSend) String() string { return proto.CompactTextString(m) } func (*PresenceMFAChallengeSend) ProtoMessage() {} func (*PresenceMFAChallengeSend) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{148} + return fileDescriptor_ce8bd90b12161215, []int{146} } func (m *PresenceMFAChallengeSend) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10378,7 +10243,7 @@ func (m *GetDomainNameResponse) Reset() { *m = GetDomainNameResponse{} } func (m *GetDomainNameResponse) String() string { return proto.CompactTextString(m) } func (*GetDomainNameResponse) ProtoMessage() {} func (*GetDomainNameResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{149} + return fileDescriptor_ce8bd90b12161215, []int{147} } func (m *GetDomainNameResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10427,7 +10292,7 @@ func (m *GetClusterCACertResponse) Reset() { *m = GetClusterCACertRespon func (m *GetClusterCACertResponse) String() string { return proto.CompactTextString(m) } func (*GetClusterCACertResponse) ProtoMessage() {} func (*GetClusterCACertResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ce8bd90b12161215, []int{150} + return fileDescriptor_ce8bd90b12161215, []int{148} } func (m *GetClusterCACertResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10575,9 +10440,6 @@ func init() { proto.RegisterType((*GetEventsRequest)(nil), "proto.GetEventsRequest") proto.RegisterType((*GetSessionEventsRequest)(nil), "proto.GetSessionEventsRequest") proto.RegisterType((*Events)(nil), "proto.Events") - proto.RegisterType((*ListNodesRequest)(nil), "proto.ListNodesRequest") - proto.RegisterMapType((map[string]string)(nil), "proto.ListNodesRequest.LabelsEntry") - proto.RegisterType((*ListNodesResponse)(nil), "proto.ListNodesResponse") proto.RegisterType((*GetLocksRequest)(nil), "proto.GetLocksRequest") proto.RegisterType((*GetLocksResponse)(nil), "proto.GetLocksResponse") proto.RegisterType((*GetLockRequest)(nil), "proto.GetLockRequest") @@ -10629,621 +10491,614 @@ func init() { func init() { proto.RegisterFile("authservice.proto", fileDescriptor_ce8bd90b12161215) } var fileDescriptor_ce8bd90b12161215 = []byte{ - // 9809 bytes of a gzipped FileDescriptorProto + // 9709 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x7d, 0x5b, 0x6c, 0x5c, 0xc9, - 0xb6, 0x50, 0xba, 0xfd, 0x6a, 0x2f, 0x3f, 0xd2, 0x2e, 0xdb, 0x71, 0xa7, 0xe3, 0xb8, 0x93, 0x9d, - 0x99, 0x9c, 0xcc, 0xdc, 0x73, 0x93, 0x8c, 0x3d, 0xef, 0x99, 0x33, 0x73, 0xba, 0xdb, 0x8e, 0xed, - 0x89, 0xe3, 0x78, 0x76, 0x3b, 0xce, 0x30, 0x67, 0xee, 0xe9, 0xd9, 0xee, 0xae, 0xd8, 0x1b, 0xb7, - 0x7b, 0xf7, 0xd9, 0x7b, 0x3b, 0x99, 0x08, 0x81, 0x78, 0x5d, 0x40, 0x48, 0x88, 0x8b, 0xc4, 0x15, - 0x20, 0x3e, 0xb8, 0x12, 0x7c, 0x81, 0xe0, 0x03, 0x21, 0xbe, 0x90, 0xee, 0x0f, 0x82, 0x03, 0x12, - 0xe2, 0xfe, 0x5c, 0x21, 0xdd, 0x0f, 0x73, 0x38, 0x5f, 0xc8, 0x7f, 0x08, 0x81, 0xc4, 0xf9, 0x42, - 0xb5, 0xea, 0xb1, 0xab, 0xf6, 0xa3, 0xdb, 0x4e, 0xc2, 0xe5, 0x27, 0xf1, 0xae, 0xaa, 0xb5, 0xaa, - 0x6a, 0xd5, 0xaa, 0xb5, 0x56, 0xad, 0x5a, 0xb5, 0x1a, 0x66, 0x9c, 0x93, 0xf0, 0x30, 0xa0, 0xfe, - 0x73, 0xb7, 0x45, 0xef, 0xf6, 0x7c, 0x2f, 0xf4, 0xc8, 0x08, 0xfe, 0x57, 0x9e, 0x3b, 0xf0, 0x0e, - 0x3c, 0xfc, 0xf3, 0x1e, 0xfb, 0x8b, 0x57, 0x96, 0xaf, 0x1d, 0x78, 0xde, 0x41, 0x87, 0xde, 0xc3, - 0xaf, 0xfd, 0x93, 0x67, 0xf7, 0xe8, 0x71, 0x2f, 0x7c, 0x29, 0x2a, 0x2b, 0xf1, 0xca, 0xd0, 0x3d, - 0xa6, 0x41, 0xe8, 0x1c, 0xf7, 0x44, 0x83, 0x89, 0x16, 0xf5, 0xc3, 0x40, 0x7c, 0x7c, 0x74, 0xe0, - 0x86, 0x87, 0x27, 0xfb, 0x77, 0x5b, 0xde, 0xf1, 0xbd, 0x03, 0xdf, 0x79, 0xee, 0x86, 0x4e, 0xe8, - 0x7a, 0x5d, 0xa7, 0x73, 0x2f, 0xa4, 0x1d, 0xda, 0xf3, 0xfc, 0xf0, 0x9e, 0xd3, 0x73, 0xef, 0x85, - 0x2f, 0x7b, 0x34, 0xe0, 0xff, 0x0a, 0xc0, 0xfa, 0x45, 0x00, 0x5f, 0xd0, 0x7d, 0x36, 0xc5, 0xae, - 0xfa, 0xe3, 0x95, 0x90, 0xf8, 0x4e, 0xaf, 0x47, 0xfd, 0xe8, 0x0f, 0x81, 0xe4, 0xcb, 0x8b, 0x20, - 0xa1, 0xcf, 0x69, 0x37, 0x94, 0xff, 0x71, 0x04, 0xd6, 0x3f, 0x9b, 0x83, 0x91, 0x35, 0x56, 0x40, - 0x3e, 0x86, 0xe1, 0xdd, 0x97, 0x3d, 0x5a, 0xca, 0xdd, 0xc8, 0xdd, 0x99, 0x5e, 0x2e, 0xf2, 0xfa, - 0xbb, 0x8f, 0x7b, 0xd4, 0x47, 0x94, 0x35, 0x72, 0x76, 0x5a, 0x99, 0x66, 0x88, 0x7e, 0xec, 0x1d, - 0xbb, 0x21, 0x52, 0xdd, 0x46, 0x08, 0xf2, 0x14, 0xa6, 0x6d, 0x1a, 0x78, 0x27, 0x7e, 0x8b, 0x6e, - 0x50, 0xa7, 0x4d, 0xfd, 0x52, 0xfe, 0x46, 0xee, 0xce, 0xc4, 0xf2, 0xfc, 0x5d, 0x4e, 0x34, 0xb3, - 0xb2, 0x76, 0xe5, 0xec, 0xb4, 0x42, 0x7c, 0x51, 0x16, 0x21, 0xdb, 0xb8, 0x64, 0xc7, 0xd0, 0x90, - 0xef, 0x60, 0xaa, 0x4e, 0xfd, 0xb0, 0x7a, 0x12, 0x1e, 0x7a, 0xbe, 0x1b, 0xbe, 0x2c, 0x0d, 0x21, - 0xde, 0x2b, 0x02, 0xaf, 0x51, 0xb7, 0xb7, 0x5c, 0x5b, 0x3c, 0x3b, 0xad, 0x94, 0xd8, 0x02, 0x37, - 0x1d, 0x59, 0x6a, 0xa0, 0x37, 0x91, 0x91, 0x6f, 0x60, 0xb2, 0xc1, 0xc8, 0xd5, 0xda, 0xf5, 0x8e, - 0x68, 0x37, 0x28, 0x0d, 0x1b, 0x83, 0xd6, 0xab, 0xf6, 0x96, 0x6b, 0xd7, 0xce, 0x4e, 0x2b, 0x0b, - 0x01, 0x96, 0x35, 0x43, 0x2c, 0x34, 0x50, 0x1b, 0x98, 0xc8, 0xf7, 0x30, 0xbd, 0xe3, 0x7b, 0xcf, - 0xdd, 0xc0, 0xf5, 0xba, 0x58, 0x54, 0x1a, 0x41, 0xdc, 0x0b, 0x02, 0xb7, 0x59, 0xb9, 0xb7, 0x5c, - 0xbb, 0x7e, 0x76, 0x5a, 0xb9, 0xda, 0x93, 0xa5, 0xbc, 0x03, 0x93, 0x32, 0x26, 0x08, 0xd9, 0x85, - 0x89, 0x7a, 0xe7, 0x24, 0x08, 0xa9, 0xbf, 0xed, 0x1c, 0xd3, 0xd2, 0x28, 0xa2, 0x9f, 0x93, 0x74, - 0x89, 0x6a, 0xf6, 0x96, 0x6b, 0xe5, 0xb3, 0xd3, 0xca, 0x95, 0x16, 0x2f, 0x6a, 0x76, 0x9d, 0x63, - 0x93, 0xe4, 0x3a, 0x1a, 0xf2, 0x11, 0x0c, 0x3f, 0x09, 0xa8, 0x5f, 0x2a, 0x20, 0xba, 0x29, 0x81, - 0x8e, 0x15, 0xed, 0x2d, 0xf3, 0xf5, 0x3f, 0x09, 0xa8, 0x6f, 0xc0, 0x23, 0x00, 0x03, 0xb4, 0xbd, - 0x0e, 0x2d, 0x8d, 0x1b, 0x80, 0xac, 0x68, 0xef, 0x03, 0x0e, 0xe8, 0x7b, 0x1d, 0xb3, 0x63, 0x04, - 0x20, 0x9b, 0x30, 0xce, 0x7a, 0x0e, 0x7a, 0x4e, 0x8b, 0x96, 0x00, 0xa1, 0x8b, 0x02, 0x5a, 0x95, - 0xd7, 0x16, 0xce, 0x4e, 0x2b, 0xb3, 0x5d, 0xf9, 0x69, 0x60, 0x89, 0xa0, 0xc9, 0x97, 0x30, 0xda, - 0xa0, 0xfe, 0x73, 0xea, 0x97, 0x26, 0x10, 0xcf, 0x65, 0xb9, 0x90, 0x58, 0xb8, 0xb7, 0x5c, 0x9b, - 0x3b, 0x3b, 0xad, 0x14, 0x03, 0xfc, 0x32, 0x70, 0x08, 0x30, 0xc6, 0x6d, 0x36, 0x7d, 0x4e, 0xfd, - 0x80, 0xee, 0x9e, 0x74, 0xbb, 0xb4, 0x53, 0x9a, 0x34, 0xb8, 0xcd, 0xa8, 0x93, 0xdc, 0xe6, 0xf3, - 0xc2, 0x66, 0x88, 0xa5, 0x26, 0xb7, 0x19, 0x00, 0xe4, 0x10, 0x8a, 0xfc, 0xaf, 0xba, 0xd7, 0xed, - 0xd2, 0x16, 0xdb, 0x52, 0xa5, 0x29, 0xec, 0xe0, 0xaa, 0xe8, 0x20, 0x5e, 0xbd, 0xb7, 0x5c, 0xab, - 0x9c, 0x9d, 0x56, 0xae, 0x71, 0xdc, 0xcd, 0x96, 0xaa, 0x30, 0xba, 0x49, 0x60, 0x65, 0xf3, 0xa8, - 0xb6, 0x5a, 0x34, 0x08, 0x6c, 0xfa, 0x8b, 0x13, 0x1a, 0x84, 0xa5, 0x69, 0x63, 0x1e, 0x46, 0xdd, - 0xde, 0x0a, 0x9f, 0x87, 0x83, 0x85, 0x4d, 0x9f, 0x97, 0x9a, 0xf3, 0x30, 0x00, 0xc8, 0x0e, 0x40, - 0xb5, 0xd7, 0x6b, 0xd0, 0x80, 0x31, 0x63, 0xe9, 0x32, 0xa2, 0x9e, 0x15, 0xa8, 0x9f, 0xd2, 0x7d, - 0x51, 0xb1, 0xb7, 0x5c, 0xbb, 0x7a, 0x76, 0x5a, 0x99, 0x77, 0x7a, 0xbd, 0x66, 0xc0, 0x8b, 0x0c, - 0xa4, 0x1a, 0x0e, 0x4e, 0xf7, 0x63, 0x2f, 0xa4, 0x82, 0x15, 0x4b, 0xc5, 0x18, 0xdd, 0xb5, 0x3a, - 0x39, 0x5e, 0x1f, 0x0b, 0x9b, 0x82, 0xad, 0xe3, 0x74, 0xd7, 0x00, 0xd8, 0x5e, 0x5c, 0x75, 0x42, - 0x67, 0xdf, 0x09, 0xa8, 0x60, 0x8f, 0x19, 0x63, 0x2f, 0x9a, 0x95, 0x7b, 0x2b, 0x7c, 0x2f, 0xb6, - 0x45, 0x69, 0x33, 0x85, 0x5f, 0x62, 0xf8, 0x18, 0x45, 0xa2, 0x89, 0x97, 0xc8, 0x00, 0x8a, 0xbc, - 0xa0, 0xfb, 0xe9, 0x14, 0x89, 0x9a, 0x92, 0x0d, 0x28, 0x3c, 0xa5, 0xfb, 0x5c, 0x72, 0xcc, 0x22, - 0xbe, 0x99, 0x08, 0x1f, 0x97, 0x19, 0x2b, 0x7c, 0x57, 0x30, 0x6c, 0x49, 0x69, 0xa1, 0xa0, 0xc9, - 0xef, 0xe6, 0x60, 0x41, 0xee, 0x70, 0x1a, 0xbe, 0xf0, 0xfc, 0x23, 0xb7, 0x7b, 0x50, 0xf7, 0xba, - 0xcf, 0xdc, 0x83, 0xd2, 0x1c, 0x62, 0xbe, 0x11, 0x13, 0x1a, 0xb1, 0x56, 0x7b, 0xcb, 0xb5, 0x1f, - 0x9d, 0x9d, 0x56, 0x6e, 0x29, 0x01, 0xa2, 0xea, 0x19, 0x43, 0x3e, 0x73, 0x0f, 0x8c, 0x8e, 0xb3, - 0xfa, 0x22, 0x7f, 0x29, 0x07, 0x57, 0xc4, 0xec, 0x6c, 0xda, 0xf2, 0xfc, 0x76, 0x34, 0x8c, 0x79, - 0x1c, 0x46, 0x45, 0xed, 0xd6, 0xb4, 0x46, 0x7b, 0xcb, 0xb5, 0xdb, 0x67, 0xa7, 0x15, 0x4b, 0x10, - 0xae, 0xe9, 0xcb, 0xea, 0xb4, 0x41, 0x64, 0x74, 0xc4, 0x38, 0x81, 0x09, 0xff, 0x1d, 0x9f, 0x3e, - 0xa3, 0x3e, 0xed, 0xb6, 0x68, 0xe9, 0x8a, 0xc1, 0x09, 0x66, 0xa5, 0x94, 0xca, 0x4c, 0x95, 0x34, - 0x7b, 0xaa, 0xd8, 0xe4, 0x04, 0x13, 0x84, 0xfc, 0x02, 0x88, 0x20, 0x40, 0xf5, 0xa4, 0xed, 0x86, - 0x62, 0x82, 0x0b, 0xd8, 0xcb, 0x35, 0x93, 0xce, 0x5a, 0x83, 0xbd, 0xe5, 0x9a, 0x75, 0x76, 0x5a, - 0x59, 0x92, 0x24, 0x76, 0x58, 0x55, 0xda, 0xc4, 0x52, 0x90, 0x33, 0xc9, 0xbb, 0xe5, 0xb5, 0x8e, - 0x4a, 0x25, 0x43, 0xf2, 0xb2, 0x22, 0x29, 0xb2, 0x3b, 0x5e, 0xeb, 0xc8, 0x94, 0xbc, 0xac, 0x96, - 0x84, 0x30, 0x2b, 0x56, 0xc9, 0xa6, 0x41, 0xe8, 0xbb, 0x28, 0x3b, 0x82, 0xd2, 0x55, 0xc4, 0xb3, - 0x28, 0x65, 0x70, 0xb2, 0xc5, 0xde, 0xfb, 0x7c, 0xb4, 0x82, 0x11, 0x9a, 0xbe, 0x56, 0x67, 0x74, - 0x93, 0x86, 0x9e, 0xfc, 0x79, 0x98, 0x7f, 0xea, 0x76, 0xdb, 0xde, 0x8b, 0x60, 0x95, 0x06, 0x47, - 0xa1, 0xd7, 0x6b, 0x70, 0xcb, 0xaf, 0x54, 0xc6, 0x7e, 0x97, 0x24, 0x9b, 0xa7, 0xb5, 0xd9, 0x5b, - 0xa9, 0xbd, 0x7d, 0x76, 0x5a, 0xb9, 0xf9, 0x82, 0x57, 0x36, 0xdb, 0xbc, 0xb6, 0x29, 0x8c, 0x47, - 0xa3, 0xf3, 0xf4, 0x5e, 0x18, 0x0b, 0x98, 0x15, 0xa5, 0x6b, 0x06, 0x0b, 0x98, 0x95, 0x52, 0x18, - 0xc4, 0x3a, 0x34, 0x59, 0xc0, 0x04, 0x21, 0xeb, 0x50, 0x90, 0xe2, 0xa1, 0xb4, 0x68, 0x6c, 0x5d, - 0x59, 0xbc, 0xb7, 0xc2, 0x2d, 0x20, 0x29, 0x62, 0xcc, 0x9d, 0x2b, 0x5b, 0x91, 0x2d, 0x18, 0x47, - 0x19, 0x89, 0x22, 0xeb, 0x3a, 0x62, 0x22, 0x92, 0x51, 0x65, 0xf9, 0xde, 0x4a, 0xad, 0x74, 0x76, - 0x5a, 0x99, 0xe3, 0x52, 0x36, 0x21, 0xa8, 0x22, 0x04, 0x64, 0x05, 0x86, 0xaa, 0xbd, 0x5e, 0x69, - 0x09, 0xf1, 0x4c, 0x46, 0x78, 0xf6, 0x56, 0x6a, 0x33, 0x67, 0xa7, 0x95, 0x29, 0xa7, 0x67, 0x4e, - 0x8b, 0xb5, 0xae, 0x01, 0x14, 0xa4, 0x41, 0xf6, 0xd5, 0x70, 0x61, 0xac, 0x58, 0xb0, 0x36, 0x60, - 0xe4, 0xa9, 0x13, 0xb6, 0x0e, 0xc9, 0x97, 0x30, 0xf2, 0xd0, 0xed, 0xb6, 0x83, 0x52, 0xee, 0xc6, - 0x10, 0xea, 0x6c, 0x6e, 0x2d, 0x62, 0x25, 0xab, 0xa8, 0x2d, 0xfc, 0xf2, 0xb4, 0x72, 0xe9, 0xec, - 0xb4, 0x72, 0xf9, 0x88, 0x35, 0xd3, 0x4c, 0x46, 0x0e, 0x67, 0xfd, 0xab, 0x3c, 0x8c, 0xab, 0xd6, - 0x64, 0x11, 0x86, 0xd9, 0xff, 0x68, 0x7b, 0x8e, 0xd7, 0x0a, 0x67, 0xa7, 0x95, 0x61, 0x06, 0x67, - 0x63, 0x29, 0x59, 0x86, 0x89, 0x2d, 0xcf, 0x69, 0x37, 0x68, 0xcb, 0xa7, 0x61, 0x80, 0xc6, 0x65, - 0xa1, 0x56, 0x3c, 0x3b, 0xad, 0x4c, 0x76, 0x3c, 0xa7, 0xdd, 0x0c, 0x78, 0xb9, 0xad, 0x37, 0x62, - 0x18, 0xd1, 0x32, 0x1a, 0x8a, 0x30, 0x32, 0x0b, 0xc2, 0xc6, 0x52, 0xf2, 0x15, 0x8c, 0x3e, 0x70, - 0x3b, 0x4c, 0xd7, 0x0c, 0xe3, 0xf8, 0x17, 0xe3, 0xe3, 0xbf, 0xcb, 0xab, 0xd7, 0xba, 0xa1, 0xff, - 0x92, 0x1b, 0x0e, 0xcf, 0xb0, 0x40, 0x9b, 0x88, 0xc0, 0x40, 0xee, 0xc3, 0x58, 0xe3, 0x64, 0x1f, - 0x87, 0x3f, 0x82, 0x9d, 0xe1, 0xea, 0x06, 0x27, 0xfb, 0x4d, 0x36, 0x05, 0x0d, 0x40, 0x36, 0x2b, - 0x7f, 0x02, 0x13, 0x1a, 0x7a, 0x52, 0x84, 0xa1, 0x23, 0xfa, 0x92, 0xcf, 0xdd, 0x66, 0x7f, 0x92, - 0x39, 0x18, 0x79, 0xee, 0x74, 0x4e, 0x28, 0x4e, 0x75, 0xdc, 0xe6, 0x1f, 0x9f, 0xe6, 0x3f, 0xce, - 0x59, 0xff, 0x79, 0x18, 0x8a, 0x1b, 0x5e, 0x10, 0x32, 0x4b, 0x56, 0xa9, 0xe4, 0x5b, 0x30, 0xca, - 0xca, 0x36, 0x57, 0x05, 0xfd, 0x26, 0xce, 0x4e, 0x2b, 0x63, 0x87, 0x5e, 0x10, 0x36, 0xdd, 0xb6, - 0x2d, 0xaa, 0xc8, 0x3b, 0x50, 0xd8, 0xf6, 0xda, 0x14, 0x89, 0x82, 0x68, 0x6b, 0x53, 0x67, 0xa7, - 0x95, 0xf1, 0xae, 0xd7, 0xa6, 0x68, 0x15, 0xda, 0xaa, 0x9a, 0xec, 0x09, 0x6b, 0x8e, 0xd3, 0xae, - 0xc6, 0x68, 0xc7, 0xcc, 0xb7, 0xdf, 0x9c, 0x56, 0x3e, 0xbc, 0xc0, 0x71, 0xe3, 0x6e, 0xe3, 0x65, - 0x10, 0xd2, 0x63, 0x86, 0x49, 0x18, 0x7b, 0x4f, 0x61, 0xae, 0xda, 0x6e, 0xbb, 0x1c, 0x62, 0xc7, - 0x77, 0xbb, 0x2d, 0xb7, 0xe7, 0x74, 0x02, 0x5c, 0x83, 0xf1, 0xda, 0xad, 0xb3, 0xd3, 0x4a, 0xc5, - 0x51, 0xf5, 0xcd, 0x9e, 0x6a, 0xa0, 0xd1, 0x30, 0x15, 0x01, 0x59, 0x81, 0xc2, 0xea, 0x76, 0x03, - 0x4d, 0xc1, 0xd2, 0x08, 0x22, 0x43, 0xe5, 0xd8, 0xee, 0x06, 0x38, 0x35, 0x1d, 0x81, 0x6a, 0x48, - 0x3e, 0x84, 0xc9, 0x9d, 0x93, 0xfd, 0x8e, 0xdb, 0xda, 0xdd, 0x6a, 0x3c, 0xa4, 0x2f, 0xd1, 0x86, - 0x9e, 0xe4, 0x22, 0xb3, 0x87, 0xe5, 0xcd, 0xb0, 0x13, 0x34, 0x8f, 0xe8, 0x4b, 0xdb, 0x68, 0x17, - 0xc1, 0x35, 0x1a, 0x1b, 0x0c, 0x6e, 0x2c, 0x01, 0x17, 0x04, 0x87, 0x3a, 0x1c, 0x6f, 0x47, 0xee, - 0x01, 0x70, 0xcb, 0xa4, 0xda, 0x6e, 0x73, 0x13, 0x7b, 0xbc, 0x76, 0xf9, 0xec, 0xb4, 0x32, 0x21, - 0x6c, 0x19, 0xa7, 0xdd, 0xf6, 0x6d, 0xad, 0x09, 0xa9, 0x43, 0xc1, 0xf6, 0x38, 0x81, 0x85, 0x61, - 0x7d, 0x59, 0x19, 0xd6, 0xbc, 0x58, 0x1c, 0xa5, 0xc4, 0x97, 0x3e, 0x4b, 0xd9, 0x82, 0x54, 0x60, - 0x6c, 0xdb, 0xab, 0x3b, 0xad, 0x43, 0x6e, 0x5e, 0x17, 0x6a, 0x23, 0x67, 0xa7, 0x95, 0xdc, 0x6f, - 0xdb, 0xb2, 0xd4, 0xfa, 0x27, 0x05, 0x28, 0x32, 0x1b, 0xde, 0xe0, 0xa8, 0x1f, 0xc3, 0x38, 0x1f, - 0xfb, 0x43, 0xc1, 0x98, 0x93, 0xb5, 0xe9, 0xb3, 0xd3, 0x0a, 0x88, 0x09, 0xb2, 0xc9, 0x45, 0x0d, - 0xc8, 0x1d, 0x28, 0x30, 0x0c, 0xdd, 0x88, 0xb5, 0x26, 0xcf, 0x4e, 0x2b, 0x85, 0x13, 0x51, 0x66, - 0xab, 0x5a, 0xd2, 0x80, 0xb1, 0xb5, 0x1f, 0x7a, 0xae, 0x4f, 0x03, 0x71, 0x94, 0x2b, 0xdf, 0xe5, - 0x27, 0xf6, 0xbb, 0xf2, 0xc4, 0x7e, 0x77, 0x57, 0x9e, 0xd8, 0x6b, 0xd7, 0x85, 0x08, 0x99, 0xa1, - 0x1c, 0x24, 0x9a, 0xdf, 0xef, 0xfd, 0xd7, 0x4a, 0xce, 0x96, 0x98, 0xc8, 0x8f, 0x61, 0xf4, 0x81, - 0xe7, 0x1f, 0x3b, 0x21, 0x9e, 0xe0, 0xc6, 0xc5, 0x76, 0xc5, 0x12, 0x63, 0xbb, 0x62, 0x09, 0x79, - 0x00, 0xd3, 0xb6, 0x77, 0x12, 0xd2, 0x5d, 0x4f, 0x9a, 0x9b, 0x7c, 0xd7, 0x2e, 0x9d, 0x9d, 0x56, - 0xca, 0x3e, 0xab, 0x69, 0x86, 0x5e, 0xd2, 0xb0, 0xb4, 0x63, 0x50, 0x64, 0x0d, 0xa6, 0x0d, 0xc3, - 0x38, 0x28, 0x8d, 0x22, 0xe7, 0x71, 0xa3, 0xc1, 0x30, 0xa7, 0x75, 0xfe, 0x8b, 0x01, 0x91, 0x6d, - 0x98, 0x79, 0x78, 0xb2, 0x4f, 0xfd, 0x2e, 0x0d, 0x69, 0x20, 0x47, 0x34, 0x86, 0x23, 0xba, 0x71, - 0x76, 0x5a, 0x59, 0x3c, 0x52, 0x95, 0x29, 0x63, 0x4a, 0x82, 0x12, 0x0a, 0x97, 0xc5, 0x40, 0x95, - 0x1a, 0x2a, 0x08, 0x73, 0x9a, 0x8b, 0xb8, 0x58, 0x6d, 0xed, 0x96, 0xa0, 0xf2, 0x35, 0x35, 0xf7, - 0xa4, 0x62, 0xb2, 0xe3, 0x38, 0xd9, 0x8e, 0x53, 0xd2, 0x64, 0x1c, 0x47, 0xcb, 0x0f, 0x69, 0x52, - 0x9a, 0xe8, 0xbc, 0xa8, 0xe4, 0xca, 0x16, 0x8c, 0x3c, 0x09, 0x9c, 0x03, 0xce, 0x89, 0xd3, 0xcb, - 0x37, 0xc5, 0x88, 0xe2, 0xdc, 0x87, 0xe7, 0x7a, 0x6c, 0x58, 0x9b, 0x65, 0x1a, 0xe4, 0x84, 0xfd, - 0xa9, 0x6b, 0x10, 0xac, 0x23, 0x5f, 0x03, 0x88, 0x51, 0x31, 0xcd, 0x36, 0x21, 0x74, 0xad, 0x31, - 0x49, 0xa6, 0xc4, 0x96, 0xc4, 0xfc, 0xae, 0xa8, 0xf9, 0x19, 0xba, 0xce, 0xd6, 0x90, 0x90, 0x2f, - 0x61, 0x12, 0xc5, 0x95, 0x5c, 0xd1, 0x49, 0x5c, 0x51, 0x3c, 0xfa, 0x33, 0x01, 0x98, 0xb6, 0x9e, - 0x06, 0x00, 0xf9, 0x0b, 0x30, 0x2f, 0xd0, 0xc5, 0xcc, 0x8c, 0x29, 0x61, 0x56, 0x19, 0xc3, 0x33, - 0xdb, 0xd4, 0xde, 0x15, 0x23, 0xb5, 0xd4, 0x48, 0x33, 0x0d, 0x0f, 0x3b, 0xbd, 0x1b, 0xeb, 0x1b, - 0x18, 0x57, 0xc4, 0x23, 0x63, 0x30, 0x54, 0xed, 0x74, 0x8a, 0x97, 0xd8, 0x1f, 0x8d, 0xc6, 0x46, - 0x31, 0x47, 0xa6, 0x01, 0x22, 0x8e, 0x29, 0xe6, 0xc9, 0x64, 0x64, 0xac, 0x14, 0x87, 0xb0, 0x7d, - 0xaf, 0x57, 0x1c, 0x26, 0x24, 0x6e, 0x25, 0x15, 0x47, 0xac, 0xff, 0x92, 0x4b, 0x30, 0x16, 0xd3, - 0xcb, 0xc2, 0xb0, 0x42, 0x3e, 0xe0, 0xca, 0x07, 0xf5, 0xb2, 0x30, 0xc9, 0xb8, 0x62, 0xd1, 0x1b, - 0x31, 0x59, 0xb1, 0xc3, 0x68, 0xd0, 0xf2, 0x3a, 0xba, 0xac, 0xe8, 0x89, 0x32, 0x5b, 0xd5, 0x92, - 0x65, 0x4d, 0xaa, 0x0c, 0x45, 0x8a, 0x55, 0x4a, 0x15, 0x9d, 0xc3, 0x94, 0x7c, 0x59, 0xd6, 0xac, - 0xaf, 0xe1, 0x08, 0x26, 0x85, 0xa3, 0x55, 0x3b, 0xeb, 0x24, 0x63, 0xcd, 0xc8, 0x67, 0x09, 0x63, - 0x91, 0xcf, 0x10, 0x99, 0x32, 0xb6, 0x34, 0x09, 0x3b, 0xb0, 0x02, 0x23, 0x5b, 0xde, 0x81, 0xdb, - 0x15, 0x93, 0x1c, 0x3f, 0x3b, 0xad, 0x8c, 0x74, 0x58, 0x81, 0xcd, 0xcb, 0xad, 0xff, 0x93, 0xd3, - 0xf9, 0x57, 0xd9, 0x2b, 0xb9, 0x54, 0x7b, 0xe5, 0xc7, 0x30, 0x2e, 0x0e, 0x35, 0x9b, 0xab, 0x02, - 0x23, 0xca, 0x63, 0x79, 0x1e, 0x72, 0xdb, 0x76, 0xd4, 0x80, 0x69, 0x1a, 0x2e, 0x9c, 0x51, 0xd3, - 0x0c, 0x45, 0x9a, 0x46, 0x88, 0x6f, 0xae, 0x69, 0xa2, 0x26, 0x6c, 0x21, 0x75, 0x6f, 0xd2, 0x70, - 0xb4, 0x90, 0xba, 0xdf, 0xc8, 0xf4, 0x15, 0x7d, 0x0a, 0x50, 0x7d, 0xda, 0x60, 0xdc, 0x5f, 0xb5, - 0xb7, 0x85, 0x0c, 0x45, 0x57, 0x93, 0xf3, 0x22, 0x68, 0xe2, 0x6e, 0x71, 0x7c, 0x5d, 0x25, 0x69, - 0xad, 0xad, 0x0e, 0x4c, 0xaf, 0xd3, 0x90, 0xad, 0x9a, 0x54, 0x38, 0xfd, 0xa7, 0xff, 0x39, 0x4c, - 0x3c, 0x75, 0xc3, 0x43, 0xd3, 0x00, 0xc4, 0xce, 0x5e, 0xb8, 0xe1, 0xa1, 0x34, 0x00, 0xb5, 0xce, - 0xf4, 0xe6, 0xd6, 0x1a, 0x5c, 0x16, 0xbd, 0x29, 0xfd, 0xb6, 0x6c, 0x22, 0xcc, 0x45, 0x16, 0xa5, - 0x8e, 0xd0, 0x44, 0x43, 0xe3, 0x02, 0x9f, 0x34, 0x12, 0x2a, 0x80, 0x5b, 0xc3, 0x59, 0x9e, 0x16, - 0x64, 0x9c, 0x98, 0x6a, 0x88, 0x2b, 0x04, 0xeb, 0x09, 0x4c, 0xed, 0x74, 0x4e, 0x0e, 0xdc, 0x2e, - 0x63, 0xd0, 0x06, 0xfd, 0x05, 0x59, 0x05, 0x88, 0x0a, 0x44, 0x0f, 0xd2, 0xbd, 0x10, 0x55, 0xec, - 0xad, 0x88, 0x25, 0xc6, 0x12, 0x94, 0xe1, 0xb6, 0x06, 0x67, 0xfd, 0xcd, 0x21, 0x20, 0xa2, 0x8f, - 0x46, 0xe8, 0x84, 0xb4, 0x41, 0x43, 0xa6, 0x2e, 0xae, 0x40, 0x5e, 0x99, 0x8d, 0xa3, 0x67, 0xa7, - 0x95, 0xbc, 0xdb, 0xb6, 0xf3, 0x9b, 0xab, 0xe4, 0x7d, 0x18, 0xc1, 0x66, 0x48, 0xeb, 0x69, 0xd5, - 0x9f, 0x8e, 0x81, 0xf3, 0x74, 0xc0, 0xfe, 0xb4, 0x79, 0x63, 0xf2, 0x01, 0x8c, 0xaf, 0xd2, 0x0e, - 0x3d, 0x70, 0x42, 0x4f, 0xf2, 0x1d, 0x37, 0xc4, 0x64, 0xa1, 0xb6, 0x44, 0x51, 0x4b, 0xa6, 0xc0, - 0x6d, 0xea, 0x04, 0x5e, 0x57, 0x57, 0xe0, 0x3e, 0x96, 0xe8, 0x0a, 0x9c, 0xb7, 0x21, 0xbf, 0x9f, - 0x83, 0x89, 0x6a, 0xb7, 0x2b, 0x0c, 0x9c, 0x40, 0xb8, 0x56, 0xe7, 0xef, 0x2a, 0xcf, 0xf8, 0x96, - 0xb3, 0x4f, 0x3b, 0x7b, 0xcc, 0x64, 0x0e, 0x6a, 0xdf, 0x31, 0x99, 0xfa, 0x27, 0xa7, 0x95, 0xcf, - 0x5e, 0xc5, 0xd9, 0x7e, 0x77, 0xd7, 0x77, 0xdc, 0x30, 0x40, 0x3f, 0x56, 0xd4, 0xa1, 0xce, 0x66, - 0xda, 0x38, 0xc8, 0x3b, 0x30, 0xc2, 0xf8, 0x5b, 0xda, 0x01, 0xb8, 0xd8, 0x6c, 0x1f, 0x18, 0x87, - 0x1f, 0x6c, 0x61, 0xdd, 0x82, 0x71, 0x41, 0xc9, 0xcd, 0xd5, 0xac, 0x25, 0xb0, 0x56, 0xe1, 0x3a, - 0x5a, 0x71, 0x94, 0x71, 0x2e, 0x7a, 0x73, 0x04, 0x27, 0x46, 0x66, 0xff, 0x18, 0x16, 0x2b, 0x68, - 0x5c, 0x10, 0xf4, 0x06, 0xd9, 0xb2, 0xc6, 0xaa, 0xc3, 0xe2, 0x3a, 0x0d, 0x6d, 0x1a, 0xd0, 0x70, - 0xc7, 0x09, 0x82, 0x17, 0x9e, 0xdf, 0xc6, 0xaa, 0x0b, 0x21, 0xf9, 0xab, 0x39, 0xa8, 0xd4, 0x7d, - 0xca, 0x56, 0x3a, 0x13, 0x51, 0xff, 0x1d, 0xbc, 0x28, 0x2e, 0x17, 0xf2, 0x51, 0x2d, 0xa3, 0xb5, - 0xb8, 0x40, 0x78, 0x1b, 0x86, 0x76, 0x77, 0xb7, 0x90, 0x63, 0x86, 0x90, 0x70, 0x43, 0x61, 0xd8, - 0xf9, 0xcd, 0x69, 0xa5, 0xb0, 0x7a, 0xc2, 0x2f, 0x1f, 0x6c, 0x56, 0x6f, 0x3d, 0x83, 0x79, 0x9b, - 0x76, 0xe9, 0x0b, 0x67, 0xbf, 0x43, 0x0d, 0x73, 0xb5, 0x02, 0x23, 0xdc, 0x59, 0x96, 0x98, 0x02, - 0x2f, 0x37, 0xed, 0xd9, 0xfc, 0x00, 0x7b, 0xd6, 0xfa, 0x83, 0x1c, 0x14, 0xf9, 0x74, 0x6b, 0x5e, - 0x78, 0xbe, 0xf9, 0x89, 0x19, 0xe4, 0xfb, 0xcf, 0x80, 0xdc, 0x8e, 0xa8, 0x3d, 0x14, 0x29, 0x3f, - 0x1c, 0x2a, 0x93, 0xe1, 0xb2, 0x92, 0x4d, 0x88, 0xf3, 0x12, 0x3f, 0x1a, 0xe1, 0x84, 0x90, 0x97, - 0x24, 0x07, 0xfd, 0xf3, 0x3c, 0xcc, 0x68, 0x43, 0x0c, 0x7a, 0x5e, 0x37, 0xa0, 0xec, 0x8c, 0xc7, - 0x98, 0x45, 0x1b, 0x27, 0x9e, 0xf1, 0x98, 0xca, 0x6c, 0x46, 0x96, 0x38, 0x0e, 0xf8, 0x1d, 0x76, - 0xb8, 0xe8, 0x24, 0x8e, 0x83, 0x28, 0xb8, 0x79, 0x53, 0x59, 0x7d, 0xee, 0x41, 0xdf, 0x83, 0x02, - 0xfe, 0xc9, 0x08, 0x31, 0x9c, 0x4d, 0x08, 0xd5, 0x88, 0xb8, 0x00, 0x5f, 0x79, 0x6e, 0xf7, 0x11, - 0x0d, 0x0f, 0x3d, 0x79, 0x78, 0xde, 0x64, 0x42, 0xec, 0xcf, 0x7a, 0x6e, 0xb7, 0x79, 0x8c, 0xc5, - 0x17, 0x3d, 0x74, 0x46, 0x08, 0x6d, 0x0d, 0xb9, 0x75, 0x1f, 0x8a, 0x4c, 0xde, 0x9c, 0x7f, 0x45, - 0xad, 0x39, 0x20, 0xeb, 0x34, 0xac, 0x79, 0x86, 0xe2, 0xb0, 0xa6, 0x60, 0x62, 0xc7, 0xed, 0x1e, - 0xc8, 0xcf, 0x7f, 0x9d, 0x87, 0x49, 0xfe, 0x2d, 0x56, 0x20, 0xa6, 0x49, 0x73, 0xe7, 0xd1, 0xa4, - 0x1f, 0xc3, 0x94, 0x70, 0xe7, 0x50, 0x1f, 0x5d, 0xc8, 0x7c, 0x3d, 0xf0, 0x44, 0xc9, 0xbd, 0x3a, - 0xcd, 0xe7, 0xbc, 0xc6, 0x36, 0x1b, 0x92, 0x2d, 0x98, 0xe6, 0x05, 0x0f, 0xa8, 0x13, 0x9e, 0x44, - 0xa7, 0xaa, 0xcb, 0xc2, 0xce, 0x94, 0xc5, 0x5c, 0x18, 0x09, 0x5c, 0xcf, 0x44, 0xa1, 0x1d, 0x83, - 0x25, 0x5f, 0xc2, 0xe5, 0x1d, 0xdf, 0xfb, 0xe1, 0xa5, 0x66, 0x3b, 0x70, 0x79, 0x3c, 0xcf, 0x0e, - 0x61, 0x3d, 0x56, 0xd5, 0xd4, 0x2d, 0x88, 0x78, 0x6b, 0xc6, 0x53, 0x9b, 0x41, 0xcd, 0xf3, 0xdd, - 0xee, 0x01, 0xae, 0x66, 0x81, 0xf3, 0x94, 0x1b, 0x34, 0xf7, 0xb1, 0xd0, 0x56, 0xd5, 0xd6, 0x7f, - 0x1f, 0x82, 0x82, 0xea, 0xf8, 0xae, 0x6e, 0x96, 0x0a, 0x65, 0x8c, 0xdb, 0x33, 0x3a, 0xfc, 0xd8, - 0x5a, 0x0b, 0x72, 0x95, 0x3b, 0xb3, 0xb8, 0x19, 0x30, 0xc6, 0x78, 0xcc, 0xe9, 0xf5, 0xd0, 0x65, - 0xc5, 0x84, 0xe9, 0x6a, 0x0d, 0xa9, 0x50, 0xe0, 0xc2, 0xb4, 0xbd, 0x6f, 0xe7, 0x57, 0x6b, 0x6c, - 0xad, 0x1f, 0x6f, 0xae, 0xd6, 0x71, 0x42, 0x05, 0xbe, 0xd6, 0x9e, 0xdb, 0x6e, 0xd9, 0x58, 0xca, - 0x6a, 0x1b, 0xd5, 0x47, 0x5b, 0x62, 0xd0, 0x58, 0x1b, 0x38, 0xc7, 0x1d, 0x1b, 0x4b, 0x99, 0x1d, - 0xc8, 0x75, 0x74, 0xdd, 0xeb, 0x86, 0xbe, 0xd7, 0x09, 0xd0, 0x55, 0x50, 0x30, 0xd4, 0x79, 0x4b, - 0x54, 0xd9, 0xb1, 0xa6, 0xe4, 0x29, 0x2c, 0x54, 0xdb, 0xcf, 0x9d, 0x6e, 0x8b, 0xb6, 0x79, 0xcd, - 0x53, 0xcf, 0x3f, 0x7a, 0xd6, 0xf1, 0x5e, 0x04, 0x78, 0xca, 0x2b, 0x88, 0xf3, 0xa2, 0x68, 0xd2, - 0x14, 0xe8, 0x5e, 0xc8, 0x46, 0x76, 0x16, 0x34, 0x13, 0x11, 0xf5, 0x8e, 0x77, 0xd2, 0xc6, 0xe3, - 0x5d, 0x81, 0x8b, 0x88, 0x16, 0x2b, 0xb0, 0x79, 0x39, 0xa3, 0xd2, 0x46, 0xe3, 0x11, 0x9e, 0xce, - 0x04, 0x95, 0x0e, 0x83, 0x63, 0x9b, 0x95, 0x91, 0xb7, 0x61, 0x4c, 0x9a, 0xb4, 0xdc, 0x29, 0x80, - 0x1e, 0x23, 0x69, 0xca, 0xca, 0x3a, 0xb2, 0x0a, 0x33, 0x8f, 0xbc, 0x36, 0xf5, 0x9d, 0x90, 0xb6, - 0x85, 0x75, 0x19, 0xe0, 0x41, 0xab, 0xc0, 0xcd, 0xea, 0x63, 0x59, 0x29, 0x2f, 0x34, 0x02, 0x3b, - 0x09, 0x60, 0xbd, 0x07, 0x33, 0x7c, 0xeb, 0x9d, 0xdb, 0xde, 0xb3, 0x76, 0x00, 0x1a, 0xf4, 0xd8, - 0xe9, 0x1d, 0x7a, 0x8c, 0x3d, 0x6a, 0xfa, 0x97, 0x30, 0x80, 0x88, 0xba, 0x2e, 0x10, 0x15, 0x7b, - 0x2b, 0xd2, 0x22, 0x96, 0x2d, 0x6d, 0x0d, 0xca, 0xfa, 0x4f, 0x79, 0x20, 0xe8, 0x36, 0x6f, 0x84, - 0x3e, 0x75, 0x8e, 0xe5, 0x30, 0x3e, 0x81, 0x49, 0x2e, 0x45, 0x79, 0x31, 0x0e, 0x87, 0x59, 0x57, - 0x7c, 0xfb, 0xe8, 0x55, 0x1b, 0x97, 0x6c, 0xa3, 0x29, 0x03, 0xb5, 0x69, 0x70, 0x72, 0x2c, 0x41, - 0xf3, 0x06, 0xa8, 0x5e, 0xc5, 0x40, 0xf5, 0x6f, 0xf2, 0x25, 0x4c, 0xd7, 0xbd, 0xe3, 0x1e, 0xa3, - 0x89, 0x00, 0x1e, 0x12, 0x36, 0x8c, 0xe8, 0xd7, 0xa8, 0xdc, 0xb8, 0x64, 0xc7, 0x9a, 0x93, 0x6d, - 0x98, 0x7d, 0xd0, 0x39, 0x09, 0x0e, 0xab, 0xdd, 0x76, 0xbd, 0xe3, 0x05, 0x12, 0xcb, 0xb0, 0x70, - 0xa9, 0x88, 0xcd, 0x9f, 0x6c, 0xb1, 0x71, 0xc9, 0x4e, 0x03, 0x24, 0x6f, 0x8b, 0x18, 0x00, 0x61, - 0x4b, 0x4d, 0xdd, 0x15, 0x21, 0x02, 0x8f, 0xbb, 0xf4, 0xf1, 0xb3, 0x8d, 0x4b, 0x36, 0xaf, 0xad, - 0x8d, 0xc3, 0x98, 0x14, 0x7c, 0xf7, 0x60, 0x46, 0x23, 0x27, 0xb3, 0xfe, 0x4e, 0x02, 0x52, 0x86, - 0xc2, 0x93, 0x5e, 0xc7, 0x73, 0xda, 0xd2, 0x98, 0xb0, 0xd5, 0xb7, 0xf5, 0x63, 0x93, 0xd2, 0x64, - 0x51, 0x3f, 0xd1, 0xf0, 0xc6, 0x51, 0x81, 0xb5, 0x61, 0x12, 0xb7, 0x7f, 0x6b, 0xa3, 0xdf, 0x7c, - 0xac, 0xdf, 0x62, 0x9c, 0xd6, 0xd6, 0x7c, 0x2a, 0xf1, 0xac, 0x87, 0x68, 0x28, 0x55, 0x7b, 0xbd, - 0x8e, 0xdb, 0x42, 0xfd, 0xc2, 0xa5, 0xa3, 0xb2, 0x31, 0x7e, 0x4b, 0xbf, 0xa9, 0xd6, 0x94, 0xab, - 0xba, 0x97, 0xd6, 0xee, 0xa2, 0xad, 0x6f, 0xe1, 0x7a, 0x06, 0x32, 0xa1, 0x27, 0x3e, 0x81, 0x31, - 0x51, 0x14, 0x63, 0x68, 0xdd, 0xb7, 0x8f, 0xbb, 0x32, 0x10, 0x90, 0xb2, 0xbd, 0xf5, 0x0d, 0x2c, - 0x3d, 0xe9, 0x05, 0xd4, 0x4f, 0xa2, 0x97, 0x43, 0xfd, 0x50, 0xdd, 0x84, 0xe7, 0x32, 0xef, 0x0d, - 0xe0, 0xec, 0xb4, 0x32, 0xca, 0x71, 0xcb, 0x0b, 0x70, 0xeb, 0xf7, 0x72, 0xb0, 0xc4, 0xb7, 0x6a, - 0x26, 0xea, 0x8b, 0x50, 0x41, 0xf3, 0x4b, 0xe7, 0xb3, 0xfd, 0xd2, 0x7d, 0x1d, 0xf5, 0xd6, 0xd7, - 0x60, 0x89, 0x11, 0x75, 0x3a, 0x6f, 0x68, 0x6d, 0xfe, 0x72, 0x0e, 0xe6, 0xf8, 0xe2, 0xbc, 0x06, - 0x16, 0xf2, 0x13, 0x98, 0x6e, 0x1c, 0xb9, 0xbd, 0x3d, 0xa7, 0xe3, 0xb6, 0xb9, 0x8b, 0x96, 0xab, - 0xa3, 0x79, 0xd4, 0xb4, 0x47, 0x6e, 0xaf, 0xf9, 0x3c, 0xaa, 0xca, 0xd9, 0xb1, 0xc6, 0xd6, 0x63, - 0x98, 0x8f, 0x8d, 0x41, 0x30, 0xc6, 0x87, 0x71, 0xc6, 0x48, 0x84, 0x31, 0xa4, 0x73, 0xc5, 0x23, - 0xb8, 0xa2, 0xb8, 0xc2, 0x5c, 0xb2, 0x95, 0x18, 0x37, 0x24, 0x10, 0xa6, 0xb1, 0x42, 0x0b, 0xae, - 0x28, 0x4e, 0x78, 0x0d, 0x0e, 0x90, 0x8b, 0x9b, 0x4f, 0x5d, 0xdc, 0x4d, 0x28, 0xeb, 0x8b, 0xfb, - 0x3a, 0x8b, 0xfa, 0x1f, 0x73, 0xb0, 0xb0, 0x4e, 0xbb, 0xa8, 0x7a, 0xaa, 0xbd, 0x9e, 0x71, 0x32, - 0xd1, 0xdd, 0xd3, 0xb9, 0xbe, 0xee, 0x69, 0x65, 0x76, 0xe7, 0xd3, 0xcd, 0x6e, 0xa6, 0x53, 0x9f, - 0xd8, 0x9b, 0x82, 0x57, 0x51, 0xa7, 0x9e, 0xf8, 0xae, 0xcd, 0xca, 0xc8, 0x66, 0xe4, 0xda, 0x1e, - 0x1e, 0xe8, 0xda, 0x9e, 0x15, 0xae, 0xbe, 0x31, 0xe1, 0xda, 0x36, 0x1c, 0xda, 0xd6, 0x67, 0x50, - 0x4a, 0xce, 0x45, 0xf0, 0xc7, 0xa0, 0xa3, 0x8e, 0xb5, 0x1a, 0x71, 0xb7, 0xb8, 0x05, 0x57, 0x2e, - 0xfd, 0x98, 0x08, 0xed, 0xe3, 0x42, 0xb2, 0x1a, 0x11, 0x7f, 0x0a, 0x2c, 0xa2, 0xff, 0x4f, 0x19, - 0x7f, 0xf2, 0x48, 0x87, 0x5c, 0x76, 0xa4, 0x83, 0xe0, 0x51, 0x0e, 0x2a, 0x01, 0xac, 0xa7, 0x70, - 0xc5, 0x40, 0x1a, 0x71, 0xfd, 0x4f, 0xa0, 0xa0, 0x0c, 0x0c, 0xd3, 0xc3, 0x61, 0xa0, 0xc5, 0x75, - 0x53, 0xb6, 0x86, 0x02, 0xb1, 0x7e, 0x95, 0x83, 0x05, 0xae, 0x5d, 0x92, 0xf3, 0x3e, 0xff, 0xea, - 0xff, 0xa9, 0xb8, 0xcd, 0xee, 0xa7, 0xb8, 0xcd, 0x10, 0x44, 0x77, 0x9b, 0xe9, 0xce, 0xb2, 0xaf, - 0x86, 0x0b, 0xf9, 0xe2, 0x90, 0xb5, 0x07, 0xa5, 0xe4, 0x0c, 0xdf, 0xc0, 0x9a, 0xac, 0xc3, 0x82, - 0xb6, 0xd1, 0x5f, 0x83, 0x63, 0x36, 0x60, 0x31, 0x32, 0xf3, 0x8c, 0x35, 0xbe, 0xe0, 0x3a, 0x08, - 0xde, 0x8b, 0xc6, 0xfe, 0x06, 0x79, 0x2f, 0x6a, 0xf8, 0xc6, 0x78, 0x6f, 0x13, 0x66, 0x39, 0x62, - 0x73, 0x9f, 0x2e, 0xeb, 0xfb, 0x34, 0x35, 0x7e, 0x27, 0xb9, 0x75, 0x1f, 0xe1, 0xd6, 0x95, 0x4d, - 0xa2, 0x11, 0x7e, 0x00, 0xa3, 0x22, 0x44, 0x91, 0x8f, 0x2f, 0x05, 0x19, 0xca, 0x70, 0x1e, 0x97, - 0x68, 0x8b, 0xc6, 0x56, 0x09, 0xa7, 0xcc, 0xce, 0x4d, 0xc2, 0x01, 0xaf, 0x4e, 0xb1, 0x5f, 0x33, - 0x61, 0x19, 0xab, 0x79, 0x4d, 0xfd, 0xf3, 0x18, 0x4a, 0x5c, 0xff, 0x68, 0x58, 0x5f, 0x4b, 0x03, - 0x7d, 0x0c, 0x25, 0xce, 0x4f, 0x29, 0x08, 0xfb, 0xab, 0x95, 0x25, 0xc9, 0x89, 0xd5, 0x4e, 0x27, - 0x6d, 0xf6, 0x7f, 0x3d, 0x07, 0x57, 0xd7, 0x69, 0x68, 0x46, 0x71, 0xfd, 0x7f, 0xb1, 0x02, 0xbe, - 0x83, 0x72, 0xda, 0x40, 0xc4, 0x52, 0x7c, 0x11, 0x5f, 0x8a, 0xcc, 0x90, 0xb5, 0xf4, 0x25, 0xf9, - 0x16, 0xae, 0xf1, 0x25, 0x31, 0xdb, 0xcb, 0x89, 0x7e, 0x16, 0x5b, 0x95, 0x4c, 0xec, 0x69, 0xab, - 0xf3, 0xb7, 0x72, 0x70, 0x8d, 0x13, 0x39, 0x1d, 0xf9, 0x9f, 0xb6, 0x9d, 0xb8, 0x0d, 0x15, 0xb5, - 0xe6, 0x6f, 0x60, 0x61, 0xad, 0x7f, 0x91, 0x03, 0x22, 0xf1, 0xd4, 0x1b, 0xb6, 0xc4, 0x71, 0x15, - 0x86, 0xea, 0x0d, 0x5b, 0xdc, 0x88, 0xa3, 0xfe, 0x6f, 0x05, 0xbe, 0xcd, 0xca, 0xe2, 0xca, 0x20, - 0x7f, 0x1e, 0x65, 0xb0, 0x09, 0xa4, 0xe1, 0x1e, 0x74, 0x9f, 0xba, 0xe1, 0xa1, 0xea, 0xac, 0x2a, - 0xbc, 0x17, 0x18, 0x2c, 0x18, 0xb8, 0x07, 0xdd, 0x26, 0x5e, 0x49, 0xa8, 0x80, 0xc4, 0x96, 0x63, - 0xa7, 0x00, 0x59, 0x3f, 0x83, 0x59, 0x63, 0xbc, 0x82, 0x87, 0x16, 0x61, 0xb8, 0x4e, 0xfd, 0x50, - 0x8c, 0x18, 0xa9, 0xd6, 0xa2, 0x7e, 0x68, 0x63, 0x29, 0xb9, 0x0d, 0x63, 0xf5, 0x2a, 0x7a, 0x52, - 0xd1, 0xe2, 0x99, 0xe4, 0x42, 0xae, 0xe5, 0x34, 0x31, 0x4a, 0xde, 0x96, 0x95, 0xd6, 0xbf, 0xcb, - 0x6b, 0xd8, 0x19, 0xf8, 0x60, 0x72, 0xbc, 0xc7, 0x0e, 0xed, 0x8c, 0xfe, 0x1a, 0x35, 0x66, 0x98, - 0x32, 0x15, 0x5e, 0x28, 0xae, 0x07, 0x6c, 0xad, 0xd1, 0x39, 0xbd, 0xc0, 0xf2, 0xd6, 0x91, 0x03, - 0x49, 0x0f, 0xa9, 0xba, 0x75, 0x14, 0xa8, 0x03, 0x5b, 0x6f, 0x44, 0x7e, 0x0e, 0x53, 0x62, 0xcc, - 0x62, 0x40, 0x23, 0x78, 0xad, 0xf1, 0x96, 0x38, 0x2a, 0xa7, 0xcc, 0xed, 0xae, 0x6a, 0x2f, 0xe2, - 0x97, 0xe5, 0x27, 0x5f, 0x46, 0x13, 0x9d, 0x75, 0x5b, 0x39, 0xf4, 0xa9, 0x4f, 0x2e, 0xc3, 0xc4, - 0x93, 0xed, 0xc6, 0xce, 0x5a, 0x7d, 0xf3, 0xc1, 0xe6, 0xda, 0x6a, 0xf1, 0x12, 0x29, 0xc0, 0xf0, - 0x6e, 0x7d, 0x77, 0xab, 0x98, 0xb3, 0xbe, 0x83, 0x39, 0xb3, 0xaf, 0x37, 0xba, 0x4c, 0x6f, 0xe1, - 0xb5, 0x9a, 0x76, 0x21, 0x4d, 0x88, 0xee, 0x66, 0x11, 0x5b, 0xe5, 0x23, 0x28, 0x8a, 0x56, 0x91, - 0xa8, 0xb9, 0x25, 0x0d, 0x5f, 0x2e, 0x68, 0xcc, 0x00, 0x6e, 0xe9, 0x73, 0xfe, 0x91, 0x74, 0xe4, - 0x0c, 0xea, 0xe1, 0xef, 0xe5, 0xa0, 0xf4, 0xe8, 0x41, 0xb5, 0x7a, 0x12, 0x1e, 0xd2, 0x6e, 0xc8, - 0x8e, 0x6c, 0xb4, 0x7e, 0xe8, 0x74, 0x3a, 0xb4, 0x7b, 0x40, 0xc9, 0x1d, 0x18, 0xde, 0x7d, 0xbc, - 0xbb, 0x23, 0xfc, 0x25, 0x73, 0x62, 0x05, 0x58, 0x91, 0x6a, 0x63, 0x63, 0x0b, 0xf2, 0x10, 0x66, - 0x9e, 0x8a, 0x27, 0x13, 0xaa, 0x4a, 0x78, 0x4a, 0xae, 0xdf, 0x55, 0x8f, 0x29, 0xea, 0x3e, 0x6d, - 0xb3, 0x5e, 0x9c, 0x4e, 0x35, 0x60, 0xc2, 0x8e, 0xf1, 0x49, 0x12, 0xee, 0xab, 0xe1, 0x42, 0xae, - 0x98, 0xb7, 0x7e, 0x3f, 0x07, 0x0b, 0xb1, 0x91, 0x69, 0xce, 0x73, 0x7d, 0x60, 0xb3, 0xda, 0xc0, - 0x64, 0x93, 0x8d, 0x4b, 0x62, 0x64, 0x75, 0x8c, 0xcf, 0xc5, 0x1e, 0xc4, 0x80, 0xde, 0xee, 0x3f, - 0xa0, 0x08, 0x81, 0x02, 0x14, 0xd1, 0x75, 0x58, 0x6e, 0x5d, 0x86, 0x29, 0x83, 0x02, 0x96, 0x05, - 0x93, 0x7a, 0xcf, 0x8c, 0xcc, 0x75, 0xaf, 0xad, 0xc8, 0xcc, 0xfe, 0xb6, 0xfe, 0x4e, 0x0e, 0xe6, - 0x1e, 0x3d, 0xa8, 0xda, 0xf4, 0xc0, 0x65, 0x7c, 0x17, 0x91, 0x78, 0xd9, 0x98, 0xc9, 0xa2, 0x31, - 0x93, 0x58, 0x5b, 0x35, 0xa5, 0x4f, 0x13, 0x53, 0x5a, 0x4c, 0x9b, 0x12, 0xda, 0xa0, 0xae, 0xd7, - 0x35, 0x66, 0xa2, 0xf9, 0x85, 0xfe, 0x7e, 0x0e, 0x66, 0xb5, 0x31, 0xa9, 0xf1, 0xbf, 0x67, 0x0c, - 0xe9, 0x5a, 0xca, 0x90, 0x12, 0x44, 0xae, 0x25, 0x46, 0xf4, 0x56, 0xbf, 0x11, 0x0d, 0xa4, 0xf1, - 0x1f, 0xe7, 0x60, 0x3e, 0x95, 0x06, 0xe4, 0x0a, 0xd3, 0x84, 0x2d, 0x9f, 0x86, 0x82, 0xbc, 0xe2, - 0x8b, 0x95, 0x6f, 0x06, 0xc1, 0x89, 0x78, 0xcf, 0x32, 0x6e, 0x8b, 0x2f, 0xf2, 0x16, 0x4c, 0xed, - 0x50, 0xdf, 0xf5, 0xda, 0x0d, 0xda, 0xf2, 0xba, 0x6d, 0xee, 0x75, 0x9f, 0xb2, 0xcd, 0x42, 0xb2, - 0x08, 0xe3, 0xd5, 0xce, 0x81, 0xe7, 0xbb, 0xe1, 0x21, 0x77, 0xcd, 0x8d, 0xdb, 0x51, 0x01, 0xc3, - 0xbd, 0xea, 0x1e, 0xb8, 0x21, 0xbf, 0xbf, 0x9c, 0xb2, 0xc5, 0x17, 0x29, 0xc1, 0x58, 0xb5, 0xd5, - 0xf2, 0x4e, 0xba, 0x21, 0x7a, 0x99, 0xc7, 0x6d, 0xf9, 0xc9, 0x20, 0xbe, 0xb6, 0x91, 0x09, 0x30, - 0xe2, 0xcc, 0x16, 0x5f, 0xd6, 0xbb, 0x30, 0x97, 0x46, 0xc7, 0x54, 0x96, 0xf9, 0x8b, 0x79, 0x98, - 0xad, 0xb6, 0xdb, 0x8f, 0x1e, 0x54, 0x57, 0xa9, 0x6e, 0x50, 0xbd, 0x0f, 0xc3, 0x9b, 0x5d, 0x37, - 0x14, 0x96, 0xc0, 0x92, 0x58, 0x9e, 0x94, 0x96, 0xac, 0x15, 0x5b, 0x21, 0xf6, 0x3f, 0xb1, 0x61, - 0x76, 0xed, 0x07, 0x37, 0x08, 0xdd, 0xee, 0x01, 0xae, 0x39, 0xef, 0x58, 0xac, 0xb1, 0x44, 0x92, - 0xb1, 0xdd, 0x36, 0x2e, 0xd9, 0x69, 0xc0, 0x64, 0x17, 0xae, 0x6c, 0xd3, 0x17, 0x29, 0x2c, 0xa4, - 0x02, 0xc6, 0x14, 0xda, 0x14, 0xce, 0xc9, 0x80, 0xd5, 0x39, 0xf4, 0xaf, 0xe5, 0x31, 0x0a, 0x51, - 0x9b, 0x98, 0xe8, 0xf9, 0x09, 0xcc, 0x69, 0x03, 0x8a, 0x24, 0x4e, 0x4e, 0xc4, 0xa7, 0xa7, 0x4e, - 0x47, 0xdf, 0x48, 0xa9, 0xe0, 0xe4, 0x29, 0x2c, 0x98, 0x83, 0x8a, 0x30, 0x9b, 0x9b, 0x21, 0xad, - 0xc9, 0xc6, 0x25, 0x3b, 0x0b, 0x9a, 0x2c, 0xc3, 0x50, 0xb5, 0x75, 0x24, 0xc8, 0x92, 0xbe, 0x64, - 0x7c, 0x66, 0xd5, 0xd6, 0x11, 0x46, 0xf4, 0xb6, 0x8e, 0x8c, 0xfd, 0xf0, 0x6f, 0x73, 0xb0, 0x90, - 0xb1, 0xc2, 0x64, 0x09, 0x80, 0x17, 0x6a, 0xb2, 0x5d, 0x2b, 0x61, 0xda, 0x9d, 0x7f, 0xe1, 0xa5, - 0xee, 0x10, 0x2a, 0x53, 0x19, 0x7b, 0x15, 0x55, 0xd8, 0x5a, 0x23, 0xb2, 0x03, 0x13, 0xfc, 0x8b, - 0x87, 0x80, 0x0d, 0x23, 0x0c, 0x31, 0x60, 0x78, 0xcc, 0x17, 0xc6, 0x75, 0xb4, 0xb1, 0xa0, 0x19, - 0x0f, 0xfd, 0xd2, 0x51, 0x88, 0x83, 0x71, 0x3d, 0x3e, 0x0b, 0x35, 0x69, 0x72, 0x07, 0x46, 0x79, - 0xa1, 0x58, 0x43, 0xf9, 0xb2, 0x28, 0x6a, 0x2c, 0xea, 0xad, 0x3f, 0xc8, 0x49, 0x7f, 0x57, 0x62, - 0x6b, 0x7c, 0x64, 0x6c, 0x8d, 0x9b, 0x6a, 0xc0, 0x69, 0x8d, 0x8d, 0xdd, 0x51, 0x83, 0x89, 0x57, - 0xd9, 0x15, 0x3a, 0x90, 0xce, 0xb7, 0xff, 0x38, 0x27, 0x4f, 0xea, 0x49, 0xd6, 0x5d, 0x83, 0xc9, - 0x57, 0x63, 0x59, 0x03, 0x8c, 0x7c, 0xc0, 0x39, 0x2a, 0xdf, 0x7f, 0xa6, 0x7d, 0x99, 0xea, 0x73, - 0xe9, 0xd2, 0x7b, 0x15, 0xb6, 0xb2, 0x16, 0x53, 0xa0, 0x55, 0x77, 0xd6, 0x49, 0xa2, 0xb6, 0xf1, - 0xb2, 0xdb, 0x92, 0xeb, 0x74, 0x3b, 0x1e, 0xc8, 0x90, 0x79, 0x4b, 0xad, 0x8f, 0x21, 0x1f, 0x79, - 0x79, 0x04, 0xcb, 0xa1, 0x79, 0xa7, 0x0f, 0xea, 0xdf, 0xe4, 0x4d, 0x0e, 0x7b, 0x95, 0x4e, 0xeb, - 0x30, 0xb5, 0x4d, 0x5f, 0x24, 0xfa, 0xc5, 0xbb, 0xbf, 0x2e, 0x7d, 0xd1, 0xd4, 0xfa, 0xd6, 0xb8, - 0xdd, 0x84, 0x21, 0xfb, 0x30, 0x2d, 0x65, 0xc1, 0x79, 0x45, 0x22, 0x8f, 0x6a, 0x65, 0x3d, 0x1c, - 0x3f, 0x73, 0x9a, 0xbe, 0x28, 0xd5, 0xc3, 0x51, 0x4d, 0x8c, 0x6f, 0x7e, 0x97, 0x5a, 0x3b, 0x50, - 0x4a, 0x52, 0x4f, 0xf4, 0xf6, 0xfe, 0xa0, 0x0d, 0xca, 0xcf, 0x9e, 0x6d, 0x73, 0xb3, 0x6e, 0xa0, - 0x9b, 0x44, 0xb5, 0x51, 0x07, 0xbc, 0xfb, 0xf1, 0xc5, 0xc0, 0x4b, 0x4a, 0xb9, 0x18, 0x7a, 0x20, - 0x7e, 0x14, 0x1c, 0x33, 0x1f, 0xc3, 0x24, 0x06, 0xf6, 0x2e, 0x8c, 0x89, 0x22, 0xf5, 0xc0, 0x21, - 0x2e, 0x3a, 0x64, 0x03, 0xeb, 0x1f, 0xe4, 0xe0, 0xea, 0x93, 0x80, 0xfa, 0x0d, 0xb7, 0x7b, 0xd0, - 0xa1, 0x4f, 0x02, 0x33, 0x34, 0xe5, 0xb7, 0x0d, 0xf1, 0xb1, 0x90, 0x11, 0xf2, 0xfa, 0xff, 0x4a, - 0x68, 0xfc, 0xa3, 0x1c, 0x94, 0xd3, 0xc6, 0xf6, 0x66, 0xe5, 0xc6, 0x5d, 0x71, 0x7a, 0xe1, 0xa3, - 0x2d, 0x09, 0x70, 0xd5, 0xa7, 0x9c, 0x2c, 0x9b, 0x24, 0xfb, 0xdf, 0x10, 0x18, 0xff, 0x3b, 0x07, - 0x73, 0x9b, 0x01, 0x0e, 0xff, 0x17, 0x27, 0xae, 0x4f, 0xdb, 0x92, 0x70, 0x77, 0xd3, 0x02, 0xa3, - 0x71, 0x5d, 0x37, 0x2e, 0xa5, 0x05, 0x3e, 0xbf, 0xaf, 0x85, 0x7e, 0xe6, 0xfb, 0x45, 0x3c, 0x1b, - 0xaf, 0x6c, 0x6e, 0xc3, 0xf0, 0x36, 0x33, 0x92, 0x86, 0x04, 0xff, 0x71, 0x08, 0x56, 0x84, 0x51, - 0x9a, 0x6c, 0xc8, 0xec, 0x83, 0x3c, 0x48, 0xc4, 0x82, 0x0e, 0x0f, 0x8e, 0xe8, 0x4d, 0x3e, 0x0f, - 0xaa, 0x15, 0x60, 0x74, 0xd7, 0xf1, 0x0f, 0x68, 0x68, 0x7d, 0x0b, 0x65, 0x71, 0x79, 0xca, 0x3d, - 0x89, 0x78, 0xc5, 0x1a, 0x44, 0x1e, 0xae, 0x7e, 0x17, 0x9e, 0x4b, 0x00, 0x8d, 0xd0, 0xf1, 0xc3, - 0xcd, 0x6e, 0x9b, 0xfe, 0x80, 0xb3, 0x1d, 0xb1, 0xb5, 0x12, 0xeb, 0x03, 0x18, 0x57, 0x53, 0xc0, - 0x13, 0x9a, 0x66, 0x07, 0xe2, 0x74, 0xe6, 0x8c, 0xe8, 0x54, 0x19, 0x92, 0xba, 0x02, 0xf3, 0xb1, - 0xa5, 0x10, 0x7c, 0x52, 0x66, 0x0b, 0xc6, 0xcb, 0x78, 0x78, 0x86, 0xad, 0xbe, 0xad, 0x3a, 0xcc, - 0x24, 0x56, 0x9a, 0x10, 0x8c, 0x38, 0xe6, 0xc7, 0x59, 0xa6, 0x26, 0x1a, 0x8d, 0x0d, 0x56, 0xb6, - 0xbb, 0xd5, 0xe0, 0xd1, 0x57, 0xac, 0x6c, 0x77, 0xab, 0x51, 0x1b, 0xe5, 0x9c, 0x63, 0xfd, 0xd3, - 0x3c, 0x1e, 0x4a, 0x13, 0x34, 0x88, 0x39, 0x6c, 0x74, 0xa7, 0x51, 0x0d, 0xc6, 0x71, 0xc6, 0xab, - 0x32, 0x4a, 0xb1, 0xff, 0x8d, 0x4b, 0xe1, 0x97, 0xa7, 0x95, 0x4b, 0x78, 0xcd, 0x12, 0x81, 0x91, - 0x2f, 0x60, 0x6c, 0xad, 0xdb, 0x46, 0x0c, 0x43, 0x17, 0xc0, 0x20, 0x81, 0xd8, 0x3a, 0xe0, 0x90, - 0x99, 0x81, 0x23, 0x3c, 0x11, 0xb6, 0x56, 0x82, 0x64, 0x76, 0x8f, 0x5d, 0x7e, 0xaf, 0x3e, 0x62, - 0xf3, 0x0f, 0x46, 0x4d, 0x1c, 0x82, 0x7c, 0x74, 0x32, 0x6e, 0xab, 0x6f, 0x62, 0xc1, 0xc8, 0x63, - 0xbf, 0x2d, 0x9e, 0x00, 0x4c, 0x2f, 0x4f, 0xca, 0x57, 0xf8, 0xac, 0xcc, 0xe6, 0x55, 0xd6, 0xff, - 0xc4, 0xbb, 0xae, 0x30, 0x95, 0x6f, 0x0c, 0xaa, 0xe4, 0x5e, 0x9b, 0x2a, 0xf9, 0x57, 0xa1, 0x8a, - 0x9a, 0xf5, 0x50, 0xd6, 0xac, 0x87, 0xb3, 0x66, 0x3d, 0x92, 0x3d, 0xeb, 0x75, 0x18, 0xe5, 0x53, - 0x25, 0xb7, 0x60, 0x64, 0x33, 0xa4, 0xc7, 0x91, 0xb3, 0x42, 0x8f, 0x56, 0xb0, 0x79, 0x1d, 0x3b, - 0x47, 0x6d, 0x39, 0x41, 0x28, 0xe3, 0xfd, 0xc6, 0x6d, 0xf9, 0x69, 0xfd, 0x49, 0x0e, 0x8a, 0x5b, - 0x6e, 0x10, 0xb2, 0x8d, 0x70, 0x4e, 0x5e, 0x53, 0x33, 0xca, 0x67, 0xcd, 0x68, 0x28, 0x36, 0xa3, - 0xcf, 0x60, 0x14, 0xc3, 0x50, 0x03, 0xf1, 0xc0, 0xec, 0x96, 0x98, 0x52, 0xbc, 0x63, 0x1e, 0xac, - 0x1a, 0xe0, 0x43, 0x30, 0x5b, 0x80, 0x94, 0x3f, 0x81, 0x09, 0xad, 0xf8, 0x42, 0xef, 0xc3, 0xbe, - 0x81, 0x19, 0xad, 0x0b, 0xe5, 0xd9, 0x18, 0xe0, 0xd3, 0x57, 0x3e, 0x63, 0x46, 0xb6, 0x6d, 0xfa, - 0x83, 0x4e, 0x36, 0xf1, 0x69, 0x7d, 0x8f, 0x51, 0xd4, 0x5b, 0x5e, 0xeb, 0x48, 0xf3, 0xa8, 0x8e, - 0x71, 0x61, 0x16, 0xbf, 0x98, 0x60, 0xad, 0x78, 0x8d, 0x2d, 0x5b, 0x90, 0x1b, 0x30, 0xb1, 0xd9, - 0x7d, 0xe0, 0xf9, 0x2d, 0xfa, 0xb8, 0xdb, 0xe1, 0xd8, 0x0b, 0xb6, 0x5e, 0x24, 0x1c, 0x53, 0xa2, - 0x87, 0xc8, 0x31, 0x85, 0x05, 0x31, 0xc7, 0x14, 0x7f, 0xdf, 0x6a, 0xf3, 0x3a, 0xe1, 0xf7, 0x62, - 0x7f, 0xf7, 0xf3, 0x4a, 0x29, 0xf7, 0xd5, 0xa0, 0x86, 0xfb, 0x70, 0xd5, 0xa6, 0xbd, 0x8e, 0xc3, - 0xac, 0xcf, 0x63, 0x8f, 0xb7, 0x57, 0x73, 0xbe, 0x91, 0x12, 0xe0, 0x67, 0x3a, 0x75, 0xd5, 0x90, - 0xf3, 0x7d, 0x86, 0x7c, 0x0c, 0x37, 0xd7, 0x69, 0x98, 0xfa, 0x48, 0x35, 0x9a, 0xfc, 0x06, 0x14, - 0xc4, 0x43, 0x0a, 0x39, 0xff, 0x41, 0xef, 0x63, 0xc5, 0x25, 0x95, 0xc0, 0xa3, 0xfe, 0xb2, 0xbe, - 0x84, 0x4a, 0x56, 0x77, 0xe7, 0x8b, 0xc8, 0x72, 0xe1, 0x46, 0x36, 0x02, 0x65, 0x4d, 0x8c, 0x89, - 0x0e, 0x95, 0x1f, 0xa1, 0xff, 0x68, 0xd5, 0xb5, 0x05, 0xda, 0x53, 0xe2, 0x0f, 0xab, 0x26, 0x43, - 0x3e, 0x5e, 0x63, 0xb8, 0x4d, 0xbc, 0x58, 0x31, 0x11, 0x44, 0x74, 0xad, 0x42, 0x41, 0x96, 0xc5, - 0x6e, 0x56, 0x12, 0xef, 0x7f, 0x91, 0xa0, 0x6d, 0x89, 0x40, 0x81, 0x59, 0xdf, 0xcb, 0xeb, 0x0f, - 0x13, 0xe2, 0x7c, 0xc1, 0xc2, 0xe7, 0xb9, 0xef, 0xb0, 0x3c, 0xb8, 0x6a, 0xe2, 0xd6, 0x1d, 0xef, - 0x45, 0xcd, 0xf1, 0xce, 0xfd, 0xed, 0x8c, 0x2f, 0xed, 0xad, 0xb5, 0x6e, 0xbb, 0xe7, 0xb9, 0xdd, - 0x50, 0x6c, 0x5e, 0xbd, 0x88, 0x2c, 0xe9, 0xee, 0xf5, 0xc9, 0x64, 0x74, 0xf5, 0x7d, 0x28, 0xa7, - 0x75, 0xa8, 0x79, 0x93, 0x94, 0x87, 0x9a, 0xdb, 0x71, 0xd6, 0x21, 0xcc, 0x19, 0x19, 0x55, 0xa2, - 0x14, 0x11, 0x51, 0x26, 0x99, 0xf1, 0xda, 0xe7, 0xbf, 0x39, 0xad, 0x7c, 0x7c, 0x91, 0x10, 0x5e, - 0x89, 0x73, 0x57, 0x05, 0x88, 0x5b, 0x0b, 0x30, 0x54, 0xb7, 0xb7, 0x70, 0xda, 0xf6, 0x96, 0x9a, - 0xb6, 0xbd, 0x65, 0xfd, 0x61, 0x1e, 0x2a, 0xf5, 0x43, 0xa7, 0x7b, 0xc0, 0xaf, 0x9d, 0x23, 0x73, - 0x55, 0xbb, 0xc7, 0x3e, 0xef, 0x21, 0x6d, 0x19, 0x26, 0xb6, 0xe9, 0x0b, 0x19, 0xdc, 0x2e, 0xc2, - 0xc4, 0xf1, 0x62, 0x81, 0x1d, 0xa0, 0x7a, 0xa2, 0xdc, 0xd6, 0x1b, 0x91, 0x3f, 0xf7, 0xea, 0xee, - 0x2a, 0x9e, 0x57, 0x21, 0x3a, 0x9b, 0xf1, 0xda, 0xb4, 0x43, 0x5a, 0x46, 0x17, 0xc9, 0x53, 0xe5, - 0xf0, 0xc5, 0x4f, 0x95, 0xd6, 0xbf, 0xcc, 0xc1, 0x8d, 0x6c, 0x0a, 0x8a, 0x9e, 0x56, 0x8d, 0x14, - 0x17, 0x7d, 0x2e, 0xdf, 0xf1, 0x24, 0xad, 0xa5, 0xb8, 0x88, 0xa7, 0xb5, 0xb0, 0x69, 0xcb, 0x7b, - 0x4e, 0xfd, 0x97, 0x31, 0xf7, 0xbf, 0x2c, 0xae, 0x33, 0xbd, 0x25, 0x13, 0x04, 0xf1, 0x22, 0xe3, - 0x55, 0xab, 0x28, 0xb3, 0xfe, 0x43, 0x0e, 0xae, 0xa1, 0xae, 0x15, 0xce, 0x51, 0x59, 0x71, 0xf1, - 0xa0, 0x8f, 0x0f, 0x60, 0x52, 0xef, 0x5c, 0xac, 0x3a, 0xbe, 0x89, 0x97, 0x23, 0x68, 0xb6, 0xbc, - 0x36, 0xb5, 0x8d, 0x66, 0x64, 0x13, 0x26, 0xc4, 0xb7, 0xe6, 0x01, 0x9b, 0xd7, 0x12, 0xe6, 0x20, - 0x53, 0xf1, 0xa3, 0x32, 0xb2, 0x90, 0x40, 0xd6, 0xc4, 0x57, 0x0f, 0x3a, 0xac, 0xf5, 0xeb, 0x3c, - 0x2c, 0xee, 0x51, 0xdf, 0x7d, 0xf6, 0x32, 0x63, 0x32, 0x8f, 0x61, 0x4e, 0x16, 0xe1, 0x9c, 0x4d, - 0x66, 0xe6, 0xaf, 0x13, 0xe5, 0x50, 0x03, 0xd6, 0xa0, 0xa9, 0x78, 0x3b, 0x15, 0xf0, 0x02, 0xef, - 0x75, 0xdf, 0x87, 0x82, 0xda, 0x0f, 0x43, 0x48, 0x19, 0x5c, 0x1b, 0xb9, 0x17, 0xcc, 0xd4, 0x05, - 0x6a, 0x53, 0xfc, 0x95, 0xec, 0x5b, 0x16, 0x71, 0x6c, 0x1a, 0x70, 0xa2, 0xe5, 0x5b, 0x83, 0x6d, - 0x0b, 0x47, 0xab, 0x4d, 0xd9, 0x1a, 0x1b, 0x97, 0xec, 0xac, 0x9e, 0x6a, 0x13, 0x30, 0x5e, 0xc5, - 0x3b, 0x20, 0x76, 0x4a, 0xf9, 0x5f, 0x79, 0x58, 0x92, 0x71, 0xa0, 0x19, 0x64, 0xfe, 0x06, 0x16, - 0x64, 0x51, 0xb5, 0xd7, 0xf3, 0xbd, 0xe7, 0xb4, 0x6d, 0x52, 0x9a, 0xbf, 0x10, 0x96, 0x94, 0x76, - 0x44, 0x9b, 0x88, 0xd8, 0x59, 0xe0, 0x6f, 0xc6, 0xfb, 0xf3, 0x85, 0x29, 0x9d, 0xf8, 0x6a, 0xa0, - 0x17, 0x46, 0x97, 0x4e, 0x66, 0x6e, 0x27, 0x5d, 0x52, 0xb5, 0x13, 0xde, 0xa3, 0xe1, 0xd7, 0xf5, - 0x1e, 0xb1, 0xf3, 0xad, 0x89, 0xb3, 0x36, 0x0d, 0x93, 0xdb, 0xf4, 0x45, 0x44, 0xf7, 0xdf, 0xcd, - 0xc1, 0x94, 0xb1, 0xb9, 0xc9, 0x3b, 0x30, 0x82, 0x7f, 0xa0, 0xe6, 0x15, 0xcf, 0xa4, 0xd8, 0x06, - 0x33, 0x9e, 0x49, 0xf1, 0xa6, 0x9b, 0x30, 0xc6, 0x63, 0x9e, 0xda, 0xe7, 0x38, 0x88, 0xa8, 0x90, - 0xba, 0x16, 0x07, 0xe1, 0x67, 0x12, 0x01, 0x6f, 0x3d, 0x84, 0x9b, 0x22, 0x7c, 0xca, 0x5c, 0xfc, - 0xba, 0x7e, 0x08, 0x38, 0xa7, 0xa2, 0xb0, 0x1c, 0x58, 0x5a, 0xa7, 0x71, 0xd1, 0x63, 0x84, 0x1c, - 0x7e, 0x09, 0x97, 0x8d, 0x72, 0x85, 0x11, 0x9f, 0x52, 0x28, 0x1e, 0x52, 0xa8, 0xe3, 0xad, 0xad, - 0x1b, 0x69, 0x5d, 0xe8, 0x83, 0xb5, 0x28, 0x5c, 0xc6, 0xe3, 0xb6, 0xba, 0x08, 0x0b, 0x2e, 0x20, - 0xf5, 0xee, 0x68, 0xfb, 0x9a, 0x4b, 0x3c, 0xfe, 0x0a, 0x57, 0xea, 0x38, 0x55, 0x6b, 0x4d, 0xc1, - 0x44, 0xdd, 0xeb, 0x86, 0xf4, 0x07, 0x7c, 0x07, 0x63, 0x4d, 0xc3, 0xa4, 0xac, 0xea, 0xd0, 0x20, - 0xb0, 0xfe, 0xe1, 0x10, 0x58, 0x82, 0xb0, 0x69, 0xae, 0x22, 0x49, 0x8f, 0xfd, 0xc4, 0x60, 0x85, - 0x12, 0xb9, 0xa2, 0x3b, 0xc4, 0xa2, 0x5a, 0xce, 0x79, 0xf8, 0x6e, 0xa9, 0x15, 0x95, 0x1a, 0x9c, - 0x97, 0x98, 0xfd, 0xcf, 0x32, 0xc4, 0x24, 0xdf, 0x6c, 0x98, 0x39, 0x26, 0x43, 0x4c, 0x1a, 0x78, - 0xd3, 0x45, 0xa6, 0x6d, 0x90, 0x41, 0x28, 0x77, 0xa2, 0xe2, 0xf5, 0x55, 0x8d, 0xc8, 0xb6, 0xc6, - 0x0b, 0x9a, 0x89, 0x6c, 0x69, 0x3a, 0x12, 0xf2, 0xc4, 0xa4, 0xa5, 0xd8, 0x8f, 0xf2, 0xe2, 0x59, - 0xaf, 0xe2, 0x58, 0x7b, 0x5a, 0x89, 0x99, 0x7c, 0xce, 0x68, 0xab, 0xb9, 0xff, 0xfe, 0x6e, 0x0e, - 0xae, 0xf1, 0xd5, 0xd9, 0xf1, 0xdd, 0xe7, 0x6e, 0x87, 0x1e, 0x50, 0x83, 0x4d, 0x4f, 0xd2, 0x2f, - 0xf0, 0x72, 0xe7, 0x92, 0xd1, 0x98, 0xaf, 0x83, 0x0a, 0xf0, 0x2c, 0xff, 0x72, 0x1a, 0x7e, 0xeb, - 0x34, 0x07, 0x4b, 0xf2, 0x39, 0x61, 0xec, 0x56, 0xeb, 0xa2, 0x36, 0x5b, 0xcd, 0xb8, 0x88, 0xca, - 0x67, 0x5c, 0x44, 0x19, 0x0e, 0xfe, 0x70, 0xc0, 0xcd, 0xd4, 0xd0, 0xeb, 0xfb, 0xbc, 0x7f, 0x35, - 0x04, 0x33, 0x3b, 0xce, 0x81, 0xdb, 0x65, 0xb2, 0x47, 0xa6, 0xd0, 0x21, 0xd5, 0x44, 0x26, 0xb2, - 0xfe, 0x81, 0x57, 0x29, 0xa9, 0xc6, 0x96, 0xf5, 0xa4, 0x40, 0xf9, 0xac, 0xe0, 0x7e, 0x33, 0xf5, - 0xcf, 0x27, 0x86, 0x8b, 0x33, 0x11, 0x7b, 0x87, 0xd1, 0x2d, 0x5d, 0xaf, 0x1d, 0xcb, 0xce, 0x87, - 0x6e, 0xc2, 0xc7, 0x30, 0xa1, 0x05, 0xd0, 0x09, 0x06, 0x4d, 0x60, 0x40, 0xb2, 0x1c, 0x9d, 0xec, - 0xd3, 0xd4, 0x4c, 0x4c, 0x3a, 0x86, 0x94, 0xfc, 0x4b, 0x23, 0x6f, 0x38, 0xff, 0xd2, 0xb7, 0x7c, - 0xc8, 0xd2, 0x61, 0x3c, 0x2a, 0xf4, 0x06, 0x47, 0x9f, 0xf0, 0x1a, 0xef, 0xad, 0x68, 0xa3, 0x4f, - 0x4b, 0x26, 0xa7, 0x23, 0xab, 0x01, 0x14, 0x64, 0xda, 0x4a, 0xeb, 0x7f, 0x8c, 0xc2, 0xdc, 0x96, - 0x1b, 0x84, 0x72, 0x75, 0x83, 0x48, 0xf4, 0x4f, 0xca, 0x32, 0xed, 0x10, 0x24, 0xac, 0x34, 0x5e, - 0xde, 0x8c, 0x65, 0xd1, 0x34, 0x00, 0xc8, 0x07, 0xba, 0x2b, 0x2a, 0xaf, 0xe5, 0xd6, 0x48, 0x26, - 0x40, 0xd4, 0x7d, 0x54, 0xef, 0x18, 0x5e, 0x37, 0xae, 0x57, 0x3b, 0xac, 0x40, 0xd7, 0xab, 0xdc, - 0x71, 0xb5, 0x12, 0x77, 0xc5, 0xf1, 0x0e, 0xb8, 0x50, 0x3c, 0xa2, 0x86, 0xc9, 0xad, 0x3c, 0x5a, - 0x4f, 0x94, 0x47, 0x6b, 0x04, 0x8f, 0xcc, 0x3f, 0xd2, 0x3c, 0x5a, 0x71, 0x22, 0xe8, 0x5e, 0x2d, - 0xfe, 0x9a, 0xbb, 0x83, 0x05, 0xfa, 0x6b, 0x6e, 0xde, 0x84, 0xec, 0xc2, 0xec, 0x8e, 0x4f, 0xdb, - 0x28, 0x5a, 0xd6, 0x7e, 0xe8, 0xf9, 0xe2, 0x88, 0x81, 0x7e, 0x51, 0x9e, 0x68, 0xac, 0x27, 0xab, - 0x9b, 0x54, 0xd5, 0xeb, 0x12, 0x26, 0x05, 0x9c, 0xac, 0xc1, 0x74, 0x83, 0x3a, 0x7e, 0xeb, 0xf0, - 0x21, 0x7d, 0xc9, 0x04, 0x63, 0x50, 0x1a, 0x8b, 0x92, 0xb3, 0x04, 0x58, 0xc3, 0x26, 0x8a, 0x55, - 0xfa, 0x6d, 0x98, 0x09, 0x44, 0x7e, 0x0a, 0xa3, 0x0d, 0xcf, 0x0f, 0x6b, 0x2f, 0x63, 0x19, 0x31, - 0x79, 0x61, 0xed, 0xaa, 0x4c, 0x50, 0x13, 0x78, 0x7e, 0xd8, 0xdc, 0xd7, 0xe9, 0x26, 0xe0, 0xc8, - 0x03, 0x66, 0x75, 0x31, 0x4b, 0x30, 0x74, 0x3a, 0x75, 0x8c, 0xea, 0xe0, 0xef, 0xf1, 0x84, 0x65, - 0x85, 0xe6, 0x63, 0xe8, 0x74, 0x9a, 0xa8, 0xe7, 0xcd, 0x7b, 0x39, 0x1d, 0x8a, 0xbc, 0x84, 0x39, - 0x93, 0xd1, 0x45, 0xfa, 0x2a, 0x30, 0x72, 0xcb, 0xa5, 0x35, 0xa9, 0xdd, 0x11, 0xa3, 0xbc, 0x11, - 0xcf, 0x9b, 0x96, 0xc8, 0x68, 0x95, 0xda, 0x05, 0x79, 0x84, 0xf9, 0x81, 0x38, 0x65, 0xaa, 0x01, - 0x0f, 0x13, 0xe3, 0x8f, 0x00, 0x6f, 0x9e, 0x9d, 0x56, 0xae, 0x9f, 0x60, 0x92, 0x44, 0xa4, 0xa8, - 0xc3, 0x23, 0xd8, 0x75, 0x8a, 0x26, 0x40, 0x5f, 0xc7, 0xb9, 0xf9, 0xc7, 0x39, 0x98, 0x8f, 0xb1, - 0x9b, 0x38, 0x9f, 0x3e, 0x86, 0x71, 0x55, 0x28, 0x5c, 0x3a, 0x25, 0xa5, 0x47, 0x63, 0x72, 0x98, - 0x33, 0xbb, 0xdc, 0x8b, 0xfa, 0x60, 0x23, 0x1c, 0xe4, 0x7e, 0xcc, 0x0f, 0xca, 0xcf, 0x3d, 0x5d, - 0xa6, 0xd4, 0xcd, 0x0d, 0x22, 0x9b, 0x91, 0x4f, 0x00, 0xb4, 0x55, 0xe6, 0x9b, 0x10, 0x63, 0x38, - 0xd3, 0x17, 0x58, 0x6b, 0x6c, 0xfd, 0xe1, 0x98, 0x54, 0xd3, 0xe2, 0xa4, 0xbc, 0xeb, 0x3b, 0xad, - 0xa3, 0x28, 0x98, 0xf6, 0x83, 0x64, 0xe4, 0xea, 0x79, 0x24, 0xc2, 0x6d, 0xe3, 0xcd, 0x7d, 0x76, - 0xfa, 0xde, 0x28, 0xfd, 0xc2, 0xd0, 0x39, 0xd2, 0x2f, 0xdc, 0x83, 0xb1, 0xcd, 0xee, 0x73, 0x97, - 0x19, 0xe5, 0x3c, 0xf4, 0x12, 0x4d, 0x5a, 0x97, 0x17, 0xe9, 0x84, 0x11, 0xad, 0xc8, 0x27, 0x50, - 0xd8, 0xf0, 0x82, 0xb0, 0x2b, 0xc3, 0x2e, 0xc5, 0x2e, 0x0c, 0xd1, 0x2f, 0xdc, 0x3c, 0x14, 0x55, - 0xba, 0xcc, 0x91, 0xcd, 0xc9, 0x87, 0x30, 0x56, 0x6d, 0xb7, 0xd9, 0xa6, 0x16, 0x02, 0x01, 0x73, - 0x7f, 0x0a, 0x48, 0x87, 0xd7, 0xe8, 0x5d, 0x8a, 0xc6, 0xe4, 0x73, 0xd3, 0x49, 0x3b, 0x16, 0x25, - 0x27, 0x49, 0xcf, 0x83, 0x6b, 0x3a, 0x70, 0xdf, 0x91, 0x97, 0x63, 0x85, 0x28, 0xdd, 0x0b, 0xa6, - 0x6e, 0x31, 0x24, 0x29, 0xde, 0xad, 0x6d, 0xc2, 0xf8, 0x66, 0xd7, 0x0d, 0x5d, 0x4c, 0x78, 0x31, - 0x6e, 0xe8, 0xe3, 0x1d, 0xc7, 0x0f, 0xdd, 0x96, 0xdb, 0x73, 0xba, 0x21, 0x5f, 0x2d, 0x57, 0x36, - 0xd4, 0x57, 0x4b, 0x41, 0xeb, 0xa9, 0xb1, 0xe0, 0x8d, 0xa5, 0xc6, 0x4a, 0xcd, 0x2e, 0x35, 0xf1, - 0xea, 0xd9, 0xa5, 0x56, 0xf8, 0x5a, 0xa2, 0x0d, 0x3c, 0x19, 0x31, 0x22, 0xfa, 0x2e, 0x4d, 0x63, - 0xd7, 0x56, 0x0d, 0xc9, 0x0d, 0x4c, 0x70, 0x31, 0x15, 0x05, 0x44, 0x1b, 0x97, 0xf1, 0xf9, 0xcd, - 0x55, 0xd2, 0x84, 0x49, 0xd6, 0x7a, 0xc7, 0xeb, 0xb8, 0x2d, 0x97, 0x06, 0xa5, 0x69, 0xc3, 0xd9, - 0x6d, 0x6e, 0x0a, 0x6c, 0xf4, 0xb2, 0x41, 0x43, 0xae, 0x53, 0xb1, 0xeb, 0x9e, 0x00, 0xd4, 0x75, - 0xaa, 0x8e, 0x90, 0xfc, 0x9c, 0xe9, 0x03, 0x1d, 0x8b, 0x48, 0x5c, 0xbb, 0x90, 0xda, 0xc5, 0xde, - 0x7b, 0x52, 0x51, 0xf0, 0x87, 0x2e, 0x21, 0x2f, 0x36, 0x15, 0x85, 0x0e, 0x60, 0xd9, 0x50, 0x8a, - 0x6e, 0xe4, 0x62, 0xbb, 0xf7, 0xc3, 0xe4, 0x33, 0x1a, 0x4c, 0xda, 0x18, 0x3d, 0xa3, 0xd1, 0x19, - 0x22, 0x7a, 0x50, 0xf3, 0x04, 0xae, 0xd9, 0xf4, 0xd8, 0x7b, 0x4e, 0xdf, 0x2c, 0xda, 0x9f, 0xc1, - 0x55, 0x13, 0xe1, 0x93, 0x5e, 0x1b, 0x9f, 0xe5, 0xf2, 0xab, 0xbf, 0xd4, 0xb4, 0x2f, 0x02, 0x80, - 0xa7, 0x7d, 0xe1, 0xb9, 0x04, 0xd8, 0x9f, 0xfa, 0x7e, 0xc0, 0x3a, 0xcb, 0x83, 0x45, 0x13, 0x79, - 0xb5, 0xdd, 0xd6, 0x36, 0x02, 0x33, 0x28, 0xb5, 0xcf, 0x98, 0x05, 0xab, 0xef, 0x18, 0x94, 0x9c, - 0xbd, 0xa8, 0x40, 0xdf, 0xab, 0x5a, 0x3b, 0x8b, 0x42, 0x25, 0x4e, 0x1e, 0x46, 0x32, 0xbd, 0xcf, - 0x1a, 0x4c, 0x69, 0x9f, 0xea, 0x40, 0x88, 0xa2, 0x44, 0xeb, 0xc1, 0x24, 0x98, 0x09, 0x62, 0xb5, - 0xa0, 0x9c, 0x46, 0x34, 0xdc, 0x66, 0x2f, 0xc9, 0x5a, 0xb4, 0x75, 0x07, 0x5f, 0xb9, 0x5e, 0xce, - 0x7c, 0xf6, 0xf7, 0xb7, 0x87, 0xe1, 0x9a, 0x58, 0x8c, 0x37, 0xb9, 0xe2, 0xe4, 0x7b, 0x98, 0xd0, - 0xd6, 0x58, 0x10, 0xfd, 0x86, 0x8c, 0xd2, 0xc8, 0xe2, 0x05, 0x2e, 0x2f, 0x4f, 0xb0, 0xa0, 0x19, - 0x5b, 0x6e, 0x66, 0x18, 0xeb, 0x6c, 0xd3, 0x81, 0x69, 0x73, 0xa1, 0xc5, 0x61, 0xe3, 0x56, 0x6a, - 0x27, 0x66, 0x53, 0x99, 0x00, 0xa1, 0xdd, 0x4c, 0x5d, 0x6e, 0xcc, 0xb2, 0x6b, 0x32, 0xd1, 0x0f, - 0x30, 0x93, 0x58, 0x65, 0x71, 0x36, 0xb9, 0x9d, 0xda, 0x61, 0xa2, 0x35, 0x17, 0x7e, 0x3e, 0x16, - 0x67, 0x76, 0x9b, 0xec, 0x84, 0xb4, 0x61, 0x52, 0x5f, 0x78, 0x71, 0x78, 0xb9, 0xd9, 0x87, 0x94, - 0xbc, 0x21, 0x17, 0x55, 0x82, 0x96, 0xb8, 0xf6, 0x66, 0x62, 0x7a, 0x03, 0x6b, 0xad, 0x00, 0xa3, - 0xfc, 0x9b, 0x89, 0x80, 0x1d, 0x9f, 0x06, 0xb4, 0xdb, 0xa2, 0x7a, 0xc0, 0xcd, 0xeb, 0x8a, 0x80, - 0x7f, 0x9f, 0x83, 0x52, 0x1a, 0xde, 0x06, 0xed, 0xb6, 0xc9, 0x0e, 0x14, 0xe3, 0x1d, 0x09, 0xae, - 0xb6, 0xa4, 0x45, 0x95, 0x3d, 0xa4, 0x8d, 0x4b, 0x76, 0x02, 0x9a, 0x29, 0x21, 0xad, 0xec, 0x82, - 0x91, 0x4d, 0x49, 0x50, 0xdd, 0xc1, 0xb1, 0x81, 0x01, 0x5c, 0xab, 0xde, 0xb1, 0xe3, 0x76, 0x99, - 0xee, 0x56, 0x06, 0xe1, 0x3d, 0x80, 0xa8, 0x54, 0xd0, 0x86, 0x3b, 0x01, 0xb0, 0x54, 0x46, 0xf9, - 0xa9, 0x26, 0xd6, 0xe7, 0x28, 0xc1, 0x85, 0x9e, 0xe3, 0x0f, 0x2a, 0x14, 0xb2, 0x1b, 0x30, 0xb2, - 0xbb, 0xd5, 0xa8, 0x57, 0xc5, 0xf3, 0x0c, 0xfe, 0xd6, 0xae, 0x13, 0x34, 0x5b, 0x8e, 0xcd, 0x2b, - 0xde, 0x7d, 0x17, 0xc6, 0xd5, 0x0f, 0x25, 0x90, 0x02, 0x0c, 0x6f, 0x6e, 0x6f, 0xee, 0xf2, 0xc4, - 0x7b, 0x3b, 0x4f, 0x76, 0x8b, 0x39, 0x02, 0x30, 0xba, 0xba, 0xb6, 0xb5, 0xb6, 0xbb, 0x56, 0xcc, - 0xbf, 0xdb, 0xd4, 0x5d, 0x16, 0xe4, 0x1a, 0x2c, 0xac, 0xae, 0xed, 0x6d, 0xd6, 0xd7, 0x9a, 0xbb, - 0x7f, 0x66, 0x67, 0xad, 0x69, 0x3e, 0x1c, 0x99, 0x83, 0xa2, 0x5e, 0xb9, 0xfb, 0x78, 0x77, 0xa7, - 0x98, 0x23, 0x25, 0x98, 0xd3, 0x4b, 0x9f, 0xae, 0xd5, 0xaa, 0x4f, 0x76, 0x37, 0xb6, 0x8b, 0x43, - 0xd6, 0x70, 0x21, 0x5f, 0xcc, 0xbf, 0xfb, 0xbd, 0xe1, 0xcf, 0x20, 0x8b, 0x50, 0x12, 0xcd, 0x9f, - 0x34, 0xaa, 0xeb, 0xd9, 0x5d, 0xf0, 0xda, 0x47, 0x0f, 0xaa, 0xc5, 0x1c, 0xb9, 0x0e, 0x57, 0x8d, - 0xd2, 0x9d, 0x6a, 0xa3, 0xf1, 0xf4, 0xb1, 0xbd, 0xba, 0xb5, 0xd6, 0x68, 0x14, 0xf3, 0xef, 0xde, - 0x16, 0xf1, 0x1a, 0x64, 0x1a, 0x60, 0x75, 0xad, 0x51, 0x5f, 0xdb, 0x5e, 0xdd, 0xdc, 0x5e, 0x2f, - 0x5e, 0x22, 0x53, 0x30, 0x5e, 0x55, 0x9f, 0xb9, 0xe5, 0x3f, 0xda, 0x87, 0x09, 0xb6, 0xae, 0xf2, - 0xf8, 0xdf, 0x84, 0x85, 0x47, 0x8e, 0xdb, 0x0d, 0x1d, 0xb7, 0x2b, 0xb8, 0x51, 0xf2, 0x12, 0xa9, - 0xf4, 0x61, 0x2e, 0xc6, 0x97, 0xe5, 0x41, 0x51, 0x69, 0x77, 0x72, 0xf7, 0x73, 0xa4, 0x01, 0x73, - 0x69, 0x86, 0x34, 0xb1, 0xcc, 0x8c, 0x1e, 0x69, 0xe2, 0xb5, 0x9c, 0x65, 0x0b, 0x90, 0x47, 0x30, - 0x93, 0x50, 0xee, 0x6a, 0xbc, 0x59, 0x6a, 0xbf, 0x1f, 0xba, 0x12, 0xba, 0x76, 0x43, 0x37, 0xae, - 0xda, 0x03, 0x72, 0x25, 0xa1, 0x38, 0xd6, 0xd8, 0xe6, 0xcd, 0x44, 0x76, 0x3f, 0x47, 0x6c, 0x98, - 0x4b, 0x33, 0x13, 0xd4, 0x94, 0xfb, 0xd8, 0x10, 0xe5, 0x8c, 0xee, 0x18, 0xce, 0x34, 0x45, 0xa4, - 0x70, 0xf6, 0xd1, 0x52, 0x99, 0x38, 0x3f, 0x67, 0x26, 0x58, 0xb7, 0xfd, 0x90, 0xd2, 0x5e, 0xb5, - 0xe3, 0x3e, 0xa7, 0x01, 0x91, 0x31, 0x95, 0xaa, 0x28, 0x0b, 0xf6, 0x4e, 0x8e, 0xfc, 0x16, 0x4c, - 0x60, 0x6e, 0x66, 0x11, 0x02, 0x34, 0xa9, 0xe7, 0x6b, 0x2e, 0xcb, 0x2f, 0xac, 0xbc, 0x9f, 0x23, - 0x3f, 0x81, 0xb1, 0x75, 0x8a, 0x31, 0x30, 0xe4, 0x66, 0xec, 0x27, 0x48, 0x36, 0xbb, 0xea, 0x7c, - 0x24, 0x07, 0x1c, 0xf7, 0x67, 0x91, 0x3a, 0x14, 0x04, 0x78, 0x40, 0xac, 0x18, 0x7c, 0x90, 0x82, - 0x60, 0x36, 0x86, 0x80, 0x1d, 0x51, 0x49, 0x1d, 0xc6, 0x55, 0x20, 0x0e, 0x59, 0xc8, 0x88, 0xfe, - 0x29, 0x97, 0x92, 0x15, 0xc2, 0x47, 0x3a, 0xf4, 0x37, 0xf2, 0x39, 0x26, 0xc5, 0xf8, 0x0b, 0x4e, - 0x9c, 0x4b, 0x7c, 0xa0, 0xe5, 0x04, 0x01, 0xc9, 0x3a, 0x93, 0x2d, 0x1d, 0x1a, 0xd2, 0xf3, 0x4e, - 0x3e, 0x6b, 0xb5, 0xb6, 0x60, 0x5a, 0xbd, 0xa7, 0x3c, 0x3f, 0x25, 0xb2, 0xb0, 0x7d, 0xca, 0x76, - 0x10, 0x4f, 0x68, 0xa0, 0x22, 0x5f, 0x49, 0x56, 0x2c, 0xac, 0x5a, 0x4e, 0xde, 0x4c, 0x83, 0x55, - 0x89, 0xaf, 0x15, 0x6c, 0x3c, 0x15, 0x76, 0x0c, 0x96, 0x42, 0x59, 0xef, 0xd7, 0x8c, 0x82, 0x25, - 0x37, 0xb4, 0x01, 0xa4, 0x06, 0xef, 0x96, 0x6f, 0xf6, 0x69, 0xc1, 0xd7, 0x09, 0xa5, 0xce, 0x57, - 0x30, 0x65, 0xc4, 0x4d, 0x12, 0xf9, 0xa4, 0x23, 0x2d, 0xb0, 0xb5, 0xbc, 0x98, 0x5e, 0x29, 0x74, - 0xcd, 0x03, 0x14, 0x36, 0xb1, 0x44, 0x93, 0xe5, 0xb4, 0x84, 0x92, 0xdc, 0x3d, 0x53, 0x96, 0x49, - 0x83, 0x62, 0x20, 0x6b, 0x30, 0xab, 0x2e, 0xbc, 0xb4, 0x5f, 0xef, 0xc8, 0x48, 0x4d, 0x99, 0xb9, - 0x72, 0x5f, 0xc2, 0xac, 0xe0, 0x03, 0x03, 0x4d, 0x51, 0x09, 0x17, 0x91, 0xc5, 0x30, 0x13, 0xc1, - 0x57, 0x30, 0xdf, 0x88, 0xcd, 0x87, 0xdb, 0x8c, 0x57, 0x4d, 0x14, 0x5a, 0x52, 0xca, 0x4c, 0x5c, - 0x0f, 0x81, 0x34, 0x4e, 0xf6, 0x8f, 0x5d, 0x85, 0xee, 0xb9, 0x4b, 0x5f, 0x90, 0xeb, 0xb1, 0x29, - 0xb1, 0x42, 0x6c, 0x86, 0xd2, 0xa9, 0x9c, 0x31, 0x63, 0xb2, 0xcb, 0x33, 0x5c, 0xf0, 0x6c, 0x5d, - 0x4e, 0xcf, 0xd9, 0x77, 0x3b, 0x6e, 0xc8, 0xce, 0x8a, 0x37, 0x0c, 0x00, 0xbd, 0x4a, 0xae, 0xe0, - 0xd5, 0xcc, 0x16, 0xe4, 0x0b, 0x98, 0x5a, 0xa7, 0x61, 0x94, 0x77, 0x93, 0x2c, 0x24, 0x32, 0x75, - 0x8a, 0x75, 0x93, 0xa1, 0x0f, 0x66, 0xb2, 0xcf, 0x4d, 0x28, 0x72, 0xe1, 0xaa, 0xa1, 0xb8, 0x9e, - 0x40, 0x21, 0x9a, 0x38, 0xbe, 0x73, 0x1c, 0x64, 0x52, 0xeb, 0x1e, 0x0c, 0xef, 0xb8, 0xdd, 0x03, - 0x22, 0x6f, 0x32, 0xb4, 0xbc, 0x75, 0xe5, 0x59, 0xa3, 0x4c, 0xb0, 0xde, 0x3e, 0x54, 0x78, 0xc2, - 0xc9, 0x64, 0x92, 0x47, 0x99, 0x55, 0xff, 0x2d, 0x15, 0xee, 0xdc, 0x27, 0x31, 0xa5, 0xa2, 0x4f, - 0xbc, 0x7e, 0x6f, 0x85, 0xec, 0x20, 0xd5, 0x93, 0x1d, 0x90, 0x5b, 0x91, 0x3e, 0xcd, 0xcc, 0x31, - 0x59, 0x26, 0x71, 0xc4, 0x7b, 0x2b, 0x44, 0x25, 0xc6, 0x48, 0x41, 0x7a, 0xdb, 0x50, 0xfb, 0x17, - 0xc3, 0xfb, 0x05, 0x8c, 0xab, 0x04, 0x8b, 0x4a, 0xde, 0xc4, 0xb3, 0x42, 0x2a, 0x01, 0x9e, 0xcc, - 0xc5, 0xf8, 0x39, 0xcf, 0x85, 0x6a, 0xc2, 0xc7, 0x73, 0x10, 0x66, 0x2e, 0xde, 0x27, 0x30, 0xa1, - 0x65, 0x1f, 0x54, 0x9b, 0x25, 0x99, 0x91, 0xb0, 0x6c, 0xfe, 0x4a, 0xd3, 0x7d, 0xa6, 0x34, 0xc6, - 0x44, 0xba, 0x5b, 0x32, 0x1f, 0x81, 0x69, 0xc9, 0xd7, 0x62, 0x20, 0xe4, 0x23, 0x0c, 0x9f, 0xac, - 0x9f, 0xf8, 0x3e, 0xed, 0x72, 0xb8, 0x2c, 0x33, 0x24, 0x06, 0xb8, 0x82, 0x8a, 0x92, 0x8f, 0xf0, - 0x8a, 0xd9, 0x55, 0xf6, 0xf0, 0x56, 0x00, 0x38, 0xb1, 0xb0, 0x27, 0xb3, 0x3a, 0x93, 0x1c, 0x2b, - 0x4c, 0x11, 0xb6, 0x2f, 0x08, 0xf4, 0x85, 0x54, 0x86, 0x08, 0x54, 0x32, 0x96, 0x40, 0x27, 0x47, - 0x16, 0xfc, 0x26, 0x14, 0xab, 0x2d, 0x14, 0xcf, 0x2a, 0x91, 0x1c, 0x59, 0x52, 0x5b, 0xdf, 0xac, - 0x90, 0xb8, 0xe6, 0xe3, 0x79, 0xe9, 0xb6, 0xa8, 0x83, 0x91, 0x9c, 0x0b, 0x4a, 0x49, 0xc7, 0xaa, - 0xd2, 0x21, 0x32, 0x07, 0xb5, 0x06, 0x73, 0x75, 0xa7, 0xdb, 0xa2, 0x9d, 0xd7, 0x43, 0xf3, 0x29, - 0xca, 0x29, 0x2d, 0xc9, 0xde, 0x95, 0x38, 0xbc, 0x10, 0x53, 0x33, 0xea, 0x70, 0xab, 0x9a, 0x56, - 0xe1, 0x32, 0x27, 0x62, 0x44, 0x96, 0x2c, 0xe8, 0xac, 0xee, 0x3f, 0x82, 0xe9, 0x35, 0x26, 0xc7, - 0x4f, 0xda, 0x2e, 0x0f, 0xfa, 0x27, 0x66, 0x14, 0x77, 0x26, 0xe0, 0x86, 0x4c, 0x7b, 0xaa, 0x65, - 0x9f, 0x53, 0xbb, 0x23, 0x99, 0xe0, 0xaf, 0x3c, 0x27, 0xd1, 0xea, 0x89, 0xea, 0x50, 0x69, 0x1f, - 0xc8, 0x0c, 0x47, 0xb1, 0x9c, 0x62, 0xba, 0x24, 0xca, 0xcc, 0x38, 0x56, 0x7e, 0xab, 0x7f, 0x23, - 0xdd, 0x88, 0xb3, 0x61, 0x21, 0x23, 0x5f, 0x1b, 0x79, 0x5b, 0xd9, 0xd3, 0xfd, 0xf2, 0xb9, 0xa5, - 0xd8, 0x79, 0xdf, 0x68, 0x59, 0x7b, 0x32, 0x70, 0xf6, 0x4f, 0xe4, 0x96, 0x49, 0x60, 0x15, 0xd8, - 0x9a, 0x9a, 0x70, 0x8d, 0xbc, 0x63, 0x62, 0xef, 0x93, 0x94, 0x2d, 0xb3, 0x87, 0xc7, 0xc8, 0x7a, - 0x51, 0xbe, 0x2f, 0x65, 0x2d, 0xa5, 0x25, 0x65, 0x53, 0xd6, 0x52, 0x6a, 0xb6, 0x34, 0x4e, 0xe0, - 0x75, 0xb8, 0x1c, 0x4b, 0x7d, 0x46, 0xae, 0xc7, 0x09, 0x3b, 0x80, 0xa0, 0x1c, 0xd1, 0x23, 0xc9, - 0xd8, 0x49, 0x44, 0xe9, 0xc9, 0xd0, 0xb2, 0xe6, 0xc8, 0xd1, 0x3d, 0x51, 0xb6, 0x93, 0x9e, 0xde, - 0x8c, 0xdc, 0x4c, 0x21, 0xe1, 0xf9, 0x48, 0xc7, 0xd1, 0x36, 0xa0, 0x18, 0xcf, 0x0e, 0x46, 0x96, - 0x14, 0x95, 0x52, 0x53, 0xa0, 0x95, 0x2b, 0x99, 0xf5, 0x42, 0x5b, 0x7d, 0x15, 0x2d, 0x0a, 0xbf, - 0x41, 0x8d, 0x2f, 0x8a, 0x9e, 0x19, 0x2a, 0xb1, 0x28, 0x66, 0x9a, 0xa6, 0x75, 0xd4, 0x27, 0x5a, - 0x0a, 0xa8, 0x4c, 0x7d, 0x72, 0x3d, 0x0d, 0x4f, 0x74, 0xab, 0xd7, 0x90, 0x69, 0x98, 0xb5, 0x71, - 0x2d, 0x19, 0x0a, 0x37, 0x39, 0xb4, 0x4a, 0x66, 0xbd, 0x9a, 0x69, 0x31, 0x9e, 0xf0, 0x4a, 0x21, - 0xcd, 0xc8, 0x84, 0x95, 0xc9, 0xca, 0x0f, 0x60, 0xce, 0x5c, 0xc5, 0x01, 0xf3, 0xcd, 0xc2, 0xb3, - 0x0b, 0xf3, 0xa9, 0xb9, 0xb3, 0x94, 0x2c, 0xea, 0x97, 0x59, 0xab, 0x8f, 0xe9, 0x3d, 0x65, 0xa4, - 0xbc, 0x22, 0xf2, 0x9a, 0x38, 0x96, 0x5d, 0x2b, 0xb1, 0xa6, 0x29, 0xa9, 0xb7, 0xf8, 0x9a, 0x6a, - 0xe9, 0xb3, 0xce, 0xb3, 0xa6, 0x69, 0xd9, 0xb6, 0x14, 0xf9, 0xb5, 0x71, 0x49, 0xa5, 0x1a, 0xaf, - 0xb8, 0x08, 0xf9, 0xcf, 0x33, 0xb4, 0x2c, 0x3c, 0xab, 0x68, 0x6c, 0xa9, 0xdf, 0xcc, 0xbb, 0x6a, - 0x90, 0xc9, 0xd8, 0x47, 0x65, 0x63, 0x72, 0xe6, 0x16, 0xaa, 0xc3, 0xa4, 0x9e, 0xbd, 0x2b, 0x73, - 0x14, 0xd7, 0x92, 0x38, 0x02, 0xed, 0xf8, 0x37, 0xad, 0xa8, 0xc0, 0x47, 0xb3, 0x18, 0x27, 0x8e, - 0x31, 0xa0, 0xec, 0x29, 0x11, 0x9d, 0x34, 0x03, 0x86, 0x94, 0x6d, 0x6c, 0xcc, 0x72, 0xb3, 0xcb, - 0xfc, 0x49, 0xc5, 0x8c, 0x5f, 0x66, 0xcc, 0x44, 0xf3, 0x04, 0x9f, 0x0e, 0xe9, 0xa9, 0xb8, 0x88, - 0xc6, 0x25, 0x29, 0x29, 0xba, 0xca, 0x4b, 0x59, 0xd5, 0xba, 0xdc, 0xff, 0x1a, 0x66, 0x12, 0x29, - 0xc7, 0x94, 0x5f, 0x2e, 0x2b, 0x19, 0x59, 0x7f, 0xd9, 0xba, 0xc1, 0x26, 0x1c, 0x03, 0xdc, 0x5b, - 0x1e, 0x8c, 0x34, 0xa9, 0xa1, 0xb7, 0xe4, 0x6b, 0xa3, 0xb4, 0xc1, 0x65, 0x25, 0x36, 0x1b, 0x2c, - 0x20, 0x62, 0x29, 0xcd, 0x62, 0x02, 0x22, 0x3d, 0xe1, 0x59, 0x26, 0xd6, 0x9f, 0x63, 0x8a, 0xf3, - 0x58, 0xba, 0x2c, 0xe5, 0x16, 0xc9, 0x4c, 0x91, 0xa6, 0xdc, 0x22, 0xd9, 0xb9, 0xcb, 0x38, 0x35, - 0xb7, 0x60, 0x2e, 0x2d, 0x01, 0x99, 0xe6, 0x46, 0xcc, 0xcc, 0x4e, 0x96, 0x42, 0x51, 0x5b, 0xee, - 0xf6, 0x0c, 0x6c, 0x7d, 0xd2, 0x91, 0x65, 0x52, 0xe0, 0x5b, 0x99, 0x64, 0x2e, 0x99, 0x36, 0x4c, - 0x1d, 0x1e, 0x07, 0xe4, 0x15, 0xeb, 0x63, 0xaa, 0x5e, 0x6e, 0xb8, 0x07, 0x5d, 0x2d, 0x2b, 0x97, - 0x32, 0x54, 0x93, 0x99, 0xc5, 0x94, 0x64, 0x49, 0x4b, 0xe2, 0xf5, 0x18, 0xe6, 0xa4, 0xe2, 0xd6, - 0xb3, 0x47, 0x91, 0x72, 0x76, 0xfa, 0x2a, 0x25, 0x65, 0x52, 0xd3, 0x4d, 0xf1, 0x23, 0x22, 0xfe, - 0x26, 0x9b, 0x76, 0x44, 0xd4, 0xd2, 0x3a, 0x95, 0xcd, 0x0c, 0x50, 0xe4, 0x33, 0x3c, 0xe9, 0xf1, - 0x1c, 0xa8, 0xd9, 0x3e, 0x6a, 0x03, 0x53, 0x24, 0xd3, 0x56, 0xa4, 0x17, 0x13, 0x3b, 0x34, 0x31, - 0x0f, 0x3e, 0xbc, 0x21, 0x90, 0x79, 0x78, 0xd3, 0x07, 0x9a, 0xed, 0x2b, 0x9a, 0xd4, 0xd3, 0x0e, - 0x28, 0x5a, 0xa5, 0x64, 0x3c, 0x51, 0xb4, 0x4a, 0xcb, 0x23, 0x82, 0x67, 0x85, 0x5d, 0x69, 0x18, - 0x46, 0xf8, 0xae, 0xf7, 0x4d, 0x04, 0x52, 0x5e, 0xea, 0x9f, 0x3d, 0x43, 0x5c, 0x56, 0x14, 0xe3, - 0x99, 0x11, 0x48, 0x5a, 0x1e, 0x17, 0x2d, 0xe1, 0x84, 0x32, 0x6f, 0x32, 0x53, 0x2a, 0xec, 0x48, - 0xa3, 0xd3, 0xc4, 0x9b, 0x91, 0xcd, 0x43, 0x47, 0xdd, 0xdf, 0x8c, 0x88, 0x92, 0x24, 0xe8, 0xa6, - 0x61, 0x22, 0x09, 0x83, 0x6e, 0x46, 0xa4, 0xe4, 0x55, 0x70, 0x65, 0xa0, 0x53, 0x7a, 0x6e, 0xb0, - 0x77, 0x4c, 0xe3, 0xad, 0x4f, 0x44, 0xf9, 0xc0, 0xeb, 0x20, 0xf2, 0x3b, 0x32, 0x25, 0x6c, 0x32, - 0x73, 0xce, 0xdb, 0x31, 0xb7, 0x50, 0x7a, 0x0c, 0x72, 0xb9, 0x5f, 0x62, 0x1e, 0xf2, 0x08, 0x1f, - 0xab, 0x3e, 0xde, 0x5c, 0xad, 0x8b, 0x5f, 0x5e, 0xf6, 0xfc, 0x84, 0xbf, 0x5d, 0xfb, 0xf5, 0xa0, - 0x88, 0xc8, 0xbc, 0x89, 0x01, 0xb8, 0xb7, 0x42, 0x1a, 0xe8, 0xf6, 0x35, 0x4a, 0x53, 0x5c, 0xee, - 0x29, 0x08, 0xcb, 0xe9, 0x08, 0xf1, 0x0e, 0x62, 0x4d, 0x6a, 0x33, 0x73, 0x98, 0x19, 0x63, 0xe8, - 0x67, 0x05, 0x70, 0xb6, 0x49, 0x47, 0x23, 0x47, 0x37, 0x88, 0x8f, 0x38, 0xc5, 0x1a, 0xd5, 0x47, - 0x5b, 0xaf, 0x44, 0x31, 0x03, 0x70, 0x6f, 0x59, 0x50, 0xcc, 0x28, 0xbd, 0x18, 0xc5, 0x62, 0x08, - 0x4d, 0x8a, 0x99, 0xc3, 0xcc, 0x18, 0xc3, 0x60, 0x8a, 0xa5, 0xa3, 0x39, 0x2f, 0xc5, 0xbe, 0x46, - 0xfd, 0xbc, 0x8e, 0x4f, 0x27, 0x2f, 0x44, 0xb3, 0x92, 0xb4, 0x60, 0x4d, 0xd0, 0xbd, 0x15, 0xf2, - 0x14, 0xb3, 0xd5, 0xc6, 0xca, 0xcf, 0x47, 0xb7, 0xc5, 0x2c, 0xa4, 0x48, 0xb9, 0x4d, 0x98, 0xe7, - 0x94, 0x8b, 0x0f, 0x37, 0x73, 0x2c, 0x99, 0xd3, 0x5e, 0x97, 0xc6, 0x4e, 0x1c, 0xd5, 0x45, 0xe9, - 0xb7, 0x8a, 0x2c, 0xb2, 0xeb, 0x33, 0xfb, 0xb4, 0x9d, 0x34, 0x5e, 0x4d, 0x24, 0xd2, 0x51, 0x6f, - 0x36, 0xdf, 0x5b, 0x26, 0x9b, 0xb8, 0x0a, 0x66, 0x71, 0x3f, 0xeb, 0x3e, 0x1d, 0x0d, 0x12, 0x69, - 0x43, 0x1a, 0x44, 0xb1, 0x31, 0x65, 0xf5, 0x9d, 0x3d, 0x28, 0x75, 0xf4, 0x39, 0xe7, 0xec, 0xb2, - 0x48, 0xc4, 0x15, 0x3b, 0x3f, 0x69, 0x0c, 0xa2, 0xcc, 0x8e, 0xef, 0x3d, 0x77, 0xf1, 0xc6, 0x17, - 0x5d, 0xe4, 0xcb, 0xe4, 0xa7, 0x30, 0x2e, 0x81, 0x07, 0x13, 0x24, 0x0e, 0x8d, 0x04, 0xf9, 0x02, - 0x26, 0x04, 0x41, 0x70, 0x04, 0x59, 0x3d, 0x65, 0x0e, 0xff, 0x27, 0x30, 0x21, 0xc8, 0xd0, 0x77, - 0x06, 0xd9, 0xb7, 0x9c, 0xf3, 0x51, 0xd0, 0x87, 0xfe, 0xab, 0xda, 0x83, 0x26, 0x93, 0xf6, 0x23, - 0xde, 0x64, 0x0f, 0x1f, 0x9d, 0x67, 0xfd, 0x02, 0x7a, 0x16, 0xca, 0x81, 0xbf, 0xbf, 0xce, 0xf0, - 0x36, 0xb2, 0xf1, 0x0e, 0x84, 0xcf, 0x9c, 0xfd, 0x36, 0x2c, 0xe2, 0x95, 0xc8, 0x45, 0x47, 0x9c, - 0x7d, 0x48, 0xb9, 0x1a, 0x45, 0x43, 0xc4, 0x7f, 0x7c, 0x3d, 0x0b, 0xd9, 0xa0, 0xdf, 0x7d, 0x67, - 0x58, 0x1b, 0x99, 0x58, 0x07, 0x41, 0xf7, 0x51, 0x46, 0xd7, 0x70, 0xee, 0x17, 0x1c, 0x6d, 0x7f, - 0x49, 0x13, 0xfb, 0x35, 0xf8, 0x41, 0xc1, 0x1c, 0xf1, 0xdf, 0x9b, 0x67, 0x58, 0x1a, 0x09, 0x2c, - 0x59, 0xad, 0xfb, 0x29, 0x1f, 0x9c, 0xda, 0x39, 0x47, 0x93, 0x7d, 0xe5, 0x32, 0xae, 0x32, 0xf2, - 0x10, 0xcd, 0xb6, 0x37, 0xf2, 0xcd, 0x94, 0xa7, 0xf4, 0xd0, 0x8b, 0x80, 0x54, 0xb9, 0x8e, 0xd7, - 0x33, 0xd3, 0x68, 0xbe, 0xc9, 0xd4, 0x94, 0x35, 0x71, 0x14, 0xfc, 0x6c, 0x82, 0x3f, 0x51, 0xaf, - 0x9d, 0x4d, 0xb4, 0x9c, 0x1d, 0x65, 0x33, 0xa3, 0x86, 0x10, 0x61, 0x98, 0x56, 0x43, 0xbf, 0x85, - 0xd2, 0xb3, 0x76, 0xe8, 0x67, 0x13, 0x33, 0xbf, 0x88, 0x3a, 0x9b, 0x60, 0x87, 0x26, 0xe6, 0xc1, - 0x67, 0x13, 0x04, 0x32, 0xcf, 0x26, 0xfa, 0x40, 0xb3, 0x37, 0x1e, 0x49, 0x26, 0x18, 0x51, 0xe7, - 0xee, 0xcc, 0xdc, 0x23, 0x7d, 0x2e, 0xaa, 0x66, 0x53, 0x52, 0x49, 0x29, 0x9b, 0x3f, 0x3b, 0xcd, - 0x54, 0xd9, 0xbc, 0x75, 0xb9, 0x9f, 0x23, 0xdb, 0x98, 0x33, 0x3e, 0xed, 0x97, 0xfb, 0xb3, 0xf8, - 0x47, 0x9a, 0x05, 0x29, 0x30, 0x7b, 0xef, 0x33, 0x7c, 0x8d, 0x74, 0x7c, 0x7d, 0xe1, 0xfa, 0x1c, - 0xeb, 0xae, 0x8a, 0x00, 0x97, 0x0b, 0x0c, 0x31, 0x9b, 0xc5, 0xc7, 0xb8, 0xe7, 0x39, 0x1b, 0xb4, - 0xa8, 0xff, 0x54, 0x3e, 0xaa, 0xac, 0xbb, 0x30, 0xca, 0x81, 0x32, 0xb5, 0x8d, 0xf1, 0xf3, 0xfa, - 0xe4, 0x3d, 0x79, 0x8f, 0xcc, 0x40, 0x8c, 0xaa, 0xcc, 0x71, 0xbd, 0x07, 0xe3, 0xdc, 0xed, 0x76, - 0x7e, 0x90, 0xcf, 0xe4, 0x6d, 0x73, 0xbf, 0x81, 0x65, 0x07, 0x79, 0x4c, 0xe9, 0x6e, 0xec, 0x8b, - 0x13, 0xf2, 0x27, 0xe8, 0xfa, 0x94, 0xae, 0x86, 0x6c, 0xf8, 0xf9, 0xd8, 0x4b, 0x47, 0x41, 0xd2, - 0x8f, 0xd1, 0xff, 0xaa, 0x72, 0xb2, 0x65, 0x0d, 0x7f, 0x26, 0x01, 0x4d, 0x3e, 0x83, 0x69, 0x4e, - 0x5c, 0x05, 0x9c, 0x6c, 0xd4, 0x87, 0x66, 0xd3, 0x9c, 0xcc, 0xaf, 0x02, 0xfc, 0x53, 0xe9, 0xa8, - 0x1d, 0x38, 0xec, 0xf3, 0xb8, 0x68, 0x07, 0x93, 0x2e, 0x0b, 0xcb, 0xef, 0xa0, 0xd2, 0x4d, 0x4f, - 0x24, 0x94, 0x89, 0xec, 0x8e, 0xe6, 0x82, 0xee, 0x9f, 0x82, 0xe8, 0x08, 0x83, 0x15, 0x53, 0x1b, - 0x29, 0x07, 0xd9, 0x80, 0xcc, 0x42, 0xe5, 0x1f, 0x0d, 0x6c, 0xa7, 0xfc, 0x5c, 0xe2, 0x07, 0x0b, - 0xd2, 0xfb, 0x1b, 0x90, 0x4e, 0x28, 0xc5, 0x65, 0x98, 0x91, 0xa5, 0x47, 0x22, 0x34, 0x2f, 0x33, - 0xfb, 0xce, 0x21, 0xfb, 0x88, 0x16, 0xfd, 0xee, 0xc0, 0x05, 0x17, 0x21, 0xdb, 0x8c, 0x22, 0xc9, - 0xdc, 0x45, 0xa4, 0xdf, 0x13, 0x3f, 0xdd, 0x21, 0x9b, 0x95, 0xf3, 0x68, 0x5d, 0x46, 0xc6, 0xc6, - 0xde, 0xcb, 0x66, 0xbd, 0xbc, 0xed, 0x73, 0x3a, 0x13, 0xb1, 0xa1, 0x6f, 0x04, 0x51, 0x72, 0xb5, - 0x2f, 0x8e, 0x48, 0x39, 0x86, 0x63, 0x88, 0xac, 0x3e, 0xcb, 0x3b, 0xd8, 0xe9, 0x55, 0xca, 0x58, - 0xd7, 0x8b, 0x2f, 0xa8, 0x13, 0x45, 0x21, 0x26, 0x13, 0x2c, 0x29, 0xb5, 0x9f, 0x99, 0xec, 0x49, - 0xad, 0x6e, 0x9f, 0xec, 0x4c, 0xf5, 0xe8, 0x17, 0xa3, 0x8c, 0x8c, 0x4c, 0x75, 0x7b, 0x4b, 0xb9, - 0xeb, 0xd2, 0x52, 0x35, 0x95, 0x41, 0x56, 0xda, 0x5b, 0x6c, 0xaf, 0x67, 0x25, 0x02, 0x8a, 0x22, - 0xa9, 0xfa, 0xe7, 0x5a, 0x52, 0x7b, 0x7d, 0x60, 0x46, 0xa1, 0x6d, 0x98, 0x4b, 0x4b, 0xe0, 0xa3, - 0x16, 0xad, 0x4f, 0x76, 0x9f, 0xd4, 0x70, 0xad, 0x1d, 0x98, 0x4f, 0x4d, 0xa2, 0xa3, 0x6e, 0x48, - 0xfa, 0xa5, 0xd8, 0x49, 0xc5, 0xf8, 0x0d, 0x2c, 0x64, 0x64, 0x8c, 0x89, 0x1c, 0x88, 0x7d, 0x33, - 0xca, 0x64, 0x32, 0xc4, 0x77, 0x50, 0xce, 0x4e, 0x46, 0x42, 0xee, 0x98, 0x4e, 0xd0, 0xec, 0x14, - 0x20, 0xe5, 0xd4, 0xec, 0x49, 0x64, 0x17, 0xb3, 0x43, 0xa6, 0x65, 0x27, 0x51, 0xe3, 0xee, 0x9f, - 0xbd, 0x24, 0x23, 0xcc, 0x6e, 0x21, 0x23, 0x21, 0x49, 0x1f, 0xac, 0xe7, 0x18, 0xed, 0xb6, 0x94, - 0x4b, 0x66, 0x86, 0x8a, 0x58, 0xc4, 0x7e, 0x6a, 0xfa, 0x8a, 0xd4, 0x71, 0x7e, 0x05, 0x53, 0xc6, - 0x13, 0x61, 0xc5, 0xfe, 0x69, 0xef, 0xd4, 0x95, 0xb7, 0x3a, 0xfd, 0x55, 0xf1, 0x1a, 0x7a, 0xbe, - 0xa3, 0x47, 0x22, 0x7d, 0x6c, 0xe0, 0xe8, 0x42, 0x2c, 0xf9, 0x16, 0xe5, 0x21, 0x1e, 0x8a, 0x8c, - 0xa7, 0x25, 0x7d, 0x8e, 0xc3, 0x0a, 0x53, 0xea, 0x5b, 0x94, 0x5a, 0xf1, 0x97, 0xff, 0x6d, 0x29, - 0xf7, 0xcb, 0x5f, 0x2f, 0xe5, 0xfe, 0xe8, 0xd7, 0x4b, 0xb9, 0x5f, 0xfd, 0x7a, 0x29, 0xb7, 0x3f, - 0x8a, 0x10, 0x2b, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0xf7, 0xd7, 0x27, 0x41, 0x49, 0x95, 0x00, - 0x00, + 0xb6, 0x50, 0xba, 0xfd, 0x6a, 0x2f, 0x3f, 0xd2, 0xa9, 0xd8, 0x71, 0xa7, 0xe3, 0xb8, 0x93, 0x3d, + 0x33, 0x39, 0x99, 0xb9, 0x73, 0x93, 0x8c, 0x3d, 0xef, 0xe7, 0xe9, 0x6e, 0x3b, 0xb6, 0x27, 0x8e, + 0xe3, 0xd9, 0xed, 0x38, 0xc3, 0x9c, 0xb9, 0xa7, 0x67, 0xbb, 0xbb, 0x62, 0x6f, 0xdc, 0xee, 0xdd, + 0x67, 0xef, 0xed, 0x64, 0x22, 0x04, 0xe2, 0x75, 0x01, 0x21, 0x21, 0x2e, 0x12, 0x57, 0x80, 0xf8, + 0xe0, 0x4a, 0xf0, 0x05, 0x82, 0x0f, 0x84, 0xf8, 0x42, 0xba, 0x3f, 0xe8, 0x72, 0x40, 0x42, 0xf0, + 0x73, 0x85, 0xc4, 0x47, 0x73, 0x38, 0x5f, 0xc8, 0x7f, 0x08, 0x81, 0xc4, 0xf9, 0x42, 0xb5, 0xea, + 0xb1, 0xab, 0xf6, 0xa3, 0xdb, 0x4e, 0xc2, 0xbd, 0x3f, 0x89, 0x77, 0x55, 0xad, 0x55, 0x55, 0xab, + 0x56, 0xad, 0xb5, 0x6a, 0xd5, 0xaa, 0xd5, 0x70, 0xc9, 0x39, 0x09, 0x0f, 0x03, 0xea, 0x3f, 0x73, + 0x5b, 0xf4, 0x4e, 0xcf, 0xf7, 0x42, 0x8f, 0x8c, 0xe1, 0x7f, 0xe5, 0xb9, 0x03, 0xef, 0xc0, 0xc3, + 0x3f, 0xef, 0xb2, 0xbf, 0x78, 0x65, 0xf9, 0xda, 0x81, 0xe7, 0x1d, 0x74, 0xe8, 0x5d, 0xfc, 0xda, + 0x3f, 0x79, 0x7a, 0x97, 0x1e, 0xf7, 0xc2, 0x17, 0xa2, 0xb2, 0x12, 0xaf, 0x0c, 0xdd, 0x63, 0x1a, + 0x84, 0xce, 0x71, 0x4f, 0x34, 0x98, 0x6a, 0x51, 0x3f, 0x0c, 0xc4, 0xc7, 0x47, 0x07, 0x6e, 0x78, + 0x78, 0xb2, 0x7f, 0xa7, 0xe5, 0x1d, 0xdf, 0x3d, 0xf0, 0x9d, 0x67, 0x6e, 0xe8, 0x84, 0xae, 0xd7, + 0x75, 0x3a, 0x77, 0x43, 0xda, 0xa1, 0x3d, 0xcf, 0x0f, 0xef, 0x3a, 0x3d, 0xf7, 0x6e, 0xf8, 0xa2, + 0x47, 0x03, 0xfe, 0xaf, 0x00, 0xac, 0x9f, 0x07, 0xf0, 0x39, 0xdd, 0x67, 0x53, 0xec, 0xaa, 0x3f, + 0x5e, 0x0a, 0x89, 0xef, 0xf4, 0x7a, 0xd4, 0x8f, 0xfe, 0x10, 0x48, 0xbe, 0x3a, 0x0f, 0x12, 0xfa, + 0x8c, 0x76, 0x43, 0xf9, 0x1f, 0x47, 0x60, 0xfd, 0xb3, 0x39, 0x18, 0x5b, 0x63, 0x05, 0xe4, 0x63, + 0x18, 0xdd, 0x7d, 0xd1, 0xa3, 0xa5, 0xdc, 0x8d, 0xdc, 0xed, 0xd9, 0xe5, 0x22, 0xaf, 0xbf, 0xf3, + 0xa8, 0x47, 0x7d, 0x44, 0x59, 0x23, 0xa7, 0xfd, 0xca, 0x2c, 0x43, 0xf4, 0xae, 0x77, 0xec, 0x86, + 0x48, 0x75, 0x1b, 0x21, 0xc8, 0x13, 0x98, 0xb5, 0x69, 0xe0, 0x9d, 0xf8, 0x2d, 0xba, 0x41, 0x9d, + 0x36, 0xf5, 0x4b, 0xf9, 0x1b, 0xb9, 0xdb, 0x53, 0xcb, 0xf3, 0x77, 0x38, 0xd1, 0xcc, 0xca, 0xda, + 0x95, 0xd3, 0x7e, 0x85, 0xf8, 0xa2, 0x2c, 0x42, 0xb6, 0x71, 0xc1, 0x8e, 0xa1, 0x21, 0xdf, 0xc3, + 0x4c, 0x9d, 0xfa, 0x61, 0xf5, 0x24, 0x3c, 0xf4, 0x7c, 0x37, 0x7c, 0x51, 0x1a, 0x41, 0xbc, 0x57, + 0x04, 0x5e, 0xa3, 0x6e, 0x6f, 0xb9, 0xb6, 0x78, 0xda, 0xaf, 0x94, 0xd8, 0x02, 0x37, 0x1d, 0x59, + 0x6a, 0xa0, 0x37, 0x91, 0x91, 0x6f, 0x61, 0xba, 0xc1, 0xc8, 0xd5, 0xda, 0xf5, 0x8e, 0x68, 0x37, + 0x28, 0x8d, 0x1a, 0x83, 0xd6, 0xab, 0xf6, 0x96, 0x6b, 0xd7, 0x4e, 0xfb, 0x95, 0x85, 0x00, 0xcb, + 0x9a, 0x21, 0x16, 0x1a, 0xa8, 0x0d, 0x4c, 0xe4, 0x07, 0x98, 0xdd, 0xf1, 0xbd, 0x67, 0x6e, 0xe0, + 0x7a, 0x5d, 0x2c, 0x2a, 0x8d, 0x21, 0xee, 0x05, 0x81, 0xdb, 0xac, 0xdc, 0x5b, 0xae, 0x5d, 0x3f, + 0xed, 0x57, 0xae, 0xf6, 0x64, 0x29, 0xef, 0xc0, 0xa4, 0x8c, 0x09, 0x42, 0x76, 0x61, 0xaa, 0xde, + 0x39, 0x09, 0x42, 0xea, 0x6f, 0x3b, 0xc7, 0xb4, 0x34, 0x8e, 0xe8, 0xe7, 0x24, 0x5d, 0xa2, 0x9a, + 0xbd, 0xe5, 0x5a, 0xf9, 0xb4, 0x5f, 0xb9, 0xd2, 0xe2, 0x45, 0xcd, 0xae, 0x73, 0x6c, 0x92, 0x5c, + 0x47, 0x43, 0x3e, 0x82, 0xd1, 0xc7, 0x01, 0xf5, 0x4b, 0x05, 0x44, 0x37, 0x23, 0xd0, 0xb1, 0xa2, + 0xbd, 0x65, 0xbe, 0xfe, 0x27, 0x01, 0xf5, 0x0d, 0x78, 0x04, 0x60, 0x80, 0xb6, 0xd7, 0xa1, 0xa5, + 0x49, 0x03, 0x90, 0x15, 0xed, 0x7d, 0xc0, 0x01, 0x7d, 0xaf, 0x63, 0x76, 0x8c, 0x00, 0x64, 0x13, + 0x26, 0x59, 0xcf, 0x41, 0xcf, 0x69, 0xd1, 0x12, 0x20, 0x74, 0x51, 0x40, 0xab, 0xf2, 0xda, 0xc2, + 0x69, 0xbf, 0x72, 0xb9, 0x2b, 0x3f, 0x0d, 0x2c, 0x11, 0x34, 0xf9, 0x0a, 0xc6, 0x1b, 0xd4, 0x7f, + 0x46, 0xfd, 0xd2, 0x14, 0xe2, 0xb9, 0x28, 0x17, 0x12, 0x0b, 0xf7, 0x96, 0x6b, 0x73, 0xa7, 0xfd, + 0x4a, 0x31, 0xc0, 0x2f, 0x03, 0x87, 0x00, 0x63, 0xdc, 0x66, 0xd3, 0x67, 0xd4, 0x0f, 0xe8, 0xee, + 0x49, 0xb7, 0x4b, 0x3b, 0xa5, 0x69, 0x83, 0xdb, 0x8c, 0x3a, 0xc9, 0x6d, 0x3e, 0x2f, 0x6c, 0x86, + 0x58, 0x6a, 0x72, 0x9b, 0x01, 0x40, 0x0e, 0xa1, 0xc8, 0xff, 0xaa, 0x7b, 0xdd, 0x2e, 0x6d, 0xb1, + 0x2d, 0x55, 0x9a, 0xc1, 0x0e, 0xae, 0x8a, 0x0e, 0xe2, 0xd5, 0x7b, 0xcb, 0xb5, 0xca, 0x69, 0xbf, + 0x72, 0x8d, 0xe3, 0x6e, 0xb6, 0x54, 0x85, 0xd1, 0x4d, 0x02, 0x2b, 0x9b, 0x47, 0xb5, 0xd5, 0xa2, + 0x41, 0x60, 0xd3, 0x5f, 0x9c, 0xd0, 0x20, 0x2c, 0xcd, 0x1a, 0xf3, 0x30, 0xea, 0xf6, 0x56, 0xf8, + 0x3c, 0x1c, 0x2c, 0x6c, 0xfa, 0xbc, 0xd4, 0x9c, 0x87, 0x01, 0x40, 0x76, 0x00, 0xaa, 0xbd, 0x5e, + 0x83, 0x06, 0x8c, 0x19, 0x4b, 0x17, 0x11, 0xf5, 0x65, 0x81, 0xfa, 0x09, 0xdd, 0x17, 0x15, 0x7b, + 0xcb, 0xb5, 0xab, 0xa7, 0xfd, 0xca, 0xbc, 0xd3, 0xeb, 0x35, 0x03, 0x5e, 0x64, 0x20, 0xd5, 0x70, + 0x70, 0xba, 0x1f, 0x7b, 0x21, 0x15, 0xac, 0x58, 0x2a, 0xc6, 0xe8, 0xae, 0xd5, 0xc9, 0xf1, 0xfa, + 0x58, 0xd8, 0x14, 0x6c, 0x1d, 0xa7, 0xbb, 0x06, 0xc0, 0xf6, 0xe2, 0xaa, 0x13, 0x3a, 0xfb, 0x4e, + 0x40, 0x05, 0x7b, 0x5c, 0x32, 0xf6, 0xa2, 0x59, 0xb9, 0xb7, 0xc2, 0xf7, 0x62, 0x5b, 0x94, 0x36, + 0x53, 0xf8, 0x25, 0x86, 0x8f, 0x51, 0x24, 0x9a, 0x78, 0x89, 0x0c, 0xa1, 0xc8, 0x73, 0xba, 0x9f, + 0x4e, 0x91, 0xa8, 0x29, 0xd9, 0x80, 0xc2, 0x13, 0xba, 0xcf, 0x25, 0xc7, 0x65, 0xc4, 0x77, 0x29, + 0xc2, 0xc7, 0x65, 0xc6, 0x0a, 0xdf, 0x15, 0x0c, 0x5b, 0x52, 0x5a, 0x28, 0x68, 0xf2, 0xbb, 0x39, + 0x58, 0x90, 0x3b, 0x9c, 0x86, 0xcf, 0x3d, 0xff, 0xc8, 0xed, 0x1e, 0xd4, 0xbd, 0xee, 0x53, 0xf7, + 0xa0, 0x34, 0x87, 0x98, 0x6f, 0xc4, 0x84, 0x46, 0xac, 0xd5, 0xde, 0x72, 0xed, 0x27, 0xa7, 0xfd, + 0xca, 0x1b, 0x4a, 0x80, 0xa8, 0x7a, 0xc6, 0x90, 0x4f, 0xdd, 0x03, 0xa3, 0xe3, 0xac, 0xbe, 0xc8, + 0x5f, 0xca, 0xc1, 0x15, 0x31, 0x3b, 0x9b, 0xb6, 0x3c, 0xbf, 0x1d, 0x0d, 0x63, 0x1e, 0x87, 0x51, + 0x51, 0xbb, 0x35, 0xad, 0xd1, 0xde, 0x72, 0xed, 0xd6, 0x69, 0xbf, 0x62, 0x09, 0xc2, 0x35, 0x7d, + 0x59, 0x9d, 0x36, 0x88, 0x8c, 0x8e, 0x18, 0x27, 0x30, 0xe1, 0xbf, 0xe3, 0xd3, 0xa7, 0xd4, 0xa7, + 0xdd, 0x16, 0x2d, 0x5d, 0x31, 0x38, 0xc1, 0xac, 0x94, 0x52, 0x99, 0xa9, 0x92, 0x66, 0x4f, 0x15, + 0x9b, 0x9c, 0x60, 0x82, 0x90, 0x5f, 0x00, 0x11, 0x04, 0xa8, 0x9e, 0xb4, 0xdd, 0x50, 0x4c, 0x70, + 0x01, 0x7b, 0xb9, 0x66, 0xd2, 0x59, 0x6b, 0xb0, 0xb7, 0x5c, 0xb3, 0x4e, 0xfb, 0x95, 0x25, 0x49, + 0x62, 0x87, 0x55, 0xa5, 0x4d, 0x2c, 0x05, 0x39, 0x93, 0xbc, 0x5b, 0x5e, 0xeb, 0xa8, 0x54, 0x32, + 0x24, 0x2f, 0x2b, 0x92, 0x22, 0xbb, 0xe3, 0xb5, 0x8e, 0x4c, 0xc9, 0xcb, 0x6a, 0x49, 0x08, 0x97, + 0xc5, 0x2a, 0xd9, 0x34, 0x08, 0x7d, 0x17, 0x65, 0x47, 0x50, 0xba, 0x8a, 0x78, 0x16, 0xa5, 0x0c, + 0x4e, 0xb6, 0xd8, 0x7b, 0x9f, 0x8f, 0x56, 0x30, 0x42, 0xd3, 0xd7, 0xea, 0x8c, 0x6e, 0xd2, 0xd0, + 0x93, 0x3f, 0x0f, 0xf3, 0x4f, 0xdc, 0x6e, 0xdb, 0x7b, 0x1e, 0xac, 0xd2, 0xe0, 0x28, 0xf4, 0x7a, + 0x0d, 0x6e, 0xf9, 0x95, 0xca, 0xd8, 0xef, 0x92, 0x64, 0xf3, 0xb4, 0x36, 0x7b, 0x2b, 0xb5, 0xb7, + 0x4e, 0xfb, 0x95, 0x9b, 0xcf, 0x79, 0x65, 0xb3, 0xcd, 0x6b, 0x9b, 0xc2, 0x78, 0x34, 0x3a, 0x4f, + 0xef, 0x85, 0xb1, 0x80, 0x59, 0x51, 0xba, 0x66, 0xb0, 0x80, 0x59, 0x29, 0x85, 0x41, 0xac, 0x43, + 0x93, 0x05, 0x4c, 0x10, 0xb2, 0x0e, 0x05, 0x29, 0x1e, 0x4a, 0x8b, 0xc6, 0xd6, 0x95, 0xc5, 0x7b, + 0x2b, 0xdc, 0x02, 0x92, 0x22, 0xc6, 0xdc, 0xb9, 0xb2, 0x15, 0xd9, 0x82, 0x49, 0x94, 0x91, 0x28, + 0xb2, 0xae, 0x23, 0x26, 0x22, 0x19, 0x55, 0x96, 0xef, 0xad, 0xd4, 0x4a, 0xa7, 0xfd, 0xca, 0x1c, + 0x97, 0xb2, 0x09, 0x41, 0x15, 0x21, 0x20, 0x2b, 0x30, 0x52, 0xed, 0xf5, 0x4a, 0x4b, 0x88, 0x67, + 0x3a, 0xc2, 0xb3, 0xb7, 0x52, 0xbb, 0x74, 0xda, 0xaf, 0xcc, 0x38, 0x3d, 0x73, 0x5a, 0xac, 0x75, + 0x0d, 0xa0, 0x20, 0x0d, 0xb2, 0xaf, 0x47, 0x0b, 0x13, 0xc5, 0x82, 0xb5, 0x01, 0x63, 0x4f, 0x9c, + 0xb0, 0x75, 0x48, 0xbe, 0x82, 0xb1, 0x07, 0x6e, 0xb7, 0x1d, 0x94, 0x72, 0x37, 0x46, 0x50, 0x67, + 0x73, 0x6b, 0x11, 0x2b, 0x59, 0x45, 0x6d, 0xe1, 0x97, 0xfd, 0xca, 0x85, 0xd3, 0x7e, 0xe5, 0xe2, + 0x11, 0x6b, 0xa6, 0x99, 0x8c, 0x1c, 0xce, 0xfa, 0x57, 0x79, 0x98, 0x54, 0xad, 0xc9, 0x22, 0x8c, + 0xb2, 0xff, 0xd1, 0xf6, 0x9c, 0xac, 0x15, 0x4e, 0xfb, 0x95, 0x51, 0x06, 0x67, 0x63, 0x29, 0x59, + 0x86, 0xa9, 0x2d, 0xcf, 0x69, 0x37, 0x68, 0xcb, 0xa7, 0x61, 0x80, 0xc6, 0x65, 0xa1, 0x56, 0x3c, + 0xed, 0x57, 0xa6, 0x3b, 0x9e, 0xd3, 0x6e, 0x06, 0xbc, 0xdc, 0xd6, 0x1b, 0x31, 0x8c, 0x68, 0x19, + 0x8d, 0x44, 0x18, 0x99, 0x05, 0x61, 0x63, 0x29, 0xf9, 0x1a, 0xc6, 0xef, 0xbb, 0x1d, 0xa6, 0x6b, + 0x46, 0x71, 0xfc, 0x8b, 0xf1, 0xf1, 0xdf, 0xe1, 0xd5, 0x6b, 0xdd, 0xd0, 0x7f, 0xc1, 0x0d, 0x87, + 0xa7, 0x58, 0xa0, 0x4d, 0x44, 0x60, 0x20, 0xf7, 0x60, 0xa2, 0x71, 0xb2, 0x8f, 0xc3, 0x1f, 0xc3, + 0xce, 0x70, 0x75, 0x83, 0x93, 0xfd, 0x26, 0x9b, 0x82, 0x06, 0x20, 0x9b, 0x95, 0x3f, 0x81, 0x29, + 0x0d, 0x3d, 0x29, 0xc2, 0xc8, 0x11, 0x7d, 0xc1, 0xe7, 0x6e, 0xb3, 0x3f, 0xc9, 0x1c, 0x8c, 0x3d, + 0x73, 0x3a, 0x27, 0x14, 0xa7, 0x3a, 0x69, 0xf3, 0x8f, 0x4f, 0xf3, 0x1f, 0xe7, 0xac, 0xff, 0x34, + 0x0a, 0xc5, 0x0d, 0x2f, 0x08, 0x99, 0x25, 0xab, 0x54, 0xf2, 0x1b, 0x30, 0xce, 0xca, 0x36, 0x57, + 0x05, 0xfd, 0xa6, 0x4e, 0xfb, 0x95, 0x89, 0x43, 0x2f, 0x08, 0x9b, 0x6e, 0xdb, 0x16, 0x55, 0xe4, + 0x6d, 0x28, 0x6c, 0x7b, 0x6d, 0x8a, 0x44, 0x41, 0xb4, 0xb5, 0x99, 0xd3, 0x7e, 0x65, 0xb2, 0xeb, + 0xb5, 0x29, 0x5a, 0x85, 0xb6, 0xaa, 0x26, 0x7b, 0xc2, 0x9a, 0xe3, 0xb4, 0xab, 0x31, 0xda, 0x31, + 0xf3, 0xed, 0x37, 0xfd, 0xca, 0x87, 0xe7, 0x38, 0x6e, 0xdc, 0x69, 0xbc, 0x08, 0x42, 0x7a, 0xcc, + 0x30, 0x09, 0x63, 0xef, 0x09, 0xcc, 0x55, 0xdb, 0x6d, 0x97, 0x43, 0xec, 0xf8, 0x6e, 0xb7, 0xe5, + 0xf6, 0x9c, 0x4e, 0x80, 0x6b, 0x30, 0x59, 0x7b, 0xe3, 0xb4, 0x5f, 0xa9, 0x38, 0xaa, 0xbe, 0xd9, + 0x53, 0x0d, 0x34, 0x1a, 0xa6, 0x22, 0x20, 0x2b, 0x50, 0x58, 0xdd, 0x6e, 0xa0, 0x29, 0x58, 0x1a, + 0x43, 0x64, 0xa8, 0x1c, 0xdb, 0xdd, 0x00, 0xa7, 0xa6, 0x23, 0x50, 0x0d, 0xc9, 0x87, 0x30, 0xbd, + 0x73, 0xb2, 0xdf, 0x71, 0x5b, 0xbb, 0x5b, 0x8d, 0x07, 0xf4, 0x05, 0xda, 0xd0, 0xd3, 0x5c, 0x64, + 0xf6, 0xb0, 0xbc, 0x19, 0x76, 0x82, 0xe6, 0x11, 0x7d, 0x61, 0x1b, 0xed, 0x22, 0xb8, 0x46, 0x63, + 0x83, 0xc1, 0x4d, 0x24, 0xe0, 0x82, 0xe0, 0x50, 0x87, 0xe3, 0xed, 0xc8, 0x5d, 0x00, 0x6e, 0x99, + 0x54, 0xdb, 0x6d, 0x6e, 0x62, 0x4f, 0xd6, 0x2e, 0x9e, 0xf6, 0x2b, 0x53, 0xc2, 0x96, 0x71, 0xda, + 0x6d, 0xdf, 0xd6, 0x9a, 0x90, 0x3a, 0x14, 0x6c, 0x8f, 0x13, 0x58, 0x18, 0xd6, 0x17, 0x95, 0x61, + 0xcd, 0x8b, 0xc5, 0x51, 0x4a, 0x7c, 0xe9, 0xb3, 0x94, 0x2d, 0x48, 0x05, 0x26, 0xb6, 0xbd, 0xba, + 0xd3, 0x3a, 0xe4, 0xe6, 0x75, 0xa1, 0x36, 0x76, 0xda, 0xaf, 0xe4, 0x7e, 0xdb, 0x96, 0xa5, 0xd6, + 0x3f, 0x29, 0x40, 0x91, 0xd9, 0xf0, 0x06, 0x47, 0xbd, 0x0b, 0x93, 0x7c, 0xec, 0x0f, 0x04, 0x63, + 0x4e, 0xd7, 0x66, 0x4f, 0xfb, 0x15, 0x10, 0x13, 0x64, 0x93, 0x8b, 0x1a, 0x90, 0xdb, 0x50, 0x60, + 0x18, 0xba, 0x11, 0x6b, 0x4d, 0x9f, 0xf6, 0x2b, 0x85, 0x13, 0x51, 0x66, 0xab, 0x5a, 0xd2, 0x80, + 0x89, 0xb5, 0x1f, 0x7b, 0xae, 0x4f, 0x03, 0x71, 0x94, 0x2b, 0xdf, 0xe1, 0x27, 0xf6, 0x3b, 0xf2, + 0xc4, 0x7e, 0x67, 0x57, 0x9e, 0xd8, 0x6b, 0xd7, 0x85, 0x08, 0xb9, 0x44, 0x39, 0x48, 0x34, 0xbf, + 0xdf, 0xfb, 0x6f, 0x95, 0x9c, 0x2d, 0x31, 0x91, 0x77, 0x61, 0xfc, 0xbe, 0xe7, 0x1f, 0x3b, 0x21, + 0x9e, 0xe0, 0x26, 0xc5, 0x76, 0xc5, 0x12, 0x63, 0xbb, 0x62, 0x09, 0xb9, 0x0f, 0xb3, 0xb6, 0x77, + 0x12, 0xd2, 0x5d, 0x4f, 0x9a, 0x9b, 0x7c, 0xd7, 0x2e, 0x9d, 0xf6, 0x2b, 0x65, 0x9f, 0xd5, 0x34, + 0x43, 0x2f, 0x69, 0x58, 0xda, 0x31, 0x28, 0xb2, 0x06, 0xb3, 0x86, 0x61, 0x1c, 0x94, 0xc6, 0x91, + 0xf3, 0xb8, 0xd1, 0x60, 0x98, 0xd3, 0x3a, 0xff, 0xc5, 0x80, 0xc8, 0x36, 0x5c, 0x7a, 0x70, 0xb2, + 0x4f, 0xfd, 0x2e, 0x0d, 0x69, 0x20, 0x47, 0x34, 0x81, 0x23, 0xba, 0x71, 0xda, 0xaf, 0x2c, 0x1e, + 0xa9, 0xca, 0x94, 0x31, 0x25, 0x41, 0x09, 0x85, 0x8b, 0x62, 0xa0, 0x4a, 0x0d, 0x15, 0x84, 0x39, + 0xcd, 0x45, 0x5c, 0xac, 0xb6, 0xf6, 0x86, 0xa0, 0xf2, 0x35, 0x35, 0xf7, 0xa4, 0x62, 0xb2, 0xe3, + 0x38, 0xd9, 0x8e, 0x53, 0xd2, 0x64, 0x12, 0x47, 0xcb, 0x0f, 0x69, 0x52, 0x9a, 0xe8, 0xbc, 0xa8, + 0xe4, 0xca, 0x16, 0x8c, 0x3d, 0x0e, 0x9c, 0x03, 0xce, 0x89, 0xb3, 0xcb, 0x37, 0xc5, 0x88, 0xe2, + 0xdc, 0x87, 0xe7, 0x7a, 0x6c, 0x58, 0xbb, 0xcc, 0x34, 0xc8, 0x09, 0xfb, 0x53, 0xd7, 0x20, 0x58, + 0x47, 0xbe, 0x01, 0x10, 0xa3, 0x62, 0x9a, 0x6d, 0x4a, 0xe8, 0x5a, 0x63, 0x92, 0x4c, 0x89, 0x2d, + 0x89, 0xf9, 0x5d, 0x51, 0xf3, 0x33, 0x74, 0x9d, 0xad, 0x21, 0x21, 0x5f, 0xc1, 0x34, 0x8a, 0x2b, + 0xb9, 0xa2, 0xd3, 0xb8, 0xa2, 0x78, 0xf4, 0x67, 0x02, 0x30, 0x6d, 0x3d, 0x0d, 0x00, 0xf2, 0x17, + 0x60, 0x5e, 0xa0, 0x8b, 0x99, 0x19, 0x33, 0xc2, 0xac, 0x32, 0x86, 0x67, 0xb6, 0xa9, 0xbd, 0x23, + 0x46, 0x6a, 0xa9, 0x91, 0x66, 0x1a, 0x1e, 0x76, 0x7a, 0x37, 0xd6, 0xb7, 0x30, 0xa9, 0x88, 0x47, + 0x26, 0x60, 0xa4, 0xda, 0xe9, 0x14, 0x2f, 0xb0, 0x3f, 0x1a, 0x8d, 0x8d, 0x62, 0x8e, 0xcc, 0x02, + 0x44, 0x1c, 0x53, 0xcc, 0x93, 0xe9, 0xc8, 0x58, 0x29, 0x8e, 0x60, 0xfb, 0x5e, 0xaf, 0x38, 0x4a, + 0x48, 0xdc, 0x4a, 0x2a, 0x8e, 0x59, 0xff, 0x25, 0x97, 0x60, 0x2c, 0xa6, 0x97, 0x85, 0x61, 0x85, + 0x7c, 0xc0, 0x95, 0x0f, 0xea, 0x65, 0x61, 0x92, 0x71, 0xc5, 0xa2, 0x37, 0x62, 0xb2, 0x62, 0x87, + 0xd1, 0xa0, 0xe5, 0x75, 0x74, 0x59, 0xd1, 0x13, 0x65, 0xb6, 0xaa, 0x25, 0xcb, 0x9a, 0x54, 0x19, + 0x89, 0x14, 0xab, 0x94, 0x2a, 0x3a, 0x87, 0x29, 0xf9, 0xb2, 0xac, 0x59, 0x5f, 0xa3, 0x11, 0x4c, + 0x0a, 0x47, 0xab, 0x76, 0xd6, 0x49, 0xc6, 0x9a, 0x91, 0xcf, 0x12, 0xc6, 0x22, 0x9f, 0x21, 0x32, + 0x65, 0x6c, 0x69, 0x12, 0x76, 0x60, 0x05, 0xc6, 0xb6, 0xbc, 0x03, 0xb7, 0x2b, 0x26, 0x39, 0x79, + 0xda, 0xaf, 0x8c, 0x75, 0x58, 0x81, 0xcd, 0xcb, 0xad, 0xff, 0x9b, 0xd3, 0xf9, 0x57, 0xd9, 0x2b, + 0xb9, 0x54, 0x7b, 0xe5, 0x5d, 0x98, 0x14, 0x87, 0x9a, 0xcd, 0x55, 0x81, 0x11, 0xe5, 0xb1, 0x3c, + 0x0f, 0xb9, 0x6d, 0x3b, 0x6a, 0xc0, 0x34, 0x0d, 0x17, 0xce, 0xa8, 0x69, 0x46, 0x22, 0x4d, 0x23, + 0xc4, 0x37, 0xd7, 0x34, 0x51, 0x13, 0xb6, 0x90, 0xba, 0x37, 0x69, 0x34, 0x5a, 0x48, 0xdd, 0x6f, + 0x64, 0xfa, 0x8a, 0x3e, 0x05, 0xa8, 0x3e, 0x69, 0x30, 0xee, 0xaf, 0xda, 0xdb, 0x42, 0x86, 0xa2, + 0xab, 0xc9, 0x79, 0x1e, 0x34, 0x71, 0xb7, 0x38, 0xbe, 0xae, 0x92, 0xb4, 0xd6, 0x56, 0x07, 0x66, + 0xd7, 0x69, 0xc8, 0x56, 0x4d, 0x2a, 0x9c, 0xc1, 0xd3, 0xff, 0x1c, 0xa6, 0x9e, 0xb8, 0xe1, 0xa1, + 0x69, 0x00, 0x62, 0x67, 0xcf, 0xdd, 0xf0, 0x50, 0x1a, 0x80, 0x5a, 0x67, 0x7a, 0x73, 0x6b, 0x0d, + 0x2e, 0x8a, 0xde, 0x94, 0x7e, 0x5b, 0x36, 0x11, 0xe6, 0x22, 0x8b, 0x52, 0x47, 0x68, 0xa2, 0xa1, + 0x71, 0x81, 0x4f, 0x1a, 0x09, 0x15, 0xc0, 0xad, 0xe1, 0x2c, 0x4f, 0x0b, 0x32, 0x4e, 0x4c, 0x35, + 0xc4, 0x15, 0x82, 0xf5, 0x18, 0x66, 0x76, 0x3a, 0x27, 0x07, 0x6e, 0x97, 0x31, 0x68, 0x83, 0xfe, + 0x82, 0xac, 0x02, 0x44, 0x05, 0xa2, 0x07, 0xe9, 0x5e, 0x88, 0x2a, 0xf6, 0x56, 0xc4, 0x12, 0x63, + 0x09, 0xca, 0x70, 0x5b, 0x83, 0xb3, 0xfe, 0xe6, 0x08, 0x10, 0xd1, 0x47, 0x23, 0x74, 0x42, 0xda, + 0xa0, 0x21, 0x53, 0x17, 0x57, 0x20, 0xaf, 0xcc, 0xc6, 0xf1, 0xd3, 0x7e, 0x25, 0xef, 0xb6, 0xed, + 0xfc, 0xe6, 0x2a, 0x79, 0x1f, 0xc6, 0xb0, 0x19, 0xd2, 0x7a, 0x56, 0xf5, 0xa7, 0x63, 0xe0, 0x3c, + 0x1d, 0xb0, 0x3f, 0x6d, 0xde, 0x98, 0x7c, 0x00, 0x93, 0xab, 0xb4, 0x43, 0x0f, 0x9c, 0xd0, 0x93, + 0x7c, 0xc7, 0x0d, 0x31, 0x59, 0xa8, 0x2d, 0x51, 0xd4, 0x92, 0x29, 0x70, 0x9b, 0x3a, 0x81, 0xd7, + 0xd5, 0x15, 0xb8, 0x8f, 0x25, 0xba, 0x02, 0xe7, 0x6d, 0xc8, 0xef, 0xe7, 0x60, 0xaa, 0xda, 0xed, + 0x0a, 0x03, 0x27, 0x10, 0xae, 0xd5, 0xf9, 0x3b, 0xca, 0x33, 0xbe, 0xe5, 0xec, 0xd3, 0xce, 0x1e, + 0x33, 0x99, 0x83, 0xda, 0xf7, 0x4c, 0xa6, 0xfe, 0xd7, 0x7e, 0xe5, 0xb3, 0x97, 0x71, 0xb6, 0xdf, + 0xd9, 0xf5, 0x1d, 0x37, 0x0c, 0xd0, 0x8f, 0x15, 0x75, 0xa8, 0xb3, 0x99, 0x36, 0x0e, 0xf2, 0x36, + 0x8c, 0x31, 0xfe, 0x96, 0x76, 0x00, 0x2e, 0x36, 0xdb, 0x07, 0xc6, 0xe1, 0x07, 0x5b, 0x58, 0x6f, + 0xc0, 0xa4, 0xa0, 0xe4, 0xe6, 0x6a, 0xd6, 0x12, 0x58, 0xab, 0x70, 0x1d, 0xad, 0x38, 0xca, 0x38, + 0x17, 0xbd, 0x39, 0x82, 0x13, 0x23, 0xb3, 0x7f, 0x02, 0x8b, 0x15, 0x34, 0x2e, 0x08, 0x7a, 0x83, + 0x6c, 0x59, 0x63, 0xd5, 0x61, 0x71, 0x9d, 0x86, 0x36, 0x0d, 0x68, 0xb8, 0xe3, 0x04, 0xc1, 0x73, + 0xcf, 0x6f, 0x63, 0xd5, 0xb9, 0x90, 0xfc, 0xd5, 0x1c, 0x54, 0xea, 0x3e, 0x65, 0x2b, 0x9d, 0x89, + 0x68, 0xf0, 0x0e, 0x5e, 0x14, 0x97, 0x0b, 0xf9, 0xa8, 0x96, 0xd1, 0x5a, 0x5c, 0x20, 0xbc, 0x05, + 0x23, 0xbb, 0xbb, 0x5b, 0xc8, 0x31, 0x23, 0x48, 0xb8, 0x91, 0x30, 0xec, 0xfc, 0xa6, 0x5f, 0x29, + 0xac, 0x9e, 0xf0, 0xcb, 0x07, 0x9b, 0xd5, 0x5b, 0x4f, 0x61, 0xde, 0xa6, 0x5d, 0xfa, 0xdc, 0xd9, + 0xef, 0x50, 0xc3, 0x5c, 0xad, 0xc0, 0x18, 0x77, 0x96, 0x25, 0xa6, 0xc0, 0xcb, 0x4d, 0x7b, 0x36, + 0x3f, 0xc4, 0x9e, 0xb5, 0xfe, 0x20, 0x07, 0x45, 0x3e, 0xdd, 0x9a, 0x17, 0x9e, 0x6d, 0x7e, 0x62, + 0x06, 0xf9, 0xc1, 0x33, 0x20, 0xb7, 0x22, 0x6a, 0x8f, 0x44, 0xca, 0x0f, 0x87, 0xca, 0x64, 0xb8, + 0xac, 0x64, 0x13, 0xe2, 0xbc, 0xc4, 0x8f, 0x46, 0x38, 0x21, 0xe4, 0x25, 0xc9, 0x41, 0xff, 0x3c, + 0x0f, 0x97, 0xb4, 0x21, 0x06, 0x3d, 0xaf, 0x1b, 0x50, 0x76, 0xc6, 0x63, 0xcc, 0xa2, 0x8d, 0x13, + 0xcf, 0x78, 0x4c, 0x65, 0x36, 0x23, 0x4b, 0x1c, 0x07, 0xfc, 0x36, 0x3b, 0x5c, 0x74, 0x12, 0xc7, + 0x41, 0x14, 0xdc, 0xbc, 0xa9, 0xac, 0x3e, 0xf3, 0xa0, 0xef, 0x42, 0x01, 0xff, 0x64, 0x84, 0x18, + 0xcd, 0x26, 0x84, 0x6a, 0x44, 0x5c, 0x80, 0xaf, 0x3d, 0xb7, 0xfb, 0x90, 0x86, 0x87, 0x9e, 0x3c, + 0x3c, 0x6f, 0x32, 0x21, 0xf6, 0x67, 0x3d, 0xb7, 0xdb, 0x3c, 0xc6, 0xe2, 0xf3, 0x1e, 0x3a, 0x23, + 0x84, 0xb6, 0x86, 0xdc, 0xba, 0x07, 0x45, 0x26, 0x6f, 0xce, 0xbe, 0xa2, 0xd6, 0x1c, 0x90, 0x75, + 0x1a, 0xd6, 0x3c, 0x43, 0x71, 0x58, 0x33, 0x30, 0xb5, 0xe3, 0x76, 0x0f, 0xe4, 0xe7, 0xbf, 0xce, + 0xc3, 0x34, 0xff, 0x16, 0x2b, 0x10, 0xd3, 0xa4, 0xb9, 0xb3, 0x68, 0xd2, 0x8f, 0x61, 0x46, 0xb8, + 0x73, 0xa8, 0x8f, 0x2e, 0x64, 0xbe, 0x1e, 0x78, 0xa2, 0xe4, 0x5e, 0x9d, 0xe6, 0x33, 0x5e, 0x63, + 0x9b, 0x0d, 0xc9, 0x16, 0xcc, 0xf2, 0x82, 0xfb, 0xd4, 0x09, 0x4f, 0xa2, 0x53, 0xd5, 0x45, 0x61, + 0x67, 0xca, 0x62, 0x2e, 0x8c, 0x04, 0xae, 0xa7, 0xa2, 0xd0, 0x8e, 0xc1, 0x92, 0xaf, 0xe0, 0xe2, + 0x8e, 0xef, 0xfd, 0xf8, 0x42, 0xb3, 0x1d, 0xb8, 0x3c, 0x9e, 0x67, 0x87, 0xb0, 0x1e, 0xab, 0x6a, + 0xea, 0x16, 0x44, 0xbc, 0x35, 0xe3, 0xa9, 0xcd, 0xa0, 0xe6, 0xf9, 0x6e, 0xf7, 0x00, 0x57, 0xb3, + 0xc0, 0x79, 0xca, 0x0d, 0x9a, 0xfb, 0x58, 0x68, 0xab, 0x6a, 0xeb, 0x7f, 0x8c, 0x40, 0x41, 0x75, + 0x7c, 0x47, 0x37, 0x4b, 0x85, 0x32, 0xc6, 0xed, 0x19, 0x1d, 0x7e, 0x6c, 0xad, 0x05, 0xb9, 0xca, + 0x9d, 0x59, 0xdc, 0x0c, 0x98, 0x60, 0x3c, 0xe6, 0xf4, 0x7a, 0xe8, 0xb2, 0x62, 0xc2, 0x74, 0xb5, + 0x86, 0x54, 0x28, 0x70, 0x61, 0xda, 0xde, 0xb7, 0xf3, 0xab, 0x35, 0xb6, 0xd6, 0x8f, 0x36, 0x57, + 0xeb, 0x38, 0xa1, 0x02, 0x5f, 0x6b, 0xcf, 0x6d, 0xb7, 0x6c, 0x2c, 0x65, 0xb5, 0x8d, 0xea, 0xc3, + 0x2d, 0x31, 0x68, 0xac, 0x0d, 0x9c, 0xe3, 0x8e, 0x8d, 0xa5, 0xcc, 0x0e, 0xe4, 0x3a, 0xba, 0xee, + 0x75, 0x43, 0xdf, 0xeb, 0x04, 0xe8, 0x2a, 0x28, 0x18, 0xea, 0xbc, 0x25, 0xaa, 0xec, 0x58, 0x53, + 0xf2, 0x04, 0x16, 0xaa, 0xed, 0x67, 0x4e, 0xb7, 0x45, 0xdb, 0xbc, 0xe6, 0x89, 0xe7, 0x1f, 0x3d, + 0xed, 0x78, 0xcf, 0x03, 0x3c, 0xe5, 0x15, 0xc4, 0x79, 0x51, 0x34, 0x69, 0x0a, 0x74, 0xcf, 0x65, + 0x23, 0x3b, 0x0b, 0x9a, 0x89, 0x88, 0x7a, 0xc7, 0x3b, 0x69, 0xe3, 0xf1, 0xae, 0xc0, 0x45, 0x44, + 0x8b, 0x15, 0xd8, 0xbc, 0x9c, 0x51, 0x69, 0xa3, 0xf1, 0x10, 0x4f, 0x67, 0x82, 0x4a, 0x87, 0xc1, + 0xb1, 0xcd, 0xca, 0xc8, 0x5b, 0x30, 0x21, 0x4d, 0x5a, 0xee, 0x14, 0x40, 0x8f, 0x91, 0x34, 0x65, + 0x65, 0x1d, 0x59, 0x85, 0x4b, 0x0f, 0xbd, 0x36, 0xf5, 0x9d, 0x90, 0xb6, 0x85, 0x75, 0x19, 0xe0, + 0x41, 0xab, 0xc0, 0xcd, 0xea, 0x63, 0x59, 0x29, 0x2f, 0x34, 0x02, 0x3b, 0x09, 0x60, 0xbd, 0x07, + 0x97, 0xf8, 0xd6, 0x3b, 0xb3, 0xbd, 0x67, 0xed, 0x00, 0x34, 0xe8, 0xb1, 0xd3, 0x3b, 0xf4, 0x18, + 0x7b, 0xd4, 0xf4, 0x2f, 0x61, 0x00, 0x11, 0x75, 0x5d, 0x20, 0x2a, 0xf6, 0x56, 0xa4, 0x45, 0x2c, + 0x5b, 0xda, 0x1a, 0x94, 0xf5, 0x1f, 0xf3, 0x40, 0xd0, 0x6d, 0xde, 0x08, 0x7d, 0xea, 0x1c, 0xcb, + 0x61, 0x7c, 0x02, 0xd3, 0x5c, 0x8a, 0xf2, 0x62, 0x1c, 0x0e, 0xb3, 0xae, 0xf8, 0xf6, 0xd1, 0xab, + 0x36, 0x2e, 0xd8, 0x46, 0x53, 0x06, 0x6a, 0xd3, 0xe0, 0xe4, 0x58, 0x82, 0xe6, 0x0d, 0x50, 0xbd, + 0x8a, 0x81, 0xea, 0xdf, 0xe4, 0x2b, 0x98, 0xad, 0x7b, 0xc7, 0x3d, 0x46, 0x13, 0x01, 0x3c, 0x22, + 0x6c, 0x18, 0xd1, 0xaf, 0x51, 0xb9, 0x71, 0xc1, 0x8e, 0x35, 0x27, 0xdb, 0x70, 0xf9, 0x7e, 0xe7, + 0x24, 0x38, 0xac, 0x76, 0xdb, 0xf5, 0x8e, 0x17, 0x48, 0x2c, 0xa3, 0xc2, 0xa5, 0x22, 0x36, 0x7f, + 0xb2, 0xc5, 0xc6, 0x05, 0x3b, 0x0d, 0x90, 0xbc, 0x25, 0x62, 0x00, 0x84, 0x2d, 0x35, 0x73, 0x47, + 0x84, 0x08, 0x3c, 0xea, 0xd2, 0x47, 0x4f, 0x37, 0x2e, 0xd8, 0xbc, 0xb6, 0x36, 0x09, 0x13, 0x52, + 0xf0, 0xdd, 0x85, 0x4b, 0x1a, 0x39, 0x99, 0xf5, 0x77, 0x12, 0x90, 0x32, 0x14, 0x1e, 0xf7, 0x3a, + 0x9e, 0xd3, 0x96, 0xc6, 0x84, 0xad, 0xbe, 0xad, 0x77, 0x4d, 0x4a, 0x93, 0x45, 0xfd, 0x44, 0xc3, + 0x1b, 0x47, 0x05, 0xd6, 0x86, 0x49, 0xdc, 0xc1, 0xad, 0x8d, 0x7e, 0xf3, 0xb1, 0x7e, 0x8b, 0x71, + 0x5a, 0x5b, 0xf3, 0xa9, 0xc4, 0xb3, 0x1e, 0xa0, 0xa1, 0x54, 0xed, 0xf5, 0x3a, 0x6e, 0x0b, 0xf5, + 0x0b, 0x97, 0x8e, 0xca, 0xc6, 0xf8, 0x2d, 0xfd, 0xa6, 0x5a, 0x53, 0xae, 0xea, 0x5e, 0x5a, 0xbb, + 0x8b, 0xb6, 0xbe, 0x83, 0xeb, 0x19, 0xc8, 0x84, 0x9e, 0xf8, 0x04, 0x26, 0x44, 0x51, 0x8c, 0xa1, + 0x75, 0xdf, 0x3e, 0xee, 0xca, 0x40, 0x40, 0xca, 0xf6, 0xd6, 0xb7, 0xb0, 0xf4, 0xb8, 0x17, 0x50, + 0x3f, 0x89, 0x5e, 0x0e, 0xf5, 0x43, 0x75, 0x13, 0x9e, 0xcb, 0xbc, 0x37, 0x80, 0xd3, 0x7e, 0x65, + 0x9c, 0xe3, 0x96, 0x17, 0xe0, 0xd6, 0xef, 0xe5, 0x60, 0x89, 0x6f, 0xd5, 0x4c, 0xd4, 0xe7, 0xa1, + 0x82, 0xe6, 0x97, 0xce, 0x67, 0xfb, 0xa5, 0x07, 0x3a, 0xea, 0xad, 0x6f, 0xc0, 0x12, 0x23, 0xea, + 0x74, 0x5e, 0xd3, 0xda, 0xfc, 0xe5, 0x1c, 0xcc, 0xf1, 0xc5, 0x79, 0x05, 0x2c, 0xe4, 0x0b, 0x98, + 0x6d, 0x1c, 0xb9, 0xbd, 0x3d, 0xa7, 0xe3, 0xb6, 0xb9, 0x8b, 0x96, 0xab, 0xa3, 0x79, 0xd4, 0xb4, + 0x47, 0x6e, 0xaf, 0xf9, 0x2c, 0xaa, 0xca, 0xd9, 0xb1, 0xc6, 0xd6, 0x23, 0x98, 0x8f, 0x8d, 0x41, + 0x30, 0xc6, 0x87, 0x71, 0xc6, 0x48, 0x84, 0x31, 0xa4, 0x73, 0xc5, 0x43, 0xb8, 0xa2, 0xb8, 0xc2, + 0x5c, 0xb2, 0x95, 0x18, 0x37, 0x24, 0x10, 0xa6, 0xb1, 0x42, 0x0b, 0xae, 0x28, 0x4e, 0x78, 0x05, + 0x0e, 0x90, 0x8b, 0x9b, 0x4f, 0x5d, 0xdc, 0x4d, 0x28, 0xeb, 0x8b, 0xfb, 0x2a, 0x8b, 0xfa, 0x1f, + 0x72, 0xb0, 0xb0, 0x4e, 0xbb, 0xa8, 0x7a, 0xaa, 0xbd, 0x9e, 0x71, 0x32, 0xd1, 0xdd, 0xd3, 0xb9, + 0x81, 0xee, 0x69, 0x65, 0x76, 0xe7, 0xd3, 0xcd, 0x6e, 0xa6, 0x53, 0x1f, 0xdb, 0x9b, 0x82, 0x57, + 0x51, 0xa7, 0x9e, 0xf8, 0xae, 0xcd, 0xca, 0xc8, 0x66, 0xe4, 0xda, 0x1e, 0x1d, 0xea, 0xda, 0xbe, + 0x2c, 0x5c, 0x7d, 0x13, 0xc2, 0xb5, 0x6d, 0x38, 0xb4, 0xad, 0xcf, 0xa0, 0x94, 0x9c, 0x8b, 0xe0, + 0x8f, 0x61, 0x47, 0x1d, 0x6b, 0x35, 0xe2, 0x6e, 0x71, 0x0b, 0xae, 0x5c, 0xfa, 0x31, 0x11, 0x3a, + 0xc0, 0x85, 0x64, 0x35, 0x22, 0xfe, 0x14, 0x58, 0x44, 0xff, 0x9f, 0x32, 0xfe, 0xe4, 0x91, 0x0e, + 0xb9, 0xec, 0x48, 0x07, 0xc1, 0xa3, 0x1c, 0x54, 0x02, 0x58, 0x4f, 0xe0, 0x8a, 0x81, 0x34, 0xe2, + 0xfa, 0x2f, 0xa0, 0xa0, 0x0c, 0x0c, 0xd3, 0xc3, 0x61, 0xa0, 0xc5, 0x75, 0x53, 0xb6, 0x86, 0x02, + 0xb1, 0x7e, 0x95, 0x83, 0x05, 0xae, 0x5d, 0x92, 0xf3, 0x3e, 0xfb, 0xea, 0xff, 0x89, 0xb8, 0xcd, + 0xee, 0xa5, 0xb8, 0xcd, 0x10, 0x44, 0x77, 0x9b, 0xe9, 0xce, 0xb2, 0xaf, 0x47, 0x0b, 0xf9, 0xe2, + 0x88, 0xb5, 0x07, 0xa5, 0xe4, 0x0c, 0x5f, 0xc3, 0x9a, 0xac, 0xc3, 0x82, 0xb6, 0xd1, 0x5f, 0x81, + 0x63, 0x36, 0x60, 0x31, 0x32, 0xf3, 0x8c, 0x35, 0x3e, 0xe7, 0x3a, 0x08, 0xde, 0x8b, 0xc6, 0xfe, + 0x1a, 0x79, 0x2f, 0x6a, 0xf8, 0xda, 0x78, 0x6f, 0x13, 0x2e, 0x73, 0xc4, 0xe6, 0x3e, 0x5d, 0xd6, + 0xf7, 0x69, 0x6a, 0xfc, 0x4e, 0x72, 0xeb, 0x3e, 0xc4, 0xad, 0x2b, 0x9b, 0x44, 0x23, 0xfc, 0x00, + 0xc6, 0x45, 0x88, 0x22, 0x1f, 0x5f, 0x0a, 0x32, 0x94, 0xe1, 0x3c, 0x2e, 0xd1, 0x16, 0x8d, 0xad, + 0x12, 0x4e, 0x99, 0x9d, 0x9b, 0x84, 0x03, 0x5e, 0x9d, 0x62, 0xbf, 0x61, 0xc2, 0x32, 0x56, 0xf3, + 0x8a, 0xfa, 0xe7, 0x11, 0x94, 0xb8, 0xfe, 0xd1, 0xb0, 0xbe, 0x92, 0x06, 0xfa, 0x18, 0x4a, 0x9c, + 0x9f, 0x52, 0x10, 0x0e, 0x56, 0x2b, 0x4b, 0x92, 0x13, 0xab, 0x9d, 0x4e, 0xda, 0xec, 0xff, 0x7a, + 0x0e, 0xae, 0xae, 0xd3, 0xd0, 0x8c, 0xe2, 0xfa, 0x53, 0xb1, 0x02, 0xbe, 0x87, 0x72, 0xda, 0x40, + 0xc4, 0x52, 0x7c, 0x19, 0x5f, 0x8a, 0xcc, 0x90, 0xb5, 0xf4, 0x25, 0xf9, 0x0e, 0xae, 0xf1, 0x25, + 0x31, 0xdb, 0xcb, 0x89, 0x7e, 0x16, 0x5b, 0x95, 0x4c, 0xec, 0x69, 0xab, 0xf3, 0xb7, 0x72, 0x70, + 0x8d, 0x13, 0x39, 0x1d, 0xf9, 0x9f, 0xb4, 0x9d, 0xb8, 0x0d, 0x15, 0xb5, 0xe6, 0xaf, 0x61, 0x61, + 0xad, 0x7f, 0x91, 0x03, 0x22, 0xf1, 0xd4, 0x1b, 0xb6, 0xc4, 0x71, 0x15, 0x46, 0xea, 0x0d, 0x5b, + 0xdc, 0x88, 0xa3, 0xfe, 0x6f, 0x05, 0xbe, 0xcd, 0xca, 0xe2, 0xca, 0x20, 0x7f, 0x16, 0x65, 0xb0, + 0x09, 0xa4, 0xe1, 0x1e, 0x74, 0x9f, 0xb8, 0xe1, 0xa1, 0xea, 0xac, 0x2a, 0xbc, 0x17, 0x18, 0x2c, + 0x18, 0xb8, 0x07, 0xdd, 0x26, 0x5e, 0x49, 0xa8, 0x80, 0xc4, 0x96, 0x63, 0xa7, 0x00, 0x59, 0x3f, + 0x83, 0xcb, 0xc6, 0x78, 0x05, 0x0f, 0x2d, 0xc2, 0x68, 0x9d, 0xfa, 0xa1, 0x18, 0x31, 0x52, 0xad, + 0x45, 0xfd, 0xd0, 0xc6, 0x52, 0x72, 0x0b, 0x26, 0xea, 0x55, 0xf4, 0xa4, 0xa2, 0xc5, 0x33, 0xcd, + 0x85, 0x5c, 0xcb, 0x69, 0x62, 0x94, 0xbc, 0x2d, 0x2b, 0xad, 0x3f, 0xca, 0x6b, 0xd8, 0x19, 0xf8, + 0x70, 0x72, 0xbc, 0xc7, 0x0e, 0xed, 0x8c, 0xfe, 0x1a, 0x35, 0x2e, 0x31, 0x65, 0x2a, 0xbc, 0x50, + 0x5c, 0x0f, 0xd8, 0x5a, 0xa3, 0x33, 0x7a, 0x81, 0xe5, 0xad, 0x23, 0x07, 0x92, 0x1e, 0x52, 0x75, + 0xeb, 0x28, 0x50, 0x07, 0xb6, 0xde, 0x88, 0xfc, 0x1c, 0x66, 0xc4, 0x98, 0xc5, 0x80, 0xc6, 0xf0, + 0x5a, 0xe3, 0x4d, 0x71, 0x54, 0x4e, 0x99, 0xdb, 0x1d, 0xd5, 0x5e, 0xc4, 0x2f, 0xcb, 0x4f, 0xbe, + 0x8c, 0x26, 0x3a, 0xeb, 0x96, 0x72, 0xe8, 0x53, 0x9f, 0x5c, 0x84, 0xa9, 0xc7, 0xdb, 0x8d, 0x9d, + 0xb5, 0xfa, 0xe6, 0xfd, 0xcd, 0xb5, 0xd5, 0xe2, 0x05, 0x52, 0x80, 0xd1, 0xdd, 0xfa, 0xee, 0x56, + 0x31, 0x67, 0x7d, 0x0f, 0x73, 0x66, 0x5f, 0xaf, 0x75, 0x99, 0xde, 0xc4, 0x6b, 0x35, 0xed, 0x42, + 0x9a, 0x10, 0xdd, 0xcd, 0x22, 0xb6, 0xca, 0x47, 0x50, 0x14, 0xad, 0x22, 0x51, 0xf3, 0x86, 0x34, + 0x7c, 0xb9, 0xa0, 0x31, 0x03, 0xb8, 0xa5, 0xcf, 0xf9, 0x27, 0xd2, 0x91, 0x33, 0xac, 0x87, 0xbf, + 0x97, 0x83, 0xd2, 0xc3, 0xfb, 0xd5, 0xea, 0x49, 0x78, 0x48, 0xbb, 0x21, 0x3b, 0xb2, 0xd1, 0xfa, + 0xa1, 0xd3, 0xe9, 0xd0, 0xee, 0x01, 0x25, 0xb7, 0x61, 0x74, 0xf7, 0xd1, 0xee, 0x8e, 0xf0, 0x97, + 0xcc, 0x89, 0x15, 0x60, 0x45, 0xaa, 0x8d, 0x8d, 0x2d, 0xc8, 0x03, 0xb8, 0xf4, 0x44, 0x3c, 0x99, + 0x50, 0x55, 0xc2, 0x53, 0x72, 0xfd, 0x8e, 0x7a, 0x4c, 0x51, 0xf7, 0x69, 0x9b, 0xf5, 0xe2, 0x74, + 0xaa, 0x01, 0x13, 0x76, 0x8c, 0x4f, 0x92, 0x70, 0x5f, 0x8f, 0x16, 0x72, 0xc5, 0xbc, 0xf5, 0xfb, + 0x39, 0x58, 0x88, 0x8d, 0x4c, 0x73, 0x9e, 0xeb, 0x03, 0xbb, 0xac, 0x0d, 0x4c, 0x36, 0xd9, 0xb8, + 0x20, 0x46, 0x56, 0xc7, 0xf8, 0x5c, 0xec, 0x41, 0x0c, 0xe8, 0xad, 0xc1, 0x03, 0x8a, 0x10, 0x28, + 0x40, 0x11, 0x5d, 0x87, 0xe5, 0xd6, 0x45, 0x98, 0x31, 0x28, 0x60, 0x59, 0x30, 0xad, 0xf7, 0xcc, + 0xc8, 0x5c, 0xf7, 0xda, 0x8a, 0xcc, 0xec, 0x6f, 0xeb, 0xef, 0xe4, 0x60, 0xee, 0xe1, 0xfd, 0xaa, + 0x4d, 0x0f, 0x5c, 0xc6, 0x77, 0x11, 0x89, 0x97, 0x8d, 0x99, 0x2c, 0x1a, 0x33, 0x89, 0xb5, 0x55, + 0x53, 0xfa, 0x34, 0x31, 0xa5, 0xc5, 0xb4, 0x29, 0xa1, 0x0d, 0xea, 0x7a, 0x5d, 0x63, 0x26, 0x9a, + 0x5f, 0xe8, 0xef, 0xe7, 0xe0, 0xb2, 0x36, 0x26, 0x35, 0xfe, 0xf7, 0x8c, 0x21, 0x5d, 0x4b, 0x19, + 0x52, 0x82, 0xc8, 0xb5, 0xc4, 0x88, 0xde, 0x1c, 0x34, 0xa2, 0xa1, 0x34, 0xfe, 0xe3, 0x1c, 0xcc, + 0xa7, 0xd2, 0x80, 0x5c, 0x61, 0x9a, 0xb0, 0xe5, 0xd3, 0x50, 0x90, 0x57, 0x7c, 0xb1, 0xf2, 0xcd, + 0x20, 0x38, 0x11, 0xef, 0x59, 0x26, 0x6d, 0xf1, 0x45, 0xde, 0x84, 0x99, 0x1d, 0xea, 0xbb, 0x5e, + 0xbb, 0x41, 0x5b, 0x5e, 0xb7, 0xcd, 0xbd, 0xee, 0x33, 0xb6, 0x59, 0x48, 0x16, 0x61, 0xb2, 0xda, + 0x39, 0xf0, 0x7c, 0x37, 0x3c, 0xe4, 0xae, 0xb9, 0x49, 0x3b, 0x2a, 0x60, 0xb8, 0x57, 0xdd, 0x03, + 0x37, 0xe4, 0xf7, 0x97, 0x33, 0xb6, 0xf8, 0x22, 0x25, 0x98, 0xa8, 0xb6, 0x5a, 0xde, 0x49, 0x37, + 0x44, 0x2f, 0xf3, 0xa4, 0x2d, 0x3f, 0x19, 0xc4, 0x37, 0x36, 0x32, 0x01, 0x46, 0x9c, 0xd9, 0xe2, + 0xcb, 0x7a, 0x07, 0xe6, 0xd2, 0xe8, 0x98, 0xca, 0x32, 0x7f, 0x31, 0x0f, 0x97, 0xab, 0xed, 0xf6, + 0xc3, 0xfb, 0xd5, 0x55, 0xaa, 0x1b, 0x54, 0xef, 0xc3, 0xe8, 0x66, 0xd7, 0x0d, 0x85, 0x25, 0xb0, + 0x24, 0x96, 0x27, 0xa5, 0x25, 0x6b, 0xc5, 0x56, 0x88, 0xfd, 0x4f, 0x6c, 0xb8, 0xbc, 0xf6, 0xa3, + 0x1b, 0x84, 0x6e, 0xf7, 0x00, 0xd7, 0x9c, 0x77, 0x2c, 0xd6, 0x58, 0x22, 0xc9, 0xd8, 0x6e, 0x1b, + 0x17, 0xec, 0x34, 0x60, 0xb2, 0x0b, 0x57, 0xb6, 0xe9, 0xf3, 0x14, 0x16, 0x52, 0x01, 0x63, 0x0a, + 0x6d, 0x0a, 0xe7, 0x64, 0xc0, 0xea, 0x1c, 0xfa, 0xd7, 0xf2, 0x18, 0x85, 0xa8, 0x4d, 0x4c, 0xf4, + 0xfc, 0x18, 0xe6, 0xb4, 0x01, 0x45, 0x12, 0x27, 0x27, 0xe2, 0xd3, 0x53, 0xa7, 0xa3, 0x6f, 0xa4, + 0x54, 0x70, 0xf2, 0x04, 0x16, 0xcc, 0x41, 0x45, 0x98, 0xcd, 0xcd, 0x90, 0xd6, 0x64, 0xe3, 0x82, + 0x9d, 0x05, 0x4d, 0x96, 0x61, 0xa4, 0xda, 0x3a, 0x12, 0x64, 0x49, 0x5f, 0x32, 0x3e, 0xb3, 0x6a, + 0xeb, 0x08, 0x23, 0x7a, 0x5b, 0x47, 0xc6, 0x7e, 0xf8, 0xb7, 0x39, 0x58, 0xc8, 0x58, 0x61, 0xb2, + 0x04, 0xc0, 0x0b, 0x35, 0xd9, 0xae, 0x95, 0x30, 0xed, 0xce, 0xbf, 0xf0, 0x52, 0x77, 0x04, 0x95, + 0xa9, 0x8c, 0xbd, 0x8a, 0x2a, 0x6c, 0xad, 0x11, 0xd9, 0x81, 0x29, 0xfe, 0xc5, 0x43, 0xc0, 0x46, + 0x11, 0x86, 0x18, 0x30, 0x3c, 0xe6, 0x0b, 0xe3, 0x3a, 0xda, 0x58, 0xd0, 0x8c, 0x87, 0x7e, 0xe9, + 0x28, 0xc4, 0xc1, 0xb8, 0x1e, 0x9f, 0x85, 0x9a, 0x34, 0xb9, 0x0d, 0xe3, 0xbc, 0x50, 0xac, 0xa1, + 0x7c, 0x59, 0x14, 0x35, 0x16, 0xf5, 0xd6, 0x1f, 0xe4, 0xa4, 0xbf, 0x2b, 0xb1, 0x35, 0x3e, 0x32, + 0xb6, 0xc6, 0x4d, 0x35, 0xe0, 0xb4, 0xc6, 0xc6, 0xee, 0xa8, 0xc1, 0xd4, 0xcb, 0xec, 0x0a, 0x1d, + 0x48, 0xe7, 0xdb, 0x7f, 0x9c, 0x93, 0x27, 0xf5, 0x24, 0xeb, 0xae, 0xc1, 0xf4, 0xcb, 0xb1, 0xac, + 0x01, 0x46, 0x3e, 0xe0, 0x1c, 0x95, 0x1f, 0x3c, 0xd3, 0x81, 0x4c, 0xf5, 0xb9, 0x74, 0xe9, 0xbd, + 0x0c, 0x5b, 0x59, 0x8b, 0x29, 0xd0, 0xaa, 0x3b, 0xeb, 0x24, 0x51, 0xdb, 0x78, 0xd1, 0x6d, 0xc9, + 0x75, 0xba, 0x15, 0x0f, 0x64, 0xc8, 0xbc, 0xa5, 0xd6, 0xc7, 0x90, 0x8f, 0xbc, 0x3c, 0x82, 0xe5, + 0xd0, 0xbc, 0xd3, 0x07, 0xf5, 0x6f, 0xf2, 0x26, 0x87, 0xbd, 0x4c, 0xa7, 0x75, 0x98, 0xd9, 0xa6, + 0xcf, 0x13, 0xfd, 0xe2, 0xdd, 0x5f, 0x97, 0x3e, 0x6f, 0x6a, 0x7d, 0x6b, 0xdc, 0x6e, 0xc2, 0x90, + 0x7d, 0x98, 0x95, 0xb2, 0xe0, 0xac, 0x22, 0x91, 0x47, 0xb5, 0xb2, 0x1e, 0x8e, 0x9f, 0x3a, 0x4d, + 0x5f, 0x94, 0xea, 0xe1, 0xa8, 0x26, 0xc6, 0xd7, 0xbf, 0x4b, 0xad, 0x1d, 0x28, 0x25, 0xa9, 0x27, + 0x7a, 0x7b, 0x7f, 0xd8, 0x06, 0xe5, 0x67, 0xcf, 0xb6, 0xb9, 0x59, 0x37, 0xd0, 0x4d, 0xa2, 0xda, + 0xa8, 0x03, 0xde, 0xbd, 0xf8, 0x62, 0xe0, 0x25, 0xa5, 0x5c, 0x0c, 0x3d, 0x10, 0x3f, 0x0a, 0x8e, + 0x99, 0x8f, 0x61, 0x12, 0x03, 0x7b, 0x07, 0x26, 0x44, 0x91, 0x7a, 0xe0, 0x10, 0x17, 0x1d, 0xb2, + 0x81, 0xf5, 0x0f, 0x72, 0x70, 0xf5, 0x71, 0x40, 0xfd, 0x86, 0xdb, 0x3d, 0xe8, 0xd0, 0xc7, 0x81, + 0x19, 0x9a, 0xf2, 0xdb, 0x86, 0xf8, 0x58, 0xc8, 0x08, 0x79, 0xfd, 0xff, 0x25, 0x34, 0xfe, 0x51, + 0x0e, 0xca, 0x69, 0x63, 0x7b, 0xbd, 0x72, 0xe3, 0x8e, 0x38, 0xbd, 0xf0, 0xd1, 0x96, 0x04, 0xb8, + 0xea, 0x53, 0x4e, 0x96, 0x4d, 0x92, 0xfd, 0x6f, 0x08, 0x8c, 0xff, 0x93, 0x83, 0xb9, 0xcd, 0x00, + 0x87, 0xff, 0x8b, 0x13, 0xd7, 0xa7, 0x6d, 0x49, 0xb8, 0x3b, 0x69, 0x81, 0xd1, 0xb8, 0xae, 0x1b, + 0x17, 0xd2, 0x02, 0x9f, 0xdf, 0xd7, 0x42, 0x3f, 0xf3, 0x83, 0x22, 0x9e, 0x8d, 0x57, 0x36, 0xb7, + 0x60, 0x74, 0x9b, 0x19, 0x49, 0x23, 0x82, 0xff, 0x38, 0x04, 0x2b, 0xc2, 0x28, 0x4d, 0x36, 0x64, + 0xf6, 0x41, 0xee, 0x27, 0x62, 0x41, 0x47, 0x87, 0x47, 0xf4, 0x26, 0x9f, 0x07, 0xd5, 0x0a, 0x30, + 0xbe, 0xeb, 0xf8, 0x07, 0x34, 0xb4, 0xbe, 0x83, 0xb2, 0xb8, 0x3c, 0xe5, 0x9e, 0x44, 0xbc, 0x62, + 0x0d, 0x22, 0x0f, 0xd7, 0xa0, 0x0b, 0xcf, 0x25, 0x80, 0x46, 0xe8, 0xf8, 0xe1, 0x66, 0xb7, 0x4d, + 0x7f, 0xc4, 0xd9, 0x8e, 0xd9, 0x5a, 0x89, 0xf5, 0x01, 0x4c, 0xaa, 0x29, 0xe0, 0x09, 0x4d, 0xb3, + 0x03, 0x71, 0x3a, 0x73, 0x46, 0x74, 0xaa, 0x0c, 0x49, 0x5d, 0x81, 0xf9, 0xd8, 0x52, 0x08, 0x3e, + 0x29, 0xb3, 0x05, 0xe3, 0x65, 0x3c, 0x3c, 0xc3, 0x56, 0xdf, 0x56, 0x1d, 0x2e, 0x25, 0x56, 0x9a, + 0x10, 0x8c, 0x38, 0xe6, 0xc7, 0x59, 0xa6, 0x26, 0x1a, 0x8d, 0x0d, 0x56, 0xb6, 0xbb, 0xd5, 0xe0, + 0xd1, 0x57, 0xac, 0x6c, 0x77, 0xab, 0x51, 0x1b, 0xe7, 0x9c, 0x63, 0xfd, 0xd3, 0x3c, 0x1e, 0x4a, + 0x13, 0x34, 0x88, 0x39, 0x6c, 0x74, 0xa7, 0x51, 0x0d, 0x26, 0x71, 0xc6, 0xab, 0x32, 0x4a, 0x71, + 0xf0, 0x8d, 0x4b, 0xe1, 0x97, 0xfd, 0xca, 0x05, 0xbc, 0x66, 0x89, 0xc0, 0xc8, 0x97, 0x30, 0xb1, + 0xd6, 0x6d, 0x23, 0x86, 0x91, 0x73, 0x60, 0x90, 0x40, 0x6c, 0x1d, 0x70, 0xc8, 0xcc, 0xc0, 0x11, + 0x9e, 0x08, 0x5b, 0x2b, 0x41, 0x32, 0xbb, 0xc7, 0x2e, 0xbf, 0x57, 0x1f, 0xb3, 0xf9, 0x07, 0xa3, + 0x26, 0x0e, 0x41, 0x3e, 0x3a, 0x99, 0xb4, 0xd5, 0x37, 0xb1, 0x60, 0xec, 0x91, 0xdf, 0x16, 0x4f, + 0x00, 0x66, 0x97, 0xa7, 0xe5, 0x2b, 0x7c, 0x56, 0x66, 0xf3, 0x2a, 0xeb, 0x7f, 0xe1, 0x5d, 0x57, + 0x98, 0xca, 0x37, 0x06, 0x55, 0x72, 0xaf, 0x4c, 0x95, 0xfc, 0xcb, 0x50, 0x45, 0xcd, 0x7a, 0x24, + 0x6b, 0xd6, 0xa3, 0x59, 0xb3, 0x1e, 0xcb, 0x9e, 0xf5, 0x3a, 0x8c, 0xf3, 0xa9, 0x92, 0x37, 0x60, + 0x6c, 0x33, 0xa4, 0xc7, 0x91, 0xb3, 0x42, 0x8f, 0x56, 0xb0, 0x79, 0x1d, 0x3b, 0x47, 0x6d, 0x39, + 0x41, 0x28, 0xe3, 0xfd, 0x26, 0x6d, 0xf9, 0x69, 0xfd, 0x80, 0xe1, 0xc0, 0x5b, 0x5e, 0xeb, 0x48, + 0x73, 0x0d, 0x4e, 0xf0, 0x5d, 0x19, 0xf7, 0xb0, 0xb3, 0x56, 0xbc, 0xc6, 0x96, 0x2d, 0xc8, 0x0d, + 0x98, 0xda, 0xec, 0xde, 0xf7, 0xfc, 0x16, 0x7d, 0xd4, 0xed, 0x70, 0xec, 0x05, 0x5b, 0x2f, 0x12, + 0x1e, 0x16, 0xd1, 0x43, 0xe4, 0x61, 0xc1, 0x82, 0x98, 0x87, 0x85, 0x3f, 0xd4, 0xb4, 0x79, 0x9d, + 0x70, 0xe0, 0xb0, 0xbf, 0x07, 0xb9, 0x57, 0x94, 0x1f, 0x66, 0x58, 0xc3, 0x7d, 0xb8, 0x6a, 0xd3, + 0x5e, 0xc7, 0x61, 0x66, 0xd4, 0xb1, 0xc7, 0xdb, 0xab, 0x39, 0xdf, 0x48, 0x89, 0x54, 0x33, 0xbd, + 0x93, 0x6a, 0xc8, 0xf9, 0x01, 0x43, 0x3e, 0x86, 0x9b, 0xeb, 0x34, 0x4c, 0x7d, 0x6d, 0x19, 0x4d, + 0x7e, 0x03, 0x0a, 0xe2, 0x45, 0x80, 0x9c, 0xff, 0xb0, 0x87, 0x9e, 0xe2, 0xb6, 0x45, 0xe0, 0x51, + 0x7f, 0x59, 0x5f, 0x41, 0x25, 0xab, 0xbb, 0xb3, 0x85, 0x16, 0xb9, 0x70, 0x23, 0x1b, 0x81, 0x52, + 0x8b, 0x13, 0xa2, 0x43, 0x75, 0x20, 0x1e, 0x3c, 0x5a, 0xe5, 0x7f, 0x47, 0xc3, 0x40, 0xfc, 0x61, + 0xd5, 0x64, 0xec, 0xc2, 0x2b, 0x0c, 0xb7, 0x89, 0x37, 0x04, 0x26, 0x82, 0x88, 0xae, 0x55, 0x28, + 0xc8, 0xb2, 0xd8, 0x15, 0x41, 0xe2, 0x21, 0x2b, 0x12, 0xb4, 0x2d, 0x11, 0x28, 0x30, 0xeb, 0x07, + 0xe9, 0xc7, 0x37, 0x21, 0xce, 0x16, 0xf5, 0x7a, 0x16, 0xc7, 0xbd, 0xe5, 0xc1, 0x55, 0x13, 0xb7, + 0xee, 0x41, 0x2e, 0x6a, 0x1e, 0x64, 0xee, 0x38, 0x66, 0x7c, 0x69, 0x6f, 0xad, 0x75, 0xdb, 0x3d, + 0xcf, 0xed, 0x86, 0x62, 0xf3, 0xea, 0x45, 0x64, 0x49, 0xf7, 0x13, 0x4f, 0x27, 0xc3, 0x84, 0xef, + 0x41, 0x39, 0xad, 0x43, 0xcd, 0x2d, 0xa2, 0x5c, 0xad, 0xdc, 0x20, 0xb1, 0x0e, 0x61, 0xce, 0x48, + 0x0d, 0x12, 0xe5, 0x3a, 0x88, 0x52, 0xa2, 0x4c, 0xd6, 0x3e, 0xff, 0x4d, 0xbf, 0xf2, 0xf1, 0x79, + 0x62, 0x51, 0x25, 0xce, 0x5d, 0x15, 0xe9, 0x6c, 0x2d, 0xc0, 0x48, 0xdd, 0xde, 0xc2, 0x69, 0xdb, + 0x5b, 0x6a, 0xda, 0xf6, 0x96, 0xf5, 0x87, 0x79, 0xa8, 0xd4, 0x0f, 0x9d, 0xee, 0x01, 0xbf, 0x3f, + 0x8d, 0xec, 0x2e, 0xed, 0x42, 0xf6, 0xac, 0xa7, 0x8d, 0x65, 0x98, 0xda, 0xa6, 0xcf, 0x65, 0x94, + 0xb6, 0x88, 0x77, 0x46, 0x0f, 0x39, 0x3b, 0x09, 0xf4, 0x44, 0xb9, 0xad, 0x37, 0x22, 0x7f, 0xee, + 0xe5, 0xfd, 0x2e, 0x3c, 0x41, 0x40, 0x74, 0xc8, 0xe0, 0xb5, 0x69, 0xa7, 0x8d, 0x8c, 0x2e, 0x92, + 0xc7, 0xa3, 0xd1, 0xf3, 0x1f, 0x8f, 0xac, 0x7f, 0x99, 0x83, 0x1b, 0xd9, 0x14, 0x14, 0x3d, 0xad, + 0x1a, 0xb9, 0x1a, 0x06, 0xdc, 0x22, 0xe3, 0x91, 0x50, 0xcb, 0xd5, 0x10, 0xcf, 0xcf, 0x60, 0xd3, + 0x96, 0xf7, 0x8c, 0xfa, 0x2f, 0x62, 0x7e, 0x6c, 0x59, 0x5c, 0xf7, 0xda, 0x34, 0x90, 0x99, 0x6e, + 0x78, 0x91, 0xf1, 0x3c, 0x53, 0x94, 0x59, 0xff, 0x3e, 0x07, 0xd7, 0x50, 0x0d, 0x0a, 0x2f, 0x9f, + 0xac, 0x38, 0x7f, 0xf4, 0xc2, 0x07, 0x30, 0xad, 0x77, 0x2e, 0x56, 0x1d, 0x1f, 0x77, 0xcb, 0x11, + 0x34, 0x5b, 0x5e, 0x9b, 0xda, 0x46, 0x33, 0xb2, 0x09, 0x53, 0xe2, 0x5b, 0x73, 0xe5, 0xcc, 0x6b, + 0x99, 0x5f, 0x90, 0xa9, 0xf8, 0x99, 0x0f, 0x59, 0x48, 0x20, 0x6b, 0x62, 0xf8, 0xbe, 0x0e, 0x6b, + 0xfd, 0x3a, 0x0f, 0x8b, 0x7b, 0xd4, 0x77, 0x9f, 0xbe, 0xc8, 0x98, 0xcc, 0x23, 0x98, 0x93, 0x45, + 0x38, 0x67, 0x93, 0x99, 0xf9, 0x33, 0x3b, 0x39, 0xd4, 0x80, 0x35, 0x68, 0x2a, 0xde, 0x4e, 0x05, + 0x3c, 0xc7, 0xc3, 0xd3, 0xf7, 0xa1, 0xa0, 0xf6, 0xc3, 0x08, 0x52, 0x06, 0xd7, 0x46, 0xee, 0x05, + 0xf3, 0x0d, 0xbe, 0xda, 0x14, 0x7f, 0x25, 0xfb, 0xba, 0x40, 0xd8, 0xff, 0x43, 0x8e, 0x66, 0x7c, + 0x6b, 0xb0, 0x6d, 0xe1, 0x68, 0xb5, 0x29, 0x5b, 0x63, 0xe3, 0x82, 0x9d, 0xd5, 0x53, 0x6d, 0x0a, + 0x26, 0xab, 0x78, 0x99, 0xc1, 0xcc, 0xed, 0xff, 0x9d, 0x87, 0x25, 0x19, 0xd0, 0x98, 0x41, 0xe6, + 0x6f, 0x61, 0x41, 0x16, 0x55, 0x7b, 0x3d, 0xdf, 0x7b, 0x46, 0xdb, 0x26, 0xa5, 0xf9, 0x53, 0x57, + 0x49, 0x69, 0x47, 0xb4, 0x89, 0x88, 0x9d, 0x05, 0xfe, 0x7a, 0xdc, 0x18, 0x5f, 0x9a, 0xd2, 0x89, + 0xaf, 0x06, 0xba, 0x13, 0x74, 0xe9, 0x64, 0x26, 0x29, 0xd2, 0x25, 0x55, 0x3b, 0xe1, 0x06, 0x19, + 0x7d, 0x55, 0x37, 0x08, 0x3b, 0xa8, 0x99, 0x38, 0x6b, 0xb3, 0x30, 0xbd, 0x4d, 0x9f, 0x47, 0x74, + 0xff, 0xdd, 0x1c, 0xcc, 0x18, 0x9b, 0x9b, 0xbc, 0x0d, 0x63, 0xf8, 0x07, 0x6a, 0x5e, 0xf1, 0xde, + 0x87, 0x6d, 0x30, 0xe3, 0xbd, 0x0f, 0x6f, 0xba, 0x09, 0x13, 0x3c, 0x78, 0xa7, 0x7d, 0x06, 0x8b, + 0x5a, 0xc5, 0x86, 0xb5, 0x38, 0x08, 0x37, 0xae, 0x05, 0xbc, 0xf5, 0x00, 0x6e, 0x8a, 0x38, 0x20, + 0x73, 0xf1, 0xb1, 0xa3, 0x73, 0x2a, 0x0a, 0xcb, 0x81, 0xa5, 0x75, 0x1a, 0x17, 0x3d, 0x46, 0xec, + 0xdc, 0x57, 0x70, 0xd1, 0x28, 0x57, 0x18, 0xf1, 0x4d, 0x80, 0xe2, 0x21, 0x85, 0x3a, 0xde, 0xda, + 0xba, 0x91, 0xd6, 0x85, 0x3e, 0x58, 0x8b, 0xc2, 0x45, 0x3c, 0x37, 0xaa, 0x1b, 0x9d, 0xe0, 0x1c, + 0x52, 0xef, 0xb6, 0xb6, 0xaf, 0xb9, 0xc4, 0xe3, 0xcf, 0x49, 0xa5, 0x8e, 0x53, 0xb5, 0xd6, 0x0c, + 0x4c, 0xd5, 0xbd, 0x6e, 0x48, 0x7f, 0xc4, 0x07, 0x1d, 0xd6, 0x2c, 0x4c, 0xcb, 0xaa, 0x0e, 0x0d, + 0x02, 0xeb, 0x1f, 0x8e, 0x80, 0x25, 0x08, 0x9b, 0xe6, 0xf3, 0x90, 0xf4, 0xd8, 0x4f, 0x0c, 0x56, + 0x28, 0x91, 0x2b, 0xba, 0x67, 0x27, 0xaa, 0xe5, 0x9c, 0x87, 0x0f, 0x70, 0x5a, 0x51, 0xa9, 0xc1, + 0x79, 0x89, 0xd9, 0xff, 0x2c, 0x43, 0x4c, 0xf2, 0xcd, 0x86, 0x29, 0x50, 0x32, 0xc4, 0xa4, 0x81, + 0x37, 0x5d, 0x64, 0xda, 0x06, 0x19, 0x84, 0x72, 0x27, 0x2a, 0xf0, 0x5c, 0xd5, 0x88, 0xb4, 0x61, + 0xbc, 0xa0, 0x99, 0x48, 0xfb, 0xa5, 0x23, 0x21, 0x8f, 0x4d, 0x5a, 0x8a, 0xfd, 0x28, 0x6f, 0x50, + 0xf5, 0x2a, 0x8e, 0xb5, 0xa7, 0x95, 0x98, 0x59, 0xd4, 0x8c, 0xb6, 0x9a, 0x1f, 0xeb, 0xef, 0xe6, + 0xe0, 0x1a, 0x5f, 0x9d, 0x1d, 0xdf, 0x7d, 0xe6, 0x76, 0xe8, 0x01, 0x35, 0xd8, 0xf4, 0x24, 0xfd, + 0x26, 0x2a, 0x77, 0x26, 0x19, 0x8d, 0x89, 0x27, 0xa8, 0x00, 0xcf, 0x72, 0x94, 0xa6, 0xe1, 0xb7, + 0xfa, 0x39, 0x58, 0x92, 0xef, 0xe2, 0x62, 0xd7, 0x33, 0xe7, 0xb5, 0xd9, 0x6a, 0xc6, 0x8d, 0x4a, + 0x3e, 0xe3, 0x46, 0xc5, 0xf0, 0x54, 0x87, 0x43, 0xae, 0x58, 0x46, 0x5e, 0xdd, 0x79, 0xfb, 0xab, + 0x11, 0xb8, 0xb4, 0xe3, 0x1c, 0xb8, 0x5d, 0x26, 0x7b, 0x64, 0x2e, 0x18, 0x52, 0x4d, 0xa4, 0xd4, + 0x1a, 0x1c, 0x41, 0x94, 0x92, 0x33, 0x6b, 0x59, 0xcf, 0x6e, 0x93, 0xcf, 0x8a, 0x52, 0x37, 0x73, + 0xd8, 0x7c, 0x62, 0xf8, 0xea, 0x12, 0x41, 0x64, 0x18, 0xa6, 0xd1, 0xf5, 0xda, 0xb1, 0x34, 0x73, + 0xe8, 0xef, 0x7a, 0x04, 0x53, 0x5a, 0x24, 0x98, 0x60, 0xd0, 0x04, 0x06, 0x24, 0xcb, 0xd1, 0xc9, + 0x3e, 0x4d, 0x4d, 0x29, 0xa4, 0x63, 0x48, 0x49, 0x24, 0x34, 0xf6, 0x9a, 0x13, 0x09, 0x7d, 0xc7, + 0x87, 0x2c, 0x3d, 0x9f, 0xe3, 0x42, 0x6f, 0x70, 0xf4, 0x09, 0xf7, 0xe7, 0xde, 0x8a, 0x36, 0xfa, + 0xb4, 0xac, 0x68, 0x3a, 0xb2, 0x1a, 0x40, 0x41, 0xe6, 0x5f, 0xb4, 0xfe, 0xe7, 0x38, 0xcc, 0x6d, + 0xb9, 0x41, 0x28, 0x57, 0x37, 0x88, 0x44, 0xff, 0xb4, 0x2c, 0xd3, 0x0e, 0x41, 0xc2, 0x4a, 0xe3, + 0xe5, 0xcd, 0x58, 0x3a, 0x48, 0x03, 0x80, 0x7c, 0xa0, 0xfb, 0xef, 0xf2, 0x5a, 0x92, 0x88, 0x64, + 0x26, 0x3f, 0xdd, 0xb1, 0xf7, 0xb6, 0xe1, 0x3e, 0xe2, 0x7a, 0xb5, 0xc3, 0x0a, 0x74, 0xbd, 0xca, + 0x7d, 0x4a, 0x2b, 0x71, 0x9f, 0x12, 0xef, 0x80, 0x0b, 0xc5, 0x23, 0x6a, 0x98, 0xdc, 0xca, 0xd9, + 0xf4, 0x18, 0xc6, 0xf1, 0x85, 0x30, 0x4f, 0x15, 0x33, 0xb5, 0xfc, 0x13, 0xb1, 0x41, 0xd2, 0x88, + 0xc0, 0xdf, 0x12, 0x07, 0x5a, 0x1a, 0xa0, 0x0e, 0x16, 0xe8, 0xcf, 0x92, 0x79, 0x13, 0xb2, 0x0b, + 0x97, 0x77, 0x7c, 0xda, 0x46, 0xd1, 0xb2, 0xf6, 0x63, 0xcf, 0x17, 0x47, 0x0c, 0x74, 0xf0, 0xf1, + 0x8c, 0x59, 0x3d, 0x59, 0xdd, 0xa4, 0xaa, 0x5e, 0x97, 0x30, 0x29, 0xe0, 0x64, 0x0d, 0x66, 0x1b, + 0xd4, 0xf1, 0x5b, 0x87, 0x0f, 0xe8, 0x0b, 0x26, 0x18, 0x83, 0xd2, 0x44, 0x94, 0x65, 0x24, 0xc0, + 0x1a, 0x36, 0x51, 0xac, 0xd2, 0xaf, 0x75, 0x4c, 0x20, 0xf2, 0x53, 0x18, 0x6f, 0x78, 0x7e, 0x58, + 0x7b, 0x11, 0x4b, 0xed, 0xc8, 0x0b, 0x6b, 0x57, 0x65, 0xa6, 0x95, 0xc0, 0xf3, 0xc3, 0xe6, 0xbe, + 0x4e, 0x37, 0x01, 0x47, 0xee, 0x33, 0xab, 0x8b, 0x59, 0x82, 0xa1, 0xd3, 0xa9, 0x63, 0x78, 0x02, + 0x7f, 0x58, 0x26, 0x2c, 0x2b, 0x34, 0x1f, 0x43, 0xa7, 0xd3, 0x44, 0x3d, 0x6f, 0x5e, 0x30, 0xe9, + 0x50, 0xe4, 0x05, 0xcc, 0x99, 0x8c, 0x2e, 0xf2, 0x30, 0x81, 0x91, 0x24, 0x2d, 0xad, 0x49, 0xed, + 0xb6, 0x18, 0xe5, 0x8d, 0x78, 0x02, 0xb0, 0x44, 0x6a, 0xa6, 0xd4, 0x2e, 0xc8, 0x43, 0x4c, 0x74, + 0xc3, 0x29, 0x53, 0x0d, 0x78, 0xbc, 0x13, 0x7f, 0xcd, 0x76, 0xf3, 0xb4, 0x5f, 0xb9, 0x7e, 0x82, + 0xd9, 0xfe, 0x90, 0xa2, 0x0e, 0x0f, 0xc5, 0xd6, 0x29, 0x9a, 0x00, 0x2d, 0x7f, 0x02, 0x53, 0x1a, + 0x77, 0x9c, 0x2b, 0x8b, 0xd3, 0x1f, 0xe7, 0x60, 0x3e, 0xc6, 0x6e, 0xe2, 0x7c, 0xfa, 0x08, 0x26, + 0x55, 0xa1, 0x70, 0xe9, 0x94, 0x94, 0x1e, 0x8d, 0xc9, 0x61, 0xce, 0xec, 0x72, 0x2f, 0xea, 0x83, + 0x8d, 0x70, 0x90, 0x7b, 0x30, 0xb1, 0x4d, 0x7f, 0x8c, 0xfc, 0xa0, 0xfc, 0xdc, 0xd3, 0x65, 0x4a, + 0xdd, 0xdc, 0x20, 0xb2, 0x19, 0xf9, 0x04, 0x40, 0x5b, 0x65, 0xbe, 0x09, 0x31, 0x18, 0x31, 0x7d, + 0x81, 0xb5, 0xc6, 0xd6, 0x1f, 0x4e, 0x48, 0x35, 0x2d, 0x4e, 0xca, 0xbb, 0xbe, 0xd3, 0x3a, 0x8a, + 0xa2, 0x42, 0x3f, 0x48, 0x86, 0x60, 0x9e, 0x45, 0x22, 0xdc, 0x32, 0x1e, 0x8f, 0x67, 0xe7, 0xa1, + 0x8d, 0xf2, 0x08, 0x8c, 0x9c, 0x21, 0x8f, 0xc0, 0x5d, 0x98, 0xd8, 0xec, 0x3e, 0x73, 0x99, 0x51, + 0xce, 0x63, 0x08, 0xd1, 0xa4, 0x75, 0x79, 0x91, 0x4e, 0x18, 0xd1, 0x8a, 0x7c, 0x02, 0x85, 0x0d, + 0x2f, 0x08, 0xbb, 0x32, 0x7e, 0x50, 0xec, 0xc2, 0x10, 0xfd, 0xc2, 0xcd, 0x43, 0x51, 0xa5, 0xcb, + 0x1c, 0xd9, 0x9c, 0x7c, 0x08, 0x13, 0xd5, 0x76, 0x9b, 0x6d, 0x6a, 0x21, 0x10, 0x30, 0x89, 0xa5, + 0x80, 0x74, 0x78, 0x8d, 0xde, 0xa5, 0x68, 0x4c, 0x3e, 0x37, 0x9d, 0xb4, 0x13, 0x51, 0x96, 0x8d, + 0xf4, 0x84, 0xae, 0xa6, 0x03, 0xf7, 0x6d, 0x79, 0xcb, 0x53, 0x88, 0xf2, 0x96, 0x60, 0x0e, 0x12, + 0x43, 0x92, 0xe2, 0x25, 0xd1, 0x26, 0x4c, 0x6e, 0x76, 0xdd, 0xd0, 0xc5, 0xcc, 0x0d, 0x93, 0x86, + 0x3e, 0xde, 0x71, 0xfc, 0xd0, 0x6d, 0xb9, 0x3d, 0xa7, 0x1b, 0xf2, 0xd5, 0x72, 0x65, 0x43, 0x7d, + 0xb5, 0x14, 0xb4, 0x9e, 0xe3, 0x09, 0x5e, 0x5b, 0x8e, 0xa7, 0xd4, 0x34, 0x49, 0x53, 0x2f, 0x9f, + 0x26, 0x69, 0x85, 0xaf, 0x25, 0xda, 0xc0, 0xd3, 0x11, 0x23, 0xa2, 0xef, 0xd2, 0x34, 0x76, 0x6d, + 0xd5, 0x90, 0xdc, 0xc0, 0x4c, 0x0d, 0x33, 0x51, 0x64, 0xaf, 0x71, 0xab, 0x9c, 0xdf, 0x5c, 0x25, + 0x4d, 0x98, 0x66, 0xad, 0x77, 0xbc, 0x8e, 0xdb, 0x72, 0x69, 0x50, 0x9a, 0x35, 0x9c, 0xdd, 0xe6, + 0xa6, 0xc0, 0x46, 0x2f, 0x1a, 0x34, 0xe4, 0x3a, 0x15, 0xbb, 0xee, 0x09, 0x40, 0x5d, 0xa7, 0xea, + 0x08, 0xc9, 0xcf, 0x99, 0x3e, 0xd0, 0xb1, 0x88, 0x0c, 0xac, 0x0b, 0xa9, 0x5d, 0xec, 0xbd, 0x27, + 0x15, 0x05, 0x7f, 0xb1, 0x11, 0xf2, 0x62, 0x53, 0x51, 0xe8, 0x00, 0x96, 0x0d, 0xa5, 0xe8, 0x6a, + 0x29, 0xb6, 0x7b, 0x3f, 0x4c, 0xbe, 0x07, 0xc1, 0xec, 0x83, 0xd1, 0x7b, 0x10, 0x9d, 0x21, 0xa2, + 0x97, 0x21, 0x8f, 0xe1, 0x9a, 0x4d, 0x8f, 0xbd, 0x67, 0xf4, 0xf5, 0xa2, 0xfd, 0x19, 0x5c, 0x35, + 0x11, 0x3e, 0xee, 0xb5, 0xf1, 0x7d, 0x29, 0xbf, 0xc3, 0x4a, 0xcd, 0x5f, 0x22, 0x00, 0x78, 0xfe, + 0x12, 0xfe, 0x28, 0x9e, 0xfd, 0xa9, 0xef, 0x07, 0xac, 0xb3, 0x3c, 0x58, 0x34, 0x91, 0x57, 0xdb, + 0x6d, 0x6d, 0x23, 0x30, 0x83, 0x52, 0xfb, 0x8c, 0x59, 0xb0, 0xfa, 0x8e, 0x41, 0xc9, 0xd9, 0x8b, + 0x0a, 0xf4, 0xbd, 0xaa, 0xb5, 0xb3, 0x28, 0x54, 0xe2, 0xe4, 0x61, 0x24, 0xd3, 0xfb, 0xac, 0xc1, + 0x8c, 0xf6, 0xa9, 0x0e, 0x84, 0x28, 0x4a, 0xb4, 0x1e, 0x4c, 0x82, 0x99, 0x20, 0x56, 0x0b, 0xca, + 0x69, 0x44, 0xc3, 0x6d, 0xf6, 0x82, 0xac, 0x45, 0x5b, 0x77, 0xf8, 0xdd, 0xe1, 0xc5, 0xcc, 0xf7, + 0x6b, 0x7f, 0x7b, 0x14, 0xae, 0x89, 0xc5, 0x78, 0x9d, 0x2b, 0x4e, 0x7e, 0x80, 0x29, 0x6d, 0x8d, + 0x05, 0xd1, 0x6f, 0xc8, 0x70, 0x83, 0x2c, 0x5e, 0xe0, 0xf2, 0xf2, 0x04, 0x0b, 0x9a, 0xb1, 0xe5, + 0x66, 0x86, 0xb1, 0xce, 0x36, 0x1d, 0x98, 0x35, 0x17, 0x5a, 0x1c, 0x36, 0xde, 0x48, 0xed, 0xc4, + 0x6c, 0x2a, 0x5f, 0xf2, 0xb7, 0x9b, 0xa9, 0xcb, 0x8d, 0xe9, 0x62, 0x4d, 0x26, 0xfa, 0x11, 0x2e, + 0x25, 0x56, 0x59, 0x9c, 0x4d, 0x6e, 0xa5, 0x76, 0x98, 0x68, 0xcd, 0x85, 0x9f, 0x8f, 0xc5, 0x99, + 0xdd, 0x26, 0x3b, 0x21, 0x6d, 0x98, 0xd6, 0x17, 0x5e, 0x1c, 0x5e, 0x6e, 0x0e, 0x20, 0x25, 0x6f, + 0xc8, 0x45, 0x95, 0xa0, 0x25, 0xae, 0xbd, 0x99, 0x61, 0xdd, 0xc0, 0x5a, 0x2b, 0xc0, 0x38, 0xff, + 0x66, 0x22, 0x60, 0xc7, 0xa7, 0x01, 0xed, 0xb6, 0xa8, 0x1e, 0x39, 0xf2, 0xaa, 0x22, 0xe0, 0xdf, + 0xe5, 0xa0, 0x94, 0x86, 0xb7, 0x41, 0xbb, 0x6d, 0xb2, 0x03, 0xc5, 0x78, 0x47, 0x82, 0xab, 0x2d, + 0x69, 0x51, 0x65, 0x0f, 0x69, 0xe3, 0x82, 0x9d, 0x80, 0x66, 0x4a, 0x48, 0x2b, 0x3b, 0x67, 0x88, + 0x4e, 0x12, 0x54, 0x77, 0x70, 0x6c, 0x60, 0x24, 0xd2, 0xaa, 0x77, 0xec, 0xb8, 0x5d, 0xa6, 0xbb, + 0x95, 0x41, 0x78, 0x17, 0x20, 0x2a, 0x15, 0xb4, 0xe1, 0x4e, 0x00, 0x2c, 0x95, 0xe1, 0x6a, 0xaa, + 0x89, 0xf5, 0x39, 0x4a, 0x70, 0xa1, 0xe7, 0xf8, 0xcb, 0x00, 0x85, 0xec, 0x06, 0x8c, 0xed, 0x6e, + 0x35, 0xea, 0x55, 0xf1, 0xce, 0x80, 0x3f, 0x1a, 0xeb, 0x04, 0xcd, 0x96, 0x63, 0xf3, 0x8a, 0x77, + 0xde, 0x81, 0x49, 0x95, 0xf1, 0x9f, 0x14, 0x60, 0x74, 0x73, 0x7b, 0x73, 0x97, 0x67, 0x90, 0xdb, + 0x79, 0xbc, 0x5b, 0xcc, 0x11, 0x80, 0xf1, 0xd5, 0xb5, 0xad, 0xb5, 0xdd, 0xb5, 0x62, 0xfe, 0x9d, + 0xa6, 0xee, 0xb2, 0x20, 0xd7, 0x60, 0x61, 0x75, 0x6d, 0x6f, 0xb3, 0xbe, 0xd6, 0xdc, 0xfd, 0x33, + 0x3b, 0x6b, 0x4d, 0xf3, 0x05, 0xc4, 0x1c, 0x14, 0xf5, 0xca, 0xdd, 0x47, 0xbb, 0x3b, 0xc5, 0x1c, + 0x29, 0xc1, 0x9c, 0x5e, 0xfa, 0x64, 0xad, 0x56, 0x7d, 0xbc, 0xbb, 0xb1, 0x5d, 0x1c, 0xb1, 0x46, + 0x0b, 0xf9, 0x62, 0xfe, 0x9d, 0x1f, 0x0c, 0x7f, 0x06, 0x59, 0x84, 0x92, 0x68, 0xfe, 0xb8, 0x51, + 0x5d, 0xcf, 0xee, 0x82, 0xd7, 0x3e, 0xbc, 0x5f, 0x2d, 0xe6, 0xc8, 0x75, 0xb8, 0x6a, 0x94, 0xee, + 0x54, 0x1b, 0x8d, 0x27, 0x8f, 0xec, 0xd5, 0xad, 0xb5, 0x46, 0xa3, 0x98, 0x7f, 0xe7, 0x96, 0x08, + 0x3c, 0x20, 0xb3, 0x00, 0xab, 0x6b, 0x8d, 0xfa, 0xda, 0xf6, 0xea, 0xe6, 0xf6, 0x7a, 0xf1, 0x02, + 0x99, 0x81, 0xc9, 0xaa, 0xfa, 0xcc, 0x2d, 0xff, 0x91, 0x03, 0x53, 0x6c, 0x5d, 0xe5, 0xf1, 0xbf, + 0x09, 0x0b, 0x0f, 0x1d, 0xb7, 0x1b, 0x3a, 0x6e, 0x57, 0x70, 0xa3, 0xe4, 0x25, 0x52, 0x19, 0xc0, + 0x5c, 0x8c, 0x2f, 0xcb, 0xc3, 0xc2, 0xab, 0x6e, 0xe7, 0xee, 0xe5, 0x48, 0x03, 0xe6, 0xd2, 0x0c, + 0x69, 0x62, 0x99, 0xa9, 0x29, 0xd2, 0xc4, 0x6b, 0x39, 0xcb, 0x16, 0x20, 0x0f, 0xe1, 0x52, 0x42, + 0xb9, 0xab, 0xf1, 0x66, 0xa9, 0xfd, 0x41, 0xe8, 0x4a, 0xe8, 0xda, 0x0d, 0xdd, 0xb8, 0x6a, 0x0f, + 0xc8, 0x95, 0x84, 0xe2, 0x58, 0x63, 0x9b, 0x37, 0x13, 0xd9, 0xbd, 0x1c, 0xb1, 0x61, 0x2e, 0xcd, + 0x4c, 0x50, 0x53, 0x1e, 0x60, 0x43, 0x94, 0x33, 0xba, 0x63, 0x38, 0xd3, 0x14, 0x91, 0xc2, 0x39, + 0x40, 0x4b, 0x65, 0xe2, 0xfc, 0x9c, 0x99, 0x60, 0xdd, 0xf6, 0x03, 0x4a, 0x7b, 0xd5, 0x8e, 0xfb, + 0x8c, 0x06, 0x44, 0x06, 0x07, 0xaa, 0xa2, 0x2c, 0xd8, 0xdb, 0x39, 0xf2, 0x5b, 0x30, 0x85, 0x49, + 0x86, 0x45, 0x2c, 0xcb, 0xb4, 0x9e, 0x78, 0xb8, 0x2c, 0xbf, 0xb0, 0xf2, 0x5e, 0x8e, 0x7c, 0x01, + 0x13, 0xeb, 0x34, 0x44, 0x0f, 0xd6, 0xcd, 0xd8, 0x6f, 0x69, 0x6c, 0x76, 0xd5, 0xf9, 0x48, 0x0e, + 0x38, 0xee, 0xcf, 0x62, 0xb2, 0x83, 0x3f, 0x00, 0x44, 0x0c, 0xf1, 0xea, 0x72, 0x62, 0xd8, 0x64, + 0x9d, 0xed, 0xe8, 0x0e, 0x0d, 0xe9, 0x59, 0xbb, 0xcc, 0xa2, 0xd1, 0x16, 0xcc, 0xaa, 0xe7, 0x78, + 0xdb, 0x78, 0x05, 0x62, 0xc5, 0x90, 0x05, 0xe7, 0xc0, 0xf6, 0x29, 0xe3, 0x5b, 0xfe, 0x1e, 0x5e, + 0x05, 0x4e, 0x92, 0xac, 0x50, 0x4a, 0x45, 0x44, 0xde, 0x4c, 0x83, 0x55, 0x79, 0x93, 0x15, 0x6c, + 0x3c, 0x93, 0x72, 0x0c, 0x96, 0x42, 0x59, 0xef, 0xd7, 0x0c, 0xa2, 0x24, 0x37, 0xb4, 0x01, 0xa4, + 0xc6, 0x7e, 0x96, 0x6f, 0x0e, 0x68, 0xc1, 0x25, 0x32, 0xee, 0xf5, 0xaf, 0x61, 0xc6, 0x08, 0xbb, + 0x23, 0xf2, 0x45, 0x40, 0x5a, 0x5c, 0x64, 0x79, 0x31, 0xbd, 0x52, 0x48, 0xf8, 0xfb, 0xb8, 0xc5, + 0x63, 0x79, 0x0a, 0xcb, 0x69, 0xf9, 0x08, 0xb9, 0x53, 0xa4, 0x2c, 0x73, 0xce, 0xc4, 0x40, 0xd6, + 0xe0, 0xb2, 0xba, 0x66, 0xd2, 0x7e, 0xfc, 0x21, 0x23, 0xb3, 0x61, 0xe6, 0xca, 0x7d, 0x05, 0x97, + 0x05, 0x1f, 0x18, 0x68, 0x8a, 0x6a, 0x4b, 0x8b, 0x24, 0x78, 0x99, 0x08, 0xbe, 0x86, 0xf9, 0x46, + 0x6c, 0x3e, 0xdc, 0x52, 0xbb, 0x6a, 0xa2, 0xd0, 0x72, 0x1a, 0x66, 0xe2, 0x7a, 0x00, 0xa4, 0x71, + 0xb2, 0x7f, 0xec, 0x2a, 0x74, 0xcf, 0x5c, 0xfa, 0x9c, 0x5c, 0x8f, 0x4d, 0x89, 0x15, 0x62, 0x33, + 0x94, 0x09, 0xe5, 0x8c, 0x19, 0x93, 0x5d, 0x9e, 0x20, 0x81, 0x27, 0x7b, 0x72, 0x7a, 0xce, 0xbe, + 0xdb, 0x71, 0x43, 0x76, 0x42, 0xbb, 0x61, 0x00, 0xe8, 0x55, 0x72, 0x05, 0xaf, 0x66, 0xb6, 0x20, + 0x5f, 0xc2, 0xcc, 0x3a, 0x0d, 0xa3, 0xb4, 0x8d, 0x64, 0x21, 0x91, 0xe8, 0x51, 0xac, 0x9b, 0x0c, + 0x38, 0x30, 0x73, 0x45, 0x6e, 0x42, 0x91, 0x8b, 0x34, 0x0d, 0xc5, 0xf5, 0x04, 0x0a, 0xd1, 0xc4, + 0xf1, 0x9d, 0xe3, 0x20, 0x93, 0x5a, 0x77, 0x61, 0x74, 0xc7, 0xed, 0x1e, 0x10, 0x79, 0x7f, 0xa0, + 0xa5, 0x3d, 0x2b, 0x5f, 0x36, 0xca, 0x04, 0xeb, 0xed, 0x43, 0x85, 0xe7, 0x2b, 0x4c, 0xe6, 0x08, + 0x94, 0x49, 0xd9, 0xdf, 0x54, 0xd1, 0xb2, 0x03, 0xf2, 0x1a, 0x2a, 0xfa, 0xc4, 0xeb, 0xf7, 0x56, + 0xc8, 0x0e, 0x52, 0x3d, 0xd9, 0x01, 0x79, 0x23, 0xd2, 0x62, 0x99, 0x29, 0x0a, 0xcb, 0x24, 0x8e, + 0x78, 0x6f, 0x85, 0xa8, 0xbc, 0x0a, 0x29, 0x48, 0x6f, 0x19, 0xca, 0xf6, 0x7c, 0x78, 0xbf, 0x84, + 0x49, 0x95, 0x9f, 0x4f, 0xc9, 0x9b, 0x78, 0x52, 0xc1, 0x72, 0x29, 0x59, 0x21, 0xa8, 0xf9, 0x39, + 0x4f, 0xa5, 0x69, 0xc2, 0xc7, 0x53, 0xd8, 0x65, 0x2e, 0xde, 0x27, 0x30, 0xa5, 0x25, 0xaf, 0x53, + 0x9b, 0x25, 0x99, 0xd0, 0xae, 0x6c, 0xfe, 0xc8, 0xcf, 0xbd, 0x1c, 0xb9, 0x8b, 0x3a, 0x07, 0xfd, + 0x1d, 0xf3, 0x11, 0x98, 0x96, 0xbb, 0x2b, 0x06, 0x42, 0x3e, 0xc2, 0xa0, 0xc5, 0xfa, 0x89, 0xef, + 0xd3, 0x2e, 0x87, 0xcb, 0x52, 0xfe, 0x31, 0xc0, 0x15, 0x28, 0xc8, 0xbc, 0xac, 0xe4, 0x8a, 0xd9, + 0x55, 0xf6, 0xf0, 0x56, 0x00, 0x38, 0xb1, 0xb0, 0x27, 0xb3, 0x3a, 0x93, 0x1c, 0x2b, 0x4c, 0x11, + 0xb6, 0xcf, 0x09, 0xf4, 0xa5, 0x54, 0x86, 0x08, 0x54, 0x32, 0x96, 0x40, 0x27, 0x47, 0x16, 0xfc, + 0x26, 0x14, 0xab, 0x2d, 0x14, 0xcf, 0x2a, 0x0f, 0x19, 0x59, 0x52, 0x5b, 0xdf, 0xac, 0x90, 0xb8, + 0xe6, 0xe3, 0x69, 0xcd, 0xb6, 0xa8, 0x83, 0xf1, 0x93, 0x0b, 0x4a, 0x49, 0xc7, 0xaa, 0xd2, 0x21, + 0x32, 0x07, 0xb5, 0x06, 0x73, 0x75, 0xa7, 0xdb, 0xa2, 0x9d, 0x57, 0x43, 0xf3, 0x29, 0xca, 0x29, + 0x2d, 0x47, 0xdb, 0x95, 0x38, 0xbc, 0x10, 0x53, 0x97, 0xd4, 0x91, 0x52, 0x35, 0xad, 0xc2, 0x45, + 0x4e, 0xc4, 0x88, 0x2c, 0x59, 0xd0, 0x59, 0xdd, 0x7f, 0x04, 0xb3, 0x6b, 0x4c, 0x8e, 0x9f, 0xb4, + 0x5d, 0x1e, 0x33, 0x4e, 0xcc, 0x20, 0xe0, 0x4c, 0xc0, 0x0d, 0x99, 0x35, 0x53, 0x4b, 0x5e, 0xa6, + 0x76, 0x47, 0x32, 0x3f, 0x5c, 0x79, 0x4e, 0xa2, 0xd5, 0xf3, 0x9c, 0xa1, 0xd2, 0x3e, 0x90, 0x09, + 0x72, 0x62, 0x29, 0xa9, 0x74, 0x49, 0x94, 0x99, 0xb0, 0xaa, 0xfc, 0xe6, 0xe0, 0x46, 0xe2, 0x7a, + 0x79, 0xe4, 0x6f, 0xe4, 0x99, 0x59, 0xbc, 0x90, 0x91, 0xee, 0x8b, 0xbc, 0xa5, 0xac, 0xd8, 0x41, + 0xe9, 0xc0, 0x52, 0xec, 0xbc, 0x6f, 0xb5, 0xa4, 0x2f, 0x19, 0x38, 0x07, 0xe7, 0x01, 0xcb, 0x24, + 0xb0, 0x0a, 0x27, 0x4d, 0xcd, 0xd7, 0x45, 0xde, 0x36, 0xb1, 0x0f, 0xc8, 0xe9, 0x95, 0xd9, 0xc3, + 0x23, 0x64, 0xbd, 0x28, 0x5d, 0x94, 0xb2, 0x96, 0xd2, 0x72, 0x7a, 0x29, 0x6b, 0x29, 0x35, 0xd9, + 0x16, 0x27, 0xf0, 0x3a, 0x5c, 0x8c, 0x65, 0xce, 0x22, 0xd7, 0xe3, 0x84, 0x1d, 0x42, 0x50, 0x8e, + 0xe8, 0xa1, 0x64, 0xec, 0x24, 0xa2, 0xf4, 0x5c, 0x5a, 0x59, 0x73, 0xe4, 0xe8, 0x1e, 0x2b, 0xdb, + 0x49, 0xcf, 0x8e, 0x45, 0x6e, 0xa6, 0x90, 0xf0, 0x6c, 0xa4, 0xe3, 0x68, 0x1b, 0x50, 0x8c, 0x27, + 0x97, 0x22, 0x4b, 0x8a, 0x4a, 0xa9, 0x19, 0xb4, 0xca, 0x95, 0xcc, 0x7a, 0xa1, 0xad, 0xbe, 0x8e, + 0x16, 0x85, 0xdf, 0x5b, 0xc6, 0x17, 0x45, 0x4f, 0x2c, 0x94, 0x58, 0x14, 0x33, 0xcb, 0xcf, 0x3a, + 0xea, 0x13, 0x2d, 0x83, 0x50, 0xa6, 0x3e, 0xb9, 0x9e, 0x86, 0x27, 0xba, 0x4b, 0x6b, 0xc8, 0x2c, + 0xbe, 0xda, 0xb8, 0x96, 0x0c, 0x85, 0x9b, 0x1c, 0x5a, 0x25, 0xb3, 0x5e, 0xcd, 0xb4, 0x18, 0xcf, + 0x97, 0xa4, 0x90, 0x66, 0x24, 0x52, 0xca, 0x64, 0xe5, 0xfb, 0x30, 0x67, 0xae, 0xe2, 0x90, 0xf9, + 0x66, 0xe1, 0xd9, 0x85, 0xf9, 0xd4, 0xd4, 0x4b, 0x4a, 0x16, 0x0d, 0x4a, 0xcc, 0x34, 0xc0, 0xf4, + 0x9e, 0x31, 0x32, 0x26, 0x11, 0x79, 0x39, 0x1b, 0x4b, 0xce, 0x94, 0x58, 0xd3, 0x94, 0xcc, 0x4d, + 0x7c, 0x4d, 0xb5, 0xec, 0x4b, 0x67, 0x59, 0xd3, 0xb4, 0x64, 0x4d, 0x8a, 0xfc, 0xda, 0xb8, 0xa4, + 0x52, 0x8d, 0x57, 0x9c, 0x87, 0xfc, 0x67, 0x19, 0x5a, 0x16, 0x9e, 0x55, 0x34, 0xb6, 0xd4, 0x4f, + 0xae, 0x5d, 0x35, 0xc8, 0x64, 0xec, 0xa3, 0xb2, 0x31, 0x39, 0x73, 0x0b, 0xd5, 0x61, 0x5a, 0x4f, + 0xfe, 0x94, 0x39, 0x8a, 0x6b, 0x49, 0x1c, 0x81, 0x76, 0xfc, 0x9b, 0x55, 0x54, 0xe0, 0xa3, 0x59, + 0x8c, 0x13, 0xc7, 0x18, 0x50, 0xf6, 0x94, 0x88, 0x4e, 0x9a, 0x21, 0x43, 0xca, 0x36, 0x36, 0x2e, + 0x73, 0xb3, 0xcb, 0xfc, 0x45, 0xbe, 0x8c, 0x1f, 0xf6, 0xcb, 0x44, 0xf3, 0x18, 0x1f, 0xec, 0xe8, + 0x99, 0x9c, 0x88, 0xc6, 0x25, 0x29, 0x19, 0x9e, 0xca, 0x4b, 0x59, 0xd5, 0xba, 0xdc, 0xff, 0x06, + 0x2e, 0x25, 0x32, 0x56, 0x29, 0x6f, 0x58, 0x56, 0x2e, 0xab, 0xc1, 0xb2, 0x75, 0x83, 0x4d, 0x38, + 0x06, 0xb8, 0xb7, 0x3c, 0x1c, 0x69, 0x52, 0x43, 0x6f, 0xc9, 0x37, 0x3e, 0x69, 0x83, 0xcb, 0xca, + 0x8b, 0x35, 0x5c, 0x40, 0xc4, 0x32, 0x62, 0xc5, 0x04, 0x44, 0x7a, 0xbe, 0xac, 0x4c, 0xac, 0x3f, + 0xc7, 0x0c, 0xd9, 0xb1, 0x6c, 0x4b, 0xca, 0x2d, 0x92, 0x99, 0x61, 0x4b, 0xb9, 0x45, 0xb2, 0x53, + 0x5f, 0x71, 0x6a, 0x6e, 0xc1, 0x5c, 0x5a, 0xfe, 0x2a, 0xcd, 0x79, 0x97, 0x99, 0xdc, 0x2a, 0x85, + 0xa2, 0xb6, 0xdc, 0xed, 0x19, 0xd8, 0x06, 0x64, 0xb3, 0xca, 0xa4, 0xc0, 0x77, 0x32, 0x47, 0x59, + 0x32, 0xeb, 0x94, 0x3a, 0x3c, 0x0e, 0x49, 0x4b, 0x35, 0xc0, 0x54, 0xbd, 0xd8, 0x70, 0x0f, 0xba, + 0x5a, 0x52, 0x27, 0x65, 0xa8, 0x26, 0x13, 0x53, 0x29, 0xc9, 0x92, 0x96, 0x03, 0xea, 0x11, 0xcc, + 0x49, 0xc5, 0xad, 0x27, 0x1f, 0x22, 0xe5, 0xec, 0xec, 0x47, 0x4a, 0xca, 0xa4, 0x66, 0x2b, 0xe2, + 0x47, 0x44, 0xfc, 0x49, 0x2f, 0xed, 0x88, 0xa8, 0x65, 0x05, 0x2a, 0x9b, 0x09, 0x84, 0xc8, 0x67, + 0x78, 0xd2, 0xe3, 0x29, 0x34, 0xb3, 0x3d, 0xc3, 0x06, 0xa6, 0x48, 0xa6, 0xad, 0x48, 0x2f, 0x26, + 0x76, 0x68, 0x62, 0x1e, 0x7e, 0x78, 0x43, 0x20, 0xf3, 0xf0, 0xa6, 0x0f, 0x34, 0xdb, 0x57, 0x34, + 0xad, 0xbf, 0x5a, 0x57, 0xb4, 0x4a, 0x49, 0x98, 0xa1, 0x68, 0x95, 0x96, 0x86, 0x02, 0xcf, 0x0a, + 0xbb, 0xd2, 0x30, 0x8c, 0xf0, 0x5d, 0x1f, 0x98, 0x47, 0xa2, 0xbc, 0x34, 0x38, 0xf9, 0x82, 0xb8, + 0x22, 0x28, 0xc6, 0x1f, 0xd6, 0x93, 0xb4, 0x34, 0x20, 0x5a, 0xbe, 0x02, 0x65, 0xde, 0x64, 0xbe, + 0xc8, 0xdf, 0x91, 0x46, 0xa7, 0x89, 0x37, 0x23, 0x19, 0x84, 0x8e, 0x7a, 0xb0, 0x19, 0x11, 0xbd, + 0xb1, 0xd7, 0x4d, 0xc3, 0xc4, 0x1b, 0x7e, 0xdd, 0x8c, 0x48, 0x79, 0x96, 0xef, 0xca, 0xf0, 0xa2, + 0xf4, 0xd4, 0x52, 0x6f, 0x9b, 0xc6, 0xdb, 0x80, 0x38, 0xee, 0xa1, 0x97, 0x30, 0xe4, 0x77, 0x64, + 0x46, 0xd1, 0x64, 0xe2, 0x95, 0xb7, 0x62, 0x6e, 0xa1, 0xf4, 0xc8, 0xdf, 0xf2, 0xa0, 0xbc, 0x2e, + 0xe4, 0x21, 0x3e, 0x11, 0x7d, 0xb4, 0xb9, 0x5a, 0x17, 0x3f, 0xdc, 0xeb, 0xf9, 0x09, 0x7f, 0xbb, + 0xf6, 0xe3, 0x33, 0x11, 0x91, 0x79, 0x13, 0x03, 0x70, 0x6f, 0x85, 0x34, 0xd0, 0xed, 0x6b, 0x94, + 0xa6, 0xb8, 0xdc, 0x53, 0x10, 0x96, 0xd3, 0x11, 0x6e, 0xb9, 0x41, 0xc8, 0xd5, 0x37, 0xdb, 0x78, + 0xe6, 0x30, 0x33, 0xc6, 0x30, 0xc8, 0x0a, 0xe0, 0x6c, 0x93, 0x8e, 0x46, 0x8e, 0x6e, 0x18, 0x1f, + 0x71, 0x8a, 0x35, 0xaa, 0x0f, 0xb7, 0x5e, 0x8a, 0x62, 0x06, 0xe0, 0xde, 0xb2, 0xa0, 0x98, 0x51, + 0x7a, 0x3e, 0x8a, 0xc5, 0x10, 0x9a, 0x14, 0x33, 0x87, 0x99, 0x31, 0x86, 0xe1, 0x14, 0x4b, 0x47, + 0x73, 0x56, 0x8a, 0x7d, 0x83, 0xfa, 0x79, 0x1d, 0x1f, 0x2c, 0x9e, 0x8b, 0x66, 0x25, 0x69, 0xc1, + 0x9a, 0xa0, 0x7b, 0x2b, 0xe4, 0x09, 0x26, 0x3b, 0x8d, 0x95, 0x9f, 0x8d, 0x6e, 0x8b, 0x59, 0x48, + 0x91, 0x72, 0x9b, 0x30, 0xcf, 0x29, 0x17, 0x1f, 0x6e, 0xe6, 0x58, 0x32, 0xa7, 0xbd, 0x2e, 0x8d, + 0x9d, 0x38, 0xaa, 0xf3, 0xd2, 0x6f, 0x15, 0x59, 0x64, 0xd7, 0x67, 0xf6, 0x69, 0x3b, 0x69, 0xbc, + 0x9a, 0x48, 0xa4, 0xa3, 0xde, 0x6c, 0xbe, 0xb7, 0x4c, 0x36, 0x71, 0x15, 0xcc, 0xe2, 0x41, 0xd6, + 0x7d, 0x3a, 0x1a, 0x24, 0xd2, 0x86, 0x34, 0x88, 0x62, 0x63, 0xca, 0xea, 0x3b, 0x7b, 0x50, 0xea, + 0xe8, 0x73, 0xc6, 0xd9, 0x65, 0x91, 0x88, 0x2b, 0x76, 0x7e, 0xd2, 0x18, 0x46, 0x99, 0xf8, 0x8f, + 0xde, 0x93, 0x9f, 0xc2, 0xa4, 0x04, 0x1e, 0x4e, 0x90, 0x38, 0x34, 0x12, 0xe4, 0x4b, 0x98, 0x12, + 0x04, 0xc1, 0x11, 0x64, 0xf5, 0x94, 0x39, 0xfc, 0x2f, 0x60, 0x4a, 0x90, 0x61, 0xe0, 0x0c, 0xb2, + 0x6f, 0x39, 0xe7, 0xa3, 0x50, 0x0b, 0xfd, 0x47, 0x99, 0x87, 0x4d, 0x26, 0xed, 0x37, 0xa0, 0xc9, + 0x1e, 0x3e, 0xf5, 0xce, 0xfa, 0x01, 0xed, 0x2c, 0x94, 0x43, 0x7f, 0xbe, 0x9b, 0xe1, 0x6d, 0x64, + 0xe3, 0x1d, 0x0a, 0x9f, 0x39, 0xfb, 0x6d, 0x58, 0xc4, 0x2b, 0x91, 0xf3, 0x8e, 0x38, 0xfb, 0x90, + 0x72, 0x35, 0x8a, 0x41, 0x88, 0xff, 0x76, 0x77, 0x16, 0xb2, 0x61, 0x3f, 0x1b, 0xce, 0xb0, 0x36, + 0x32, 0xb1, 0x0e, 0x83, 0x1e, 0xa0, 0x8c, 0xae, 0xe1, 0xdc, 0xcf, 0x39, 0xda, 0xc1, 0x92, 0x26, + 0xf6, 0x63, 0xe2, 0xc3, 0x42, 0x28, 0xe2, 0x3f, 0x57, 0xce, 0xb0, 0x34, 0x12, 0x58, 0xb2, 0x5a, + 0x0f, 0x52, 0x3e, 0x38, 0xb5, 0x33, 0x8e, 0x26, 0xfb, 0xca, 0x65, 0x52, 0x25, 0x74, 0x21, 0x9a, + 0x6d, 0x6f, 0xa4, 0x2b, 0x29, 0xcf, 0xe8, 0x01, 0x0f, 0x01, 0xa9, 0x72, 0x1d, 0xaf, 0x27, 0x36, + 0xd1, 0x7c, 0x93, 0xa9, 0x19, 0x4f, 0xe2, 0x28, 0xf8, 0xd9, 0x04, 0x7f, 0xe1, 0x5c, 0x3b, 0x9b, + 0x68, 0x99, 0x32, 0xca, 0x66, 0x1e, 0x0b, 0x21, 0xc2, 0x30, 0x99, 0x85, 0x7e, 0x0b, 0xa5, 0xe7, + 0xca, 0xd0, 0xcf, 0x26, 0x66, 0x56, 0x0f, 0x75, 0x36, 0xc1, 0x0e, 0x4d, 0xcc, 0xc3, 0xcf, 0x26, + 0x08, 0x64, 0x9e, 0x4d, 0xf4, 0x81, 0x66, 0x6f, 0x3c, 0x92, 0x4c, 0xeb, 0xa1, 0xce, 0xdd, 0x99, + 0x19, 0x3f, 0x06, 0x5c, 0x54, 0x5d, 0x4e, 0xc9, 0x44, 0xa4, 0x6c, 0xfe, 0xec, 0x2c, 0x45, 0x65, + 0xf3, 0xd6, 0xe5, 0x5e, 0x8e, 0x6c, 0x63, 0xca, 0xf1, 0xb4, 0x1f, 0x7e, 0xcf, 0xe2, 0x9f, 0x81, + 0xbf, 0x34, 0xcf, 0xf0, 0x35, 0xd2, 0xf1, 0x0d, 0x84, 0x1b, 0x70, 0xac, 0xbb, 0x2a, 0x02, 0x5c, + 0xce, 0x31, 0xc4, 0x6c, 0x16, 0x9f, 0xe0, 0x9e, 0xe7, 0x6c, 0xd0, 0xa2, 0xfe, 0x4b, 0xeb, 0xa8, + 0xb2, 0xee, 0xc0, 0x38, 0x07, 0xca, 0xd4, 0x36, 0xc6, 0xaf, 0xb3, 0x93, 0xf7, 0xe4, 0x3d, 0x32, + 0x03, 0x31, 0xaa, 0x32, 0xc7, 0xf5, 0x1e, 0x4c, 0x72, 0xb7, 0xdb, 0xd9, 0x41, 0x3e, 0x93, 0xb7, + 0xcd, 0x83, 0x06, 0x96, 0x1d, 0xe4, 0x31, 0xa3, 0xbb, 0xb1, 0xcf, 0x4f, 0xc8, 0x2f, 0xd0, 0xf5, + 0x29, 0x5d, 0x0d, 0xd9, 0xf0, 0xf3, 0x89, 0x5f, 0xd2, 0x47, 0x92, 0x7e, 0x8c, 0xfe, 0x57, 0x95, + 0xd2, 0x2b, 0x6b, 0xf8, 0xc9, 0xdf, 0xe1, 0x27, 0x9f, 0xc1, 0x2c, 0x27, 0xae, 0x02, 0x4e, 0x36, + 0x1a, 0x40, 0xb3, 0x59, 0x4e, 0xe6, 0x97, 0x01, 0xfe, 0xa9, 0x74, 0xd4, 0x0e, 0x1d, 0xf6, 0x59, + 0x5c, 0xb4, 0xc3, 0x49, 0x97, 0x85, 0xe5, 0x77, 0x50, 0xe9, 0xa6, 0xa7, 0xef, 0xc9, 0x44, 0x76, + 0x5b, 0x73, 0x41, 0x0f, 0x4e, 0xfc, 0x73, 0x84, 0x21, 0x82, 0xa9, 0x8d, 0x94, 0x83, 0x6c, 0x48, + 0x3e, 0x9f, 0xf2, 0x4f, 0x86, 0xb6, 0x53, 0x7e, 0x2e, 0x91, 0xef, 0x3e, 0xbd, 0xbf, 0x21, 0x49, + 0x7c, 0x52, 0x5c, 0x86, 0x19, 0xb9, 0x71, 0x24, 0x42, 0xf3, 0x32, 0x73, 0xe0, 0x1c, 0xb2, 0x8f, + 0x68, 0x51, 0xda, 0xfa, 0x73, 0x2e, 0x42, 0xb6, 0x19, 0x45, 0x92, 0x19, 0x83, 0xc8, 0xa0, 0x87, + 0x75, 0xba, 0x43, 0x36, 0x2b, 0xd3, 0xd0, 0xba, 0x8c, 0x47, 0x8d, 0xbd, 0x52, 0xcd, 0x7a, 0xef, + 0x3a, 0xe0, 0x74, 0x26, 0x22, 0x32, 0x5f, 0x0b, 0xa2, 0xe4, 0x6a, 0x9f, 0x1f, 0x91, 0x72, 0x0c, + 0xc7, 0x10, 0x59, 0x03, 0x96, 0x77, 0xb8, 0xd3, 0xab, 0x94, 0xb1, 0xae, 0xe7, 0x5f, 0x50, 0x27, + 0x8a, 0x42, 0x4c, 0xa6, 0x35, 0x52, 0x6a, 0x3f, 0x33, 0xc5, 0x92, 0x5a, 0xdd, 0x01, 0x39, 0x91, + 0xea, 0xd1, 0x0f, 0x0e, 0x19, 0x79, 0x90, 0xea, 0xf6, 0x96, 0x72, 0xd7, 0xa5, 0x25, 0x48, 0x2a, + 0x83, 0xac, 0xb4, 0xb7, 0xd8, 0x5e, 0xcf, 0x4a, 0xbf, 0x13, 0x45, 0x52, 0x0d, 0xce, 0x70, 0xa4, + 0xf6, 0xfa, 0xd0, 0x3c, 0x3e, 0xdb, 0x30, 0x97, 0x96, 0x36, 0x47, 0x2d, 0xda, 0x80, 0x9c, 0x3a, + 0xa9, 0xe1, 0x5a, 0x3b, 0x30, 0x9f, 0x9a, 0xba, 0x46, 0xdd, 0x90, 0x0c, 0x4a, 0x6c, 0x93, 0x8a, + 0xf1, 0x5b, 0x58, 0xc8, 0xc8, 0xd3, 0x12, 0x39, 0x10, 0x07, 0xe6, 0x71, 0xc9, 0x64, 0x88, 0xef, + 0xa1, 0x9c, 0x9d, 0x02, 0x84, 0xdc, 0x36, 0x9d, 0xa0, 0xd9, 0x89, 0x37, 0xca, 0xa9, 0x39, 0x8b, + 0xc8, 0x2e, 0x26, 0x17, 0x4c, 0xcb, 0x09, 0xa2, 0xc6, 0x3d, 0x38, 0x67, 0x48, 0x46, 0x98, 0xdd, + 0x42, 0x46, 0x1a, 0x90, 0x01, 0x58, 0xcf, 0x30, 0xda, 0x6d, 0x29, 0x97, 0xcc, 0xbc, 0x10, 0xb1, + 0x38, 0xf9, 0xd4, 0xa4, 0x11, 0xa9, 0xe3, 0xfc, 0x1a, 0x66, 0x8c, 0x87, 0xb9, 0x8a, 0xfd, 0xd3, + 0x5e, 0x87, 0x2b, 0x6f, 0x75, 0xfa, 0x5b, 0xde, 0x35, 0xf4, 0x7c, 0x47, 0x4f, 0x33, 0x06, 0xd8, + 0xc0, 0xd1, 0x85, 0x58, 0xf2, 0x05, 0xc8, 0x03, 0x3c, 0x14, 0x19, 0x0f, 0x3a, 0x06, 0x1c, 0x87, + 0x15, 0xa6, 0xd4, 0x17, 0x20, 0xb5, 0xe2, 0x2f, 0xff, 0xfb, 0x52, 0xee, 0x97, 0xbf, 0x5e, 0xca, + 0xfd, 0xe7, 0x5f, 0x2f, 0xe5, 0x7e, 0xf5, 0xeb, 0xa5, 0xdc, 0xfe, 0x38, 0x42, 0xac, 0xfc, 0xbf, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x81, 0x63, 0x28, 0xcb, 0x88, 0x93, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -11277,12 +11132,6 @@ type AuthServiceClient interface { WatchEvents(ctx context.Context, in *Watch, opts ...grpc.CallOption) (AuthService_WatchEventsClient, error) // GetNode retrieves a node described by the given request. GetNode(ctx context.Context, in *types.ResourceInNamespaceRequest, opts ...grpc.CallOption) (*types.ServerV2, error) - // GetNodes retrieves all nodes. - // DELETE IN 8.0.0 in favor of ListNodes - GetNodes(ctx context.Context, in *types.ResourcesInNamespaceRequest, opts ...grpc.CallOption) (*types.ServerV2List, error) - // ListNodes retrieves a paginated list of nodes. - // DELETE IN 10.0. Deprecated, use ListResources. - ListNodes(ctx context.Context, in *ListNodesRequest, opts ...grpc.CallOption) (*ListNodesResponse, error) // UpsertNode upserts a node in a backend. UpsertNode(ctx context.Context, in *types.ServerV2, opts ...grpc.CallOption) (*types.KeepAlive, error) // DeleteNode deletes an existing node in a backend described by the given request. @@ -11873,25 +11722,6 @@ func (c *authServiceClient) GetNode(ctx context.Context, in *types.ResourceInNam return out, nil } -func (c *authServiceClient) GetNodes(ctx context.Context, in *types.ResourcesInNamespaceRequest, opts ...grpc.CallOption) (*types.ServerV2List, error) { - out := new(types.ServerV2List) - err := c.cc.Invoke(ctx, "/proto.AuthService/GetNodes", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// Deprecated: Do not use. -func (c *authServiceClient) ListNodes(ctx context.Context, in *ListNodesRequest, opts ...grpc.CallOption) (*ListNodesResponse, error) { - out := new(ListNodesResponse) - err := c.cc.Invoke(ctx, "/proto.AuthService/ListNodes", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *authServiceClient) UpsertNode(ctx context.Context, in *types.ServerV2, opts ...grpc.CallOption) (*types.KeepAlive, error) { out := new(types.KeepAlive) err := c.cc.Invoke(ctx, "/proto.AuthService/UpsertNode", in, out, opts...) @@ -13500,12 +13330,6 @@ type AuthServiceServer interface { WatchEvents(*Watch, AuthService_WatchEventsServer) error // GetNode retrieves a node described by the given request. GetNode(context.Context, *types.ResourceInNamespaceRequest) (*types.ServerV2, error) - // GetNodes retrieves all nodes. - // DELETE IN 8.0.0 in favor of ListNodes - GetNodes(context.Context, *types.ResourcesInNamespaceRequest) (*types.ServerV2List, error) - // ListNodes retrieves a paginated list of nodes. - // DELETE IN 10.0. Deprecated, use ListResources. - ListNodes(context.Context, *ListNodesRequest) (*ListNodesResponse, error) // UpsertNode upserts a node in a backend. UpsertNode(context.Context, *types.ServerV2) (*types.KeepAlive, error) // DeleteNode deletes an existing node in a backend described by the given request. @@ -13945,12 +13769,6 @@ func (*UnimplementedAuthServiceServer) WatchEvents(req *Watch, srv AuthService_W func (*UnimplementedAuthServiceServer) GetNode(ctx context.Context, req *types.ResourceInNamespaceRequest) (*types.ServerV2, error) { return nil, status.Errorf(codes.Unimplemented, "method GetNode not implemented") } -func (*UnimplementedAuthServiceServer) GetNodes(ctx context.Context, req *types.ResourcesInNamespaceRequest) (*types.ServerV2List, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetNodes not implemented") -} -func (*UnimplementedAuthServiceServer) ListNodes(ctx context.Context, req *ListNodesRequest) (*ListNodesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListNodes not implemented") -} func (*UnimplementedAuthServiceServer) UpsertNode(ctx context.Context, req *types.ServerV2) (*types.KeepAlive, error) { return nil, status.Errorf(codes.Unimplemented, "method UpsertNode not implemented") } @@ -14614,42 +14432,6 @@ func _AuthService_GetNode_Handler(srv interface{}, ctx context.Context, dec func return interceptor(ctx, in, info, handler) } -func _AuthService_GetNodes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(types.ResourcesInNamespaceRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(AuthServiceServer).GetNodes(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/proto.AuthService/GetNodes", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AuthServiceServer).GetNodes(ctx, req.(*types.ResourcesInNamespaceRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _AuthService_ListNodes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListNodesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(AuthServiceServer).ListNodes(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/proto.AuthService/ListNodes", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AuthServiceServer).ListNodes(ctx, req.(*ListNodesRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _AuthService_UpsertNode_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(types.ServerV2) if err := dec(in); err != nil { @@ -17559,14 +17341,6 @@ var _AuthService_serviceDesc = grpc.ServiceDesc{ MethodName: "GetNode", Handler: _AuthService_GetNode_Handler, }, - { - MethodName: "GetNodes", - Handler: _AuthService_GetNodes_Handler, - }, - { - MethodName: "ListNodes", - Handler: _AuthService_ListNodes_Handler, - }, { MethodName: "UpsertNode", Handler: _AuthService_UpsertNode_Handler, @@ -24028,119 +23802,6 @@ func (m *Events) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ListNodesRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ListNodesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ListNodesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Labels) > 0 { - for k := range m.Labels { - v := m.Labels[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintAuthservice(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintAuthservice(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintAuthservice(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x22 - } - } - if len(m.StartKey) > 0 { - i -= len(m.StartKey) - copy(dAtA[i:], m.StartKey) - i = encodeVarintAuthservice(dAtA, i, uint64(len(m.StartKey))) - i-- - dAtA[i] = 0x1a - } - if m.Limit != 0 { - i = encodeVarintAuthservice(dAtA, i, uint64(m.Limit)) - i-- - dAtA[i] = 0x10 - } - if len(m.Namespace) > 0 { - i -= len(m.Namespace) - copy(dAtA[i:], m.Namespace) - i = encodeVarintAuthservice(dAtA, i, uint64(len(m.Namespace))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ListNodesResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ListNodesResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ListNodesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.NextKey) > 0 { - i -= len(m.NextKey) - copy(dAtA[i:], m.NextKey) - i = encodeVarintAuthservice(dAtA, i, uint64(len(m.NextKey))) - i-- - dAtA[i] = 0x12 - } - if len(m.Servers) > 0 { - for iNdEx := len(m.Servers) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Servers[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintAuthservice(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - func (m *GetLocksRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -29280,59 +28941,6 @@ func (m *Events) Size() (n int) { return n } -func (m *ListNodesRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Namespace) - if l > 0 { - n += 1 + l + sovAuthservice(uint64(l)) - } - if m.Limit != 0 { - n += 1 + sovAuthservice(uint64(m.Limit)) - } - l = len(m.StartKey) - if l > 0 { - n += 1 + l + sovAuthservice(uint64(l)) - } - if len(m.Labels) > 0 { - for k, v := range m.Labels { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovAuthservice(uint64(len(k))) + 1 + len(v) + sovAuthservice(uint64(len(v))) - n += mapEntrySize + 1 + sovAuthservice(uint64(mapEntrySize)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ListNodesResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Servers) > 0 { - for _, e := range m.Servers { - l = e.Size() - n += 1 + l + sovAuthservice(uint64(l)) - } - } - l = len(m.NextKey) - if l > 0 { - n += 1 + l + sovAuthservice(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - func (m *GetLocksRequest) Size() (n int) { if m == nil { return 0 @@ -43808,384 +43416,6 @@ func (m *Events) Unmarshal(dAtA []byte) error { } return nil } -func (m *ListNodesRequest) 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 ErrIntOverflowAuthservice - } - 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: ListNodesRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ListNodesRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAuthservice - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthAuthservice - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthAuthservice - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Namespace = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Limit", wireType) - } - m.Limit = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAuthservice - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Limit |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StartKey", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAuthservice - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthAuthservice - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthAuthservice - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.StartKey = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Labels", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAuthservice - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthAuthservice - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthAuthservice - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Labels == nil { - m.Labels = make(map[string]string) - } - var mapkey string - var mapvalue string - for iNdEx < postIndex { - entryPreIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAuthservice - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - if fieldNum == 1 { - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAuthservice - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return ErrInvalidLengthAuthservice - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthAuthservice - } - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey - } else if fieldNum == 2 { - var stringLenmapvalue uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAuthservice - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapvalue |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapvalue := int(stringLenmapvalue) - if intStringLenmapvalue < 0 { - return ErrInvalidLengthAuthservice - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthAuthservice - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipAuthservice(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAuthservice - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Labels[mapkey] = mapvalue - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipAuthservice(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAuthservice - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ListNodesResponse) 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 ErrIntOverflowAuthservice - } - 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: ListNodesResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ListNodesResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Servers", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAuthservice - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthAuthservice - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthAuthservice - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Servers = append(m.Servers, &types.ServerV2{}) - if err := m.Servers[len(m.Servers)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NextKey", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAuthservice - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthAuthservice - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthAuthservice - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.NextKey = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipAuthservice(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAuthservice - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *GetLocksRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/api/client/proto/authservice.proto b/api/client/proto/authservice.proto index 57a21b43dc4..e202a4c48fb 100644 --- a/api/client/proto/authservice.proto +++ b/api/client/proto/authservice.proto @@ -1159,28 +1159,6 @@ message Events { string LastKey = 2; } -// DELETE IN 10.0 -message ListNodesRequest { - // Namespace is the namespace of resources. - string Namespace = 1; - // Limit is the maximum amount of nodes to retrieve. - int32 Limit = 2; - // StartKey is used to start listing nodes from a specific spot. This should - // be set to the previous NextKey value if using pagination, or left empty. - string StartKey = 3; - // Labels is a label-based matcher if non-empty. - map Labels = 4; -} - -// DELETE IN 10.0 -message ListNodesResponse { - // Servers is a list of servers. - repeated types.ServerV2 Servers = 1; - // NextKey is the next Key to use as StartKey in a ListNodesRequest to continue - // retrieving pages of nodes. If NextKey is empty, there are no more pages. - string NextKey = 2; -} - message GetLocksRequest { // Targets is a list of targets. Every returned lock must match at least // one of the targets. @@ -1500,6 +1478,7 @@ message PaginatedResource { // one type of resource can be retrieved per request. message ListResourcesRequest { // ResourceType is the resource that is going to be retrieved. + // This only needs to be set explicitly for the `ListResources` rpc. string ResourceType = 1 [ (gogoproto.jsontag) = "resource_type,omitempty" ]; // Namespace is the namespace of resources. string Namespace = 2 [ (gogoproto.jsontag) = "namespace,omitempty" ]; @@ -1720,12 +1699,6 @@ service AuthService { // GetNode retrieves a node described by the given request. rpc GetNode(types.ResourceInNamespaceRequest) returns (types.ServerV2); - // GetNodes retrieves all nodes. - // DELETE IN 8.0.0 in favor of ListNodes - rpc GetNodes(types.ResourcesInNamespaceRequest) returns (types.ServerV2List); - // ListNodes retrieves a paginated list of nodes. - // DELETE IN 10.0. Deprecated, use ListResources. - rpc ListNodes(ListNodesRequest) returns (ListNodesResponse) { option deprecated = true; }; // UpsertNode upserts a node in a backend. rpc UpsertNode(types.ServerV2) returns (types.KeepAlive); // DeleteNode deletes an existing node in a backend described by the given request. diff --git a/e b/e index d2c63fbb62b..d2f35978902 160000 --- a/e +++ b/e @@ -1 +1 @@ -Subproject commit d2c63fbb62bd8ff25c98c1e19245576aa1b636ee +Subproject commit d2f3597890207c51c25a05651d3e41a6cceeff26 diff --git a/lib/auth/api.go b/lib/auth/api.go index 6fd800ea0d7..5950bea5b88 100644 --- a/lib/auth/api.go +++ b/lib/auth/api.go @@ -201,7 +201,7 @@ type ReadProxyAccessPoint interface { GetNode(ctx context.Context, namespace, name string) (types.Server, error) // GetNodes returns a list of registered servers for this cluster. - GetNodes(ctx context.Context, namespace string, opts ...services.MarshalOption) ([]types.Server, error) + GetNodes(ctx context.Context, namespace string) ([]types.Server, error) // GetProxies returns a list of proxy servers registered in the cluster GetProxies() ([]types.Server, error) @@ -329,7 +329,7 @@ type ReadRemoteProxyAccessPoint interface { GetNode(ctx context.Context, namespace, name string) (types.Server, error) // GetNodes returns a list of registered servers for this cluster. - GetNodes(ctx context.Context, namespace string, opts ...services.MarshalOption) ([]types.Server, error) + GetNodes(ctx context.Context, namespace string) ([]types.Server, error) // GetProxies returns a list of proxy servers registered in the cluster GetProxies() ([]types.Server, error) @@ -697,10 +697,7 @@ type Cache interface { GetNode(ctx context.Context, namespace, name string) (types.Server, error) // GetNodes returns a list of registered servers for this cluster. - GetNodes(ctx context.Context, namespace string, opts ...services.MarshalOption) ([]types.Server, error) - - // ListNodes returns a paginated list of registered servers for this cluster. - ListNodes(ctx context.Context, req proto.ListNodesRequest) (nodes []types.Server, nextKey string, err error) + GetNodes(ctx context.Context, namespace string) ([]types.Server, error) // GetProxies returns a list of proxy servers registered in the cluster GetProxies() ([]types.Server, error) diff --git a/lib/auth/apiserver.go b/lib/auth/apiserver.go index 0f6c1c7c019..2b3c6b950e7 100644 --- a/lib/auth/apiserver.go +++ b/lib/auth/apiserver.go @@ -121,12 +121,7 @@ func NewAPIServer(config *APIConfig) (http.Handler, error) { srv.DELETE("/:version/users/:user/web/sessions/:sid", srv.withAuth(srv.deleteWebSession)) // Servers and presence heartbeat - srv.POST("/:version/namespaces/:namespace/nodes", srv.withAuth(srv.upsertNode)) srv.POST("/:version/namespaces/:namespace/nodes/keepalive", srv.withAuth(srv.keepAliveNode)) - srv.PUT("/:version/namespaces/:namespace/nodes", srv.withAuth(srv.upsertNodes)) - srv.GET("/:version/namespaces/:namespace/nodes", srv.withAuth(srv.getNodes)) - srv.DELETE("/:version/namespaces/:namespace/nodes", srv.withAuth(srv.deleteAllNodes)) - srv.DELETE("/:version/namespaces/:namespace/nodes/:name", srv.withAuth(srv.deleteNode)) srv.POST("/:version/authservers", srv.withAuth(srv.upsertAuthServer)) srv.GET("/:version/authservers", srv.withAuth(srv.getAuthServers)) srv.POST("/:version/proxies", srv.withAuth(srv.upsertProxy)) @@ -350,84 +345,6 @@ func (s *APIServer) keepAliveNode(auth ClientI, w http.ResponseWriter, r *http.R return message("ok"), nil } -type upsertNodesReq struct { - Nodes json.RawMessage `json:"nodes"` - Namespace string `json:"namespace"` -} - -// upsertNodes is used to bulk insert nodes into the backend. -func (s *APIServer) upsertNodes(auth ClientI, w http.ResponseWriter, r *http.Request, p httprouter.Params, version string) (interface{}, error) { - var req upsertNodesReq - if err := httplib.ReadJSON(r, &req); err != nil { - return nil, trace.Wrap(err) - } - - if !types.IsValidNamespace(req.Namespace) { - return nil, trace.BadParameter("invalid namespace %q", req.Namespace) - } - - nodes, err := services.UnmarshalServers(req.Nodes) - if err != nil { - return nil, trace.Wrap(err) - } - - err = auth.UpsertNodes(req.Namespace, nodes) - if err != nil { - return nil, trace.Wrap(err) - } - - return message("ok"), nil -} - -// upsertNode is called by remote SSH nodes when they ping back into the auth service -func (s *APIServer) upsertNode(auth ClientI, w http.ResponseWriter, r *http.Request, p httprouter.Params, version string) (interface{}, error) { - return s.upsertServer(auth, types.RoleNode, r, p) -} - -// getNodes returns registered SSH nodes -func (s *APIServer) getNodes(auth ClientI, w http.ResponseWriter, r *http.Request, p httprouter.Params, version string) (interface{}, error) { - namespace := p.ByName("namespace") - if !types.IsValidNamespace(namespace) { - return nil, trace.BadParameter("invalid namespace %q", namespace) - } - - servers, err := auth.GetNodes(r.Context(), namespace) - if err != nil { - return nil, trace.Wrap(err) - } - return marshalServers(servers, version) -} - -// deleteAllNodes deletes all nodes -func (s *APIServer) deleteAllNodes(auth ClientI, w http.ResponseWriter, r *http.Request, p httprouter.Params, version string) (interface{}, error) { - namespace := p.ByName("namespace") - if !types.IsValidNamespace(namespace) { - return nil, trace.BadParameter("invalid namespace %q", namespace) - } - err := auth.DeleteAllNodes(r.Context(), namespace) - if err != nil { - return nil, trace.Wrap(err) - } - return message("ok"), nil -} - -// deleteNode deletes node -func (s *APIServer) deleteNode(auth ClientI, w http.ResponseWriter, r *http.Request, p httprouter.Params, version string) (interface{}, error) { - namespace := p.ByName("namespace") - if !types.IsValidNamespace(namespace) { - return nil, trace.BadParameter("invalid namespace %q", namespace) - } - name := p.ByName("name") - if name == "" { - return nil, trace.BadParameter("missing node name") - } - err := auth.DeleteNode(r.Context(), namespace, name) - if err != nil { - return nil, trace.Wrap(err) - } - return message("ok"), nil -} - // upsertProxy is called by remote SSH nodes when they ping back into the auth service func (s *APIServer) upsertProxy(auth ClientI, w http.ResponseWriter, r *http.Request, p httprouter.Params, version string) (interface{}, error) { return s.upsertServer(auth, types.RoleProxy, r, p) diff --git a/lib/auth/auth.go b/lib/auth/auth.go index b43afce7f6b..761c6b884e3 100644 --- a/lib/auth/auth.go +++ b/lib/auth/auth.go @@ -2739,39 +2739,8 @@ func (a *Server) GetNamespaces() ([]types.Namespace, error) { } // GetNodes returns nodes from the cache -func (a *Server) GetNodes(ctx context.Context, namespace string, opts ...services.MarshalOption) ([]types.Server, error) { - return a.GetCache().GetNodes(ctx, namespace, opts...) -} - -// ListNodes lists nodes from the cache -func (a *Server) ListNodes(ctx context.Context, req proto.ListNodesRequest) ([]types.Server, string, error) { - return a.GetCache().ListNodes(ctx, req) -} - -// NodePageFunc is a function to run on each page iterated over. -type NodePageFunc func(next []types.Server) (stop bool, err error) - -// IterateNodePages can be used to iterate over pages of nodes. -func (a *Server) IterateNodePages(ctx context.Context, req proto.ListNodesRequest, f NodePageFunc) (string, error) { - for { - nextPage, nextKey, err := a.ListNodes(ctx, req) - if err != nil { - return "", trace.Wrap(err) - } - - stop, err := f(nextPage) - if err != nil { - return "", trace.Wrap(err) - } - - // Iterator stopped before end of pages or - // there are no more pages, return nextKey - if stop || nextKey == "" { - return nextKey, nil - } - - req.StartKey = nextKey - } +func (a *Server) GetNodes(ctx context.Context, namespace string) ([]types.Server, error) { + return a.GetCache().GetNodes(ctx, namespace) } // ResourcePageFunc is a function to run on each page iterated over. diff --git a/lib/auth/auth_with_roles.go b/lib/auth/auth_with_roles.go index ba0578e51d9..4cac7fdd2a3 100644 --- a/lib/auth/auth_with_roles.go +++ b/lib/auth/auth_with_roles.go @@ -32,7 +32,6 @@ import ( apievents "github.com/gravitational/teleport/api/types/events" "github.com/gravitational/teleport/api/types/wrappers" apiutils "github.com/gravitational/teleport/api/utils" - "github.com/gravitational/teleport/lib/backend" "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/events" "github.com/gravitational/teleport/lib/modules" @@ -623,14 +622,6 @@ func (a *ServerWithRoles) GenerateHostCerts(ctx context.Context, req *proto.Host return a.authServer.GenerateHostCerts(ctx, req) } -// UpsertNodes bulk upserts nodes into the backend. -func (a *ServerWithRoles) UpsertNodes(namespace string, servers []types.Server) error { - if err := a.action(namespace, types.KindNode, types.VerbCreate, types.VerbUpdate); err != nil { - return trace.Wrap(err) - } - return a.authServer.UpsertNodes(namespace, servers) -} - func (a *ServerWithRoles) UpsertNode(ctx context.Context, s types.Server) (*types.KeepAlive, error) { if err := a.action(s.GetNamespace(), types.KindNode, types.VerbCreate, types.VerbUpdate); err != nil { return nil, trace.Wrap(err) @@ -875,14 +866,14 @@ func (a *ServerWithRoles) GetNode(ctx context.Context, namespace, name string) ( return node, nil } -func (a *ServerWithRoles) GetNodes(ctx context.Context, namespace string, opts ...services.MarshalOption) ([]types.Server, error) { +func (a *ServerWithRoles) GetNodes(ctx context.Context, namespace string) ([]types.Server, error) { if err := a.action(namespace, types.KindNode, types.VerbList); err != nil { return nil, trace.Wrap(err) } // Fetch full list of nodes in the backend. startFetch := time.Now() - nodes, err := a.authServer.GetNodes(ctx, namespace, opts...) + nodes, err := a.authServer.GetNodes(ctx, namespace) if err != nil { return nil, trace.Wrap(err) } @@ -1296,66 +1287,6 @@ func (a *ServerWithRoles) ListWindowsDesktops(ctx context.Context, req types.Lis return nil, trace.NotImplemented(notImplementedMessage) } -// ListNodes returns a paginated list of nodes filtered by user access. -// -// DELETE IN 10.0.0 in favor of ListResources. -func (a *ServerWithRoles) ListNodes(ctx context.Context, req proto.ListNodesRequest) (page []types.Server, nextKey string, err error) { - if err := a.action(req.Namespace, types.KindNode, types.VerbList); err != nil { - return nil, "", trace.Wrap(err) - } - - return a.filterAndListNodes(ctx, req) -} - -// DELETE IN 10.0.0 in favor of ListResources. -func (a *ServerWithRoles) filterAndListNodes(ctx context.Context, req proto.ListNodesRequest) (page []types.Server, nextKey string, err error) { - limit := int(req.Limit) - if limit <= 0 { - return nil, "", trace.BadParameter("nonpositive parameter limit") - } - - // move labels out of request so that we can perform label-based filtering *after* RBAC filtering. - realLabels := req.Labels - req.Labels = nil - - checker, err := newNodeChecker(a.context, a.authServer) - if err != nil { - return nil, "", trace.Wrap(err) - } - - page = make([]types.Server, 0, limit) - nextKey, err = a.authServer.IterateNodePages(ctx, req, func(nextPage []types.Server) (bool, error) { - // Retrieve and filter pages of nodes until we can fill a page or run out of nodes. - filteredPage, err := a.filterNodes(checker, nextPage) - if err != nil { - return false, trace.Wrap(err) - } - - // add all matching nodes to page - for _, node := range filteredPage { - if len(page) == limit { - // page is filled, stop processing - break - } - if node.MatchAgainst(realLabels) { - page = append(page, node) - } - } - - return len(page) == limit, nil - }) - if err != nil { - return nil, "", trace.Wrap(err) - } - - // Filled a page, reset nextKey in case the last node was cut out. - if len(page) == limit { - nextKey = backend.NextPaginationKey(page[len(page)-1]) - } - - return page, nextKey, nil -} - func (a *ServerWithRoles) UpsertAuthServer(s types.Server) error { if err := a.action(apidefaults.Namespace, types.KindAuthServer, types.VerbCreate, types.VerbUpdate); err != nil { return trace.Wrap(err) diff --git a/lib/auth/auth_with_roles_test.go b/lib/auth/auth_with_roles_test.go index d19e34da7e0..6a69854e6d4 100644 --- a/lib/auth/auth_with_roles_test.go +++ b/lib/auth/auth_with_roles_test.go @@ -1395,67 +1395,6 @@ func TestSessionRecordingConfigRBAC(t *testing.T) { }) } -// TestListNodes users can retrieve nodes with the appropriate permissions. -func TestListNodes(t *testing.T) { - t.Parallel() - ctx := context.Background() - srv := newTestTLSServer(t) - - // Create test nodes. - for i := 0; i < 10; i++ { - name := uuid.New().String() - node, err := types.NewServerWithLabels( - name, - types.KindNode, - types.ServerSpecV2{}, - map[string]string{"name": name}, - ) - require.NoError(t, err) - - _, err = srv.Auth().UpsertNode(ctx, node) - require.NoError(t, err) - } - - testNodes, err := srv.Auth().GetNodes(ctx, defaults.Namespace) - require.NoError(t, err) - - // create user, role, and client - username := "user" - user, role, err := CreateUserAndRole(srv.Auth(), username, nil) - require.NoError(t, err) - identity := TestUser(user.GetName()) - clt, err := srv.NewClient(identity) - require.NoError(t, err) - - // permit user to list all nodes - role.SetNodeLabels(types.Allow, types.Labels{types.Wildcard: {types.Wildcard}}) - require.NoError(t, srv.Auth().UpsertRole(ctx, role)) - - // listing nodes 0-4 should list first 5 nodes - nodes, _, err := clt.ListNodes(ctx, proto.ListNodesRequest{ - Namespace: defaults.Namespace, - Limit: 5, - }) - require.NoError(t, err) - require.EqualValues(t, 5, len(nodes)) - expectedNodes := testNodes[:5] - require.Empty(t, cmp.Diff(expectedNodes, nodes)) - - // remove permission for third node - role.SetNodeLabels(types.Deny, types.Labels{"name": {testNodes[3].GetName()}}) - require.NoError(t, srv.Auth().UpsertRole(ctx, role)) - - // listing nodes 0-4 should skip the third node and add the fifth to the end. - nodes, _, err = clt.ListNodes(ctx, proto.ListNodesRequest{ - Namespace: defaults.Namespace, - Limit: 5, - }) - require.NoError(t, err) - require.EqualValues(t, 5, len(nodes)) - expectedNodes = append(testNodes[:3], testNodes[4:6]...) - require.Empty(t, cmp.Diff(expectedNodes, nodes)) -} - // TestGetAndList_Nodes users can retrieve nodes with various filters // and with the appropriate permissions. func TestGetAndList_Nodes(t *testing.T) { diff --git a/lib/auth/clt.go b/lib/auth/clt.go index 6c92705d1fe..ce53d633ef1 100644 --- a/lib/auth/clt.go +++ b/lib/auth/clt.go @@ -530,24 +530,6 @@ func (c *Client) KeepAliveServer(ctx context.Context, keepAlive types.KeepAlive) return trace.BadParameter("not implemented, use StreamKeepAlives instead") } -// UpsertNodes bulk inserts nodes. -func (c *Client) UpsertNodes(namespace string, servers []types.Server) error { - if namespace == "" { - return trace.BadParameter("missing node namespace") - } - - bytes, err := services.MarshalServers(servers) - if err != nil { - return trace.Wrap(err) - } - args := &upsertNodesReq{ - Namespace: namespace, - Nodes: bytes, - } - _, err = c.PutJSON(context.TODO(), c.Endpoint("namespaces", namespace, "nodes"), args) - return trace.Wrap(err) -} - // UpsertReverseTunnel is used by admins to create a new reverse tunnel // to the remote proxy to bypass firewall restrictions func (c *Client) UpsertReverseTunnel(tunnel types.ReverseTunnel) error { diff --git a/lib/auth/grpcserver.go b/lib/auth/grpcserver.go index 20e26bcc10f..83a5bb10ed1 100644 --- a/lib/auth/grpcserver.go +++ b/lib/auth/grpcserver.go @@ -2586,52 +2586,6 @@ func (g *GRPCServer) GetNode(ctx context.Context, req *types.ResourceInNamespace return serverV2, nil } -// GetNodes retrieves all nodes in the given namespace. -// DELETE IN 8.0.0 in favor of ListNodes -func (g *GRPCServer) GetNodes(ctx context.Context, req *types.ResourcesInNamespaceRequest) (*types.ServerV2List, error) { - auth, err := g.authenticate(ctx) - if err != nil { - return nil, trace.Wrap(err) - } - ns, err := auth.ServerWithRoles.GetNodes(ctx, req.Namespace) - if err != nil { - return nil, trace.Wrap(err) - } - serversV2 := make([]*types.ServerV2, len(ns)) - for i, t := range ns { - var ok bool - if serversV2[i], ok = t.(*types.ServerV2); !ok { - return nil, trace.Errorf("encountered unexpected node type: %T", t) - } - } - return &types.ServerV2List{ - Servers: serversV2, - }, nil -} - -// ListNodes retrieves a paginated list of nodes in the given namespace. -func (g *GRPCServer) ListNodes(ctx context.Context, req *proto.ListNodesRequest) (*proto.ListNodesResponse, error) { - auth, err := g.authenticate(ctx) - if err != nil { - return nil, trace.Wrap(err) - } - ns, nextKey, err := auth.ServerWithRoles.ListNodes(ctx, *req) - if err != nil { - return nil, trace.Wrap(err) - } - serversV2 := make([]*types.ServerV2, len(ns)) - for i, t := range ns { - var ok bool - if serversV2[i], ok = t.(*types.ServerV2); !ok { - return nil, trace.Errorf("encountered unexpected node type: %T", t) - } - } - return &proto.ListNodesResponse{ - Servers: serversV2, - NextKey: nextKey, - }, nil -} - // UpsertNode upserts a node. func (g *GRPCServer) UpsertNode(ctx context.Context, node *types.ServerV2) (*types.KeepAlive, error) { auth, err := g.authenticate(ctx) diff --git a/lib/auth/grpcserver_test.go b/lib/auth/grpcserver_test.go index 6a375f7d4be..d993b911df6 100644 --- a/lib/auth/grpcserver_test.go +++ b/lib/auth/grpcserver_test.go @@ -39,7 +39,6 @@ import ( "github.com/gravitational/teleport/lib/auth/mocku2f" "github.com/gravitational/teleport/lib/auth/native" wanlib "github.com/gravitational/teleport/lib/auth/webauthn" - "github.com/gravitational/teleport/lib/backend" "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/tlsca" @@ -1391,51 +1390,6 @@ func TestNodesCRUD(t *testing.T) { // Run NodeGetters in nested subtests to allow parallelization. t.Run("NodeGetters", func(t *testing.T) { - t.Run("List Nodes", func(t *testing.T) { - t.Parallel() - // List nodes one at a time, last page should be empty. - - // First node. - nodes, nextKey, err := clt.ListNodes(ctx, proto.ListNodesRequest{ - Namespace: apidefaults.Namespace, - Limit: 1, - }) - require.NoError(t, err) - require.Len(t, nodes, 1) - require.Empty(t, cmp.Diff([]types.Server{node1}, nodes, - cmpopts.IgnoreFields(types.Metadata{}, "ID"))) - require.Equal(t, backend.NextPaginationKey(node1), nextKey) - - // Second node (last). - nodes, nextKey, err = clt.ListNodes(ctx, proto.ListNodesRequest{ - Namespace: apidefaults.Namespace, - Limit: 1, - StartKey: nextKey, - }) - require.NoError(t, err) - require.Len(t, nodes, 1) - require.Empty(t, cmp.Diff([]types.Server{node2}, nodes, - cmpopts.IgnoreFields(types.Metadata{}, "ID"))) - require.Empty(t, nextKey) - - // ListNodes should not fail if namespace is empty - _, _, err = clt.ListNodes(ctx, proto.ListNodesRequest{ - Limit: 1, - }) - require.NoError(t, err) - - // ListNodes should fail if limit is nonpositive - _, _, err = clt.ListNodes(ctx, proto.ListNodesRequest{ - Namespace: apidefaults.Namespace, - }) - require.IsType(t, &trace.BadParameterError{}, err.(*trace.TraceErr).OrigError()) - - _, _, err = clt.ListNodes(ctx, proto.ListNodesRequest{ - Namespace: apidefaults.Namespace, - Limit: -1, - }) - require.IsType(t, &trace.BadParameterError{}, err.(*trace.TraceErr).OrigError()) - }) t.Run("GetNodes", func(t *testing.T) { t.Parallel() // Get all nodes diff --git a/lib/auth/httpfallback.go b/lib/auth/httpfallback.go index d22035569e8..86c13dd683f 100644 --- a/lib/auth/httpfallback.go +++ b/lib/auth/httpfallback.go @@ -21,121 +21,13 @@ import ( "encoding/json" "net/url" - "github.com/gravitational/teleport/api/client" "github.com/gravitational/teleport/api/client/proto" - "github.com/gravitational/teleport/api/types" - "github.com/gravitational/teleport/lib/services" - "github.com/gravitational/trace" ) // httpfallback.go holds endpoints that have been converted to gRPC // but still need http fallback logic in the old client. -// DeleteAllNodes deletes all nodes in a given namespace -func (c *Client) DeleteAllNodes(ctx context.Context, namespace string) error { - if err := c.APIClient.DeleteAllNodes(ctx, namespace); err != nil { - if !trace.IsNotImplemented(err) { - return trace.Wrap(err) - } - } else { - return nil - } - - _, err := c.Delete(ctx, c.Endpoint("namespaces", namespace, "nodes")) - if err != nil { - return trace.Wrap(err) - } - return nil -} - -// DeleteNode deletes node in the namespace by name -func (c *Client) DeleteNode(ctx context.Context, namespace string, name string) error { - if err := c.APIClient.DeleteNode(ctx, namespace, name); err != nil { - if !trace.IsNotImplemented(err) { - return trace.Wrap(err) - } - } else { - return nil - } - - _, err := c.Delete(ctx, c.Endpoint("namespaces", namespace, "nodes", name)) - if err != nil { - return trace.Wrap(err) - } - return nil -} - -type nodeClient interface { - ListNodes(ctx context.Context, req proto.ListNodesRequest) (nodes []types.Server, nextKey string, err error) - GetNodes(ctx context.Context, namespace string, opts ...services.MarshalOption) ([]types.Server, error) -} - -// GetNodesWithLabels is a helper for getting a list of nodes with optional label-based filtering. This is essentially -// a wrapper around client.GetNodesWithLabels that performs fallback on NotImplemented errors. -// -// DELETE IN 11.0.0, this function is only called by lib/client/client.go (*ProxyClient).FindServersByLabels -// which is also marked for deletion (replaced by FindNodesByFilters). -func GetNodesWithLabels(ctx context.Context, clt nodeClient, namespace string, labels map[string]string) ([]types.Server, error) { - nodes, err := client.GetNodesWithLabels(ctx, clt, namespace, labels) - if err == nil || !trace.IsNotImplemented(err) { - return nodes, trace.Wrap(err) - } - - nodes, err = clt.GetNodes(ctx, namespace) - if err != nil { - return nil, trace.Wrap(err) - } - - var filtered []types.Server - - // we had to fallback to a method that does not perform server-side filtering, - // so filter here instead. - for _, node := range nodes { - if node.MatchAgainst(labels) { - filtered = append(filtered, node) - } - } - - return filtered, nil -} - -// GetNodes returns the list of servers registered in the cluster. -// -// DELETE IN 11.0.0, replaced by GetResourcesWithFilters -func (c *Client) GetNodes(ctx context.Context, namespace string, opts ...services.MarshalOption) ([]types.Server, error) { - if resp, err := c.APIClient.GetNodes(ctx, namespace); err != nil { - if !trace.IsNotImplemented(err) { - return nil, trace.Wrap(err) - } - } else { - return resp, nil - } - - out, err := c.Get(ctx, c.Endpoint("namespaces", namespace, "nodes"), url.Values{}) - if err != nil { - return nil, trace.Wrap(err) - } - - var items []json.RawMessage - if err := json.Unmarshal(out.Bytes(), &items); err != nil { - return nil, trace.Wrap(err) - } - re := make([]types.Server, len(items)) - for i, raw := range items { - s, err := services.UnmarshalServer( - raw, - types.KindNode, - opts...) - if err != nil { - return nil, trace.Wrap(err) - } - re[i] = s - } - - return re, nil -} - // GetDomainName returns local auth domain of the current auth server // DELETE IN 11.0.0 func (c *Client) GetDomainName(ctx context.Context) (string, error) { diff --git a/lib/cache/cache.go b/lib/cache/cache.go index 078d4aaa52f..96aa387c493 100644 --- a/lib/cache/cache.go +++ b/lib/cache/cache.go @@ -1412,7 +1412,7 @@ type getNodesCacheKey struct { var _ map[getNodesCacheKey]struct{} // compile-time hashability check // GetNodes is a part of auth.Cache implementation -func (c *Cache) GetNodes(ctx context.Context, namespace string, opts ...services.MarshalOption) ([]types.Server, error) { +func (c *Cache) GetNodes(ctx context.Context, namespace string) ([]types.Server, error) { rg, err := c.read() if err != nil { return nil, trace.Wrap(err) @@ -1420,7 +1420,7 @@ func (c *Cache) GetNodes(ctx context.Context, namespace string, opts ...services defer rg.Release() if !rg.IsCacheRead() { - cachedNodes, err := c.getNodesWithTTLCache(ctx, rg, namespace, opts...) + cachedNodes, err := c.getNodesWithTTLCache(ctx, rg, namespace) if err != nil { return nil, trace.Wrap(err) } @@ -1431,7 +1431,7 @@ func (c *Cache) GetNodes(ctx context.Context, namespace string, opts ...services return nodes, nil } - return rg.presence.GetNodes(ctx, namespace, opts...) + return rg.presence.GetNodes(ctx, namespace) } // getNodesWithTTLCache implements TTL-based caching for the GetNodes endpoint. All nodes that will be returned from the caching layer @@ -1441,7 +1441,7 @@ func (c *Cache) getNodesWithTTLCache(ctx context.Context, rg readGuard, namespac ni, err := c.fnCache.Get(ctx, getNodesCacheKey{namespace}, func(ctx context.Context) (interface{}, error) { // use cache's close context instead of request context in order to ensure // that we don't cache a context cancellation error. - nodes, err := rg.presence.GetNodes(c.ctx, namespace, opts...) + nodes, err := rg.presence.GetNodes(c.ctx, namespace) ta(nodes) return nodes, err }) @@ -1456,74 +1456,6 @@ func (c *Cache) getNodesWithTTLCache(ctx context.Context, rg readGuard, namespac return cachedNodes, nil } -// ListNodes is a part of auth.Cache implementation -// -// DELETE IN 10.0.0 in favor of ListResources. -func (c *Cache) ListNodes(ctx context.Context, req proto.ListNodesRequest) ([]types.Server, string, error) { - rg, err := c.read() - if err != nil { - return nil, "", trace.Wrap(err) - } - defer rg.Release() - - if rg.IsCacheRead() { - // cache is healthy, delegate to the standard ListNodes implementation - return rg.presence.ListNodes(ctx, req) - } - - // Cache is not healthy. List nodes using TTL cache. - return c.listNodesFromTTLCache(ctx, rg, req.Namespace, req.StartKey, req.Labels, int(req.Limit)) -} - -// listNodesFromTTLCache Used when the cache is not healthy. It takes advantage -// of TTL-based caching rather than caching individual page calls (very messy). -// It relies on caching the result of the `GetNodes` endpoint and then "faking" -// pagination. -// -// DELETE IN 10.0.0 in favor of ListResources. -func (c *Cache) listNodesFromTTLCache(ctx context.Context, rg readGuard, namespace, startKey string, labels map[string]string, limit int) ([]types.Server, string, error) { - if limit <= 0 { - return nil, "", trace.BadParameter("nonpositive limit value") - } - - cachedNodes, err := c.getNodesWithTTLCache(ctx, rg, namespace) - if err != nil { - return nil, "", trace.Wrap(err) - } - - // trim nodes that precede start key - if startKey != "" { - pageStart := 0 - for i, node := range cachedNodes { - if node.GetName() < startKey { - pageStart = i + 1 - } else { - break - } - } - cachedNodes = cachedNodes[pageStart:] - } - - // iterate and filter nodes, halting when we reach page limit - var filtered []types.Server - for _, node := range cachedNodes { - if len(filtered) == limit { - break - } - - if node.MatchAgainst(labels) { - filtered = append(filtered, node.DeepCopy()) - } - } - - var nextKey string - if len(filtered) == limit { - nextKey = backend.NextPaginationKey(filtered[len(filtered)-1]) - } - - return filtered, nextKey, nil -} - // GetAuthServers returns a list of registered servers func (c *Cache) GetAuthServers() ([]types.Server, error) { rg, err := c.read() diff --git a/lib/cache/cache_test.go b/lib/cache/cache_test.go index 8446e0eba91..0cbec5c937e 100644 --- a/lib/cache/cache_test.go +++ b/lib/cache/cache_test.go @@ -737,62 +737,6 @@ func benchGetNodes(b *testing.B, nodeCount int) { } } -/* -goos: linux -goarch: amd64 -pkg: github.com/gravitational/teleport/lib/cache -cpu: Intel(R) Core(TM) i9-10885H CPU @ 2.40GHz -BenchmarkListMaxNodes-16 1 1136071399 ns/op -*/ -func BenchmarkListMaxNodes(b *testing.B) { - benchListNodes(b, backend.DefaultRangeLimit, apidefaults.DefaultChunkSize) -} - -func benchListNodes(b *testing.B, nodeCount int, pageSize int) { - p, err := newPack(b.TempDir(), ForAuth, memoryBackend(true)) - require.NoError(b, err) - defer p.Close() - - ctx := context.Background() - - for i := 0; i < nodeCount; i++ { - func() { - server := suite.NewServer(types.KindNode, uuid.New().String(), "127.0.0.1:2022", apidefaults.Namespace) - _, err := p.presenceS.UpsertNode(ctx, server) - require.NoError(b, err) - timeout := time.NewTimer(time.Millisecond * 200) - defer timeout.Stop() - select { - case event := <-p.eventsC: - require.Equal(b, EventProcessed, event.Type) - case <-timeout.C: - b.Fatalf("timeout waiting for event, iteration=%d", i) - } - }() - } - - b.ResetTimer() - - for n := 0; n < b.N; n++ { - var nodes []types.Server - req := proto.ListNodesRequest{ - Namespace: apidefaults.Namespace, - Limit: int32(pageSize), - } - for { - page, nextKey, err := p.cache.ListNodes(ctx, req) - require.NoError(b, err) - nodes = append(nodes, page...) - require.True(b, len(page) == pageSize || nextKey == "") - if nextKey == "" { - break - } - req.StartKey = nextKey - } - require.Len(b, nodes, nodeCount) - } -} - // TestListResources_NodesTTLVariant verifies that the custom ListNodes impl that we fallback to when // using ttl-based caching works as expected. func TestListResources_NodesTTLVariant(t *testing.T) { @@ -844,32 +788,6 @@ func TestListResources_NodesTTLVariant(t *testing.T) { require.NoError(t, err) require.Len(t, allNodes, nodeCount) - // DELETE IN 10.0.0 this block with ListNodes is replaced - // by the following block with ListResources test. - var nodes []types.Server - var startKey string - for { - page, nextKey, err := p.cache.ListNodes(ctx, proto.ListNodesRequest{ - Namespace: apidefaults.Namespace, - Limit: int32(pageSize), - StartKey: startKey, - }) - require.NoError(t, err) - - if nextKey != "" { - require.Len(t, page, pageSize) - } - - nodes = append(nodes, page...) - - startKey = nextKey - - if startKey == "" { - break - } - } - require.Len(t, nodes, nodeCount) - var resources []types.ResourceWithLabels var listResourcesStartKey string sortBy := types.SortBy{ diff --git a/lib/client/client.go b/lib/client/client.go index baff7e89f22..4debe26eaff 100644 --- a/lib/client/client.go +++ b/lib/client/client.go @@ -580,24 +580,6 @@ func (proxy *ProxyClient) isAuthBoring(ctx context.Context) (bool, error) { return resp.IsBoring, trace.Wrap(err) } -// FindServersByLabels returns list of the nodes which have labels exactly matching -// the given label set. -// -// A server is matched when ALL labels match. -// If no labels are passed, ALL nodes are returned. -// -// DELETE IN 11.0.0 replaced by FindNodesByFilters. -func (proxy *ProxyClient) FindServersByLabels(ctx context.Context, namespace string, labels map[string]string) ([]types.Server, error) { - if namespace == "" { - return nil, trace.BadParameter(auth.MissingNamespaceError) - } - site, err := proxy.CurrentClusterAccessPoint(ctx, false) - if err != nil { - return nil, trace.Wrap(err) - } - return auth.GetNodesWithLabels(ctx, site, namespace, labels) -} - // FindServersByFilters returns list of the nodes which have filters matched. func (proxy *ProxyClient) FindNodesByFilters(ctx context.Context, req proto.ListResourcesRequest) ([]types.Server, error) { req.ResourceType = types.KindNode @@ -609,18 +591,6 @@ func (proxy *ProxyClient) FindNodesByFilters(ctx context.Context, req proto.List resources, err := client.GetResourcesWithFilters(ctx, site, req) if err != nil { - // ListResources for nodes not available, provide fallback. - // Fallback does not support search/predicate support, so if users - // provide them, it does nothing. - // - // DELETE IN 11.0.0 - if trace.IsNotImplemented(err) { - servers, err := proxy.FindServersByLabels(ctx, req.Namespace, req.Labels) - if err != nil { - return nil, trace.Wrap(err) - } - return servers, nil - } return nil, trace.Wrap(err) } diff --git a/lib/datalog/access_test.go b/lib/datalog/access_test.go index 27f25e44ef6..7e74d1f9966 100644 --- a/lib/datalog/access_test.go +++ b/lib/datalog/access_test.go @@ -64,7 +64,7 @@ func (c mockClient) GetRoles(ctx context.Context) ([]types.Role, error) { return c.roles, nil } -func (c mockClient) GetNodes(ctx context.Context, namespace string, opts ...services.MarshalOption) ([]types.Server, error) { +func (c mockClient) GetNodes(ctx context.Context, namespace string) ([]types.Server, error) { return c.nodes, nil } diff --git a/lib/reversetunnel/localsite_test.go b/lib/reversetunnel/localsite_test.go index e1731673c44..fdcad5090d7 100644 --- a/lib/reversetunnel/localsite_test.go +++ b/lib/reversetunnel/localsite_test.go @@ -24,7 +24,6 @@ import ( "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/utils/sshutils" "github.com/gravitational/teleport/lib/auth" - "github.com/gravitational/teleport/lib/services" "github.com/gravitational/trace" "github.com/stretchr/testify/require" ) @@ -89,7 +88,7 @@ type mockLocalSiteClient struct { } // called by (*localSite).sshTunnelStats() as part of (*localSite).periodicFunctions() -func (mockLocalSiteClient) GetNodes(_ context.Context, _ string, _ ...services.MarshalOption) ([]types.Server, error) { +func (mockLocalSiteClient) GetNodes(_ context.Context, _ string) ([]types.Server, error) { return nil, nil } diff --git a/lib/services/local/perf_test.go b/lib/services/local/perf_test.go index 8b05a159ae6..568d5d184bb 100644 --- a/lib/services/local/perf_test.go +++ b/lib/services/local/perf_test.go @@ -118,11 +118,11 @@ func insertNodes(ctx context.Context, b *testing.B, svc services.Presence, nodeC } // benchmarkGetNodes runs GetNodes b.N times. -func benchmarkGetNodes(ctx context.Context, b *testing.B, svc services.Presence, nodeCount int, opts ...services.MarshalOption) { +func benchmarkGetNodes(ctx context.Context, b *testing.B, svc services.Presence, nodeCount int) { var nodes []types.Server var err error for i := 0; i < b.N; i++ { - nodes, err = svc.GetNodes(ctx, apidefaults.Namespace, opts...) + nodes, err = svc.GetNodes(ctx, apidefaults.Namespace) require.NoError(b, err) } // do *something* with the loop result. probably unnecessary since the loop diff --git a/lib/services/local/presence.go b/lib/services/local/presence.go index b1f73b2cb08..ec0b73cb7cc 100644 --- a/lib/services/local/presence.go +++ b/lib/services/local/presence.go @@ -206,7 +206,7 @@ func (s *PresenceService) GetNode(ctx context.Context, namespace, name string) ( } // GetNodes returns a list of registered servers -func (s *PresenceService) GetNodes(ctx context.Context, namespace string, opts ...services.MarshalOption) ([]types.Server, error) { +func (s *PresenceService) GetNodes(ctx context.Context, namespace string) ([]types.Server, error) { if namespace == "" { return nil, trace.BadParameter("missing namespace value") } @@ -223,9 +223,11 @@ func (s *PresenceService) GetNodes(ctx context.Context, namespace string, opts . server, err := services.UnmarshalServer( item.Value, types.KindNode, - services.AddOptions(opts, + []services.MarshalOption{ services.WithResourceID(item.ID), - services.WithExpires(item.Expires))...) + services.WithExpires(item.Expires), + }..., + ) if err != nil { return nil, trace.Wrap(err) } @@ -235,59 +237,6 @@ func (s *PresenceService) GetNodes(ctx context.Context, namespace string, opts . return servers, nil } -// ListNodes returns a paginated list of registered servers. -// StartKey is a resource name, which is the suffix of its key. -// -// DELETE IN 10.0.0 in favor of ListResources. -func (s *PresenceService) ListNodes(ctx context.Context, req proto.ListNodesRequest) (page []types.Server, nextKey string, err error) { - // NOTE: changes to the outward behavior of this method may require updating cache.Cache.ListNodes, since that method - // emulates this one but relies on a different implementation internally. - if req.Namespace == "" { - return nil, "", trace.BadParameter("missing namespace value") - } - limit := int(req.Limit) - if limit <= 0 { - return nil, "", trace.BadParameter("nonpositive limit value") - } - - // Get all items in the bucket within the given range. - rangeStart := backend.Key(nodesPrefix, req.Namespace, req.StartKey) - keyPrefix := backend.Key(nodesPrefix, req.Namespace) - rangeEnd := backend.RangeEnd(keyPrefix) - - var servers []types.Server - err = backend.IterateRange(ctx, s.Backend, rangeStart, rangeEnd, limit, func(items []backend.Item) (stop bool, err error) { - for _, item := range items { - if len(servers) == limit { - break - } - server, err := services.UnmarshalServer( - item.Value, - types.KindNode, - services.WithResourceID(item.ID), - services.WithExpires(item.Expires), - ) - if err != nil { - return false, trace.Wrap(err) - } - if server.MatchAgainst(req.Labels) { - servers = append(servers, server) - } - } - return len(servers) == limit, nil - }) - if err != nil { - return nil, "", trace.Wrap(err) - } - - // If a full page was filled, set nextKey using the last node. - if len(servers) == limit { - nextKey = backend.NextPaginationKey(servers[len(servers)-1]) - } - - return servers, nextKey, nil -} - // UpsertNode registers node presence, permanently if TTL is 0 or for the // specified duration with second resolution if it's >= 1 second. func (s *PresenceService) UpsertNode(ctx context.Context, server types.Server) (*types.KeepAlive, error) { @@ -333,43 +282,6 @@ func (s *PresenceService) KeepAliveNode(ctx context.Context, h types.KeepAlive) return trace.Wrap(err) } -// UpsertNodes is used for bulk insertion of nodes. -func (s *PresenceService) UpsertNodes(namespace string, servers []types.Server) error { - batch, ok := s.Backend.(backend.Batch) - if !ok { - return trace.BadParameter("backend does not support batch interface") - } - if namespace == "" { - return trace.BadParameter("missing node namespace") - } - - start := time.Now() - - items := make([]backend.Item, len(servers)) - for i, server := range servers { - value, err := services.MarshalServer(server) - if err != nil { - return trace.Wrap(err) - } - - items[i] = backend.Item{ - Key: backend.Key(nodesPrefix, server.GetNamespace(), server.GetName()), - Value: value, - Expires: server.Expiry(), - ID: server.GetResourceID(), - } - } - - err := batch.PutRange(context.TODO(), items) - if err != nil { - return trace.Wrap(err) - } - - s.log.Debugf("UpsertNodes(%v) in %v", len(servers), time.Since(start)) - - return nil -} - // GetAuthServers returns a list of registered servers func (s *PresenceService) GetAuthServers() ([]types.Server, error) { return s.getServers(context.TODO(), types.KindAuthServer, authServersPrefix) diff --git a/lib/services/local/presence_test.go b/lib/services/local/presence_test.go index 88c3e91592d..5536eae782d 100644 --- a/lib/services/local/presence_test.go +++ b/lib/services/local/presence_test.go @@ -313,57 +313,6 @@ func TestNodeCRUD(t *testing.T) { // Run NodeGetters in nested subtests to allow parallelization. t.Run("NodeGetters", func(t *testing.T) { - t.Run("List Nodes", func(t *testing.T) { - t.Parallel() - // list nodes one at a time, last page should be empty - nodes, nextKey, err := presence.ListNodes(ctx, proto.ListNodesRequest{ - Namespace: apidefaults.Namespace, - Limit: 1, - }) - require.NoError(t, err) - require.EqualValues(t, 1, len(nodes)) - require.Empty(t, cmp.Diff([]types.Server{node1}, nodes, - cmpopts.IgnoreFields(types.Metadata{}, "ID"))) - require.EqualValues(t, backend.NextPaginationKey(node1), nextKey) - - nodes, nextKey, err = presence.ListNodes(ctx, proto.ListNodesRequest{ - Namespace: apidefaults.Namespace, - Limit: 1, - StartKey: nextKey, - }) - require.NoError(t, err) - require.EqualValues(t, 1, len(nodes)) - require.Empty(t, cmp.Diff([]types.Server{node2}, nodes, - cmpopts.IgnoreFields(types.Metadata{}, "ID"))) - require.EqualValues(t, backend.NextPaginationKey(node2), nextKey) - - nodes, nextKey, err = presence.ListNodes(ctx, proto.ListNodesRequest{ - Namespace: apidefaults.Namespace, - Limit: 1, - StartKey: nextKey, - }) - require.NoError(t, err) - require.EqualValues(t, 0, len(nodes)) - require.EqualValues(t, "", nextKey) - - // ListNodes should fail if namespace isn't provided - _, _, err = presence.ListNodes(ctx, proto.ListNodesRequest{ - Limit: 1, - }) - require.IsType(t, &trace.BadParameterError{}, err.(*trace.TraceErr).OrigError()) - - // ListNodes should fail if limit is nonpositive - _, _, err = presence.ListNodes(ctx, proto.ListNodesRequest{ - Namespace: apidefaults.Namespace, - }) - require.IsType(t, &trace.BadParameterError{}, err.(*trace.TraceErr).OrigError()) - - _, _, err = presence.ListNodes(ctx, proto.ListNodesRequest{ - Namespace: apidefaults.Namespace, - Limit: -1, - }) - require.IsType(t, &trace.BadParameterError{}, err.(*trace.TraceErr).OrigError()) - }) t.Run("GetNodes", func(t *testing.T) { t.Parallel() // Get all nodes, transparently handle limit exceeded errors diff --git a/lib/services/presence.go b/lib/services/presence.go index b6259d485a6..af869be4ad9 100644 --- a/lib/services/presence.go +++ b/lib/services/presence.go @@ -32,7 +32,7 @@ type ProxyGetter interface { // NodesGetter is a service that gets nodes. type NodesGetter interface { // GetNodes returns a list of registered servers. - GetNodes(ctx context.Context, namespace string, opts ...MarshalOption) ([]types.Server, error) + GetNodes(ctx context.Context, namespace string) ([]types.Server, error) } // Presence records and reports the presence of all components @@ -43,8 +43,6 @@ type Presence interface { // GetNode returns a node by name and namespace. GetNode(ctx context.Context, namespace, name string) (types.Server, error) - // ListNodes returns a paginated list of registered servers. - ListNodes(ctx context.Context, req proto.ListNodesRequest) (nodes []types.Server, nextKey string, err error) // NodesGetter gets nodes NodesGetter @@ -59,9 +57,6 @@ type Presence interface { // specified duration with second resolution if it's >= 1 second. UpsertNode(ctx context.Context, server types.Server) (*types.KeepAlive, error) - // UpsertNodes bulk inserts nodes. - UpsertNodes(namespace string, servers []types.Server) error - // DELETE IN: 5.1.0 // // This logic has been moved to KeepAliveServer. diff --git a/lib/teleterm/clusters/cluster_servers.go b/lib/teleterm/clusters/cluster_servers.go index 02ac5daf983..5034e344fc0 100644 --- a/lib/teleterm/clusters/cluster_servers.go +++ b/lib/teleterm/clusters/cluster_servers.go @@ -19,6 +19,7 @@ package clusters import ( "context" + "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/defaults" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/teleterm/api/uri" @@ -42,7 +43,9 @@ func (c *Cluster) GetServers(ctx context.Context) ([]Server, error) { } defer proxyClient.Close() - clusterServers, err := proxyClient.FindServersByLabels(ctx, defaults.Namespace, nil) + clusterServers, err := proxyClient.FindNodesByFilters(ctx, proto.ListResourcesRequest{ + Namespace: defaults.Namespace, + }) if err != nil { return nil, trace.Wrap(err) } diff --git a/lib/web/apiserver_test.go b/lib/web/apiserver_test.go index a379fe2d682..f34f1799fa8 100644 --- a/lib/web/apiserver_test.go +++ b/lib/web/apiserver_test.go @@ -3349,7 +3349,7 @@ type authProviderMock struct { server types.ServerV2 } -func (mock authProviderMock) GetNodes(ctx context.Context, n string, opts ...services.MarshalOption) ([]types.Server, error) { +func (mock authProviderMock) GetNodes(ctx context.Context, n string) ([]types.Server, error) { return []types.Server{&mock.server}, nil } diff --git a/lib/web/terminal.go b/lib/web/terminal.go index 37cc9de136f..de11ce877f3 100644 --- a/lib/web/terminal.go +++ b/lib/web/terminal.go @@ -42,7 +42,6 @@ import ( "github.com/gravitational/teleport/lib/client" "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/events" - "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/session" "github.com/gravitational/teleport/lib/sshutils" "github.com/gravitational/teleport/lib/utils" @@ -83,7 +82,7 @@ type TerminalRequest struct { // AuthProvider is a subset of the full Auth API. type AuthProvider interface { - GetNodes(ctx context.Context, namespace string, opts ...services.MarshalOption) ([]types.Server, error) + GetNodes(ctx context.Context, namespace string) ([]types.Server, error) GetSessionEvents(namespace string, sid session.ID, after int, includePrintEvents bool) ([]events.EventFields, error) } diff --git a/lib/web/ui/cluster.go b/lib/web/ui/cluster.go index c2162432728..34169c2dd25 100644 --- a/lib/web/ui/cluster.go +++ b/lib/web/ui/cluster.go @@ -92,7 +92,7 @@ func GetClusterDetails(ctx context.Context, site reversetunnel.RemoteSite, opts return nil, trace.Wrap(err) } - nodes, err := clt.GetNodes(ctx, apidefaults.Namespace, opts...) + nodes, err := clt.GetNodes(ctx, apidefaults.Namespace) if err != nil { return nil, trace.Wrap(err) } diff --git a/lib/web/ui/perf_test.go b/lib/web/ui/perf_test.go index 9e79dfc6233..ce8786979ae 100644 --- a/lib/web/ui/perf_test.go +++ b/lib/web/ui/perf_test.go @@ -182,8 +182,8 @@ type mockAccessPoint struct { presence *local.PresenceService } -func (m *mockAccessPoint) GetNodes(ctx context.Context, namespace string, opts ...services.MarshalOption) ([]types.Server, error) { - return m.presence.GetNodes(ctx, namespace, opts...) +func (m *mockAccessPoint) GetNodes(ctx context.Context, namespace string) ([]types.Server, error) { + return m.presence.GetNodes(ctx, namespace) } func (m *mockAccessPoint) GetProxies() ([]types.Server, error) {