diff --git a/api/client/client.go b/api/client/client.go index 5c1f5de991f1b..ecb8491f80ff5 100644 --- a/api/client/client.go +++ b/api/client/client.go @@ -55,6 +55,7 @@ import ( "github.com/gravitational/teleport/api/client/discoveryconfig" "github.com/gravitational/teleport/api/client/dynamicwindows" "github.com/gravitational/teleport/api/client/externalauditstorage" + gitserverclient "github.com/gravitational/teleport/api/client/gitserver" kubewaitingcontainerclient "github.com/gravitational/teleport/api/client/kubewaitingcontainer" "github.com/gravitational/teleport/api/client/okta" "github.com/gravitational/teleport/api/client/proto" @@ -77,6 +78,7 @@ import ( discoveryconfigv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/discoveryconfig/v1" dynamicwindowsv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/dynamicwindows/v1" externalauditstoragev1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/externalauditstorage/v1" + gitserverpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/gitserver/v1" identitycenterv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/identitycenter/v1" integrationpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" kubeproto "github.com/gravitational/teleport/api/gen/proto/go/teleport/kube/v1" @@ -3958,6 +3960,8 @@ func convertEnrichedResource(resource *proto.PaginatedResource) (*types.Enriched return &types.EnrichedResource{ResourceWithLabels: r, Logins: resource.Logins, RequiresRequest: resource.RequiresRequest}, nil } else if r := resource.GetSAMLIdPServiceProvider(); r != nil { return &types.EnrichedResource{ResourceWithLabels: r, RequiresRequest: resource.RequiresRequest}, nil + } else if r := resource.GetGitServer(); r != nil { + return &types.EnrichedResource{ResourceWithLabels: r, RequiresRequest: resource.RequiresRequest}, nil } else { return nil, trace.BadParameter("received unsupported resource %T", resource.Resource) } @@ -4937,6 +4941,16 @@ func (c *Client) UserTasksServiceClient() *usertaskapi.Client { return usertaskapi.NewClient(usertaskv1.NewUserTaskServiceClient(c.conn)) } +// GitServerClient returns a client for managing Git servers +func (c *Client) GitServerClient() *gitserverclient.Client { + return gitserverclient.NewClient(gitserverpb.NewGitServerServiceClient(c.conn)) +} + +// GitServerReadOnlyClient returns the read-only client for Git servers. +func (c *Client) GitServerReadOnlyClient() gitserverclient.ReadOnlyClient { + return c.GitServerClient() +} + // GetCertAuthority retrieves a CA by type and domain. func (c *Client) GetCertAuthority(ctx context.Context, id types.CertAuthID, loadKeys bool) (types.CertAuthority, error) { ca, err := c.TrustClient().GetCertAuthority(ctx, &trustpb.GetCertAuthorityRequest{ @@ -5299,3 +5313,8 @@ func (c *Client) IdentityCenterClient() identitycenterv1.IdentityCenterServiceCl func (c *Client) ProvisioningServiceClient() provisioningv1.ProvisioningServiceClient { return provisioningv1.NewProvisioningServiceClient(c.conn) } + +// IntegrationsClient returns integrations client. +func (c *Client) IntegrationsClient() integrationpb.IntegrationServiceClient { + return c.integrationsClient() +} diff --git a/api/client/events.go b/api/client/events.go index c7d9d8c51d14b..02eaf9550c95a 100644 --- a/api/client/events.go +++ b/api/client/events.go @@ -348,6 +348,10 @@ func EventToGRPC(in types.Event) (*proto.Event, error) { out.Resource = &proto.Event_AccessListReview{ AccessListReview: accesslistv1conv.ToReviewProto(r), } + case *types.PluginStaticCredentialsV1: + out.Resource = &proto.Event_PluginStaticCredentials{ + PluginStaticCredentials: r, + } default: return nil, trace.BadParameter("resource type %T is not supported", in.Resource) } @@ -617,6 +621,9 @@ func EventFromGRPC(in *proto.Event) (*types.Event, error) { } else if r := in.GetWorkloadIdentity(); r != nil { out.Resource = types.Resource153ToLegacy(r) return &out, nil + } else if r := in.GetPluginStaticCredentials(); r != nil { + out.Resource = r + return &out, nil } else { return nil, trace.BadParameter("received unsupported resource %T", in.Resource) } diff --git a/api/client/gitserver/gitserver.go b/api/client/gitserver/gitserver.go new file mode 100644 index 0000000000000..bfb259c80cc82 --- /dev/null +++ b/api/client/gitserver/gitserver.go @@ -0,0 +1,142 @@ +// Copyright 2024 Gravitational, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package gitserver + +import ( + "context" + + "github.com/gravitational/trace" + + gitserverv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/gitserver/v1" + "github.com/gravitational/teleport/api/types" +) + +// ReadOnlyClient defines getter functions for Git servers. +type ReadOnlyClient interface { + // ListGitServers returns a paginated list of Git servers. + ListGitServers(ctx context.Context, pageSize int, pageToken string) ([]types.Server, string, error) + // GetGitServer returns a Git server by name. + GetGitServer(ctx context.Context, name string) (types.Server, error) +} + +// Client is an Git servers client. +type Client struct { + grpcClient gitserverv1.GitServerServiceClient +} + +// NewClient creates a new Git servers client. +func NewClient(grpcClient gitserverv1.GitServerServiceClient) *Client { + return &Client{ + grpcClient: grpcClient, + } +} + +// GetGitServer returns Git servers by name. +func (c *Client) GetGitServer(ctx context.Context, name string) (types.Server, error) { + server, err := c.grpcClient.GetGitServer(ctx, &gitserverv1.GetGitServerRequest{Name: name}) + if err != nil { + return nil, trace.Wrap(err) + } + return server, nil +} + +// ListGitServers returns all Git servers matching filter. +func (c *Client) ListGitServers(ctx context.Context, pageSize int, pageToken string) ([]types.Server, string, error) { + resp, err := c.grpcClient.ListGitServers(ctx, &gitserverv1.ListGitServersRequest{ + PageSize: int32(pageSize), + PageToken: pageToken, + }) + if err != nil { + return nil, "", trace.Wrap(err) + } + + servers := make([]types.Server, 0, len(resp.Servers)) + for _, server := range resp.Servers { + servers = append(servers, server) + } + return servers, resp.NextPageToken, nil +} + +func toServerV2(server types.Server) (*types.ServerV2, error) { + serverV2, ok := server.(*types.ServerV2) + if !ok { + return nil, trace.Errorf("encountered unexpected server type: %T", serverV2) + } + return serverV2, nil +} + +// CreateGitServer creates a Git server resource. +func (c *Client) CreateGitServer(ctx context.Context, item types.Server) (types.Server, error) { + serverV2, err := toServerV2(item) + if err != nil { + return nil, trace.Wrap(err) + } + resp, err := c.grpcClient.CreateGitServer(ctx, &gitserverv1.CreateGitServerRequest{ + Server: serverV2, + }) + if err != nil { + return nil, trace.Wrap(err) + } + return resp, nil +} + +// UpdateGitServer updates a Git server resource. +func (c *Client) UpdateGitServer(ctx context.Context, item types.Server) (types.Server, error) { + serverV2, err := toServerV2(item) + if err != nil { + return nil, trace.Wrap(err) + } + resp, err := c.grpcClient.UpdateGitServer(ctx, &gitserverv1.UpdateGitServerRequest{ + Server: serverV2, + }) + if err != nil { + return nil, trace.Wrap(err) + } + return resp, nil +} + +// UpsertGitServer updates a Git server resource, creating it if it doesn't exist. +func (c *Client) UpsertGitServer(ctx context.Context, item types.Server) (types.Server, error) { + serverV2, err := toServerV2(item) + if err != nil { + return nil, trace.Wrap(err) + } + resp, err := c.grpcClient.UpsertGitServer(ctx, &gitserverv1.UpsertGitServerRequest{ + Server: serverV2, + }) + if err != nil { + return nil, trace.Wrap(err) + } + return resp, nil +} + +// DeleteGitServer removes the specified Git server resource. +func (c *Client) DeleteGitServer(ctx context.Context, name string) error { + _, err := c.grpcClient.DeleteGitServer(ctx, &gitserverv1.DeleteGitServerRequest{Name: name}) + return trace.Wrap(err) +} + +// DeleteAllGitServers removes all Git server resources. +func (c *Client) DeleteAllGitServers(ctx context.Context) error { + return trace.NotImplemented("DeleteAllGitServers servers not implemented") +} + +// CreateGitHubAuthRequest starts GitHub OAuth flow for authenticated user. +func (c *Client) CreateGitHubAuthRequest(ctx context.Context, req *types.GithubAuthRequest, org string) (*types.GithubAuthRequest, error) { + resp, err := c.grpcClient.CreateGitHubAuthRequest(ctx, &gitserverv1.CreateGitHubAuthRequestRequest{ + Request: req, + Organization: org, + }) + return resp, trace.Wrap(err) +} diff --git a/api/client/proto/authservice.pb.go b/api/client/proto/authservice.pb.go index 062c65931529b..3d69c81ce0b6b 100644 --- a/api/client/proto/authservice.pb.go +++ b/api/client/proto/authservice.pb.go @@ -10887,6 +10887,7 @@ type PaginatedResource struct { // *PaginatedResource_UserGroup // *PaginatedResource_AppServerOrSAMLIdPServiceProvider // *PaginatedResource_SAMLIdPServiceProvider + // *PaginatedResource_GitServer // *PaginatedResource_IdentityCenterAccountAssignment Resource isPaginatedResource_Resource `protobuf_oneof:"resource"` // Logins allowed for the included resource. Only to be populated for SSH and Desktops. @@ -10971,6 +10972,9 @@ type PaginatedResource_AppServerOrSAMLIdPServiceProvider struct { type PaginatedResource_SAMLIdPServiceProvider struct { SAMLIdPServiceProvider *types.SAMLIdPServiceProviderV1 `protobuf:"bytes,12,opt,name=SAMLIdPServiceProvider,proto3,oneof" json:"saml_idp_service_provider,omitempty"` } +type PaginatedResource_GitServer struct { + GitServer *types.ServerV2 `protobuf:"bytes,15,opt,name=git_server,json=gitServer,proto3,oneof" json:"git_server,omitempty"` +} type PaginatedResource_IdentityCenterAccountAssignment struct { IdentityCenterAccountAssignment *IdentityCenterAccountAssignment `protobuf:"bytes,16,opt,name=IdentityCenterAccountAssignment,proto3,oneof" json:"identity_center_account_assignment,omitempty"` } @@ -10986,6 +10990,7 @@ func (*PaginatedResource_DatabaseService) isPaginatedResource_Resource() func (*PaginatedResource_UserGroup) isPaginatedResource_Resource() {} func (*PaginatedResource_AppServerOrSAMLIdPServiceProvider) isPaginatedResource_Resource() {} func (*PaginatedResource_SAMLIdPServiceProvider) isPaginatedResource_Resource() {} +func (*PaginatedResource_GitServer) isPaginatedResource_Resource() {} func (*PaginatedResource_IdentityCenterAccountAssignment) isPaginatedResource_Resource() {} func (m *PaginatedResource) GetResource() isPaginatedResource_Resource { @@ -11073,6 +11078,13 @@ func (m *PaginatedResource) GetSAMLIdPServiceProvider() *types.SAMLIdPServicePro return nil } +func (m *PaginatedResource) GetGitServer() *types.ServerV2 { + if x, ok := m.GetResource().(*PaginatedResource_GitServer); ok { + return x.GitServer + } + return nil +} + func (m *PaginatedResource) GetIdentityCenterAccountAssignment() *IdentityCenterAccountAssignment { if x, ok := m.GetResource().(*PaginatedResource_IdentityCenterAccountAssignment); ok { return x.IdentityCenterAccountAssignment @@ -11108,6 +11120,7 @@ func (*PaginatedResource) XXX_OneofWrappers() []interface{} { (*PaginatedResource_UserGroup)(nil), (*PaginatedResource_AppServerOrSAMLIdPServiceProvider)(nil), (*PaginatedResource_SAMLIdPServiceProvider)(nil), + (*PaginatedResource_GitServer)(nil), (*PaginatedResource_IdentityCenterAccountAssignment)(nil), } } @@ -16087,14 +16100,14 @@ func init() { } var fileDescriptor_0ffcffcda38ae159 = []byte{ - // 15367 bytes of a gzipped FileDescriptorProto + // 15393 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x7d, 0x59, 0x6c, 0x5c, 0xc9, 0x76, 0x98, 0x9a, 0x3b, 0x0f, 0x17, 0xb5, 0x8a, 0xa4, 0xd8, 0xa2, 0x96, 0x96, 0xae, 0x46, 0x33, 0x1a, 0xbd, 0x79, 0x5a, 0x38, 0xcb, 0x9b, 0x7d, 0xa6, 0x9b, 0xa4, 0x44, 0x4a, 0xdc, 0xe6, 0x36, 0x49, 0xcd, 0xe6, 0xd7, 0xef, 0xb2, 0xbb, 0x44, 0x5e, 0xab, 0x79, 0x6f, 0xbf, 0x7b, 0x6f, 0x4b, - 0xa3, 0xe7, 0x3c, 0x07, 0xb6, 0xb3, 0x18, 0x08, 0x92, 0xd8, 0x40, 0x12, 0x38, 0xc9, 0x87, 0x13, + 0xa3, 0xe7, 0x3c, 0x07, 0xb6, 0xb3, 0x18, 0x08, 0x92, 0xd8, 0x40, 0x1c, 0x38, 0xc9, 0x87, 0x13, 0xc0, 0x01, 0x82, 0x00, 0x01, 0xfc, 0x13, 0xf8, 0xcb, 0x1f, 0x01, 0x02, 0xe4, 0xc5, 0x40, 0x90, - 0x18, 0xb6, 0x7f, 0x02, 0x84, 0x4e, 0x5e, 0xe0, 0x1f, 0x22, 0xf9, 0x30, 0x82, 0x04, 0xc8, 0x0b, + 0x18, 0xb6, 0x7f, 0x02, 0x84, 0x4e, 0x1e, 0xe0, 0x1f, 0x22, 0xf9, 0x30, 0x82, 0x04, 0xc8, 0x0b, 0x0c, 0x04, 0x75, 0x6a, 0xb9, 0x55, 0x77, 0xe9, 0x26, 0x25, 0xcd, 0x73, 0x7e, 0x24, 0xf6, 0xd9, 0xaa, 0xea, 0x54, 0xdd, 0xaa, 0x3a, 0xa7, 0x4e, 0x9d, 0x82, 0x9b, 0x11, 0x6d, 0xd1, 0xb6, 0x1f, 0x44, 0xb7, 0x5a, 0x74, 0xcf, 0x69, 0x3c, 0xbb, 0xd5, 0x68, 0xb9, 0xd4, 0x8b, 0x6e, 0xb5, 0x03, @@ -16107,13 +16120,13 @@ var fileDescriptor_0ffcffcda38ae159 = []byte{ 0x0d, 0x39, 0x89, 0xfc, 0x4f, 0x90, 0x5e, 0xc9, 0x26, 0xc5, 0x7f, 0x05, 0xc9, 0x77, 0xb3, 0x49, 0x9e, 0xd2, 0x5d, 0xa6, 0x53, 0x4f, 0xfd, 0xd1, 0x83, 0x3c, 0x70, 0xda, 0x6d, 0x1a, 0xc4, 0x7f, 0x08, 0xf2, 0x73, 0x8a, 0xfc, 0xe0, 0x91, 0xc3, 0x54, 0x74, 0xf0, 0xc8, 0x49, 0x35, 0xa3, 0x13, - 0x3a, 0x7b, 0x54, 0x54, 0xff, 0xc9, 0x1d, 0xfd, 0x27, 0x27, 0xb5, 0x7e, 0xbb, 0x00, 0x83, 0x0f, + 0x3a, 0x7b, 0x54, 0x54, 0xff, 0xc9, 0x1d, 0xfd, 0x27, 0x27, 0xb5, 0x7e, 0xa7, 0x00, 0x83, 0x0f, 0x9d, 0xa8, 0xb1, 0x4f, 0x3e, 0x81, 0xc1, 0x07, 0xae, 0xd7, 0x0c, 0x4b, 0x85, 0xcb, 0xfd, 0xd7, 0xc7, 0xe6, 0x8b, 0x37, 0x79, 0x53, 0x10, 0xc9, 0x10, 0xd5, 0xd9, 0x9f, 0x1c, 0x96, 0x4f, 0x1d, 0x1d, 0x96, 0x4f, 0x3f, 0x66, 0x64, 0x6f, 0xf8, 0x07, 0x6e, 0x84, 0x7d, 0x6b, 0x73, 0x3e, 0xb2, 0x0d, 0x53, 0x95, 0x56, 0xcb, 0x7f, 0xba, 0xe9, 0x04, 0x91, 0xeb, 0xb4, 0x6a, 0x9d, 0x46, 0x83, 0x86, 0x61, 0xa9, 0xef, 0x72, 0xe1, 0xfa, 0x48, 0xf5, 0xea, 0xd1, 0x61, 0xb9, 0xec, 0x30, 0x74, - 0xbd, 0xcd, 0xf1, 0xf5, 0x90, 0x13, 0x68, 0x82, 0xb2, 0xf8, 0xad, 0x3f, 0x18, 0x82, 0xe2, 0xb2, + 0xbd, 0xcd, 0xf1, 0xf5, 0x90, 0x13, 0x68, 0x82, 0xb2, 0xf8, 0xad, 0x3f, 0x1c, 0x82, 0xe2, 0xb2, 0x1f, 0x46, 0x0b, 0xac, 0x47, 0x6d, 0xfa, 0xc3, 0x0e, 0x0d, 0x23, 0x72, 0x15, 0x86, 0x18, 0x6c, 0x65, 0xb1, 0x54, 0xb8, 0x5c, 0xb8, 0x3e, 0x5a, 0x1d, 0x3b, 0x3a, 0x2c, 0x0f, 0xef, 0xfb, 0x61, 0x54, 0x77, 0x9b, 0xb6, 0x40, 0x91, 0xd7, 0x61, 0x64, 0xdd, 0x6f, 0xd2, 0x75, 0xe7, 0x80, 0x62, @@ -16138,7 +16151,7 @@ var fileDescriptor_0ffcffcda38ae159 = []byte{ 0x46, 0x81, 0x5e, 0x10, 0xf9, 0x1a, 0x66, 0xe2, 0x9f, 0x95, 0x30, 0xa4, 0x01, 0x93, 0xb1, 0xb2, 0x58, 0x9a, 0x40, 0xcd, 0xbc, 0x7a, 0x74, 0x58, 0xb6, 0xb4, 0x1a, 0xd4, 0x1d, 0x49, 0x52, 0x77, 0x9b, 0x5a, 0x4b, 0xb3, 0x85, 0xdc, 0x1f, 0x18, 0x19, 0x2f, 0x4e, 0xd8, 0x17, 0xb7, 0xbd, 0x30, - 0x72, 0x76, 0x5b, 0x34, 0x93, 0xc8, 0xfa, 0x8b, 0x02, 0x90, 0x8d, 0x36, 0xf5, 0x6a, 0xb5, 0x65, + 0x72, 0x76, 0x5b, 0x34, 0x93, 0xc8, 0xfa, 0xcb, 0x02, 0x90, 0x8d, 0x36, 0xf5, 0x6a, 0xb5, 0x65, 0xf6, 0x3d, 0xc9, 0xcf, 0xe9, 0x0d, 0x18, 0xe5, 0x1d, 0xc7, 0x7a, 0xb7, 0x0f, 0x7b, 0x77, 0xf2, 0xe8, 0xb0, 0x0c, 0xa2, 0x77, 0x59, 0xcf, 0xc6, 0x04, 0xe4, 0x1a, 0xf4, 0x6f, 0x6d, 0xad, 0xe2, 0xb7, 0xd2, 0x5f, 0x9d, 0x3a, 0x3a, 0x2c, 0xf7, 0x47, 0x51, 0xeb, 0x67, 0x87, 0xe5, 0x91, 0xc5, @@ -16148,12 +16161,12 @@ var fileDescriptor_0ffcffcda38ae159 = []byte{ 0x1b, 0x89, 0xc8, 0x4d, 0x18, 0xe4, 0x9d, 0x36, 0x84, 0x93, 0xd4, 0x84, 0x1a, 0x1d, 0x2d, 0xba, 0xf3, 0x4e, 0x75, 0xf4, 0xe8, 0xb0, 0x3c, 0x88, 0x9d, 0x67, 0x73, 0xb2, 0xfb, 0x03, 0x23, 0x85, 0x62, 0x9f, 0x3d, 0xc2, 0x78, 0xd9, 0x67, 0x61, 0x7d, 0x07, 0xc6, 0xb4, 0xe6, 0x93, 0x0b, 0x30, - 0xc0, 0xfe, 0xc7, 0x49, 0x64, 0x9c, 0x17, 0xc6, 0x16, 0x0e, 0x1b, 0xa1, 0xd6, 0x3f, 0x99, 0x82, + 0xc0, 0xfe, 0xc7, 0x49, 0x64, 0x9c, 0x17, 0xc6, 0x16, 0x0e, 0x1b, 0xa1, 0xd6, 0x3f, 0x9d, 0x82, 0x22, 0xe3, 0x34, 0x66, 0x9e, 0x9b, 0xba, 0xaa, 0x38, 0x5f, 0xd1, 0x54, 0x55, 0xa9, 0xa0, 0x2b, 0xeb, 0x3a, 0xa8, 0xd2, 0xc5, 0x24, 0x34, 0x7e, 0x74, 0x58, 0x1e, 0xe9, 0x08, 0x58, 0x5c, 0x37, 0x52, 0x83, 0xe1, 0xa5, 0x6f, 0xda, 0x6e, 0x40, 0x43, 0x54, 0xed, 0xd8, 0xfc, 0xdc, 0x4d, 0xbe, 0x5c, 0xde, 0x94, 0xcb, 0xe5, 0xcd, 0x2d, 0xb9, 0x5c, 0x56, 0x2f, 0x8a, 0xc9, 0xf8, 0x0c, 0xe5, - 0x2c, 0xf1, 0xf8, 0xf8, 0x8d, 0x3f, 0x2d, 0x17, 0x6c, 0x29, 0x89, 0xbc, 0x01, 0x43, 0x77, 0xfd, + 0x2c, 0xf1, 0xf8, 0xf8, 0x8d, 0x3f, 0x2b, 0x17, 0x6c, 0x29, 0x89, 0xbc, 0x01, 0x43, 0x77, 0xfd, 0xe0, 0xc0, 0x89, 0x44, 0x1f, 0x4c, 0x1f, 0x1d, 0x96, 0x8b, 0x8f, 0x10, 0xa2, 0x0d, 0x29, 0x41, 0x43, 0xee, 0xc2, 0xa4, 0xed, 0x77, 0x22, 0xba, 0xe5, 0xcb, 0x9e, 0x1b, 0x44, 0xae, 0x4b, 0x47, 0x87, 0xe5, 0xb9, 0x80, 0x61, 0xea, 0x91, 0x5f, 0x17, 0x5d, 0xa8, 0xf1, 0x27, 0xb8, 0xc8, 0x12, @@ -16189,7 +16202,7 @@ var fileDescriptor_0ffcffcda38ae159 = []byte{ 0x43, 0x6b, 0x9d, 0x14, 0x45, 0x3e, 0x85, 0xf1, 0x5a, 0x6d, 0x39, 0x5e, 0x50, 0xce, 0xe2, 0x82, 0x72, 0xe1, 0xe8, 0xb0, 0x5c, 0x62, 0x5b, 0xaa, 0x78, 0x51, 0xd1, 0xbf, 0x2a, 0x9d, 0x83, 0x49, 0xd8, 0x5a, 0xad, 0xc5, 0x12, 0x66, 0x63, 0x09, 0x6c, 0x33, 0x97, 0x2d, 0x41, 0xe7, 0x20, 0xff, - 0xb2, 0x00, 0x97, 0x75, 0x91, 0x59, 0x8a, 0x29, 0x9d, 0x7b, 0x1e, 0x6d, 0xce, 0x1f, 0x1d, 0x96, + 0xaa, 0x00, 0x97, 0x75, 0x91, 0x59, 0x8a, 0x29, 0x9d, 0x7b, 0x1e, 0x6d, 0xce, 0x1f, 0x1d, 0x96, 0x6f, 0x9a, 0xed, 0xa8, 0x67, 0x76, 0x96, 0x56, 0xb7, 0x9e, 0x55, 0xc1, 0xfa, 0xea, 0x0d, 0xc8, 0xac, 0xef, 0xdc, 0x73, 0xd7, 0xd7, 0xd4, 0x5a, 0xef, 0xfa, 0xf6, 0xaa, 0x8a, 0xf5, 0x39, 0x8c, 0xaa, 0x49, 0x9b, 0x0c, 0x43, 0x7f, 0xa5, 0xd5, 0x2a, 0x9e, 0x62, 0x7f, 0xd4, 0x6a, 0xcb, 0xc5, @@ -16211,7 +16224,7 @@ var fileDescriptor_0ffcffcda38ae159 = []byte{ 0xe4, 0x75, 0xb9, 0xd3, 0xe5, 0xd6, 0x1d, 0x2e, 0xf6, 0x09, 0xbb, 0x44, 0x6c, 0x72, 0xad, 0x4e, 0xce, 0xc2, 0x4a, 0x3e, 0x48, 0x8e, 0x19, 0xa1, 0x0c, 0x14, 0x96, 0x58, 0x3f, 0xed, 0x04, 0x29, 0x29, 0xc3, 0x20, 0x9f, 0x71, 0xb9, 0x3e, 0x70, 0x6f, 0xdd, 0x62, 0x00, 0x9b, 0xc3, 0xad, 0x3f, - 0xec, 0xd7, 0x37, 0x19, 0x6c, 0x2f, 0xad, 0xe9, 0x1b, 0xf7, 0xd2, 0xa8, 0x67, 0x84, 0x32, 0x53, + 0xea, 0xd7, 0x37, 0x19, 0x6c, 0x2f, 0xad, 0xe9, 0x1b, 0xf7, 0xd2, 0xa8, 0x67, 0x84, 0x32, 0x53, 0x90, 0x7f, 0x25, 0x68, 0x0a, 0xf6, 0xc7, 0xa6, 0xa0, 0xf8, 0xd4, 0xb8, 0x29, 0x18, 0x93, 0xb0, 0x5e, 0x14, 0xdb, 0x36, 0x94, 0x3a, 0x10, 0xf7, 0xa2, 0xd8, 0xea, 0x89, 0x5e, 0xd4, 0x88, 0xc8, 0xfb, 0x00, 0x95, 0x87, 0x35, 0xb4, 0x79, 0xec, 0x75, 0xb1, 0x75, 0xc5, 0x45, 0xc6, 0x79, 0x1a, @@ -16226,7 +16239,7 @@ var fileDescriptor_0ffcffcda38ae159 = []byte{ 0x21, 0xb7, 0x0f, 0x5b, 0x30, 0x79, 0x8f, 0x46, 0x6c, 0xe0, 0x4a, 0x7b, 0xa7, 0x7b, 0xb7, 0x7e, 0x08, 0x63, 0x0f, 0xdd, 0x68, 0xbf, 0x46, 0x1b, 0x01, 0x8d, 0xa4, 0xaf, 0x07, 0x55, 0xfe, 0xd4, 0x8d, 0xf6, 0xeb, 0x21, 0x87, 0xeb, 0xeb, 0xba, 0x46, 0x6e, 0x2d, 0xc1, 0x69, 0x51, 0x9a, 0x32, - 0xaf, 0xe6, 0x4d, 0x81, 0x05, 0x14, 0x88, 0xdd, 0xae, 0x0b, 0x34, 0xc5, 0xfc, 0xab, 0x3e, 0x98, + 0xaf, 0xe6, 0x4d, 0x81, 0x05, 0x14, 0x88, 0xdd, 0xae, 0x0b, 0x34, 0xc5, 0xfc, 0xeb, 0x3e, 0x98, 0x59, 0xd8, 0x77, 0xbc, 0x3d, 0xba, 0xe9, 0x84, 0xe1, 0x53, 0x3f, 0x68, 0x6a, 0x95, 0x47, 0xdb, 0x32, 0x55, 0x79, 0x34, 0x26, 0xe7, 0x61, 0x6c, 0xa3, 0xd5, 0x94, 0x3c, 0xc2, 0xee, 0xc5, 0xb2, 0xfc, 0x56, 0xb3, 0xde, 0x96, 0xb2, 0x74, 0x22, 0xc6, 0xb3, 0x4e, 0x9f, 0x2a, 0x9e, 0xfe, 0x98, @@ -16241,814 +16254,816 @@ var fileDescriptor_0ffcffcda38ae159 = []byte{ 0x61, 0xb9, 0xcf, 0x6d, 0xda, 0x7d, 0x2b, 0x8b, 0xe4, 0x2d, 0x18, 0x44, 0x32, 0xd4, 0xff, 0xa4, 0x2a, 0x4f, 0x97, 0xc0, 0x27, 0x1f, 0x5c, 0x7d, 0x6d, 0x4e, 0x4c, 0xde, 0x86, 0xd1, 0x45, 0xda, 0xa2, 0x7b, 0x4e, 0xe4, 0xcb, 0xe9, 0x84, 0x3b, 0xc0, 0x24, 0x50, 0x1b, 0x73, 0x31, 0x25, 0x33, - 0x87, 0x6d, 0xea, 0x84, 0xbe, 0xa7, 0x9b, 0xc3, 0x01, 0x42, 0x74, 0x73, 0x98, 0xd3, 0x90, 0xbf, - 0x5f, 0x80, 0xb1, 0x8a, 0xe7, 0x09, 0xc7, 0x52, 0x28, 0xb4, 0x3e, 0x73, 0x53, 0x79, 0x62, 0x57, - 0x9d, 0x5d, 0xda, 0xda, 0x71, 0x5a, 0x1d, 0x1a, 0x56, 0xbf, 0x66, 0x16, 0xca, 0x7f, 0x3a, 0x2c, - 0x7f, 0x70, 0x02, 0x57, 0x51, 0xec, 0xd3, 0xdd, 0x0a, 0x1c, 0x37, 0x0a, 0xd9, 0x57, 0xeb, 0xc4, - 0x05, 0xea, 0xdf, 0x8d, 0x56, 0x8f, 0x78, 0x6d, 0x18, 0xea, 0xb5, 0x36, 0x90, 0x03, 0x38, 0x5d, - 0x09, 0xc3, 0xce, 0x01, 0xad, 0x45, 0x4e, 0x10, 0x6d, 0xb9, 0x07, 0x14, 0x27, 0xa4, 0xee, 0xce, - 0x85, 0xd7, 0x7e, 0x72, 0x58, 0x2e, 0x30, 0xa3, 0xc8, 0x41, 0x56, 0xb6, 0xef, 0x09, 0xa2, 0x7a, - 0xe4, 0xea, 0xcb, 0x1b, 0xba, 0x19, 0x92, 0xb2, 0xad, 0xab, 0x6a, 0x43, 0xb2, 0xb2, 0x98, 0xd7, - 0xe3, 0xd6, 0x02, 0x5c, 0xb8, 0x47, 0x23, 0x9b, 0x86, 0x34, 0x92, 0xdf, 0x08, 0x8e, 0xf0, 0xd8, - 0xb9, 0x3b, 0x8c, 0xbf, 0x15, 0x33, 0x76, 0x3f, 0xff, 0x2e, 0x24, 0xc6, 0xfa, 0x6b, 0x05, 0x28, - 0x2f, 0x04, 0x94, 0xdb, 0x13, 0x39, 0x82, 0xba, 0xcf, 0x5d, 0x17, 0x60, 0x60, 0xeb, 0x59, 0x5b, - 0x7a, 0x65, 0x10, 0xcb, 0x3a, 0xc5, 0x46, 0xe8, 0x31, 0x9d, 0x5c, 0xd6, 0x23, 0x98, 0xb1, 0xa9, - 0x47, 0x9f, 0x3a, 0xbb, 0x2d, 0x6a, 0xf8, 0x89, 0xca, 0x30, 0xc8, 0x3f, 0xf4, 0x54, 0x13, 0x38, - 0xfc, 0x64, 0x3e, 0x37, 0x6b, 0x02, 0xc6, 0x36, 0x5d, 0x6f, 0x4f, 0x48, 0xb7, 0xfe, 0x6c, 0x00, - 0xc6, 0xf9, 0x6f, 0x61, 0x22, 0x25, 0x96, 0xcb, 0xc2, 0x71, 0x96, 0xcb, 0x77, 0x61, 0x82, 0xad, - 0x37, 0x34, 0xd8, 0xa1, 0x01, 0x9b, 0xff, 0x85, 0x26, 0xd0, 0xdc, 0x0b, 0x11, 0x51, 0x7f, 0xc2, - 0x31, 0xb6, 0x49, 0x48, 0x56, 0x61, 0x92, 0x03, 0xee, 0x52, 0x27, 0xea, 0xc4, 0x1e, 0xab, 0xd3, - 0xc2, 0x26, 0x92, 0x60, 0x3e, 0x34, 0x85, 0xac, 0x47, 0x02, 0x68, 0x27, 0x78, 0xc9, 0x27, 0x70, - 0x7a, 0x33, 0xf0, 0xbf, 0x79, 0xa6, 0x6d, 0x10, 0xf8, 0xd7, 0xc9, 0xad, 0x27, 0x86, 0xaa, 0xeb, - 0xdb, 0x84, 0x24, 0x35, 0x79, 0x1d, 0x46, 0x56, 0xc2, 0xaa, 0x1f, 0xb8, 0xde, 0x1e, 0x7e, 0xa3, - 0x23, 0xdc, 0xd1, 0xef, 0x86, 0xf5, 0x5d, 0x04, 0xda, 0x0a, 0x9d, 0x70, 0x49, 0x0f, 0xf7, 0x76, - 0x49, 0xdf, 0x06, 0x58, 0xf5, 0x9d, 0x66, 0xa5, 0xd5, 0x5a, 0xa8, 0x84, 0xb8, 0x12, 0x8b, 0xf5, - 0xa8, 0xe5, 0x3b, 0xcd, 0xba, 0xd3, 0x6a, 0xd5, 0x1b, 0x4e, 0x68, 0x6b, 0x34, 0xe4, 0x4b, 0x38, - 0x17, 0xba, 0x7b, 0x1e, 0x36, 0xae, 0xee, 0xb4, 0xf6, 0xfc, 0xc0, 0x8d, 0xf6, 0x0f, 0xea, 0x61, - 0xc7, 0x8d, 0xb8, 0x3f, 0x68, 0x72, 0xfe, 0x92, 0x98, 0xe4, 0x6a, 0x92, 0xae, 0x22, 0xc9, 0x6a, - 0x8c, 0xca, 0x9e, 0x0d, 0xb3, 0x11, 0xe4, 0x21, 0x4c, 0xac, 0xba, 0x0d, 0xea, 0x85, 0x14, 0x1d, - 0x7c, 0xcf, 0xd0, 0x5b, 0xd4, 0xfd, 0x63, 0x66, 0x4a, 0x9c, 0x68, 0xe9, 0x4c, 0xf8, 0xe9, 0x9a, - 0x72, 0xee, 0x0f, 0x8c, 0x0c, 0x15, 0x87, 0xed, 0xd3, 0x02, 0xf8, 0xd0, 0x09, 0x3c, 0xd7, 0xdb, - 0x0b, 0xad, 0xbf, 0x45, 0x60, 0x44, 0xf5, 0xd3, 0x4d, 0xdd, 0x52, 0x11, 0x4b, 0x33, 0x0e, 0xd9, - 0xd8, 0x0f, 0x67, 0x6b, 0x14, 0xe4, 0x1c, 0xda, 0x2e, 0x62, 0x53, 0x30, 0xcc, 0x3e, 0x21, 0xa7, - 0xdd, 0xb6, 0x19, 0x8c, 0x4d, 0x0d, 0x8b, 0x55, 0x1c, 0x34, 0x23, 0x7c, 0x6a, 0x68, 0xee, 0xda, - 0x7d, 0x8b, 0x55, 0xf6, 0x4d, 0x6e, 0xac, 0x2c, 0x2e, 0x60, 0xff, 0x8f, 0xf0, 0x6f, 0xd2, 0x77, - 0x9b, 0x0d, 0x1b, 0xa1, 0x0c, 0x5b, 0xab, 0xac, 0xad, 0x8a, 0x3e, 0x46, 0x6c, 0xe8, 0x1c, 0xb4, - 0x6c, 0x84, 0xb2, 0xdd, 0x2e, 0x77, 0xa9, 0x2c, 0xf8, 0x5e, 0x14, 0xf8, 0xad, 0x10, 0xb7, 0x70, - 0x23, 0x7c, 0x0c, 0x0a, 0x5f, 0x4c, 0x43, 0xa0, 0xec, 0x04, 0x29, 0x79, 0x08, 0xb3, 0x95, 0xe6, - 0x13, 0xc7, 0x6b, 0xd0, 0x26, 0xc7, 0x3c, 0xf4, 0x83, 0xc7, 0x8f, 0x5a, 0xfe, 0xd3, 0x10, 0x07, - 0xc9, 0x88, 0x70, 0x5d, 0x0a, 0x12, 0xe9, 0xda, 0x79, 0x2a, 0x89, 0xec, 0x3c, 0x6e, 0x36, 0x0f, - 0x2c, 0xb4, 0xfc, 0x4e, 0x53, 0x0c, 0x1d, 0x9c, 0x07, 0x1a, 0x0c, 0x60, 0x73, 0x38, 0xd3, 0xd2, - 0x72, 0x6d, 0x0d, 0x07, 0x86, 0xd0, 0xd2, 0x7e, 0x78, 0x60, 0x33, 0x18, 0xb9, 0x06, 0xc3, 0x72, - 0xe3, 0xce, 0x4f, 0x32, 0xd0, 0x83, 0x2e, 0x37, 0xec, 0x12, 0xc7, 0xbe, 0x63, 0x9b, 0x36, 0xfc, - 0x27, 0x34, 0x78, 0xb6, 0xe0, 0x37, 0xa9, 0x74, 0x6b, 0x09, 0xb7, 0x0d, 0x47, 0xd4, 0x1b, 0x0c, - 0x63, 0x9b, 0x84, 0xac, 0x00, 0xbe, 0x70, 0x87, 0xa5, 0xd3, 0x71, 0x01, 0x7c, 0x61, 0x0f, 0x6d, - 0x89, 0x23, 0x8b, 0x70, 0xa6, 0xd2, 0x89, 0xfc, 0x03, 0x27, 0x72, 0x1b, 0xdb, 0xed, 0xbd, 0xc0, - 0x61, 0x85, 0x14, 0x91, 0x01, 0x0d, 0x19, 0x47, 0x22, 0xeb, 0x1d, 0x81, 0xb5, 0xd3, 0x0c, 0xe4, - 0x1d, 0x18, 0x5f, 0x09, 0xb9, 0xeb, 0xd2, 0x09, 0x69, 0x13, 0xfd, 0x4f, 0xa2, 0x96, 0x6e, 0x58, - 0x47, 0x47, 0x66, 0x9d, 0x99, 0x3e, 0x4d, 0xdb, 0xa0, 0x23, 0x16, 0x0c, 0x55, 0xc2, 0xd0, 0x0d, - 0x23, 0x74, 0x2b, 0x8d, 0x54, 0xe1, 0xe8, 0xb0, 0x3c, 0xe4, 0x20, 0xc4, 0x16, 0x18, 0xf2, 0x10, - 0xc6, 0x16, 0x29, 0xdb, 0x39, 0x6f, 0x05, 0x9d, 0x30, 0x42, 0x27, 0xd1, 0xd8, 0xfc, 0x39, 0x31, - 0x1b, 0x69, 0x18, 0x31, 0x96, 0xf9, 0x16, 0xb5, 0x89, 0xf0, 0x7a, 0xc4, 0x10, 0xfa, 0x52, 0xab, - 0xd1, 0x33, 0xb3, 0x40, 0xf0, 0x2c, 0xbb, 0x4d, 0x36, 0xbf, 0x4c, 0x63, 0x1d, 0xd0, 0x2c, 0x10, - 0x13, 0x5a, 0x7d, 0x1f, 0x31, 0xba, 0x59, 0x60, 0xb0, 0x90, 0x46, 0xca, 0x1b, 0x3e, 0x63, 0x78, - 0x3c, 0x4d, 0xa4, 0xac, 0xe2, 0x09, 0x7d, 0xe5, 0x1f, 0xc2, 0xd8, 0x42, 0x27, 0x8c, 0xfc, 0x83, - 0xad, 0x7d, 0x7a, 0x40, 0xd1, 0x91, 0x24, 0x8c, 0x9f, 0x06, 0x82, 0xeb, 0x11, 0x83, 0xeb, 0xcd, - 0xd4, 0xc8, 0xc9, 0x67, 0x40, 0xa4, 0x15, 0x73, 0x8f, 0x8d, 0x0f, 0x8f, 0x8d, 0x65, 0xf4, 0x25, - 0x8d, 0x70, 0xd3, 0x45, 0x1a, 0x3f, 0xf5, 0x3d, 0x85, 0xd6, 0xfd, 0x99, 0x69, 0x66, 0x56, 0x21, - 0x5e, 0xc5, 0x7b, 0x81, 0xd3, 0xde, 0x2f, 0x95, 0x62, 0xd3, 0x40, 0x34, 0x6a, 0x8f, 0xc1, 0x8d, - 0x2d, 0x4e, 0x4c, 0x4e, 0x6a, 0x00, 0xfc, 0xe7, 0x2a, 0xeb, 0x78, 0xee, 0x7d, 0x2a, 0x19, 0xfa, - 0x62, 0x08, 0xa9, 0x2b, 0x34, 0x77, 0x84, 0xd8, 0x96, 0x6b, 0xf4, 0xa6, 0x26, 0x86, 0x3c, 0x86, - 0x22, 0xff, 0xb5, 0xe6, 0x7b, 0x6e, 0xc4, 0xd7, 0x8b, 0x39, 0xc3, 0x55, 0x99, 0x44, 0xcb, 0x02, - 0xd0, 0x45, 0x2c, 0x0a, 0x38, 0x50, 0x58, 0xad, 0x98, 0x94, 0x60, 0xb2, 0x09, 0x63, 0x9b, 0x81, - 0xdf, 0xec, 0x34, 0x22, 0xdc, 0x65, 0x9c, 0xc7, 0x89, 0x9f, 0x88, 0x72, 0x34, 0x0c, 0xd7, 0x49, - 0x9b, 0x03, 0xea, 0x6c, 0x5d, 0xd0, 0x75, 0xa2, 0x11, 0x92, 0x2a, 0x0c, 0x6d, 0xfa, 0x2d, 0xb7, - 0xf1, 0xac, 0x74, 0x01, 0x2b, 0x3d, 0x2d, 0x85, 0x21, 0x50, 0x56, 0x15, 0xb7, 0xb4, 0x6d, 0x04, - 0xe9, 0x5b, 0x5a, 0x4e, 0x44, 0x2a, 0x30, 0xf1, 0x19, 0x1b, 0x30, 0xae, 0xef, 0x79, 0x8e, 0x1b, - 0xd0, 0xd2, 0x45, 0xec, 0x17, 0x74, 0xe3, 0xff, 0x50, 0x47, 0xe8, 0xc3, 0xd9, 0xe0, 0x20, 0x2b, - 0x70, 0x7a, 0x25, 0xac, 0x45, 0x81, 0xdb, 0xa6, 0x6b, 0x8e, 0xe7, 0xec, 0xd1, 0x66, 0xe9, 0x52, - 0xec, 0x47, 0x77, 0xc3, 0x7a, 0x88, 0xb8, 0xfa, 0x01, 0x47, 0xea, 0x7e, 0xf4, 0x04, 0x1f, 0xf9, - 0x1c, 0xa6, 0x97, 0xbe, 0x89, 0xd8, 0x88, 0x69, 0x55, 0x3a, 0x4d, 0x37, 0xaa, 0x45, 0x7e, 0xe0, - 0xec, 0xd1, 0x52, 0x19, 0xe5, 0xbd, 0x72, 0x74, 0x58, 0xbe, 0x4c, 0x05, 0xbe, 0xee, 0x30, 0x82, - 0x7a, 0xc8, 0x29, 0xf4, 0xf3, 0xf1, 0x2c, 0x09, 0x4c, 0xfb, 0xb5, 0x4e, 0x9b, 0xed, 0xb6, 0x51, - 0xfb, 0x97, 0x0d, 0xed, 0x6b, 0x18, 0xae, 0xfd, 0x90, 0x03, 0x52, 0xda, 0xd7, 0x08, 0x89, 0x0d, - 0xe4, 0xbe, 0xef, 0x7a, 0x95, 0x46, 0xe4, 0x3e, 0xa1, 0xc2, 0x62, 0x0e, 0x4b, 0x57, 0xb0, 0xa6, - 0xe8, 0xf3, 0xff, 0x45, 0xdf, 0xf5, 0xea, 0x0e, 0xa2, 0xeb, 0xa1, 0xc0, 0xeb, 0xdf, 0x48, 0x9a, - 0x9b, 0x7c, 0x1f, 0xce, 0xae, 0xf9, 0xbb, 0x6e, 0x8b, 0xf2, 0x29, 0x87, 0xab, 0x05, 0xfd, 0x97, - 0x16, 0xca, 0x45, 0x9f, 0xff, 0x01, 0x52, 0xd4, 0xc5, 0x6c, 0x75, 0xa0, 0x68, 0x74, 0x9f, 0x7f, - 0xb6, 0x14, 0xb2, 0x04, 0xe3, 0xf8, 0x5d, 0xb6, 0xf0, 0x67, 0x58, 0xba, 0x8a, 0x26, 0xdd, 0x95, - 0xc4, 0x2e, 0xed, 0xe6, 0x92, 0x46, 0xb3, 0xe4, 0x45, 0xc1, 0x33, 0xdb, 0x60, 0x23, 0x1f, 0xc3, - 0x5c, 0x72, 0x78, 0x2f, 0xf8, 0xde, 0x23, 0x77, 0xaf, 0x13, 0xd0, 0x66, 0xe9, 0x15, 0x56, 0x55, - 0xbb, 0x0b, 0x05, 0xf9, 0x0a, 0x66, 0x70, 0xad, 0xab, 0x78, 0xbe, 0xf7, 0xec, 0xc0, 0xfd, 0x11, - 0xee, 0x9f, 0xd9, 0xb6, 0xf7, 0x1a, 0x6e, 0x7b, 0xaf, 0x1d, 0x1d, 0x96, 0xaf, 0xe0, 0x9a, 0x58, - 0x77, 0x74, 0x8a, 0x84, 0xd7, 0x3a, 0x5b, 0xc6, 0xdc, 0x43, 0x38, 0x93, 0xaa, 0x3f, 0x29, 0x42, - 0xff, 0x63, 0x71, 0x3e, 0x3b, 0x6a, 0xb3, 0x3f, 0xc9, 0x1b, 0x30, 0xf8, 0x84, 0x19, 0x6a, 0xb8, - 0x1d, 0x89, 0x4f, 0xfc, 0x34, 0xd6, 0x15, 0xef, 0x91, 0x6f, 0x73, 0xa2, 0xf7, 0xfb, 0xde, 0x2d, - 0xdc, 0x1f, 0x18, 0x19, 0x2b, 0x8e, 0xf3, 0x63, 0xf5, 0xfb, 0x03, 0x23, 0x13, 0xc5, 0x49, 0xab, - 0x02, 0xa7, 0x13, 0xf4, 0xa4, 0x04, 0xc3, 0xd4, 0x63, 0x9b, 0xff, 0x26, 0xdf, 0x10, 0xd9, 0xf2, - 0x27, 0x99, 0x86, 0xc1, 0x96, 0x7b, 0xe0, 0x46, 0x58, 0xe0, 0xa0, 0xcd, 0x7f, 0x58, 0xbf, 0x55, - 0x00, 0x92, 0x5e, 0x8f, 0xc8, 0xad, 0x84, 0x18, 0xbe, 0xf5, 0x15, 0x20, 0xfd, 0xe0, 0x40, 0x4a, - 0xff, 0x0c, 0xa6, 0xf8, 0x80, 0x90, 0x2b, 0xa7, 0x56, 0x16, 0x9f, 0xb1, 0x33, 0xd0, 0xba, 0xb3, - 0x49, 0xa0, 0x71, 0x9d, 0x5d, 0xc5, 0xaa, 0x75, 0x60, 0x26, 0x73, 0x25, 0x22, 0x6b, 0x30, 0x73, - 0xe0, 0x7b, 0xd1, 0x7e, 0xeb, 0x99, 0x5c, 0x88, 0x44, 0x69, 0x05, 0x2c, 0x0d, 0x27, 0xdf, 0x4c, - 0x02, 0x7b, 0x4a, 0x80, 0x85, 0x44, 0x2c, 0x47, 0x38, 0x9d, 0x64, 0x4b, 0x2c, 0x1b, 0xce, 0xa4, - 0x26, 0x74, 0xf2, 0x11, 0x8c, 0x37, 0xd0, 0xb8, 0x33, 0x4a, 0xe2, 0xcb, 0x99, 0x06, 0xd7, 0xbf, - 0x55, 0x0e, 0xe7, 0x4d, 0xf9, 0x67, 0x05, 0x98, 0xcd, 0x99, 0xca, 0x4f, 0xae, 0xea, 0x2f, 0xe0, - 0xec, 0x81, 0xf3, 0x4d, 0x3d, 0x40, 0xdb, 0xbd, 0x1e, 0x38, 0x5e, 0x42, 0xdb, 0x38, 0x4d, 0x65, - 0x53, 0xe8, 0xb1, 0x4d, 0x07, 0xce, 0x37, 0x36, 0x12, 0xd8, 0x0c, 0xcf, 0xeb, 0xf9, 0x29, 0x4c, - 0x18, 0x93, 0xf7, 0x89, 0x2b, 0x67, 0xdd, 0x81, 0x33, 0x8b, 0xb4, 0x45, 0x23, 0x7a, 0x6c, 0x9f, - 0x9d, 0xb5, 0x09, 0x50, 0xa3, 0x07, 0x4e, 0x7b, 0xdf, 0x67, 0x9b, 0xfa, 0xaa, 0xfe, 0x4b, 0xf8, - 0x7c, 0x88, 0x34, 0x4f, 0x24, 0x62, 0xe7, 0x4d, 0xbe, 0xd1, 0x0f, 0x15, 0xa5, 0xad, 0x71, 0x59, - 0xff, 0xbe, 0x0f, 0x88, 0x98, 0x7d, 0x03, 0xea, 0x1c, 0xc8, 0x6a, 0xbc, 0x07, 0xe3, 0xdc, 0x42, - 0xe7, 0x60, 0xac, 0xce, 0xd8, 0xfc, 0x94, 0xf8, 0xf2, 0x74, 0xd4, 0xf2, 0x29, 0xdb, 0x20, 0x65, - 0xac, 0x36, 0xe5, 0xae, 0x05, 0x64, 0xed, 0x33, 0x58, 0x75, 0x14, 0x63, 0xd5, 0x7f, 0x93, 0x4f, - 0x60, 0x72, 0xc1, 0x3f, 0x68, 0x33, 0x9d, 0x08, 0xe6, 0x7e, 0xe1, 0xb6, 0x11, 0xe5, 0x1a, 0xc8, - 0xe5, 0x53, 0x76, 0x82, 0x9c, 0xac, 0xc3, 0xd4, 0xdd, 0x56, 0x27, 0xdc, 0xaf, 0x78, 0xcd, 0x85, - 0x96, 0x1f, 0x4a, 0x29, 0x03, 0xc2, 0xd2, 0x12, 0x73, 0x67, 0x9a, 0x62, 0xf9, 0x94, 0x9d, 0xc5, - 0x48, 0xae, 0xc1, 0xe0, 0xd2, 0x13, 0x36, 0xa7, 0xcb, 0x08, 0x17, 0x11, 0x80, 0xb7, 0xe1, 0xd1, - 0x8d, 0x47, 0xcb, 0xa7, 0x6c, 0x8e, 0xad, 0x8e, 0xc2, 0xb0, 0xb4, 0xee, 0x6f, 0xb1, 0xfd, 0xb6, - 0x52, 0x67, 0x2d, 0x72, 0xa2, 0x4e, 0x48, 0xe6, 0x60, 0x64, 0xbb, 0xcd, 0x8c, 0x4e, 0xe9, 0x16, - 0xb1, 0xd5, 0x6f, 0xeb, 0x0d, 0x53, 0xd3, 0xe4, 0x02, 0xc4, 0x3e, 0x5d, 0x41, 0xac, 0x39, 0x79, - 0x97, 0x4d, 0xe5, 0x76, 0xa7, 0x36, 0xca, 0xed, 0x4b, 0x94, 0x5b, 0x4c, 0xea, 0xda, 0x9a, 0xc9, - 0x54, 0x9e, 0xf5, 0x39, 0x5c, 0xda, 0x6e, 0x87, 0x34, 0x88, 0x2a, 0xed, 0x76, 0xcb, 0x6d, 0xf0, - 0x13, 0x32, 0xf4, 0x02, 0xc8, 0xc1, 0xf2, 0x0e, 0x0c, 0x71, 0x80, 0x18, 0x26, 0x72, 0x0c, 0x56, - 0xda, 0x6d, 0xe1, 0x7b, 0x78, 0x93, 0xef, 0xfc, 0xb9, 0x37, 0xc1, 0x16, 0xd4, 0xd6, 0x6f, 0x14, - 0xe0, 0x12, 0xff, 0x02, 0x72, 0x45, 0x7f, 0x07, 0x46, 0x31, 0xfe, 0xad, 0xed, 0x34, 0xe4, 0x37, - 0xc1, 0x03, 0x01, 0x25, 0xd0, 0x8e, 0xf1, 0x5a, 0x64, 0x61, 0x5f, 0x7e, 0x64, 0xa1, 0xfc, 0xc0, - 0xfa, 0x33, 0x3f, 0xb0, 0xcf, 0xc0, 0x12, 0x35, 0x6a, 0xb5, 0x52, 0x95, 0x0a, 0x9f, 0xa7, 0x56, - 0xd6, 0xff, 0xe8, 0x83, 0xd9, 0x7b, 0xd4, 0xa3, 0x81, 0x83, 0xed, 0x34, 0xbc, 0x5c, 0x7a, 0x84, - 0x51, 0xa1, 0x6b, 0x84, 0x51, 0x59, 0xfa, 0x0d, 0xfb, 0xd0, 0x6f, 0x98, 0x0a, 0x97, 0x62, 0xb6, - 0xe8, 0xb6, 0xbd, 0x22, 0x9a, 0x85, 0xb6, 0x68, 0x27, 0x70, 0xf9, 0x29, 0xc3, 0x4a, 0x1c, 0x9d, - 0x34, 0xd0, 0xd3, 0xe7, 0x30, 0x25, 0xa2, 0x35, 0x86, 0x45, 0x74, 0x92, 0x19, 0x93, 0xb4, 0x0e, - 0x43, 0xdc, 0xdd, 0x89, 0x67, 0x5b, 0x63, 0xf3, 0x37, 0xc4, 0x37, 0x95, 0xd3, 0x40, 0xe1, 0x1b, - 0xc5, 0x85, 0x9d, 0x0f, 0x81, 0x08, 0x01, 0xb6, 0x90, 0x32, 0xf7, 0x19, 0x8c, 0x69, 0x24, 0xc7, - 0x59, 0xfb, 0x95, 0xdb, 0x95, 0x6d, 0x47, 0xbd, 0x3d, 0xee, 0xc1, 0xd5, 0xd6, 0x7e, 0xeb, 0x03, - 0x28, 0xa5, 0x6b, 0x23, 0x5c, 0x6d, 0xbd, 0x3c, 0x7b, 0xd6, 0x22, 0x4c, 0xdf, 0xa3, 0x11, 0x0e, - 0x5c, 0xfc, 0x88, 0xb4, 0x28, 0xbb, 0xc4, 0x77, 0x26, 0x67, 0x55, 0x04, 0xb2, 0x01, 0xa6, 0x7d, - 0xa5, 0x35, 0x98, 0x49, 0x48, 0x11, 0xe5, 0xbf, 0x0f, 0xc3, 0x02, 0xa4, 0x66, 0x54, 0x11, 0xaa, - 0x4b, 0x77, 0x05, 0x62, 0x67, 0x9e, 0x8f, 0x5b, 0x21, 0xd9, 0x96, 0x0c, 0xd6, 0x3e, 0x9c, 0x65, - 0xcb, 0x6c, 0x2c, 0x55, 0x0d, 0xc7, 0xf3, 0x30, 0xda, 0x66, 0x1b, 0x85, 0xd0, 0xfd, 0x11, 0x1f, - 0x46, 0x83, 0xf6, 0x08, 0x03, 0xd4, 0xdc, 0x1f, 0x51, 0x72, 0x11, 0x00, 0x91, 0xd8, 0x4c, 0x31, - 0x0b, 0x20, 0x39, 0x77, 0x65, 0x12, 0xc0, 0x18, 0x3d, 0x3e, 0x6e, 0x6c, 0xfc, 0xdb, 0x0a, 0x60, - 0x36, 0x55, 0x92, 0x68, 0xc0, 0x2d, 0x18, 0x91, 0xfb, 0xe3, 0xc4, 0x21, 0x83, 0xde, 0x02, 0x5b, - 0x11, 0x91, 0x57, 0xe1, 0xb4, 0x47, 0xbf, 0x89, 0xea, 0xa9, 0x3a, 0x4c, 0x30, 0xf0, 0xa6, 0xac, - 0x87, 0xf5, 0x0b, 0xe8, 0x58, 0xae, 0x79, 0xfe, 0xd3, 0x47, 0x2d, 0xe7, 0x31, 0x4d, 0x15, 0xfc, - 0x11, 0x8c, 0xd4, 0x7a, 0x17, 0xcc, 0x3f, 0x1f, 0x59, 0xb8, 0xad, 0x58, 0xac, 0x16, 0xcc, 0xb1, - 0x26, 0xd5, 0x2a, 0x6b, 0xab, 0x2b, 0xcd, 0xcd, 0x6f, 0x5b, 0x81, 0x4f, 0xe0, 0x7c, 0x66, 0x69, - 0xdf, 0xb6, 0x12, 0x7f, 0x7f, 0x00, 0x66, 0xf9, 0x62, 0x92, 0x1e, 0xc1, 0xc7, 0x9f, 0x6a, 0x7e, - 0x2e, 0xe7, 0xbd, 0xb7, 0x33, 0xce, 0x7b, 0x91, 0x45, 0x3f, 0xef, 0x35, 0x4e, 0x79, 0xdf, 0xcd, - 0x3e, 0xe5, 0x45, 0x27, 0x94, 0x79, 0xca, 0x9b, 0x3c, 0xdb, 0x5d, 0xca, 0x3f, 0xdb, 0xc5, 0x83, - 0xa7, 0x8c, 0xb3, 0xdd, 0xac, 0x13, 0xdd, 0x44, 0xa0, 0xd4, 0xc8, 0xcb, 0x0d, 0x94, 0x7a, 0x15, - 0x86, 0x2b, 0xed, 0xb6, 0x16, 0x78, 0x88, 0xdd, 0xe3, 0xb4, 0xdb, 0x5c, 0x79, 0x12, 0x29, 0xe7, - 0x79, 0xc8, 0x98, 0xe7, 0xdf, 0x03, 0x58, 0xc0, 0xeb, 0x11, 0xd8, 0x71, 0x63, 0x48, 0x81, 0x3b, - 0x7c, 0x7e, 0x69, 0x02, 0x3b, 0x4e, 0x77, 0xaf, 0xc4, 0xc4, 0x7c, 0x63, 0x6f, 0xed, 0x40, 0x29, - 0x3d, 0x7c, 0x5e, 0xc2, 0xd4, 0xf5, 0x7b, 0x05, 0xb8, 0x28, 0x36, 0x39, 0x89, 0x0f, 0xfc, 0xe4, - 0xa3, 0xf3, 0x6d, 0x18, 0x17, 0xbc, 0x5b, 0xf1, 0x87, 0xc0, 0x0f, 0xd8, 0xe5, 0x64, 0xcc, 0x67, - 0x74, 0x83, 0x8c, 0xbc, 0x0d, 0x23, 0xf8, 0x47, 0x7c, 0x30, 0xc4, 0x34, 0x33, 0x8a, 0xa4, 0xf5, - 0xe4, 0xf1, 0x90, 0x22, 0xb5, 0xbe, 0x86, 0x4b, 0x79, 0x15, 0x7f, 0x09, 0x7a, 0xf9, 0xd7, 0x05, - 0x38, 0x2f, 0xc4, 0x1b, 0x53, 0xc5, 0x73, 0xad, 0x3a, 0x27, 0x08, 0x57, 0xbe, 0x0f, 0x63, 0xac, - 0x40, 0x59, 0xef, 0x7e, 0xb1, 0xb4, 0x0a, 0xcb, 0x21, 0xc6, 0x2c, 0x3a, 0x91, 0x23, 0xc2, 0x6f, - 0x9c, 0x83, 0x96, 0xf4, 0x8c, 0xd8, 0x3a, 0xb3, 0xf5, 0x25, 0x5c, 0xc8, 0x6e, 0xc2, 0x4b, 0xd0, - 0xcf, 0x7d, 0x98, 0xcb, 0x58, 0x14, 0x9e, 0x6f, 0x4d, 0xfe, 0x02, 0xce, 0x67, 0xca, 0x7a, 0x09, - 0xd5, 0x5c, 0x66, 0x3b, 0x8e, 0xe8, 0x25, 0x74, 0xa1, 0xf5, 0x10, 0xce, 0x65, 0x48, 0x7a, 0x09, - 0x55, 0xbc, 0x07, 0xb3, 0x6a, 0xa7, 0xfd, 0x42, 0x35, 0x5c, 0x83, 0x8b, 0x5c, 0xd0, 0xcb, 0xe9, - 0x95, 0x07, 0x70, 0x5e, 0x88, 0x7b, 0x09, 0xda, 0x5b, 0x86, 0x0b, 0xb1, 0x41, 0x9d, 0xb1, 0x4f, - 0x3a, 0xf6, 0x24, 0x63, 0xad, 0xc2, 0xe5, 0x58, 0x52, 0xce, 0xa6, 0xe1, 0xf8, 0xd2, 0xf8, 0x76, - 0x30, 0xee, 0xa5, 0x97, 0xd2, 0xa3, 0x0f, 0xe1, 0xac, 0x21, 0xf4, 0xa5, 0x6d, 0x95, 0x56, 0x60, - 0x8a, 0x0b, 0x36, 0xb7, 0xce, 0xf3, 0xfa, 0xd6, 0x79, 0x6c, 0xfe, 0x4c, 0x2c, 0x12, 0xc1, 0x3b, - 0x6f, 0x66, 0xec, 0xa6, 0xd7, 0x70, 0x37, 0x2d, 0x49, 0xe2, 0x1a, 0xbe, 0x0d, 0x43, 0x1c, 0x22, - 0xea, 0x97, 0x21, 0x8c, 0x1b, 0x0b, 0x9c, 0x4d, 0x10, 0x5b, 0xdf, 0x87, 0x8b, 0xdc, 0x12, 0x8d, - 0x0f, 0x2a, 0x4d, 0x6b, 0xf1, 0xa3, 0x84, 0x21, 0x7a, 0x4e, 0xc8, 0x4d, 0xd2, 0xe7, 0xd8, 0xa3, - 0xbb, 0x72, 0x6c, 0xe7, 0xc9, 0x3f, 0xd6, 0xd5, 0x35, 0x69, 0x60, 0xf6, 0x65, 0x1a, 0x98, 0x57, - 0xe1, 0x8a, 0x32, 0x30, 0x93, 0xc5, 0xc8, 0xa1, 0x65, 0x7d, 0x09, 0xe7, 0x79, 0x43, 0x65, 0x48, - 0xa1, 0x59, 0x8d, 0x0f, 0x12, 0xcd, 0x9c, 0x15, 0xcd, 0x34, 0xa9, 0x73, 0x1a, 0xf9, 0xb7, 0x0b, - 0xf2, 0x93, 0xcb, 0x16, 0xfe, 0xf3, 0xb6, 0xb8, 0xd7, 0xa1, 0xac, 0x14, 0x62, 0xd6, 0xe8, 0xf9, - 0xcc, 0xed, 0x35, 0x98, 0xd1, 0xc5, 0xb8, 0x0d, 0xba, 0x73, 0x07, 0x4f, 0x90, 0xde, 0x62, 0x9f, - 0x05, 0x02, 0xe4, 0xb0, 0x2b, 0x65, 0xe8, 0x0d, 0xe9, 0x6d, 0x45, 0x69, 0xd5, 0xe1, 0x42, 0xba, - 0x2b, 0xdc, 0x86, 0xbc, 0x4f, 0x40, 0x3e, 0x61, 0x9f, 0x30, 0x42, 0x44, 0x67, 0xe4, 0x0a, 0x95, - 0xdf, 0x31, 0x67, 0x97, 0x5c, 0x96, 0x25, 0xa7, 0x9a, 0x44, 0xfb, 0x59, 0xe9, 0x72, 0x3c, 0xfc, - 0x18, 0x88, 0x44, 0x2d, 0xd4, 0x6c, 0x59, 0xf4, 0x39, 0xe8, 0x5f, 0xa8, 0xd9, 0xe2, 0x22, 0x13, - 0xee, 0x04, 0x1b, 0x61, 0x60, 0x33, 0x58, 0x72, 0x47, 0xde, 0x77, 0x8c, 0x1d, 0xf9, 0xfd, 0x81, - 0x91, 0xfe, 0xe2, 0x80, 0x4d, 0x6a, 0xee, 0x9e, 0xf7, 0xd0, 0x8d, 0xf6, 0x55, 0x81, 0x15, 0xeb, - 0x2b, 0x98, 0x32, 0x8a, 0x17, 0x5f, 0x71, 0xd7, 0x1b, 0x58, 0x6c, 0x3f, 0xbb, 0x50, 0xc1, 0xb0, - 0x1a, 0x74, 0x59, 0x8c, 0xf3, 0xf9, 0xa6, 0xe1, 0xd4, 0xf1, 0x7a, 0xaf, 0x2d, 0x91, 0xd6, 0xef, - 0x0c, 0x68, 0xd2, 0xb5, 0x7b, 0x6d, 0x5d, 0x5a, 0x77, 0x07, 0x80, 0x8f, 0x10, 0xad, 0x71, 0x6c, - 0x03, 0x38, 0x26, 0xa2, 0x55, 0xf8, 0x94, 0x6c, 0x6b, 0x44, 0xc7, 0xbd, 0xf7, 0x26, 0xe2, 0x8f, - 0x39, 0x93, 0xbc, 0xea, 0xa9, 0xe2, 0x8f, 0x85, 0xe8, 0xd0, 0xd6, 0x89, 0xc8, 0xf7, 0x93, 0x97, - 0x33, 0x06, 0xf1, 0xc0, 0xea, 0x15, 0x79, 0x82, 0x9d, 0x6e, 0xdb, 0xc9, 0xee, 0x67, 0x3c, 0x85, - 0x19, 0xc6, 0xeb, 0x3e, 0x42, 0xc3, 0x62, 0xe9, 0x9b, 0x88, 0x7a, 0x7c, 0x6e, 0x1f, 0xc2, 0x72, - 0xae, 0x75, 0x29, 0x27, 0x26, 0x16, 0xfe, 0xf7, 0x58, 0x4e, 0x9d, 0x2a, 0x9c, 0x9d, 0x2d, 0x1f, - 0x07, 0x91, 0xbd, 0xba, 0xe4, 0x35, 0xdb, 0xbe, 0xab, 0x0c, 0x26, 0x3e, 0x88, 0x82, 0x56, 0x9d, - 0x0a, 0xb8, 0xad, 0x13, 0x59, 0xaf, 0x76, 0x8d, 0x6a, 0x1f, 0x81, 0x81, 0xad, 0x85, 0xad, 0xd5, - 0x62, 0xc1, 0xba, 0x05, 0xa0, 0x95, 0x04, 0x30, 0xb4, 0xbe, 0x61, 0xaf, 0x55, 0x56, 0x8b, 0xa7, - 0xc8, 0x0c, 0x9c, 0x79, 0xb8, 0xb2, 0xbe, 0xb8, 0xf1, 0xb0, 0x56, 0xaf, 0xad, 0x55, 0xec, 0xad, - 0x85, 0x8a, 0xbd, 0x58, 0x2c, 0x58, 0x5f, 0xc3, 0xb4, 0xd9, 0xc2, 0x97, 0x3a, 0x08, 0x23, 0x98, - 0x52, 0xfb, 0x99, 0xfb, 0x0f, 0xb7, 0xb4, 0x88, 0x56, 0x61, 0xfc, 0x25, 0x23, 0xb3, 0x84, 0x99, - 0x28, 0x3e, 0x23, 0x8d, 0x88, 0xbc, 0xce, 0xb7, 0x05, 0xc9, 0x9b, 0xcb, 0x6c, 0x5b, 0x50, 0x8f, - 0xf7, 0x05, 0x38, 0xf5, 0x7d, 0x0f, 0xa6, 0xcd, 0x52, 0x8f, 0xeb, 0xa5, 0x7a, 0x05, 0x43, 0x7d, - 0xb5, 0x6b, 0x4d, 0x84, 0xe8, 0xc7, 0x06, 0x62, 0x66, 0xfd, 0x1e, 0x14, 0x05, 0x55, 0xbc, 0xf2, - 0x5e, 0x95, 0x6e, 0xc4, 0x42, 0xc6, 0x25, 0x4c, 0x19, 0x94, 0xee, 0x43, 0x91, 0xcd, 0x98, 0x82, - 0x93, 0x17, 0x30, 0x0d, 0x83, 0xab, 0xf1, 0x71, 0x8e, 0xcd, 0x7f, 0xe0, 0xed, 0x9e, 0xc8, 0x09, - 0x22, 0x19, 0x07, 0x37, 0x6a, 0xab, 0xdf, 0xe4, 0x75, 0x18, 0xba, 0xeb, 0xb6, 0x22, 0xe1, 0x1a, - 0x89, 0x17, 0x79, 0x26, 0x96, 0x23, 0x6c, 0x41, 0x60, 0xd9, 0x70, 0x46, 0x2b, 0xf0, 0x04, 0x55, - 0x25, 0x25, 0x18, 0x5e, 0xa7, 0xdf, 0x68, 0xe5, 0xcb, 0x9f, 0xd6, 0x3b, 0x70, 0x46, 0xc4, 0x18, - 0x6a, 0x6a, 0xba, 0x22, 0xee, 0x8a, 0x17, 0x8c, 0x0b, 0xab, 0x42, 0x24, 0xa2, 0x18, 0xdf, 0x76, - 0xbb, 0xf9, 0x9c, 0x7c, 0x6c, 0xa1, 0x38, 0x21, 0xdf, 0x6b, 0xf2, 0x14, 0xa8, 0x57, 0x77, 0xfe, - 0x8d, 0x3e, 0x28, 0x25, 0xbc, 0x0c, 0x0b, 0xfb, 0x4e, 0xab, 0x45, 0xbd, 0x3d, 0x4a, 0xae, 0xc3, - 0xc0, 0xd6, 0xc6, 0xd6, 0xa6, 0xf0, 0x92, 0xca, 0xe8, 0x02, 0x06, 0x52, 0x34, 0x36, 0x52, 0x90, - 0x07, 0x70, 0x46, 0x46, 0x11, 0x2b, 0x94, 0xe8, 0xa1, 0x8b, 0xdd, 0x63, 0x92, 0xd3, 0x7c, 0xe4, - 0x2d, 0xe1, 0x12, 0xf9, 0x61, 0xc7, 0x0d, 0x68, 0x13, 0x3d, 0x3f, 0xf1, 0x51, 0xbd, 0x86, 0xb1, - 0x75, 0x32, 0xf2, 0x3d, 0x18, 0xaf, 0xd5, 0x36, 0xe2, 0xd2, 0x07, 0x8d, 0x13, 0x22, 0x1d, 0x65, - 0x1b, 0x84, 0xfc, 0x4a, 0xb0, 0xf5, 0xfb, 0x05, 0x98, 0xcd, 0x71, 0xb7, 0x90, 0xd7, 0x0d, 0x3d, - 0x4c, 0x69, 0x7a, 0x90, 0x24, 0xcb, 0xa7, 0x84, 0x22, 0x16, 0xb4, 0x98, 0xec, 0xfe, 0x13, 0xc4, - 0x64, 0x2f, 0x9f, 0x8a, 0xe3, 0xb0, 0xc9, 0xab, 0xd0, 0x5f, 0xab, 0x6d, 0x08, 0xb7, 0x3a, 0x89, - 0x5b, 0xa0, 0x11, 0x33, 0x82, 0x2a, 0xc0, 0x88, 0x04, 0x59, 0xa7, 0x61, 0xc2, 0xe8, 0x18, 0xcb, - 0x82, 0x71, 0xbd, 0x86, 0xac, 0xf7, 0x17, 0xfc, 0xa6, 0xea, 0x7d, 0xf6, 0xb7, 0xf5, 0x63, 0x53, - 0x67, 0xe4, 0x22, 0x80, 0x3c, 0xaf, 0x75, 0x9b, 0xf2, 0xe4, 0x47, 0x40, 0x56, 0x9a, 0xe4, 0x0a, - 0x8c, 0x07, 0xb4, 0xe9, 0x06, 0xb4, 0x11, 0xd5, 0x3b, 0x81, 0xb8, 0x18, 0x63, 0x8f, 0x49, 0xd8, - 0x76, 0xd0, 0x22, 0xdf, 0x81, 0x21, 0x7e, 0x90, 0x2c, 0x5a, 0x2f, 0x8d, 0x84, 0x5a, 0x6d, 0x63, - 0xed, 0x6e, 0x85, 0x1f, 0x74, 0xdb, 0x82, 0xc4, 0xaa, 0xc2, 0x98, 0xd6, 0xaa, 0x5e, 0xa5, 0x4f, - 0xc3, 0xa0, 0xee, 0xa5, 0xe4, 0x3f, 0xac, 0xdf, 0x2c, 0xc0, 0x34, 0x0e, 0x83, 0x3d, 0x97, 0x2d, - 0x0f, 0x71, 0x5b, 0xe6, 0x8d, 0x4e, 0xbb, 0x60, 0x74, 0x5a, 0x82, 0x56, 0xf5, 0xde, 0xfb, 0xa9, - 0xde, 0xbb, 0x90, 0xd5, 0x7b, 0x38, 0x05, 0xb8, 0xbe, 0xa7, 0x77, 0x9a, 0x7e, 0x5c, 0xf7, 0x5b, - 0x05, 0x98, 0xd2, 0xea, 0xa4, 0x1a, 0x78, 0xc7, 0xa8, 0xd2, 0xf9, 0x8c, 0x2a, 0xa5, 0xc6, 0x53, - 0x35, 0x55, 0xa3, 0x57, 0xba, 0xd5, 0x28, 0x6b, 0x38, 0x19, 0xc3, 0xe4, 0xcf, 0x0a, 0x30, 0x93, - 0xa9, 0x03, 0x72, 0x96, 0xed, 0xff, 0x1b, 0x01, 0x8d, 0x84, 0xe6, 0xc5, 0x2f, 0x06, 0x5f, 0x09, - 0xc3, 0x0e, 0x0d, 0x84, 0xde, 0xc5, 0x2f, 0xf2, 0x0a, 0x4c, 0x6c, 0xd2, 0xc0, 0xf5, 0x9b, 0xfc, - 0x62, 0x02, 0x8f, 0xf8, 0x9d, 0xb0, 0x4d, 0x20, 0xb9, 0x00, 0xa3, 0x2a, 0x62, 0x95, 0xfb, 0x70, - 0xed, 0x18, 0xc0, 0x64, 0x2f, 0xba, 0x7b, 0xfc, 0xe0, 0x87, 0x31, 0x8b, 0x5f, 0x6c, 0x02, 0x96, - 0x1e, 0xd5, 0x21, 0x3e, 0x01, 0x4b, 0x77, 0xe9, 0x59, 0x18, 0xfa, 0xcc, 0xc6, 0x71, 0x8c, 0x39, - 0x27, 0x6c, 0xf1, 0x8b, 0x4c, 0x62, 0x68, 0x39, 0xde, 0x8b, 0xc1, 0x90, 0xf2, 0xf7, 0x61, 0x3a, - 0x4b, 0xaf, 0x59, 0x5f, 0x81, 0xe0, 0xed, 0x53, 0xbc, 0x5f, 0xc2, 0x54, 0xa5, 0xd9, 0x8c, 0x87, - 0x2b, 0xef, 0x55, 0x3e, 0x4f, 0x70, 0x9f, 0xa6, 0xd8, 0xd6, 0x0e, 0xac, 0x78, 0x6e, 0x64, 0x4f, - 0x2d, 0x7d, 0xe3, 0x86, 0x91, 0xeb, 0xed, 0x69, 0x8e, 0x57, 0xfb, 0xec, 0x3a, 0x7d, 0x9a, 0x31, - 0x04, 0xd8, 0x8e, 0xc3, 0x94, 0xcd, 0xe1, 0x19, 0xc2, 0xa7, 0x35, 0xb1, 0xf1, 0xd4, 0x35, 0x6b, - 0xca, 0x8d, 0x11, 0xfd, 0x95, 0xc6, 0x63, 0xeb, 0x7b, 0x70, 0x96, 0x4f, 0xfb, 0xdd, 0x2a, 0x2f, - 0xaa, 0xad, 0xfb, 0x89, 0xad, 0x77, 0xa5, 0x27, 0xa7, 0x6b, 0xcd, 0xec, 0x71, 0xa3, 0x2e, 0x58, - 0xe4, 0x7f, 0x2f, 0xc0, 0x5c, 0x82, 0xb5, 0xf6, 0xcc, 0x6b, 0xc8, 0x35, 0xe7, 0xd5, 0x64, 0xe8, - 0x3e, 0xee, 0x95, 0xb8, 0x83, 0xd4, 0x6d, 0xaa, 0xe8, 0x7d, 0x72, 0x0b, 0x80, 0x33, 0x6b, 0x5b, - 0x1c, 0x3c, 0x1e, 0x10, 0x51, 0x4e, 0xb8, 0xc9, 0xd1, 0x48, 0x48, 0x07, 0xb2, 0xf4, 0x2e, 0xbe, - 0x91, 0x5e, 0xfe, 0x73, 0xcc, 0xb3, 0x42, 0x05, 0x7b, 0x3d, 0xc7, 0x91, 0x9e, 0x25, 0xdf, 0xfa, - 0x3b, 0xfd, 0x30, 0xab, 0x77, 0xe0, 0xf3, 0xb4, 0x75, 0x13, 0xc6, 0x16, 0x7c, 0x2f, 0xa2, 0xdf, - 0x44, 0x5a, 0x9e, 0x0b, 0xa2, 0xa2, 0x11, 0x14, 0x46, 0x6c, 0xaf, 0x39, 0xa0, 0xce, 0xf6, 0x7a, - 0x46, 0xb4, 0x66, 0x4c, 0x48, 0x16, 0x60, 0x62, 0x9d, 0x3e, 0x4d, 0x29, 0x10, 0x23, 0x46, 0x3d, - 0xfa, 0xb4, 0xae, 0x29, 0x51, 0x0f, 0xe3, 0x33, 0x78, 0xc8, 0x2e, 0x4c, 0xca, 0xc1, 0x65, 0x28, - 0x73, 0x4e, 0x5f, 0x79, 0xcd, 0xe1, 0xcc, 0xf3, 0x40, 0xb0, 0x12, 0x72, 0x74, 0x98, 0x90, 0xc8, - 0x9a, 0xce, 0x4b, 0xe4, 0xa9, 0x0d, 0xcc, 0xa5, 0x5d, 0xc3, 0x18, 0xf1, 0xb8, 0xc9, 0x94, 0x06, - 0xba, 0x08, 0x6b, 0x13, 0x4a, 0xe9, 0xfe, 0x10, 0xa5, 0xbd, 0x05, 0x43, 0x1c, 0x2a, 0xb6, 0x4a, - 0x32, 0x85, 0x91, 0xa2, 0xe6, 0xbe, 0x8c, 0xa6, 0x58, 0x95, 0x38, 0xcc, 0x5a, 0x46, 0xff, 0x92, - 0xa2, 0x51, 0x9b, 0xd5, 0xdb, 0xc9, 0xee, 0xc5, 0x50, 0x67, 0xd9, 0xbd, 0x7a, 0x2c, 0x8e, 0xbc, - 0x92, 0xb2, 0x80, 0x2e, 0x3a, 0x5d, 0x92, 0xa8, 0xd8, 0x0d, 0x18, 0x16, 0xa0, 0x44, 0x72, 0xa5, - 0xf8, 0xf3, 0x93, 0x04, 0xd6, 0xfb, 0x70, 0x0e, 0xfd, 0x85, 0xae, 0xb7, 0xd7, 0xa2, 0xdb, 0xa1, - 0x71, 0xa9, 0xa4, 0xd7, 0x67, 0xfd, 0x21, 0xcc, 0x65, 0xf1, 0xf6, 0xfc, 0xb2, 0x79, 0xba, 0x93, - 0x3f, 0xe9, 0x83, 0xe9, 0x95, 0x50, 0xdf, 0x70, 0xa9, 0x94, 0x27, 0x19, 0x69, 0x38, 0x50, 0x27, - 0xcb, 0xa7, 0xb2, 0xd2, 0x6c, 0xbc, 0xa5, 0x5d, 0x77, 0xed, 0xeb, 0x96, 0x5f, 0x83, 0x2d, 0x5b, - 0xea, 0xc2, 0xeb, 0xab, 0x30, 0xb0, 0xce, 0xa6, 0xea, 0x7e, 0xd1, 0x77, 0x9c, 0x83, 0x81, 0xf0, - 0xba, 0x29, 0x5b, 0x22, 0xd9, 0x0f, 0x72, 0x37, 0x75, 0xa9, 0x75, 0xa0, 0x77, 0xfe, 0x88, 0xe5, - 0x53, 0xa9, 0xfb, 0xad, 0xef, 0xc0, 0x58, 0xa5, 0x79, 0xc0, 0x43, 0x32, 0x7d, 0x2f, 0xf1, 0x59, - 0x6a, 0x98, 0xe5, 0x53, 0xb6, 0x4e, 0x48, 0xae, 0xf1, 0x5b, 0x0d, 0x43, 0x39, 0x39, 0x35, 0xd8, - 0x66, 0xad, 0xd2, 0x6e, 0x57, 0x47, 0x60, 0x88, 0x5f, 0xb4, 0xb4, 0xbe, 0x84, 0x39, 0x11, 0xc8, - 0xc3, 0xbd, 0xa3, 0x18, 0xee, 0x13, 0xc6, 0xb1, 0x5a, 0xdd, 0x82, 0x6f, 0x2e, 0x01, 0xa0, 0x2d, - 0xb4, 0xe2, 0x35, 0xe9, 0x37, 0x22, 0x92, 0x50, 0x83, 0x58, 0x6f, 0xc3, 0xa8, 0xd2, 0x10, 0x6e, - 0xf8, 0xb5, 0xc5, 0x0e, 0xb5, 0x35, 0x6d, 0xdc, 0xe2, 0x95, 0x57, 0x77, 0xcf, 0x19, 0x6d, 0x17, - 0x59, 0x72, 0xb8, 0x85, 0xe0, 0xc2, 0x4c, 0x62, 0x10, 0xc4, 0x49, 0x18, 0xd4, 0x1e, 0x9d, 0x87, - 0x3a, 0xaa, 0xdf, 0xc9, 0x2d, 0x7c, 0xdf, 0xb1, 0xb6, 0xf0, 0xd6, 0xbf, 0xe8, 0x43, 0xe3, 0x32, - 0xa5, 0x8f, 0x84, 0x9f, 0x4e, 0xf7, 0x15, 0x56, 0x61, 0x14, 0x5b, 0xbf, 0x28, 0x2f, 0x0c, 0x76, - 0x8f, 0x43, 0x19, 0xf9, 0xc9, 0x61, 0xf9, 0x14, 0x06, 0x9f, 0xc4, 0x6c, 0xe4, 0x63, 0x18, 0x5e, - 0xf2, 0x9a, 0x28, 0xa1, 0xff, 0x04, 0x12, 0x24, 0x13, 0xeb, 0x13, 0xac, 0xf2, 0x16, 0xfb, 0x84, - 0xb9, 0x7b, 0xc7, 0xd6, 0x20, 0xb1, 0x95, 0x3b, 0x98, 0x67, 0xe5, 0x0e, 0x25, 0xac, 0x5c, 0x0b, - 0x06, 0x37, 0x82, 0xa6, 0xc8, 0x6d, 0x33, 0x39, 0x3f, 0x2e, 0x14, 0x87, 0x30, 0x9b, 0xa3, 0xac, - 0xff, 0x59, 0x80, 0xd9, 0x7b, 0x34, 0xca, 0x1c, 0x43, 0x86, 0x56, 0x0a, 0x2f, 0xac, 0x95, 0xbe, - 0xe7, 0xd1, 0x8a, 0x6a, 0x75, 0x7f, 0x5e, 0xab, 0x07, 0xf2, 0x5a, 0x3d, 0x98, 0xdf, 0xea, 0x7b, - 0x30, 0xc4, 0x9b, 0xca, 0x2c, 0xf9, 0x95, 0x88, 0x1e, 0xc4, 0x96, 0xbc, 0x1e, 0x45, 0x67, 0x73, - 0x1c, 0xdb, 0x48, 0xae, 0x3a, 0xa1, 0x6e, 0xc9, 0x8b, 0x9f, 0xd6, 0x0f, 0xf0, 0xaa, 0xf1, 0xaa, - 0xdf, 0x78, 0xac, 0x79, 0x84, 0x87, 0xf9, 0x17, 0x9a, 0x3c, 0x41, 0x60, 0x54, 0x1c, 0x63, 0x4b, - 0x0a, 0x72, 0x19, 0xc6, 0x56, 0xbc, 0xbb, 0x7e, 0xd0, 0xa0, 0x1b, 0x5e, 0x8b, 0x4b, 0x1f, 0xb1, - 0x75, 0x90, 0xf0, 0x94, 0x88, 0x12, 0x62, 0xf7, 0x03, 0x02, 0x12, 0xee, 0x07, 0x06, 0xdb, 0x99, - 0xb7, 0x39, 0x4e, 0x38, 0x62, 0xd8, 0xdf, 0xdd, 0x2c, 0x77, 0x65, 0xe2, 0xf7, 0x22, 0xdc, 0x85, - 0x73, 0x36, 0x6d, 0xb7, 0x1c, 0xb6, 0xa7, 0x3b, 0xf0, 0x39, 0xbd, 0x6a, 0xf3, 0xe5, 0x8c, 0x6b, - 0x82, 0x66, 0x4c, 0x85, 0xaa, 0x72, 0x5f, 0x97, 0x2a, 0x1f, 0xc0, 0x95, 0x7b, 0x34, 0x32, 0x27, - 0xd4, 0xd8, 0xdf, 0x2c, 0x1a, 0xbf, 0x0c, 0x23, 0xa1, 0xe9, 0x2b, 0x97, 0xd7, 0xde, 0x32, 0x19, - 0x77, 0xde, 0x94, 0xa7, 0x49, 0x42, 0x8e, 0xfa, 0xcb, 0xfa, 0x04, 0xca, 0x79, 0xc5, 0x1d, 0x2f, - 0xe4, 0xd5, 0x85, 0xcb, 0xf9, 0x02, 0x44, 0x75, 0x97, 0x40, 0xfa, 0xd5, 0xc5, 0x27, 0xd4, 0xab, - 0xb6, 0xa6, 0x2b, 0x5e, 0xfc, 0x61, 0x55, 0x65, 0xf0, 0xdf, 0x0b, 0x54, 0xb7, 0x8e, 0x47, 0xd6, - 0xa6, 0x80, 0x58, 0xaf, 0x15, 0x18, 0x91, 0x30, 0xa1, 0xd7, 0xd9, 0xcc, 0x9a, 0x4a, 0x85, 0x36, - 0xa5, 0x00, 0xc5, 0x66, 0xfd, 0x40, 0x1e, 0xdf, 0x98, 0x1c, 0xc7, 0xbb, 0x37, 0x7b, 0x9c, 0xf3, - 0x1a, 0xcb, 0x87, 0x73, 0xa6, 0x6c, 0xdd, 0x2d, 0x5f, 0xd4, 0xdc, 0xf2, 0xdc, 0x1b, 0x7f, 0xd9, - 0x74, 0x13, 0x0b, 0x4f, 0x83, 0x06, 0x22, 0x97, 0x74, 0xe7, 0xfb, 0x78, 0xfa, 0x22, 0xee, 0x6d, - 0x98, 0xcb, 0x2a, 0x50, 0xb3, 0x03, 0x95, 0x87, 0x57, 0xec, 0x77, 0x16, 0xe1, 0x92, 0xcc, 0x2e, - 0xe5, 0xfb, 0x51, 0x18, 0x05, 0x4e, 0xbb, 0xd6, 0x08, 0xdc, 0x76, 0xcc, 0x65, 0xc1, 0x10, 0x87, - 0x08, 0x4d, 0xf0, 0xa3, 0x30, 0x4e, 0x23, 0x30, 0xd6, 0xaf, 0x14, 0xc0, 0x32, 0xe2, 0xb4, 0xb0, - 0x9f, 0x37, 0x03, 0xff, 0x89, 0xdb, 0xd4, 0x8e, 0x9f, 0x5e, 0x37, 0x5c, 0x9f, 0xfc, 0x4e, 0x62, - 0x32, 0x44, 0x5c, 0xcc, 0x99, 0xb7, 0x13, 0xee, 0x48, 0xbe, 0xf1, 0xc4, 0xd8, 0x2d, 0xf3, 0x42, - 0x84, 0x72, 0x53, 0xfe, 0xef, 0x02, 0x5c, 0xed, 0x5a, 0x07, 0xd1, 0x9e, 0x5d, 0x28, 0x26, 0x71, - 0x62, 0x04, 0x95, 0xb5, 0xb8, 0x8d, 0xb4, 0x84, 0x9d, 0x3b, 0x3c, 0x0e, 0x5d, 0xc6, 0x37, 0xb5, - 0x95, 0xe4, 0x94, 0xbc, 0x93, 0xd7, 0x1e, 0xf3, 0x57, 0xf8, 0x91, 0xd3, 0x5a, 0x40, 0x07, 0x40, - 0x7f, 0x7c, 0xa7, 0x20, 0x62, 0xd0, 0x7a, 0x32, 0x4d, 0x86, 0x46, 0x6c, 0x7d, 0x8a, 0xdf, 0x75, - 0x76, 0xa5, 0x8f, 0xf7, 0xa9, 0x2d, 0xc0, 0xd5, 0x44, 0xec, 0xc0, 0x73, 0x08, 0x89, 0x60, 0x86, - 0xa9, 0x9f, 0xed, 0xbd, 0xef, 0x05, 0x7e, 0xa7, 0xfd, 0xf3, 0xe9, 0xf5, 0x3f, 0x28, 0xf0, 0x60, - 0x4e, 0xbd, 0x58, 0xd1, 0xd1, 0x0b, 0x00, 0x31, 0x34, 0x11, 0xd4, 0xaf, 0x10, 0x3b, 0x77, 0xb8, - 0xc9, 0x8d, 0xa7, 0x0a, 0x7b, 0x5c, 0x80, 0xc6, 0xf6, 0xf3, 0xed, 0xc9, 0x37, 0x31, 0x60, 0x40, - 0x95, 0x7e, 0x3c, 0xbd, 0xbf, 0x23, 0xfd, 0x1f, 0x27, 0xe4, 0xdb, 0x87, 0x69, 0x36, 0x03, 0x54, - 0x3a, 0xd1, 0xbe, 0x1f, 0xb8, 0x91, 0xbc, 0x9e, 0x42, 0x36, 0x45, 0x46, 0x00, 0xce, 0xf5, 0xe1, - 0xcf, 0x0e, 0xcb, 0xef, 0x9e, 0x24, 0xef, 0xa7, 0x94, 0xb9, 0xa5, 0xb2, 0x08, 0x58, 0xb3, 0xd0, - 0xbf, 0x60, 0xaf, 0xe2, 0x84, 0x67, 0xaf, 0xaa, 0x09, 0xcf, 0x5e, 0xb5, 0xfe, 0xbc, 0x0f, 0xca, - 0x3c, 0x67, 0x09, 0xc6, 0x99, 0xc4, 0x5e, 0x0b, 0x2d, 0x70, 0xe5, 0xb8, 0x0e, 0x86, 0x44, 0x4e, - 0x92, 0xbe, 0xe3, 0xe4, 0x24, 0xf9, 0x25, 0xc8, 0x71, 0x59, 0x1d, 0xc3, 0x0b, 0xf0, 0xda, 0xd1, - 0x61, 0xf9, 0x6a, 0xec, 0x05, 0xe0, 0xd8, 0x2c, 0x77, 0x40, 0x4e, 0x11, 0x69, 0xff, 0xc5, 0xc0, - 0x73, 0xf8, 0x2f, 0x6e, 0xc3, 0x30, 0x1a, 0x33, 0x2b, 0x9b, 0x22, 0xf2, 0x13, 0x87, 0x27, 0x66, - 0x28, 0xaa, 0xbb, 0x7a, 0x3a, 0x40, 0x49, 0x66, 0xfd, 0x83, 0x3e, 0xb8, 0x9c, 0xaf, 0x73, 0x51, - 0xb7, 0x45, 0x80, 0x38, 0xc2, 0xa5, 0x5b, 0x44, 0x0d, 0x7e, 0x3b, 0x4f, 0xe9, 0xae, 0x8a, 0x68, - 0xd3, 0xf8, 0xd8, 0xde, 0x47, 0xde, 0xb4, 0x4e, 0x1c, 0xa7, 0x18, 0x17, 0xb0, 0x45, 0x36, 0x5b, - 0x01, 0x32, 0xb2, 0xd9, 0x0a, 0x18, 0xd9, 0x85, 0xd9, 0xcd, 0xc0, 0x7d, 0xe2, 0x44, 0xf4, 0x01, - 0x7d, 0xc6, 0x2f, 0x0b, 0x2d, 0x89, 0x1b, 0x42, 0xfc, 0xfa, 0xfc, 0xf5, 0xa3, 0xc3, 0xf2, 0x2b, - 0x6d, 0x4e, 0x82, 0x19, 0xcb, 0xf8, 0xdd, 0xcf, 0x7a, 0xfa, 0xd2, 0x50, 0x9e, 0x20, 0xeb, 0xdf, - 0x15, 0xe0, 0x3c, 0x6e, 0xcb, 0x85, 0xdb, 0x55, 0x16, 0xfe, 0x5c, 0x81, 0x95, 0x7a, 0x03, 0xc5, - 0x58, 0xc4, 0xc0, 0x4a, 0xe3, 0x26, 0xba, 0x6d, 0x90, 0x91, 0x15, 0x18, 0x13, 0xbf, 0xf1, 0xfb, - 0xeb, 0x47, 0x83, 0x60, 0x46, 0x9b, 0xb0, 0x70, 0xa8, 0x73, 0x57, 0x11, 0x0e, 0x6c, 0x21, 0x0c, - 0x2f, 0x6c, 0xda, 0x3a, 0xaf, 0xf5, 0xd3, 0x3e, 0xb8, 0xb0, 0x43, 0x03, 0xf7, 0xd1, 0xb3, 0x9c, - 0xc6, 0x6c, 0xc0, 0xb4, 0x04, 0xf1, 0xbc, 0x25, 0xc6, 0x27, 0xc6, 0xf3, 0x59, 0xca, 0xaa, 0x8a, - 0xc4, 0x27, 0xf2, 0x8b, 0xcb, 0x64, 0x3c, 0x41, 0xc8, 0xe4, 0x5b, 0x30, 0x92, 0xc8, 0x1c, 0x84, - 0xfd, 0x2f, 0xbf, 0xd0, 0xb8, 0xab, 0x96, 0x4f, 0xd9, 0x8a, 0x92, 0xfc, 0x5a, 0xfe, 0x51, 0x95, - 0x70, 0x7d, 0xf4, 0xf2, 0x7f, 0xe2, 0x07, 0xcb, 0x3e, 0x56, 0x47, 0xc3, 0x66, 0x7c, 0xb0, 0xcb, - 0xa7, 0xec, 0xbc, 0x92, 0xaa, 0x63, 0x30, 0x5a, 0xc1, 0x73, 0x3b, 0x66, 0xb9, 0xff, 0xaf, 0x3e, - 0xb8, 0x24, 0x2f, 0xfe, 0xe4, 0xa8, 0xf9, 0x73, 0x98, 0x95, 0xa0, 0x4a, 0x9b, 0x6d, 0x18, 0x68, - 0xd3, 0xd4, 0x34, 0xcf, 0x29, 0x2b, 0x35, 0xed, 0x08, 0x9a, 0x58, 0xd9, 0x79, 0xec, 0x2f, 0xc7, - 0xfb, 0xf9, 0x71, 0x56, 0x1e, 0x27, 0xf4, 0x42, 0xea, 0x73, 0xa6, 0xa1, 0x1a, 0x63, 0xfe, 0x6c, - 0xa6, 0xbc, 0xa7, 0x03, 0x2f, 0xea, 0x3d, 0x5d, 0x3e, 0x95, 0xf4, 0x9f, 0x56, 0x27, 0x61, 0x7c, - 0x9d, 0x3e, 0x8d, 0xf5, 0xfe, 0xd7, 0x0b, 0x89, 0x54, 0x0f, 0x6c, 0x87, 0xc1, 0x73, 0x3e, 0x14, - 0xe2, 0x54, 0x40, 0x98, 0xea, 0x41, 0xdf, 0x61, 0x70, 0xd2, 0x15, 0x18, 0xe6, 0x87, 0xd9, 0xcd, - 0x63, 0x58, 0xf8, 0xea, 0x06, 0x0f, 0xbf, 0x56, 0xd9, 0xe4, 0xc6, 0xbe, 0xe0, 0xb7, 0x1e, 0xc0, - 0x15, 0x11, 0xe3, 0x6d, 0x76, 0x3e, 0x16, 0x74, 0xc2, 0xe5, 0xcb, 0x72, 0xe0, 0xd2, 0x3d, 0x9a, - 0x9c, 0x7a, 0x8c, 0x1b, 0x4e, 0x9f, 0xc0, 0x69, 0x03, 0xae, 0x24, 0xe2, 0xae, 0x54, 0x8d, 0x21, - 0x25, 0x3a, 0x49, 0x6d, 0x5d, 0xce, 0x2a, 0x42, 0xaf, 0xac, 0x45, 0x31, 0x39, 0x6c, 0x10, 0x1f, - 0xb1, 0x85, 0x27, 0x98, 0xf5, 0xae, 0x6b, 0xdf, 0x35, 0x9f, 0xf1, 0x78, 0xf6, 0x40, 0xb9, 0xf2, - 0x2a, 0xac, 0x35, 0x61, 0x9c, 0x05, 0x58, 0x93, 0x30, 0x2e, 0x51, 0x2d, 0x1a, 0x86, 0xd6, 0x7f, - 0x1e, 0x04, 0x4b, 0x28, 0x36, 0xeb, 0x84, 0x5e, 0xea, 0x63, 0x37, 0x55, 0x59, 0xb1, 0x50, 0x9d, - 0xd5, 0x73, 0x92, 0xc6, 0x58, 0x3e, 0xf2, 0x70, 0x9f, 0xd7, 0x88, 0xa1, 0xc6, 0xc8, 0x4b, 0xb5, - 0xfe, 0xab, 0x9c, 0x69, 0x92, 0x7f, 0x6c, 0x78, 0x65, 0x3b, 0x67, 0x9a, 0x34, 0xe4, 0x66, 0x4f, - 0x99, 0xb6, 0x79, 0x24, 0xd2, 0xff, 0x3c, 0x47, 0x22, 0xec, 0x8b, 0xd4, 0x0f, 0x45, 0xb6, 0x4d, - 0x5d, 0x8a, 0xef, 0x51, 0x9e, 0xde, 0xeb, 0x28, 0x91, 0x71, 0x41, 0x83, 0x18, 0x52, 0x0d, 0x31, - 0xc4, 0x85, 0xa2, 0xe6, 0xb3, 0x5c, 0xd8, 0xa7, 0x8d, 0xc7, 0xc2, 0x57, 0x2c, 0x0f, 0x74, 0xb3, - 0x7c, 0xe6, 0x3c, 0x3f, 0x35, 0xff, 0xce, 0x39, 0xa2, 0xde, 0x60, 0xac, 0x7a, 0xc6, 0x88, 0xa4, - 0x58, 0xf2, 0x23, 0x98, 0x52, 0x5d, 0x9d, 0x08, 0xd1, 0x1a, 0x9b, 0x7f, 0x25, 0x4e, 0x65, 0x7a, - 0xf0, 0xc8, 0xb9, 0xf9, 0xe4, 0xce, 0xcd, 0x0c, 0x5a, 0x9e, 0x88, 0xa0, 0x21, 0x11, 0x5a, 0x7c, - 0x96, 0x7e, 0xd0, 0x95, 0xc1, 0x48, 0xbe, 0x80, 0xe9, 0x5a, 0x6d, 0x83, 0x5f, 0xe6, 0xb0, 0xe5, - 0x01, 0xbf, 0xbd, 0x2a, 0x02, 0xb6, 0xb0, 0xbb, 0xc3, 0xd0, 0xaf, 0x8b, 0x4b, 0x20, 0x7a, 0x58, - 0x80, 0x9e, 0x8a, 0x21, 0x4b, 0x84, 0x7e, 0x52, 0xfe, 0xf7, 0xd4, 0x5d, 0x05, 0xb6, 0x15, 0x71, - 0x5b, 0x54, 0x5c, 0x3a, 0x92, 0x03, 0x3b, 0xe7, 0x94, 0xaf, 0xf0, 0x2d, 0x9f, 0xf2, 0xfd, 0x6e, - 0x9f, 0xbc, 0xa1, 0x91, 0x3e, 0x68, 0x3d, 0xf1, 0x61, 0x5f, 0x66, 0x0b, 0x8e, 0xb5, 0x4e, 0x67, - 0x56, 0x8e, 0x54, 0xe5, 0x51, 0xa9, 0x4a, 0x56, 0x36, 0xa9, 0x8e, 0x1d, 0x62, 0x84, 0x71, 0x7a, - 0x8a, 0xbb, 0x22, 0x8d, 0x2b, 0x79, 0x0e, 0xd7, 0xff, 0xe2, 0xe7, 0x70, 0x3f, 0x86, 0x19, 0x79, - 0x35, 0x6a, 0x81, 0x7a, 0x11, 0x0d, 0xe4, 0x89, 0xfd, 0x64, 0x9c, 0xf4, 0x0d, 0xd3, 0xfb, 0x15, - 0xa1, 0xbf, 0x62, 0xaf, 0x0b, 0x8f, 0x0e, 0xfb, 0x93, 0x5c, 0x36, 0x03, 0xe2, 0xf8, 0x9d, 0x37, - 0x23, 0xfc, 0xed, 0x32, 0xab, 0x2e, 0xf7, 0xb3, 0xb8, 0x32, 0x55, 0x9f, 0xad, 0x83, 0xac, 0x05, - 0x38, 0x6f, 0x16, 0xbf, 0x49, 0x83, 0x03, 0x17, 0xf7, 0xde, 0x35, 0x1a, 0xc9, 0x42, 0x0b, 0x71, - 0xa1, 0x44, 0x0f, 0xa8, 0x16, 0x66, 0xe0, 0xff, 0xed, 0x83, 0x72, 0x66, 0x23, 0x2a, 0x61, 0xe8, - 0xee, 0x79, 0x98, 0x41, 0xe3, 0x02, 0x0c, 0x3c, 0x70, 0xbd, 0xa6, 0x6e, 0x48, 0x3e, 0x76, 0xbd, - 0xa6, 0x8d, 0x50, 0x66, 0x83, 0xd4, 0x3a, 0xbb, 0x48, 0xa0, 0x99, 0xc8, 0x61, 0x67, 0xb7, 0xce, - 0x88, 0x74, 0x1b, 0x44, 0x90, 0x91, 0x6b, 0x30, 0x2c, 0xb3, 0xad, 0xf5, 0xc7, 0xde, 0x33, 0x99, - 0x66, 0x4d, 0xe2, 0xc8, 0x47, 0x30, 0xb2, 0x46, 0x23, 0xa7, 0xe9, 0x44, 0x8e, 0x18, 0x3b, 0xf2, - 0x21, 0x0c, 0x09, 0xae, 0x16, 0xc5, 0x0a, 0x3d, 0x72, 0x20, 0x20, 0xb6, 0x62, 0x41, 0x05, 0xba, - 0x61, 0xbb, 0xe5, 0x3c, 0x53, 0xc1, 0xa4, 0x4c, 0x81, 0x31, 0x88, 0xbc, 0x63, 0x86, 0x5c, 0xc4, - 0xc7, 0x67, 0x99, 0x0a, 0x89, 0x03, 0x32, 0x96, 0x31, 0x0c, 0x24, 0x56, 0xb5, 0xc8, 0x26, 0x68, - 0x65, 0x72, 0x1b, 0x94, 0xb6, 0xc9, 0x68, 0xfd, 0x37, 0x80, 0x33, 0x9b, 0xce, 0x9e, 0xeb, 0xb1, - 0x1d, 0x85, 0x4d, 0x43, 0xbf, 0x13, 0x34, 0x28, 0xa9, 0xc0, 0xa4, 0x19, 0xc0, 0xdd, 0x23, 0x3c, - 0x9d, 0x6d, 0x9a, 0x4c, 0x18, 0x99, 0x87, 0x51, 0x75, 0x69, 0x5c, 0xec, 0x74, 0x32, 0x2e, 0x93, - 0x2f, 0x9f, 0xb2, 0x63, 0x32, 0xf2, 0x9e, 0x71, 0xf8, 0x78, 0x5a, 0xe5, 0x3f, 0x40, 0xda, 0x79, - 0x1e, 0x61, 0xeb, 0xf9, 0x4d, 0x73, 0xb7, 0xc6, 0x4f, 0xd8, 0x7e, 0x90, 0x3a, 0x8f, 0x1c, 0x34, - 0x6a, 0x9c, 0x72, 0xca, 0xe2, 0x46, 0x35, 0x37, 0x7b, 0x7d, 0xc6, 0x49, 0xe5, 0x97, 0x30, 0xf6, - 0xa0, 0xb3, 0x4b, 0xe5, 0xc9, 0xeb, 0x90, 0xd8, 0xbc, 0x25, 0xaf, 0x25, 0x08, 0xfc, 0xce, 0x9b, - 0xfc, 0x2b, 0x7e, 0xdc, 0xd9, 0xa5, 0xe9, 0x67, 0x11, 0xd8, 0xaa, 0xa9, 0x09, 0x23, 0xfb, 0x50, - 0x4c, 0xde, 0x20, 0x10, 0x5d, 0xda, 0xe5, 0xde, 0x03, 0x26, 0xfa, 0xd1, 0x1e, 0x5f, 0xe0, 0x71, - 0xcd, 0x46, 0x21, 0x29, 0xa9, 0xe4, 0xc7, 0x30, 0x93, 0xe9, 0x12, 0x57, 0x77, 0x20, 0xbb, 0x7b, - 0xdb, 0x71, 0x09, 0x4a, 0x68, 0x4d, 0x5e, 0xb8, 0x34, 0x4a, 0xce, 0x2e, 0x85, 0x34, 0xe1, 0x74, - 0x22, 0x32, 0x5e, 0xbc, 0x30, 0x93, 0x1f, 0x6b, 0x8f, 0xbb, 0x26, 0x99, 0xa4, 0x39, 0xb3, 0xac, - 0xa4, 0x48, 0xb2, 0x0a, 0xa3, 0xca, 0x17, 0x25, 0x72, 0xf3, 0x65, 0xf9, 0xdd, 0x4a, 0x47, 0x87, - 0xe5, 0xe9, 0xd8, 0xef, 0x66, 0xc8, 0x8c, 0x05, 0x90, 0x5f, 0x86, 0x2b, 0x6a, 0x88, 0x6e, 0x04, - 0xd9, 0x1e, 0x4a, 0xf1, 0xb8, 0xc3, 0x8d, 0xe4, 0x08, 0xcf, 0xa3, 0xdf, 0xb9, 0x53, 0xed, 0x2b, - 0x15, 0x96, 0x4f, 0xd9, 0xbd, 0x45, 0x93, 0x5f, 0x2d, 0xc0, 0xd9, 0x9c, 0x52, 0xc7, 0xb1, 0xd4, - 0x9e, 0x6e, 0x63, 0xb4, 0x3c, 0xf1, 0xde, 0x9f, 0xdb, 0x8c, 0xef, 0xc7, 0x4a, 0xff, 0xb1, 0xd1, - 0xee, 0x9c, 0x92, 0xc8, 0xef, 0x14, 0x7a, 0xce, 0xd2, 0x98, 0x8b, 0x6e, 0x6c, 0xfe, 0xd5, 0x6e, - 0x53, 0x58, 0x4c, 0x5d, 0xbd, 0x7d, 0x74, 0x58, 0x7e, 0x43, 0x25, 0x34, 0x6b, 0x20, 0x95, 0xbc, - 0xb3, 0x5b, 0x77, 0x14, 0x9d, 0x51, 0xbb, 0x9e, 0x0b, 0xc5, 0x1b, 0x30, 0x84, 0x7e, 0xa6, 0xb0, - 0x34, 0x81, 0x96, 0x18, 0xa6, 0xe1, 0x42, 0x6f, 0x94, 0xbe, 0xf7, 0x12, 0x34, 0x64, 0x99, 0x59, - 0x34, 0xb8, 0xf7, 0x93, 0x16, 0x88, 0x48, 0xda, 0x27, 0xac, 0x62, 0x8e, 0x92, 0xd9, 0x74, 0x8c, - 0xc7, 0x46, 0x4c, 0xb6, 0x2a, 0xc0, 0x48, 0x20, 0x26, 0xcf, 0xfb, 0x03, 0x23, 0x03, 0xc5, 0x41, - 0xfe, 0x7d, 0xcb, 0x9b, 0x21, 0xbf, 0x3e, 0xc2, 0xaf, 0x91, 0x6f, 0x7b, 0xee, 0x23, 0x37, 0x9e, - 0x67, 0x75, 0x0f, 0x75, 0xfc, 0xea, 0x97, 0xb0, 0x1f, 0x73, 0xde, 0xf7, 0x52, 0xce, 0xec, 0xbe, - 0x9e, 0xce, 0xec, 0x37, 0xb5, 0x63, 0x5f, 0x2d, 0x39, 0x2f, 0xb7, 0x13, 0x4c, 0xe7, 0x71, 0x7c, - 0x1e, 0xfc, 0x35, 0x0c, 0x61, 0x3e, 0x5d, 0x7e, 0xa6, 0x3e, 0x36, 0x7f, 0x53, 0x74, 0x67, 0x97, - 0xea, 0xf3, 0x04, 0xbc, 0x22, 0x35, 0x04, 0xd7, 0x38, 0x02, 0x0c, 0x8d, 0x23, 0x84, 0x6c, 0xc1, - 0xd4, 0x26, 0xdb, 0xb6, 0xf2, 0xfb, 0x09, 0xed, 0x40, 0x38, 0xf8, 0xb8, 0xeb, 0x10, 0xb7, 0xcd, - 0x6d, 0x89, 0xae, 0x53, 0x85, 0xd7, 0x77, 0x8e, 0x19, 0xec, 0x64, 0x09, 0x26, 0x6b, 0xd4, 0x09, - 0x1a, 0xfb, 0x0f, 0xe8, 0x33, 0x66, 0x32, 0x18, 0x0f, 0xdd, 0x84, 0x88, 0x61, 0xed, 0x45, 0x94, - 0x1e, 0x27, 0x65, 0x32, 0x91, 0x4f, 0x61, 0xa8, 0xe6, 0x07, 0x51, 0xf5, 0x99, 0x98, 0x7b, 0xe5, - 0xa9, 0x2b, 0x07, 0x56, 0xcf, 0xc9, 0xc7, 0x7e, 0x42, 0x3f, 0x88, 0xea, 0xbb, 0x46, 0x5e, 0x37, - 0x4e, 0x42, 0x9e, 0xc1, 0xb4, 0x39, 0xef, 0x89, 0xb0, 0xf9, 0x11, 0x61, 0xaa, 0x64, 0x4d, 0xae, - 0x9c, 0xa4, 0x7a, 0x5d, 0x48, 0xbf, 0x9c, 0x9c, 0x5d, 0x1f, 0x21, 0x5e, 0xdf, 0xdf, 0x67, 0xf1, - 0x93, 0x35, 0x7c, 0x25, 0x89, 0xb7, 0xa8, 0x12, 0xf2, 0x70, 0xfb, 0xd1, 0x38, 0x73, 0x60, 0x07, - 0xe7, 0x4e, 0xd4, 0x84, 0x13, 0x26, 0x9f, 0xd6, 0xb2, 0x53, 0xac, 0x64, 0x13, 0xce, 0x6c, 0x87, - 0x74, 0x33, 0xa0, 0x4f, 0x5c, 0xfa, 0x54, 0xca, 0x83, 0x38, 0xcd, 0x1a, 0x93, 0xd7, 0xe6, 0xd8, - 0x2c, 0x81, 0x69, 0x66, 0xf2, 0x1e, 0xc0, 0xa6, 0xeb, 0x79, 0xb4, 0x89, 0x47, 0xf7, 0x63, 0x28, - 0x0a, 0x8f, 0x25, 0xda, 0x08, 0xad, 0xfb, 0x5e, 0x4b, 0x57, 0xa9, 0x46, 0x4c, 0xaa, 0x30, 0xb1, - 0xe2, 0x35, 0x5a, 0x1d, 0x11, 0x62, 0x13, 0xe2, 0xbc, 0x27, 0xd2, 0x3f, 0xba, 0x1c, 0x51, 0x4f, - 0x7d, 0xe4, 0x26, 0x0b, 0x79, 0x00, 0x44, 0x00, 0xc4, 0xa8, 0x75, 0x76, 0x5b, 0x54, 0x7c, 0xee, - 0xe8, 0x6e, 0x94, 0x82, 0x70, 0xb8, 0x1b, 0x59, 0x15, 0x53, 0x6c, 0x73, 0xef, 0xc1, 0x98, 0x36, - 0xe6, 0x33, 0x72, 0x9d, 0x4c, 0xeb, 0xb9, 0x4e, 0x46, 0xf5, 0x9c, 0x26, 0xff, 0xb4, 0x00, 0x17, - 0xb2, 0xbf, 0x25, 0x61, 0x69, 0x6c, 0xc0, 0xa8, 0x02, 0xaa, 0xdb, 0x6d, 0xd2, 0x7c, 0x4e, 0x6c, - 0xd4, 0xf8, 0x07, 0x2d, 0x67, 0x1e, 0xbd, 0xf5, 0xb1, 0x8c, 0xe7, 0x38, 0xd3, 0xfa, 0x9b, 0x23, - 0x30, 0x8d, 0xb7, 0x38, 0x92, 0xf3, 0xd4, 0x27, 0x98, 0xb3, 0x08, 0x61, 0xda, 0x11, 0x8d, 0xf0, - 0xd6, 0x72, 0x78, 0x32, 0x7b, 0x9f, 0xc1, 0x40, 0xde, 0xd6, 0xe3, 0x8a, 0xfa, 0xb4, 0x57, 0x99, - 0x24, 0x50, 0x6f, 0x42, 0x1c, 0x70, 0xf4, 0xba, 0x11, 0xd6, 0x72, 0xec, 0x49, 0x6f, 0xe0, 0xb8, - 0x93, 0xde, 0xb6, 0x9a, 0xf4, 0x78, 0x2e, 0x9c, 0xd7, 0xb4, 0x49, 0xef, 0xe5, 0xcf, 0x76, 0x43, - 0x2f, 0x7b, 0xb6, 0x1b, 0x7e, 0xb1, 0xd9, 0x6e, 0xe4, 0x39, 0x67, 0xbb, 0xbb, 0x30, 0xb9, 0x4e, - 0x69, 0x53, 0x3b, 0x6c, 0x1c, 0x8d, 0x57, 0x4f, 0x8f, 0xa2, 0x1b, 0x39, 0xeb, 0xc4, 0x31, 0xc1, - 0x95, 0x3b, 0x6b, 0xc2, 0x5f, 0xce, 0xac, 0x39, 0xf6, 0x92, 0x67, 0xcd, 0xf1, 0x17, 0x99, 0x35, - 0x53, 0x53, 0xdf, 0xc4, 0x89, 0xa7, 0xbe, 0x17, 0x99, 0xad, 0x3e, 0xc6, 0xb0, 0xdc, 0x5a, 0x6d, - 0x59, 0x44, 0x60, 0x69, 0x21, 0x4f, 0xcb, 0x7e, 0x28, 0x6f, 0x2d, 0xe0, 0xdf, 0x0c, 0x86, 0x6f, - 0x5f, 0x08, 0xe3, 0x9e, 0xfd, 0x6d, 0x55, 0x31, 0x18, 0x57, 0xe7, 0x57, 0xb7, 0x7b, 0x86, 0xc5, - 0xd5, 0x60, 0x31, 0xc7, 0x25, 0xad, 0x3d, 0x5b, 0xe2, 0xad, 0x3f, 0x29, 0xf0, 0x83, 0xfd, 0xff, - 0x1f, 0xa7, 0xca, 0x17, 0x39, 0x6c, 0xff, 0xb5, 0x38, 0x65, 0x88, 0x48, 0x6f, 0x12, 0x38, 0x8d, - 0xc7, 0x71, 0xb4, 0xc3, 0xf7, 0xd9, 0x77, 0xae, 0x23, 0x30, 0x3b, 0x74, 0x6c, 0xd2, 0x9a, 0xc8, - 0x9d, 0x3b, 0x72, 0x02, 0x10, 0x99, 0x53, 0x38, 0xd8, 0x9c, 0x00, 0x74, 0x06, 0x8c, 0x37, 0x3d, - 0x6d, 0xd9, 0x3c, 0xe3, 0x45, 0x66, 0x0d, 0xde, 0x49, 0xe7, 0x6c, 0x40, 0x9b, 0x29, 0xce, 0xd9, - 0xa0, 0xab, 0x31, 0xce, 0xde, 0xb0, 0x0d, 0xe7, 0x6d, 0x7a, 0xe0, 0x3f, 0xa1, 0x2f, 0x57, 0xec, - 0x57, 0x70, 0xce, 0x14, 0xc8, 0x6f, 0xf7, 0xf1, 0xa7, 0x28, 0x3e, 0xce, 0x7e, 0xc0, 0x42, 0x30, - 0xf0, 0x07, 0x2c, 0x78, 0x1e, 0x7c, 0xf6, 0xa7, 0xbe, 0x6e, 0x20, 0xce, 0xf2, 0xe1, 0x82, 0x29, - 0xbc, 0xd2, 0x6c, 0xe2, 0x1b, 0xb8, 0x0d, 0xb7, 0xed, 0x78, 0x11, 0xd9, 0x80, 0x31, 0xed, 0x67, - 0xc2, 0xa3, 0xa1, 0x61, 0xc4, 0x9e, 0x26, 0x06, 0x18, 0x79, 0x84, 0x63, 0xb0, 0x45, 0xa1, 0x9c, - 0x54, 0x0f, 0x53, 0x99, 0x5e, 0x66, 0x15, 0x26, 0xb4, 0x9f, 0xca, 0xed, 0x8f, 0x1f, 0xbf, 0x56, - 0x82, 0xa9, 0x30, 0x93, 0xc5, 0x6a, 0xc0, 0x5c, 0x96, 0xd2, 0x78, 0xc2, 0x79, 0xb2, 0x14, 0xe7, - 0x93, 0xeb, 0x1d, 0xb1, 0x7a, 0x3a, 0x2f, 0x97, 0x9c, 0xf5, 0x77, 0x07, 0xe0, 0xbc, 0xe8, 0x8c, - 0x97, 0xd9, 0xe3, 0xe4, 0x07, 0x30, 0xa6, 0xf5, 0xb1, 0x50, 0xfa, 0x65, 0x79, 0x37, 0x2f, 0x6f, - 0x2c, 0x70, 0xcf, 0x4b, 0x07, 0x01, 0xf5, 0x44, 0x77, 0x2f, 0x9f, 0xb2, 0x75, 0x91, 0xa4, 0x05, - 0x93, 0x66, 0x47, 0x0b, 0xe7, 0xd3, 0xd5, 0xcc, 0x42, 0x4c, 0x52, 0x99, 0x8d, 0xbe, 0x59, 0xcf, - 0xec, 0xee, 0xe5, 0x53, 0x76, 0x42, 0x36, 0xf9, 0x06, 0xce, 0xa4, 0x7a, 0x59, 0x78, 0x16, 0x5f, - 0xcd, 0x2c, 0x30, 0x45, 0xcd, 0x8f, 0x34, 0x02, 0x04, 0xe7, 0x16, 0x9b, 0x2e, 0x84, 0x34, 0x61, - 0x5c, 0xef, 0x78, 0xe1, 0x1d, 0xbb, 0xd2, 0x45, 0x95, 0x9c, 0x90, 0x6f, 0xee, 0x84, 0x2e, 0xb1, - 0xef, 0x9f, 0x99, 0xc7, 0x34, 0x06, 0xf1, 0x08, 0x0c, 0xf1, 0xdf, 0xd6, 0xef, 0x16, 0xe0, 0xfc, - 0x66, 0x40, 0x43, 0xea, 0x35, 0xa8, 0x71, 0xcb, 0xe1, 0x05, 0x47, 0x44, 0xde, 0x09, 0x49, 0xdf, - 0x0b, 0x9f, 0x90, 0x58, 0xff, 0xb6, 0x00, 0xa5, 0xac, 0x2a, 0xd7, 0xa8, 0xd7, 0x24, 0x9b, 0x50, - 0x4c, 0xb6, 0x41, 0x7c, 0x31, 0x96, 0x4a, 0x26, 0x9e, 0xdb, 0xda, 0xe5, 0x53, 0x76, 0x8a, 0x9b, - 0xac, 0xc3, 0x19, 0x0d, 0x26, 0x4e, 0x28, 0xfa, 0x8e, 0x73, 0x42, 0xc1, 0x7a, 0x38, 0xc5, 0xaa, - 0x1f, 0xf0, 0x2c, 0xe3, 0xaa, 0xbb, 0xe8, 0x1f, 0x38, 0xae, 0xc7, 0x36, 0xd1, 0x5a, 0xba, 0x3a, - 0x88, 0xa1, 0x42, 0xed, 0xfc, 0xc8, 0x02, 0xa1, 0xf2, 0xc2, 0x97, 0x22, 0xb1, 0x3e, 0xc4, 0xd5, - 0x41, 0xb8, 0x29, 0xf9, 0x15, 0x7b, 0x25, 0xec, 0x32, 0x0c, 0x6e, 0xad, 0xd6, 0x16, 0x2a, 0xe2, - 0xc2, 0x3e, 0x4f, 0xf3, 0xd2, 0x0a, 0xeb, 0x0d, 0xc7, 0xe6, 0x08, 0xeb, 0x03, 0x20, 0xf7, 0x68, - 0x24, 0x5e, 0xb3, 0x50, 0x7c, 0xd7, 0x60, 0x58, 0x80, 0x04, 0x27, 0x3a, 0xdf, 0xc5, 0xdb, 0x18, - 0xb6, 0xc4, 0x59, 0x9b, 0xd2, 0x06, 0x69, 0x51, 0x27, 0xd4, 0x16, 0xfd, 0x77, 0x61, 0x24, 0x10, - 0x30, 0xb1, 0xe6, 0x4f, 0xaa, 0xc7, 0x8a, 0x10, 0xcc, 0x0f, 0x85, 0x24, 0x8d, 0xad, 0xfe, 0xb2, - 0x56, 0x31, 0x25, 0xd3, 0xc6, 0xca, 0xe2, 0x02, 0xd3, 0xaa, 0x50, 0x96, 0xec, 0x8e, 0x5b, 0x78, - 0xc7, 0x23, 0xa2, 0xfa, 0x75, 0x7d, 0x54, 0x0d, 0x4e, 0x20, 0x22, 0x11, 0x99, 0x46, 0x62, 0xbd, - 0xa9, 0x12, 0x3c, 0x65, 0x48, 0xcb, 0x7b, 0x74, 0x67, 0x1d, 0x53, 0x57, 0xdd, 0xc3, 0x70, 0xb6, - 0x97, 0x51, 0x09, 0x07, 0xe6, 0xf8, 0x16, 0x82, 0xb5, 0x4a, 0x3c, 0x39, 0xea, 0xab, 0x69, 0x77, - 0x01, 0x46, 0x15, 0x4c, 0x9d, 0x4d, 0x73, 0x5d, 0x19, 0xf4, 0x3b, 0x6f, 0xf2, 0xcc, 0x06, 0x0d, - 0x25, 0x20, 0xe6, 0x63, 0x45, 0xf0, 0x6f, 0xfa, 0x5b, 0x2e, 0x22, 0xa4, 0x41, 0xf4, 0xad, 0x16, - 0x11, 0xe7, 0x36, 0x3b, 0x49, 0x11, 0x06, 0xfd, 0xce, 0xfc, 0x71, 0x14, 0xf5, 0x2d, 0x17, 0xc1, - 0x14, 0xf5, 0xed, 0x15, 0x41, 0x65, 0x12, 0x38, 0x3e, 0x48, 0x53, 0x85, 0x2c, 0xa5, 0x0b, 0x91, - 0xbe, 0xfb, 0x04, 0x47, 0xd7, 0xfe, 0xa0, 0x70, 0x81, 0x2b, 0xeb, 0xe7, 0x50, 0x0c, 0x53, 0xd8, - 0xb7, 0x5b, 0xcc, 0x3f, 0x2c, 0xf0, 0x94, 0x74, 0xb5, 0x0d, 0xed, 0xb1, 0x5f, 0xef, 0x91, 0xaf, - 0x85, 0xce, 0x68, 0x5f, 0xbb, 0x76, 0x94, 0x89, 0xa1, 0x33, 0x4e, 0x27, 0xda, 0x57, 0x29, 0xdb, - 0xf1, 0x5c, 0x33, 0x49, 0x4d, 0xde, 0x83, 0x09, 0x0d, 0xa4, 0x76, 0x82, 0xfc, 0x51, 0x1d, 0x9d, - 0xdd, 0x6d, 0xda, 0x26, 0xa5, 0xf5, 0x17, 0x05, 0x98, 0xca, 0x78, 0x86, 0x1e, 0x1d, 0x25, 0x68, - 0x61, 0xa9, 0x89, 0x4a, 0x3c, 0x83, 0x87, 0xd9, 0x71, 0x8c, 0xf5, 0x57, 0x11, 0xe2, 0x73, 0x22, - 0xda, 0x93, 0xf9, 0x7d, 0xda, 0xe3, 0x8e, 0xd9, 0xcf, 0xe4, 0xeb, 0xe4, 0x24, 0x04, 0x88, 0x6b, - 0x22, 0x5c, 0xd2, 0x35, 0xb6, 0x5d, 0xd6, 0xde, 0xdb, 0x7f, 0x29, 0x0f, 0xfe, 0x6b, 0xc5, 0x58, - 0xbf, 0xd6, 0x07, 0x67, 0x33, 0xda, 0x5f, 0xa3, 0xd1, 0x5f, 0x86, 0x0a, 0x9e, 0xc0, 0x58, 0x5c, - 0x99, 0xb0, 0xd4, 0x8f, 0x9e, 0x9b, 0x2d, 0x7c, 0xfd, 0x22, 0xd6, 0x41, 0xf8, 0x52, 0x94, 0xa0, - 0x17, 0x64, 0xfd, 0x61, 0x1f, 0x9c, 0xdd, 0x6e, 0x87, 0x78, 0x03, 0x72, 0xc5, 0x7b, 0x42, 0xbd, - 0xc8, 0x0f, 0x9e, 0xe1, 0xad, 0x2d, 0xf2, 0x36, 0x0c, 0x2e, 0xd3, 0x56, 0xcb, 0x17, 0xe3, 0xff, - 0xa2, 0x8c, 0x5e, 0x4a, 0x52, 0x23, 0xd1, 0xf2, 0x29, 0x9b, 0x53, 0x93, 0xf7, 0x60, 0x74, 0x99, - 0x3a, 0x41, 0xb4, 0x4b, 0x1d, 0x69, 0x0e, 0xc9, 0xa7, 0x7e, 0x34, 0x16, 0x41, 0xb0, 0x7c, 0xca, - 0x8e, 0xa9, 0xc9, 0x3c, 0x0c, 0x6c, 0xfa, 0xde, 0x9e, 0xca, 0xf6, 0x90, 0x53, 0x20, 0xa3, 0x59, - 0x3e, 0x65, 0x23, 0x2d, 0x59, 0x83, 0x89, 0xca, 0x1e, 0xf5, 0xa2, 0xc4, 0x81, 0xfc, 0xb5, 0x3c, - 0x66, 0x83, 0x78, 0xf9, 0x94, 0x6d, 0x72, 0x93, 0x0f, 0x60, 0xf8, 0x9e, 0xef, 0x37, 0x77, 0x9f, - 0xc9, 0x9c, 0x25, 0xe5, 0x3c, 0x41, 0x82, 0x6c, 0xf9, 0x94, 0x2d, 0x39, 0xaa, 0x83, 0xd0, 0xbf, - 0x16, 0xee, 0x59, 0x87, 0x05, 0x28, 0x2d, 0xfa, 0x4f, 0xbd, 0x4c, 0xad, 0x7e, 0xcf, 0xd4, 0xaa, - 0x14, 0x9f, 0x41, 0x9f, 0xd0, 0xeb, 0x5b, 0x30, 0xb0, 0xe9, 0x7a, 0x7b, 0x89, 0xad, 0x60, 0x06, - 0x1f, 0xa3, 0x42, 0xf5, 0xb8, 0xde, 0x1e, 0x59, 0x95, 0xfb, 0x7b, 0xe1, 0xc7, 0xec, 0x37, 0x8c, - 0x8a, 0x0c, 0x6e, 0x9d, 0x3a, 0xde, 0xc7, 0xf3, 0xdf, 0xb2, 0x81, 0xaf, 0xc3, 0x6c, 0x4e, 0xb9, - 0x5a, 0x80, 0xc9, 0x00, 0x6e, 0x6c, 0x5e, 0x83, 0x99, 0xcc, 0xfe, 0x4b, 0x11, 0xfe, 0xf3, 0xac, - 0x81, 0xc8, 0x5b, 0x5e, 0x8a, 0xa3, 0x32, 0xb8, 0x5f, 0x49, 0x05, 0x62, 0xcc, 0x69, 0x1f, 0xaa, - 0x4c, 0x4e, 0x24, 0xbf, 0xc7, 0x1d, 0x2d, 0x19, 0x1c, 0xff, 0x9c, 0xde, 0x7f, 0x81, 0x8f, 0x46, - 0xc9, 0x62, 0x65, 0x2e, 0xfb, 0x61, 0xe4, 0xa9, 0xc8, 0x78, 0x5b, 0xfd, 0x26, 0x37, 0xa0, 0x28, - 0xdf, 0xbb, 0x11, 0x0f, 0x6b, 0x05, 0x22, 0xbc, 0x23, 0x05, 0x27, 0xef, 0xc2, 0x6c, 0x12, 0x26, - 0x5b, 0xc9, 0x6f, 0xa0, 0xe6, 0xa1, 0xad, 0x3f, 0xee, 0xc3, 0x7c, 0xfd, 0x5d, 0xc6, 0x35, 0xd3, - 0xee, 0x46, 0x4d, 0xc6, 0xf9, 0x6c, 0xd4, 0xc8, 0x05, 0x18, 0xdd, 0xa8, 0x19, 0x0f, 0x09, 0xda, - 0x31, 0x80, 0x55, 0x9b, 0x35, 0xa1, 0x12, 0x34, 0xf6, 0xdd, 0x88, 0x36, 0xa2, 0x4e, 0x20, 0x03, - 0x7f, 0x52, 0x70, 0x62, 0xc1, 0xf8, 0xbd, 0x96, 0xbb, 0xdb, 0x90, 0xc2, 0xb8, 0x0a, 0x0c, 0x18, - 0x79, 0x15, 0x26, 0x57, 0xbc, 0x30, 0x72, 0x5a, 0xad, 0x35, 0x1a, 0xed, 0xfb, 0x4d, 0xf1, 0x4c, - 0xb2, 0x9d, 0x80, 0xb2, 0x72, 0x17, 0x7c, 0x2f, 0x72, 0x5c, 0x8f, 0x06, 0x76, 0xc7, 0x8b, 0xdc, - 0x03, 0x2a, 0xda, 0x9e, 0x82, 0x93, 0xb7, 0x60, 0x46, 0xc1, 0x36, 0x82, 0xc6, 0x3e, 0x0d, 0xa3, - 0x00, 0x9f, 0x17, 0xc5, 0x18, 0x38, 0x3b, 0x1b, 0x89, 0x25, 0xb4, 0xfc, 0x4e, 0x73, 0xc9, 0x7b, - 0xe2, 0x06, 0x3e, 0x3f, 0x8e, 0x1e, 0x11, 0x25, 0x24, 0xe0, 0xd6, 0x6f, 0x8f, 0x64, 0x7e, 0xb6, - 0x2f, 0x32, 0x06, 0xbf, 0x80, 0xf1, 0x05, 0xa7, 0xed, 0xec, 0xba, 0x2d, 0x37, 0x72, 0xd5, 0x3b, - 0x8c, 0x6f, 0xf7, 0xf8, 0xe6, 0xe5, 0x0b, 0x48, 0xb4, 0xa9, 0x33, 0xdb, 0x86, 0xa8, 0xb9, 0x3f, - 0x1f, 0x82, 0x99, 0x4c, 0x3a, 0x72, 0x5d, 0x3c, 0xd8, 0xa8, 0xe6, 0x55, 0xf1, 0x1a, 0xa0, 0x9d, - 0x04, 0xb3, 0xbe, 0x44, 0xd0, 0x42, 0x8b, 0x3a, 0x5e, 0x47, 0xbc, 0x05, 0x68, 0x1b, 0x30, 0xd6, - 0x97, 0x6c, 0xdf, 0xa0, 0x09, 0xc3, 0x8b, 0x0d, 0x76, 0x02, 0x8a, 0x71, 0x63, 0x9d, 0x68, 0x5f, - 0x8a, 0x1a, 0xe0, 0x57, 0x70, 0x35, 0x10, 0x93, 0xb4, 0xee, 0x37, 0xa9, 0x26, 0x69, 0x90, 0x4b, - 0x32, 0xa1, 0x4c, 0x12, 0x83, 0x48, 0x49, 0x43, 0x5c, 0x92, 0x06, 0x22, 0xaf, 0xc0, 0x44, 0xa5, - 0xdd, 0xd6, 0x04, 0xe1, 0x23, 0x80, 0xb6, 0x09, 0x24, 0x97, 0x00, 0x2a, 0xed, 0xb6, 0x14, 0x83, - 0x0f, 0xfc, 0xd9, 0x1a, 0x84, 0xdc, 0x8c, 0x53, 0x2e, 0x6a, 0xa2, 0xf0, 0xa8, 0xc2, 0xce, 0xc0, - 0x30, 0xbd, 0xaa, 0xfc, 0x74, 0x42, 0x28, 0x70, 0xbd, 0x26, 0xc0, 0xe4, 0x43, 0x38, 0x97, 0x08, - 0x3d, 0xd1, 0x0a, 0xc0, 0x63, 0x04, 0x3b, 0x9f, 0x80, 0xbc, 0x03, 0x67, 0x13, 0x48, 0x59, 0x1c, - 0x9e, 0x18, 0xd8, 0x39, 0x58, 0xf2, 0x3e, 0x94, 0x12, 0x69, 0x15, 0xe2, 0x42, 0xf1, 0x74, 0xc0, - 0xce, 0xc5, 0xb3, 0xaf, 0x2b, 0x71, 0x3f, 0x53, 0x14, 0x89, 0x07, 0xa1, 0x76, 0x36, 0x92, 0x2c, - 0x43, 0x39, 0x33, 0x9c, 0x47, 0x2b, 0x18, 0x1f, 0x2e, 0xb4, 0x7b, 0x91, 0x91, 0x2a, 0x5c, 0xc8, - 0x24, 0x91, 0xd5, 0xc0, 0xe7, 0x0c, 0xed, 0xae, 0x34, 0x64, 0x1e, 0xa6, 0xe3, 0xb0, 0x26, 0xad, - 0x0a, 0xf8, 0x92, 0xa1, 0x9d, 0x89, 0x23, 0x6f, 0x98, 0xc9, 0x33, 0x78, 0x61, 0xf8, 0x90, 0xa1, - 0x9d, 0x46, 0x58, 0x47, 0x05, 0xb8, 0x90, 0xb9, 0x50, 0xca, 0xfd, 0xfc, 0x5c, 0x72, 0xe3, 0xa8, - 0xcd, 0x05, 0x37, 0x44, 0xac, 0x22, 0xf7, 0x43, 0xcb, 0x58, 0x70, 0xe4, 0xe7, 0xa2, 0x1e, 0xc4, - 0x91, 0x8b, 0xf7, 0xd4, 0xb9, 0x63, 0x3f, 0x7a, 0x32, 0x6e, 0x25, 0x37, 0x50, 0x19, 0x85, 0xeb, - 0xe7, 0x8f, 0xf2, 0xa4, 0xf1, 0x45, 0x8e, 0x78, 0xfe, 0xb8, 0x00, 0xe5, 0x1e, 0xfb, 0x03, 0xd5, - 0xa6, 0xc2, 0x31, 0xda, 0x74, 0x5f, 0xb5, 0x89, 0xdf, 0x5d, 0x9f, 0x3f, 0xde, 0x1e, 0xe4, 0x65, - 0x37, 0xeb, 0x2f, 0x0a, 0x40, 0xd2, 0xfb, 0x50, 0xf2, 0x5d, 0x18, 0xad, 0xd5, 0x96, 0x8d, 0xa0, - 0xc6, 0xd4, 0xc9, 0x53, 0x4c, 0x41, 0x6e, 0x1f, 0x2b, 0x8a, 0x51, 0x8f, 0x61, 0xfc, 0x24, 0x15, - 0x3a, 0xd9, 0xdf, 0x35, 0x74, 0x32, 0x15, 0x38, 0xb9, 0x94, 0x11, 0x0b, 0x38, 0xd0, 0x23, 0x16, - 0x30, 0x1d, 0xe8, 0x67, 0x2d, 0x42, 0x29, 0x6f, 0x2b, 0x8b, 0x33, 0x1c, 0x4f, 0x54, 0xa8, 0x9d, - 0x9e, 0xf1, 0x19, 0xce, 0x04, 0x5b, 0xef, 0xc0, 0x59, 0xc5, 0xcd, 0x5f, 0x40, 0xd2, 0x32, 0x84, - 0x08, 0xfb, 0x57, 0x65, 0x22, 0x89, 0x01, 0xd6, 0x1f, 0x0d, 0xa4, 0x18, 0x6b, 0x9d, 0x83, 0x03, - 0x27, 0x78, 0x46, 0x2a, 0x26, 0x63, 0x7f, 0x4f, 0x93, 0xa3, 0x3a, 0xf0, 0x93, 0xc3, 0xf2, 0x29, - 0x4d, 0x3a, 0x5b, 0x17, 0x70, 0x87, 0xe1, 0x35, 0x28, 0x3f, 0x77, 0xeb, 0xe3, 0x59, 0xd0, 0x0c, - 0x20, 0xd9, 0x81, 0x09, 0xb1, 0x76, 0xe3, 0x6f, 0xf9, 0x8d, 0xdd, 0x4e, 0x7e, 0x63, 0x46, 0xf5, - 0x6e, 0x1a, 0x2c, 0x7c, 0x34, 0x9a, 0x62, 0xc8, 0x17, 0x30, 0x29, 0x77, 0x6a, 0x42, 0x30, 0x8f, - 0x94, 0xba, 0xd3, 0x5d, 0xb0, 0xc9, 0xc3, 0x25, 0x27, 0x04, 0xb1, 0x2a, 0xcb, 0xc9, 0x8e, 0x4b, - 0x1e, 0x3c, 0x4e, 0x95, 0x0d, 0x16, 0x51, 0x65, 0x03, 0x36, 0xf7, 0x29, 0x90, 0x74, 0xbb, 0x7a, - 0x7d, 0x4e, 0x13, 0xda, 0xe7, 0x34, 0x57, 0x81, 0xa9, 0x8c, 0x06, 0x9c, 0x48, 0xc4, 0xa7, 0x40, - 0xd2, 0x35, 0x3d, 0x89, 0x04, 0xeb, 0x3a, 0xbc, 0xaa, 0x54, 0xa0, 0x46, 0x83, 0x21, 0x53, 0x7a, - 0xc0, 0x7f, 0xa5, 0x0f, 0xca, 0x3d, 0x48, 0xc9, 0x3f, 0x2e, 0x24, 0xb5, 0xcd, 0x47, 0xe3, 0x7b, - 0x49, 0x6d, 0x67, 0xf3, 0x67, 0xa8, 0xbd, 0xfa, 0xfe, 0xaf, 0xfe, 0xe9, 0x73, 0x5b, 0x1e, 0xe9, - 0x2e, 0x3b, 0xb9, 0xb6, 0x06, 0x74, 0x6d, 0xed, 0xc0, 0xb4, 0x61, 0xb3, 0x1d, 0x67, 0xf1, 0xb2, - 0x00, 0xc4, 0x63, 0xcc, 0xab, 0xfe, 0x9e, 0x78, 0x33, 0xba, 0xaf, 0x54, 0xb0, 0x35, 0xa8, 0x75, - 0x17, 0x66, 0x12, 0x72, 0x85, 0x67, 0xfe, 0xbb, 0xa0, 0xb2, 0x41, 0xa0, 0xe0, 0xfe, 0xea, 0x99, - 0x9f, 0x1d, 0x96, 0x27, 0xd8, 0xb6, 0xfe, 0x66, 0xfc, 0x20, 0x87, 0xfc, 0xcb, 0x5a, 0xd3, 0xcf, - 0x16, 0x2a, 0x2d, 0x3d, 0x4b, 0x16, 0xb9, 0x03, 0x43, 0x1c, 0x92, 0x48, 0x7b, 0xaf, 0x53, 0x8b, - 0x79, 0x41, 0x10, 0x5a, 0x33, 0x78, 0x77, 0x1d, 0x7f, 0x54, 0xe2, 0x5c, 0x2b, 0xd6, 0x36, 0x7f, - 0x06, 0x2a, 0x06, 0xab, 0xd4, 0xfa, 0x03, 0x95, 0x38, 0x27, 0x8c, 0x0c, 0x32, 0x91, 0x74, 0x9e, - 0xff, 0xb4, 0x45, 0x9b, 0xfc, 0xfd, 0xce, 0xea, 0xb8, 0x08, 0x32, 0x19, 0x70, 0x98, 0x00, 0x64, - 0xb3, 0x3e, 0x81, 0x19, 0xb6, 0x5b, 0x08, 0x92, 0xe5, 0xe1, 0xe3, 0x2f, 0x0c, 0x66, 0x5e, 0x51, - 0x71, 0x18, 0x08, 0xaf, 0xa8, 0x08, 0xa4, 0xb5, 0x0a, 0xe7, 0xb8, 0x67, 0x52, 0x6f, 0x52, 0x7c, - 0x0e, 0x30, 0x88, 0xbf, 0x13, 0x37, 0x9f, 0x33, 0x5a, 0xcf, 0xe9, 0xac, 0x8f, 0xf1, 0x6a, 0x9d, - 0x18, 0xa8, 0xae, 0xef, 0xc5, 0x6e, 0xc8, 0xe3, 0xdd, 0xc5, 0xff, 0xab, 0x70, 0xa1, 0xd2, 0x6e, - 0x53, 0xaf, 0x19, 0x33, 0x6e, 0x05, 0xce, 0x31, 0x33, 0xa5, 0x90, 0x0a, 0x0c, 0x22, 0xb5, 0x3a, - 0xa0, 0x15, 0xd5, 0xcd, 0xa8, 0x0e, 0xd2, 0x89, 0x3c, 0xc8, 0x58, 0x00, 0xe7, 0xb4, 0x9a, 0x30, - 0x5b, 0xeb, 0xec, 0x1e, 0xb8, 0x11, 0x5e, 0x6c, 0xc1, 0x6c, 0x43, 0xb2, 0xec, 0x15, 0xf9, 0x72, - 0x1f, 0x57, 0xc6, 0xf5, 0xf8, 0x0a, 0x16, 0xde, 0x8d, 0x11, 0x19, 0x88, 0x9e, 0xdc, 0xb9, 0x19, - 0xb3, 0xa2, 0x0b, 0x86, 0x97, 0x82, 0x68, 0xf1, 0xba, 0x9f, 0x35, 0x05, 0x67, 0xf4, 0x03, 0x29, - 0x3e, 0x42, 0x66, 0x60, 0xca, 0x3c, 0x68, 0xe2, 0xe0, 0xaf, 0x61, 0x9a, 0x3b, 0xc2, 0xf9, 0x3b, - 0x06, 0xf3, 0x71, 0xca, 0xfe, 0xbe, 0x9d, 0xf9, 0xc4, 0x7d, 0x08, 0x0c, 0x93, 0x56, 0x2f, 0xd4, - 0xec, 0xcc, 0xf3, 0xeb, 0xd1, 0x4f, 0xe6, 0x8d, 0xa3, 0xd2, 0xbe, 0x9d, 0xf9, 0xea, 0xb0, 0xc8, - 0x07, 0xcd, 0xa4, 0xf3, 0xee, 0xff, 0x56, 0xa4, 0xcf, 0x63, 0x46, 0x8e, 0x65, 0xea, 0xe0, 0xed, - 0xb9, 0xec, 0xbc, 0x06, 0x93, 0xd0, 0xa7, 0x12, 0xbe, 0xf6, 0xb9, 0x4d, 0xeb, 0xf7, 0x0a, 0x70, - 0x9d, 0x6f, 0xc8, 0xb2, 0xf9, 0xf0, 0xd4, 0x29, 0x87, 0x99, 0xbc, 0x0b, 0x83, 0xa1, 0x16, 0x7d, - 0x61, 0x89, 0x9a, 0x77, 0x93, 0xc4, 0x19, 0x48, 0x05, 0xc6, 0xf5, 0x4b, 0x62, 0xc7, 0xcb, 0x25, - 0x69, 0x8f, 0x1d, 0x3c, 0x72, 0xd4, 0xc5, 0xb1, 0xc7, 0x70, 0x7e, 0xe9, 0x1b, 0x36, 0x20, 0xc4, - 0x0a, 0x25, 0xac, 0x87, 0xf8, 0xde, 0xfc, 0xe9, 0x2d, 0x31, 0x62, 0x4c, 0xd3, 0x3e, 0x09, 0x66, - 0x76, 0xb2, 0x5c, 0xe4, 0xe2, 0xdb, 0x44, 0xb6, 0x01, 0xb3, 0xfe, 0xa8, 0x00, 0x17, 0xb2, 0x4b, - 0x13, 0x13, 0xcb, 0x0a, 0x9c, 0x59, 0x70, 0x3c, 0xdf, 0x73, 0x1b, 0x4e, 0xab, 0xd6, 0xd8, 0xa7, - 0xcd, 0x8e, 0xca, 0x1a, 0xad, 0x66, 0x99, 0x3d, 0xea, 0x49, 0x76, 0x49, 0x62, 0xa7, 0xb9, 0x98, - 0x85, 0x88, 0xb7, 0x44, 0xf8, 0xdc, 0xdb, 0xa2, 0x81, 0x92, 0xc7, 0x6b, 0x96, 0x83, 0x25, 0xb7, - 0xa5, 0xc7, 0xbf, 0xb9, 0xed, 0xb9, 0x91, 0x62, 0xe2, 0xae, 0x9e, 0x2c, 0x94, 0xf5, 0x1f, 0x0a, - 0x70, 0x0e, 0x1f, 0x8a, 0x33, 0x9e, 0x9e, 0x8d, 0x93, 0xa7, 0xcb, 0xfc, 0xdf, 0x05, 0xe3, 0xd6, - 0x8b, 0x41, 0x6d, 0x26, 0x02, 0x27, 0x6f, 0xc0, 0x40, 0x4d, 0x46, 0x83, 0x4d, 0x26, 0x1e, 0x0d, - 0x17, 0x1c, 0x0c, 0x6f, 0x23, 0x15, 0xb3, 0xe1, 0x17, 0x69, 0xd8, 0xa0, 0x1e, 0xbe, 0xee, 0xce, - 0x3d, 0x0f, 0x1a, 0x24, 0xce, 0x6b, 0x36, 0x90, 0x97, 0xd7, 0x6c, 0xd0, 0xcc, 0x6b, 0x66, 0x3d, - 0xe1, 0xcf, 0xc4, 0x25, 0x1b, 0x24, 0x3a, 0xe9, 0xe3, 0xd4, 0x63, 0xf0, 0x7c, 0x1d, 0x38, 0x9b, - 0xd5, 0x32, 0xb6, 0x49, 0x4f, 0xbc, 0xf3, 0x9e, 0x9f, 0xac, 0x7c, 0x13, 0x5e, 0x31, 0x68, 0x2b, - 0xad, 0x96, 0xff, 0x94, 0x36, 0x37, 0x03, 0xff, 0xc0, 0x8f, 0x8c, 0x67, 0xb2, 0x4e, 0x3b, 0x3a, - 0x9d, 0x5a, 0x8c, 0x93, 0x60, 0xeb, 0xaf, 0xc0, 0xb5, 0x1e, 0x12, 0x45, 0xa3, 0x6a, 0x70, 0xc6, - 0x49, 0xe0, 0x64, 0x58, 0xcf, 0xb5, 0xac, 0x76, 0x25, 0x05, 0x85, 0x76, 0x9a, 0xff, 0xc6, 0x96, - 0xf1, 0x80, 0x3a, 0x29, 0xc1, 0xf4, 0xa6, 0xbd, 0xb1, 0xb8, 0xbd, 0xb0, 0x55, 0xdf, 0xfa, 0x62, - 0x73, 0xa9, 0xbe, 0xbd, 0xfe, 0x60, 0x7d, 0xe3, 0xe1, 0x3a, 0xcf, 0xf6, 0x6f, 0x60, 0xb6, 0x96, - 0x2a, 0x6b, 0xc5, 0x02, 0x99, 0x86, 0xa2, 0x01, 0x5e, 0xda, 0xae, 0x16, 0xfb, 0x6e, 0x7c, 0x6d, - 0x3c, 0x0c, 0x4e, 0x2e, 0x40, 0xa9, 0xb6, 0xbd, 0xb9, 0xb9, 0x61, 0x2b, 0xa9, 0xfa, 0x5b, 0x03, - 0x33, 0x70, 0xc6, 0xc0, 0xde, 0xb5, 0x97, 0x96, 0x8a, 0x05, 0x56, 0x15, 0x03, 0xbc, 0x69, 0x2f, - 0xad, 0xad, 0x6c, 0xaf, 0x15, 0xfb, 0x6e, 0xd4, 0xf5, 0xcb, 0x9a, 0xe4, 0x3c, 0xcc, 0x2e, 0x2e, - 0xed, 0xac, 0x2c, 0x2c, 0x65, 0xc9, 0x9e, 0x86, 0xa2, 0x8e, 0xdc, 0xda, 0xd8, 0xda, 0xe4, 0xa2, - 0x75, 0xe8, 0xc3, 0xa5, 0x6a, 0x65, 0x7b, 0x6b, 0x79, 0xbd, 0xd8, 0x6f, 0x0d, 0x8c, 0xf4, 0x15, - 0xfb, 0x6e, 0xfc, 0xc0, 0xb8, 0xc9, 0xc9, 0xaa, 0x2f, 0xc8, 0xb7, 0x6b, 0x95, 0x7b, 0xf9, 0x45, - 0x70, 0xec, 0xda, 0xdd, 0x4a, 0xb1, 0x40, 0x2e, 0xc2, 0x39, 0x03, 0xba, 0x59, 0xa9, 0xd5, 0x1e, - 0x6e, 0xd8, 0x8b, 0xab, 0x4b, 0xb5, 0x5a, 0xb1, 0xef, 0xc6, 0x8e, 0x91, 0xcb, 0x91, 0x95, 0xb0, - 0x76, 0xb7, 0x52, 0xb7, 0x97, 0x3e, 0xdb, 0x5e, 0xb1, 0x97, 0x16, 0xd3, 0x25, 0x18, 0xd8, 0x2f, - 0x96, 0x6a, 0xc5, 0x02, 0x99, 0x82, 0xd3, 0x06, 0x74, 0x7d, 0xa3, 0xd8, 0x77, 0xe3, 0x55, 0x91, - 0xee, 0x8f, 0x4c, 0x02, 0x2c, 0x2e, 0xd5, 0x16, 0x96, 0xd6, 0x17, 0x57, 0xd6, 0xef, 0x15, 0x4f, - 0x91, 0x09, 0x18, 0xad, 0xa8, 0x9f, 0x85, 0x1b, 0xef, 0xc3, 0xe9, 0x84, 0x79, 0xcf, 0x28, 0x94, - 0x61, 0x5c, 0x3c, 0x85, 0xea, 0x97, 0x3f, 0xd1, 0xc7, 0xca, 0x2d, 0xf5, 0x62, 0xe1, 0x46, 0x55, - 0xbe, 0x25, 0xad, 0x7d, 0xe7, 0x64, 0x0c, 0x86, 0x17, 0x97, 0xee, 0x56, 0xb6, 0x57, 0xb7, 0x8a, - 0xa7, 0xd8, 0x8f, 0x05, 0x7b, 0xa9, 0xb2, 0xb5, 0xb4, 0x58, 0x2c, 0x90, 0x51, 0x18, 0xac, 0x6d, - 0x55, 0xb6, 0x96, 0x8a, 0x7d, 0x64, 0x04, 0x06, 0xb6, 0x6b, 0x4b, 0x76, 0xb1, 0x7f, 0xfe, 0xdf, - 0xfc, 0xa3, 0x02, 0x77, 0x34, 0xca, 0x3b, 0x5d, 0x5f, 0x6b, 0x06, 0xa5, 0x98, 0xf2, 0xc4, 0xc3, - 0xb9, 0xb9, 0xd6, 0x23, 0xee, 0x02, 0xe6, 0xba, 0x9c, 0xbc, 0x20, 0xc1, 0xf5, 0xc2, 0xed, 0x02, - 0xb1, 0x31, 0x52, 0x25, 0x61, 0x5f, 0x29, 0xc9, 0xd9, 0x26, 0xf0, 0xdc, 0xc5, 0xae, 0x66, 0x19, - 0xf9, 0x25, 0xb0, 0x74, 0x99, 0x39, 0x56, 0xc8, 0x77, 0x8f, 0x67, 0x6d, 0xc8, 0x32, 0x5f, 0x3d, - 0x1e, 0x39, 0xb9, 0x0f, 0x13, 0x6c, 0x6f, 0xae, 0xc8, 0xc8, 0xf9, 0x24, 0xa3, 0x66, 0x12, 0xcc, - 0x5d, 0xc8, 0x46, 0xaa, 0xb7, 0xad, 0xc6, 0xb1, 0x21, 0xdc, 0xb8, 0x0e, 0x89, 0x4c, 0x09, 0x23, - 0x21, 0x7c, 0xc6, 0x9f, 0x3b, 0x93, 0x00, 0xef, 0xdc, 0xb9, 0x5d, 0x20, 0x35, 0xcc, 0xc7, 0x68, - 0x6c, 0xf2, 0x89, 0xbc, 0x64, 0x98, 0xde, 0xfd, 0xf3, 0xda, 0x94, 0xd5, 0x4b, 0xb4, 0x39, 0xd6, - 0xc1, 0x3a, 0x90, 0xf4, 0xde, 0x99, 0x5c, 0x8e, 0xc7, 0x41, 0xf6, 0xb6, 0x7a, 0xee, 0x6c, 0x2a, - 0xb8, 0x71, 0x89, 0xed, 0x9e, 0xc8, 0x12, 0x4c, 0x8a, 0x7c, 0x0f, 0x62, 0x37, 0x4f, 0xba, 0xd9, - 0x03, 0xb9, 0x62, 0xee, 0xa1, 0x9e, 0x94, 0x45, 0x40, 0xe6, 0xe2, 0x76, 0x24, 0xcd, 0x84, 0xb9, - 0xf3, 0x99, 0x38, 0xd1, 0xbe, 0xbb, 0x30, 0x69, 0x1a, 0x17, 0x44, 0x76, 0x50, 0xa6, 0xcd, 0x91, - 0x5b, 0xa1, 0x3a, 0xcc, 0xae, 0x39, 0x2e, 0x9e, 0x97, 0x88, 0x08, 0x3a, 0x19, 0xa4, 0x46, 0xca, - 0x5d, 0xa2, 0xd6, 0x6a, 0xd4, 0x6b, 0xaa, 0x4e, 0xc8, 0x7b, 0xa7, 0x02, 0x3f, 0x9b, 0x9a, 0xdc, - 0x23, 0x9b, 0x01, 0x84, 0xc4, 0x32, 0x5f, 0x17, 0xcf, 0x8a, 0x09, 0x9d, 0xcb, 0x0b, 0x63, 0x26, - 0x6b, 0xb8, 0x49, 0x4f, 0x48, 0xd4, 0xc6, 0xc4, 0x89, 0xc5, 0x95, 0x30, 0xeb, 0x48, 0xe4, 0x26, - 0xe3, 0x91, 0x43, 0x92, 0xa3, 0xb8, 0x5c, 0x61, 0xb7, 0x0b, 0xe4, 0x6b, 0xfc, 0xaa, 0x33, 0xc5, - 0x3d, 0x74, 0xa3, 0x7d, 0xb1, 0xfb, 0x39, 0x9f, 0x29, 0x40, 0x7c, 0x28, 0x5d, 0xa4, 0xdb, 0x30, - 0x9d, 0x15, 0x39, 0xad, 0x14, 0xda, 0x25, 0xac, 0x3a, 0x77, 0x14, 0xd8, 0xcc, 0xd4, 0x68, 0xe6, - 0x77, 0x52, 0x97, 0xc0, 0xdd, 0x5c, 0x99, 0x1f, 0xc2, 0x24, 0x1b, 0x25, 0x0f, 0x28, 0x6d, 0x57, - 0x5a, 0xee, 0x13, 0x1a, 0x12, 0x99, 0x4c, 0x5b, 0x81, 0xf2, 0x78, 0xaf, 0x17, 0xc8, 0x77, 0x60, - 0xec, 0xa1, 0x13, 0x35, 0xf6, 0x45, 0x52, 0x59, 0x99, 0x73, 0x16, 0x61, 0x73, 0xf2, 0x17, 0x22, - 0x6f, 0x17, 0xc8, 0x47, 0x30, 0x7c, 0x8f, 0x46, 0x78, 0xc9, 0xfb, 0x8a, 0x0a, 0xf4, 0xe3, 0xfe, - 0xc9, 0x15, 0x4f, 0x5d, 0x11, 0x92, 0x15, 0x4e, 0x3a, 0x73, 0xc9, 0x2d, 0x00, 0x3e, 0x21, 0xa0, - 0x84, 0x24, 0x7a, 0x2e, 0x55, 0x6d, 0x72, 0x8f, 0x6d, 0x1e, 0x5a, 0x34, 0xa2, 0xc7, 0x2d, 0x32, - 0x4f, 0x47, 0xab, 0x30, 0xa9, 0x9e, 0x03, 0x5b, 0xc7, 0xdc, 0x3f, 0x56, 0x42, 0x58, 0x78, 0x02, - 0x69, 0xef, 0xb3, 0xaf, 0x82, 0xbf, 0x85, 0x8d, 0x49, 0x62, 0x70, 0x26, 0x9d, 0xd5, 0x33, 0xcd, - 0xe8, 0x53, 0xa8, 0x54, 0x22, 0x27, 0xd3, 0x78, 0x97, 0xfd, 0x30, 0x32, 0x79, 0x15, 0x24, 0x9b, - 0xf7, 0x17, 0x61, 0x4e, 0x2f, 0xd7, 0xcc, 0x6a, 0x1e, 0xcf, 0xb9, 0x79, 0xc9, 0xd2, 0xe7, 0xae, - 0x74, 0xa1, 0x10, 0xf6, 0x5b, 0xff, 0xaf, 0xf7, 0x15, 0x70, 0x3a, 0x59, 0x84, 0x29, 0x59, 0xd6, - 0x46, 0x9b, 0x7a, 0xb5, 0xda, 0x32, 0x3e, 0xfd, 0x24, 0xc3, 0x4a, 0x34, 0x98, 0x94, 0x4e, 0xd2, - 0x28, 0xb6, 0xf4, 0x19, 0xc9, 0x60, 0x48, 0xb7, 0x14, 0x31, 0xf1, 0xd2, 0x97, 0x99, 0x6e, 0xfb, - 0x01, 0x77, 0x2a, 0x19, 0x9b, 0xff, 0x9d, 0x79, 0xd2, 0xc5, 0x00, 0x9a, 0xcb, 0x31, 0x21, 0x6e, - 0x17, 0xc8, 0x17, 0x40, 0xd2, 0x26, 0x89, 0x52, 0x61, 0xae, 0xf9, 0xa5, 0x54, 0xd8, 0xc5, 0x9e, - 0xb9, 0x07, 0x33, 0x2a, 0x15, 0x94, 0x56, 0xea, 0x3c, 0xc9, 0xa9, 0x4d, 0x5e, 0x2d, 0xc9, 0x27, - 0x30, 0x25, 0x06, 0xad, 0x8e, 0x20, 0x45, 0x35, 0xff, 0x08, 0xab, 0x24, 0x77, 0x9c, 0xde, 0x87, - 0x99, 0x5a, 0x42, 0x63, 0x3c, 0xd2, 0xfe, 0x9c, 0x29, 0x02, 0x81, 0x35, 0x1a, 0x71, 0x95, 0x65, - 0xcb, 0x7a, 0x00, 0x84, 0x3b, 0x85, 0xa4, 0xb8, 0x27, 0x2e, 0x7d, 0x4a, 0x2e, 0x26, 0xaa, 0xce, - 0x80, 0x48, 0x86, 0x13, 0x58, 0x6e, 0xcb, 0xb6, 0xf8, 0x4b, 0xee, 0x08, 0x35, 0xce, 0xd1, 0x2f, - 0x1b, 0x0c, 0xc6, 0x51, 0xbc, 0xe8, 0x80, 0x73, 0xb9, 0x14, 0xe4, 0x97, 0x31, 0x07, 0x73, 0x77, - 0xb3, 0x8a, 0x7c, 0x27, 0xcb, 0xfa, 0xcd, 0x31, 0x0c, 0xe7, 0xde, 0x38, 0x1e, 0xb1, 0x32, 0x64, - 0x27, 0xee, 0xd1, 0x68, 0xb3, 0xd5, 0xd9, 0x73, 0xf1, 0x8d, 0x5f, 0xa2, 0x9c, 0x46, 0x0a, 0x24, - 0xc6, 0xa5, 0x4c, 0x7d, 0x18, 0x23, 0x6a, 0xf4, 0x87, 0x64, 0x05, 0x8a, 0x7c, 0xfe, 0xd7, 0x44, - 0x5c, 0x4c, 0x89, 0x10, 0x24, 0x4e, 0xe0, 0x1c, 0x84, 0xb9, 0xbd, 0x75, 0x8b, 0x07, 0x2e, 0x11, - 0xf9, 0x4d, 0xea, 0x1b, 0xcc, 0x29, 0x03, 0xa6, 0xde, 0xa5, 0x60, 0x3d, 0x62, 0xd3, 0x90, 0x46, - 0x32, 0xd9, 0x13, 0x7f, 0xe1, 0xf9, 0x6a, 0xbc, 0xd8, 0xa7, 0xb1, 0xf1, 0xa7, 0x9f, 0x48, 0x4c, - 0xb8, 0xf3, 0x26, 0x51, 0xaf, 0x5e, 0x67, 0x08, 0x7d, 0xd5, 0xd8, 0x93, 0x9c, 0x4c, 0xee, 0x5b, - 0xb8, 0x06, 0x61, 0x82, 0xab, 0x99, 0xb8, 0x6e, 0xec, 0xb7, 0xe4, 0x9a, 0xd0, 0xb8, 0x76, 0xe6, - 0x71, 0x4a, 0x63, 0x8b, 0x24, 0xdb, 0xc2, 0x76, 0x82, 0x80, 0x7a, 0x9c, 0x39, 0x6f, 0xbf, 0x91, - 0xc5, 0xfd, 0x31, 0x4e, 0x3d, 0x1a, 0x37, 0xbf, 0x10, 0xd8, 0x4b, 0x04, 0x7f, 0x91, 0xec, 0x76, - 0x81, 0xbc, 0x0b, 0x23, 0xa2, 0x8e, 0x8c, 0xc9, 0xa8, 0x74, 0xd8, 0xa5, 0xd6, 0xc8, 0x09, 0x5c, - 0x49, 0x58, 0x67, 0x93, 0x26, 0xaf, 0xf7, 0x79, 0x9d, 0xdf, 0x65, 0x8b, 0x6d, 0xf3, 0x79, 0x38, - 0x17, 0xe4, 0xaa, 0x8b, 0x9c, 0x25, 0x95, 0x14, 0x49, 0x82, 0x7a, 0x2c, 0x8f, 0x5c, 0x08, 0xdb, - 0x37, 0x63, 0x66, 0x51, 0x95, 0x20, 0x50, 0xed, 0x9b, 0x0d, 0x70, 0xaf, 0xb5, 0x76, 0x05, 0x8a, - 0x95, 0x06, 0xae, 0x04, 0x35, 0x7a, 0xe0, 0xb4, 0xf7, 0xfd, 0x80, 0x2a, 0xa3, 0x25, 0x89, 0x90, - 0xb2, 0x66, 0xd4, 0xce, 0x42, 0x20, 0x56, 0xa9, 0x83, 0xe9, 0xd7, 0x67, 0xd5, 0xd6, 0x22, 0x81, - 0xca, 0xe6, 0xe8, 0x62, 0xa4, 0x4c, 0x2f, 0x30, 0xb3, 0xaa, 0xf5, 0x62, 0x62, 0xde, 0xc7, 0x09, - 0x43, 0x11, 0x87, 0x6a, 0x85, 0x50, 0x20, 0x65, 0xce, 0xc9, 0xbb, 0x41, 0x8a, 0xb4, 0x22, 0xcf, - 0x8d, 0x63, 0xb5, 0xe4, 0x71, 0xe7, 0x15, 0xff, 0x3d, 0x98, 0x5c, 0x62, 0x13, 0x7a, 0xa7, 0xe9, - 0xf2, 0x27, 0x27, 0x88, 0xf9, 0x86, 0x40, 0x2e, 0xe3, 0xb2, 0x7c, 0x04, 0x10, 0x59, 0x85, 0xe9, - 0x2f, 0xd7, 0x14, 0x0d, 0x26, 0xfb, 0x63, 0x5a, 0x8a, 0x15, 0xaf, 0x7e, 0xa0, 0x69, 0x2e, 0x6c, - 0xfd, 0x59, 0xbe, 0x23, 0xac, 0xb4, 0xdb, 0x2d, 0xe9, 0x92, 0xe6, 0x67, 0xef, 0xd7, 0x0c, 0x13, - 0x32, 0x85, 0x97, 0xb2, 0xd3, 0x9b, 0xc6, 0xcf, 0xb5, 0x47, 0xb9, 0x73, 0x64, 0xe6, 0xe0, 0x7b, - 0x8d, 0x45, 0x95, 0x24, 0xbe, 0xd2, 0x6a, 0xa5, 0x98, 0x43, 0xf2, 0xba, 0x29, 0x3d, 0x8b, 0xa6, - 0x57, 0x09, 0x68, 0xa2, 0xf3, 0x5d, 0x57, 0xa5, 0xdd, 0xe6, 0x93, 0xe5, 0x25, 0x35, 0x61, 0x98, - 0x88, 0xb4, 0x89, 0x9e, 0xc4, 0x8b, 0xb9, 0xfd, 0x3e, 0x0e, 0xb3, 0xf8, 0xe5, 0x6e, 0xa2, 0x1b, - 0xbc, 0xc9, 0x87, 0xcb, 0xd5, 0x26, 0x2c, 0x81, 0x54, 0xeb, 0xc4, 0x69, 0xdc, 0xfa, 0xc4, 0xcf, - 0x80, 0x2b, 0xcf, 0x4c, 0x02, 0x2e, 0xe5, 0x5d, 0xca, 0x43, 0x2b, 0x4f, 0x69, 0x51, 0x0c, 0xa6, - 0xb8, 0x82, 0x97, 0x8c, 0xf5, 0x21, 0x5d, 0xc7, 0x72, 0x2e, 0x5e, 0x35, 0xb9, 0x98, 0x7c, 0x98, - 0x5d, 0x09, 0xcd, 0x79, 0xb1, 0x3d, 0xb7, 0x4f, 0xee, 0xc2, 0xb4, 0xde, 0xa3, 0xaa, 0xdd, 0x79, - 0xb3, 0x7f, 0x9e, 0x9c, 0x2d, 0x98, 0xc9, 0x7c, 0x47, 0x5d, 0x2d, 0xb1, 0xdd, 0x5e, 0x59, 0xcf, - 0x95, 0x4a, 0xe1, 0xac, 0xb0, 0xec, 0x13, 0x2f, 0xc7, 0x93, 0x57, 0x4c, 0xc3, 0x3f, 0xfb, 0x61, - 0xf9, 0xb9, 0x6b, 0x3d, 0xa8, 0x84, 0x42, 0xbf, 0xc6, 0x15, 0x30, 0x55, 0xc6, 0x15, 0xcd, 0x15, - 0x90, 0x53, 0x80, 0xd5, 0x8d, 0x44, 0x8d, 0x81, 0xe9, 0x0c, 0x74, 0xbe, 0x8a, 0xaf, 0xe6, 0xcb, - 0x8c, 0x07, 0xd6, 0x8e, 0xcc, 0x85, 0x9e, 0xab, 0x99, 0xae, 0x4f, 0xee, 0x77, 0xb1, 0x25, 0xe7, - 0xd4, 0x78, 0x38, 0x7e, 0x95, 0xf3, 0xa4, 0x35, 0x95, 0xdb, 0xc6, 0x78, 0x0f, 0x3f, 0xe9, 0xb6, - 0xc9, 0x7a, 0xc7, 0x5f, 0xa9, 0x21, 0x9b, 0x46, 0xb3, 0xe8, 0xc8, 0x57, 0xdc, 0x8f, 0x63, 0x16, - 0xa1, 0xfb, 0x71, 0x32, 0xe5, 0x5f, 0xce, 0x27, 0xd0, 0x85, 0x3b, 0xfc, 0xd0, 0x36, 0xf1, 0xa0, - 0x3f, 0xd1, 0x4d, 0xa5, 0xec, 0xc7, 0xfe, 0xd5, 0xd8, 0xc8, 0x24, 0xd1, 0x8b, 0x78, 0x28, 0xbf, - 0xc1, 0x1c, 0x2d, 0x65, 0x21, 0x8f, 0xb5, 0x4d, 0xd9, 0x80, 0x52, 0xdc, 0x99, 0x89, 0x06, 0x9c, - 0xb0, 0x2b, 0xa5, 0x32, 0xce, 0xc5, 0xdf, 0x71, 0x52, 0xe2, 0x6b, 0xa9, 0x2f, 0x3d, 0x47, 0x31, - 0x5d, 0x8b, 0xe0, 0xf3, 0xb9, 0x96, 0x5b, 0xfd, 0x7c, 0xec, 0xc4, 0x8d, 0xa1, 0x19, 0xf3, 0xb9, - 0x8e, 0x54, 0xc6, 0xea, 0xa4, 0x81, 0xc8, 0x6f, 0xf5, 0xc5, 0x2c, 0x39, 0x61, 0x7a, 0xc6, 0xd5, - 0xea, 0x25, 0xf7, 0x69, 0x49, 0xc4, 0x49, 0x66, 0xdc, 0xe3, 0x54, 0x2d, 0x4f, 0xce, 0x22, 0x8c, - 0xf1, 0xda, 0xf2, 0x85, 0xf4, 0x9c, 0xa1, 0x26, 0x63, 0x0d, 0x9d, 0x33, 0x1a, 0x67, 0x2e, 0x9f, - 0x0b, 0xe8, 0x4a, 0x96, 0xe0, 0xfc, 0x5a, 0x9c, 0x4f, 0xcb, 0x30, 0xdc, 0xc8, 0x4a, 0x0b, 0xbc, - 0x36, 0x17, 0x92, 0xca, 0x31, 0x2a, 0x94, 0xdf, 0x24, 0xa2, 0xab, 0xa6, 0x47, 0x95, 0xf2, 0xf7, - 0xaf, 0x53, 0xe2, 0x35, 0x66, 0x7c, 0x10, 0x49, 0xa6, 0x3e, 0x3c, 0xab, 0x7c, 0x62, 0x1a, 0x14, - 0x1d, 0x14, 0xd9, 0x62, 0x36, 0xf1, 0xfa, 0x08, 0x0d, 0xa2, 0x54, 0x6a, 0xc3, 0x57, 0x8c, 0xcd, - 0x5b, 0x12, 0x9d, 0xbf, 0x77, 0x53, 0x73, 0x76, 0xae, 0xc4, 0x6c, 0x74, 0x2f, 0xb5, 0x7d, 0x5f, - 0x9b, 0xb3, 0x93, 0xbc, 0x21, 0xb9, 0x9e, 0xdc, 0xb8, 0xa5, 0x48, 0x7a, 0xaf, 0x09, 0x22, 0x84, - 0x24, 0x11, 0x40, 0x6a, 0x19, 0x7a, 0x30, 0x91, 0xf9, 0x5a, 0xb0, 0xe5, 0xf8, 0xcf, 0x91, 0x96, - 0x85, 0xec, 0x55, 0xc3, 0x2f, 0xb5, 0x89, 0xce, 0xe4, 0x0c, 0x95, 0x39, 0x9e, 0x47, 0xd0, 0x4b, - 0xf6, 0x3a, 0x5e, 0x38, 0x4a, 0x34, 0xd0, 0x6d, 0x50, 0xb5, 0xb3, 0xc9, 0xc4, 0xe6, 0xb7, 0xff, - 0x9e, 0xdc, 0x29, 0x25, 0xe5, 0x9d, 0x4d, 0x38, 0x6d, 0x7b, 0x55, 0xec, 0x6b, 0x39, 0x19, 0x27, - 0xda, 0x84, 0x97, 0x8a, 0x5e, 0xeb, 0xd6, 0x6a, 0xed, 0xdd, 0xcb, 0x2e, 0x66, 0xd0, 0xe9, 0x9a, - 0xbb, 0xe7, 0xa9, 0x9b, 0x08, 0x35, 0x5b, 0x19, 0x41, 0x1a, 0x2c, 0x39, 0xc5, 0x18, 0x28, 0x95, - 0x3c, 0x67, 0x5a, 0xee, 0xde, 0xf5, 0xe7, 0xf8, 0x49, 0x8a, 0x47, 0x73, 0xb7, 0x9e, 0xcf, 0xc4, - 0xa5, 0x05, 0xea, 0x6f, 0xe1, 0x2b, 0x81, 0x19, 0xcf, 0xf2, 0x2b, 0x81, 0x99, 0x8f, 0xe7, 0xdf, - 0x42, 0xaf, 0x8b, 0xed, 0xb7, 0xa8, 0xee, 0x75, 0xd1, 0x1e, 0x57, 0x4f, 0x38, 0x3d, 0xc8, 0xc7, - 0x30, 0xaa, 0x1e, 0x9f, 0x57, 0xfe, 0xed, 0xe4, 0xfb, 0xf7, 0x73, 0xa5, 0x34, 0x42, 0x14, 0xf8, - 0xb6, 0x74, 0x7c, 0x60, 0x99, 0x25, 0xd3, 0x61, 0x94, 0x5f, 0xec, 0xdb, 0xd2, 0xeb, 0x61, 0xb0, - 0xa5, 0x9e, 0x9e, 0x4f, 0xb2, 0x7d, 0x0f, 0xc6, 0xe3, 0x67, 0xe6, 0x77, 0xe6, 0x35, 0xc6, 0xc4, - 0xdb, 0xf3, 0x49, 0xc6, 0x77, 0xe5, 0x91, 0x06, 0x96, 0x67, 0x22, 0xbb, 0xaf, 0xe2, 0x1f, 0x4b, - 0x2f, 0x8b, 0x51, 0xd3, 0xd4, 0xa3, 0xf5, 0x5d, 0x26, 0xdf, 0x71, 0xfd, 0xdd, 0x57, 0xd5, 0xb5, - 0x19, 0x2f, 0x37, 0xab, 0xae, 0xcd, 0x7a, 0x79, 0x39, 0x76, 0xf9, 0x7f, 0x21, 0x5d, 0x0a, 0xb1, - 0xd0, 0x8b, 0x46, 0xb5, 0x52, 0x72, 0x2f, 0xe5, 0xa1, 0x93, 0xa2, 0x6b, 0x50, 0x4c, 0x3e, 0x52, - 0xab, 0xec, 0xb1, 0x9c, 0xd7, 0x84, 0x95, 0x91, 0x97, 0xfb, 0xba, 0xed, 0xa6, 0xf4, 0x8f, 0x9b, - 0x72, 0xaf, 0x64, 0x57, 0x4a, 0x17, 0x9d, 0xef, 0x30, 0x9f, 0x30, 0xde, 0xab, 0xd5, 0x2d, 0xe5, - 0xd4, 0x7b, 0xb8, 0xfa, 0xce, 0x2a, 0xe3, 0x89, 0x5b, 0x57, 0x66, 0x94, 0xca, 0x3c, 0xb2, 0x55, - 0xce, 0x82, 0xde, 0x8f, 0x1b, 0xf4, 0x3c, 0xfe, 0x25, 0xbf, 0x00, 0xb3, 0x39, 0xc9, 0xda, 0xc9, - 0xb5, 0x84, 0xa7, 0x35, 0x3b, 0x99, 0xbb, 0x1a, 0x20, 0x99, 0x0f, 0xc9, 0xaf, 0x61, 0xdc, 0x80, - 0x91, 0xdf, 0x21, 0x75, 0x16, 0xf7, 0xd0, 0x8d, 0xf6, 0xf9, 0x7b, 0xe9, 0xda, 0xb4, 0x99, 0x99, - 0x18, 0x82, 0xd4, 0xd0, 0x16, 0x31, 0xa0, 0x19, 0xc7, 0x71, 0x19, 0x02, 0xe7, 0xb2, 0x05, 0xb2, - 0xb9, 0x83, 0x8d, 0x85, 0x8c, 0xe4, 0x1b, 0x6a, 0x2c, 0xe4, 0x27, 0xe6, 0xc8, 0xad, 0xe6, 0xa6, - 0xdc, 0x23, 0x65, 0x4b, 0xcc, 0xcf, 0xc3, 0x91, 0x2b, 0xf1, 0x3e, 0x93, 0x98, 0x4a, 0xad, 0x41, - 0x72, 0xc8, 0xbb, 0xcf, 0x1e, 0xb6, 0x5c, 0x72, 0x4d, 0xae, 0x79, 0xad, 0x7e, 0x79, 0x49, 0x3c, - 0x72, 0xeb, 0xb7, 0x24, 0xbf, 0xa7, 0xec, 0xfa, 0x1d, 0x77, 0xd1, 0x55, 0xe7, 0x5f, 0x89, 0xec, - 0x2e, 0x46, 0x43, 0x35, 0xf8, 0x5c, 0x0e, 0x9c, 0xac, 0x63, 0x20, 0x50, 0x12, 0xaa, 0x19, 0xa5, - 0xd9, 0xe9, 0x63, 0x72, 0xe5, 0xf1, 0x71, 0x6c, 0xa4, 0xdf, 0x38, 0xc9, 0x38, 0x4e, 0xe4, 0xed, - 0x10, 0xe3, 0xd8, 0x80, 0x9e, 0x6c, 0x1c, 0x27, 0x04, 0x9a, 0xe3, 0x38, 0x59, 0xcd, 0xa4, 0xa5, - 0x9f, 0xdb, 0xab, 0xc9, 0x6a, 0xaa, 0x71, 0x9c, 0x2d, 0x31, 0x3f, 0x4d, 0x4a, 0xae, 0x44, 0x35, - 0x8e, 0x4d, 0x89, 0x39, 0xe4, 0xc7, 0x1c, 0xc7, 0xc9, 0x42, 0xcc, 0x71, 0x7c, 0xa2, 0xfa, 0xa9, - 0x71, 0x9c, 0x5d, 0xbf, 0x13, 0x8f, 0xe3, 0x44, 0x5e, 0x21, 0xa3, 0xa1, 0x59, 0xe3, 0x38, 0x49, - 0xcf, 0xc7, 0x71, 0x12, 0x9a, 0x70, 0xae, 0x74, 0x19, 0xc7, 0x49, 0xce, 0xcf, 0x50, 0x5e, 0x22, - 0x27, 0xca, 0x71, 0x46, 0x72, 0x6e, 0x3a, 0x15, 0xf2, 0x10, 0xdd, 0x7b, 0x09, 0xf8, 0xf1, 0x46, - 0xf3, 0x85, 0x3c, 0xa1, 0x38, 0x9e, 0x77, 0xa4, 0x12, 0x93, 0xd5, 0x35, 0x7d, 0x57, 0xd9, 0x29, - 0x61, 0xba, 0x54, 0x78, 0x87, 0x8d, 0x9b, 0x66, 0x17, 0xb9, 0xdd, 0x32, 0xda, 0x74, 0x91, 0xab, - 0x4c, 0x99, 0xa4, 0xdc, 0x5c, 0x96, 0xee, 0xe3, 0xfb, 0x73, 0x79, 0xc0, 0x91, 0xe4, 0x9b, 0x4f, - 0x18, 0x47, 0x27, 0xae, 0xa9, 0x32, 0x92, 0x92, 0x35, 0x3d, 0xe9, 0x38, 0x5f, 0x93, 0xbb, 0x87, - 0x54, 0x2a, 0xac, 0x44, 0xa3, 0xf5, 0xb1, 0x9e, 0x8b, 0x21, 0x5b, 0xe8, 0xcb, 0x4d, 0xc3, 0x35, - 0x3f, 0x70, 0x5e, 0xce, 0xad, 0x9e, 0x52, 0x53, 0x49, 0x7d, 0x74, 0xa9, 0x79, 0x19, 0x7f, 0x94, - 0xd4, 0x34, 0xf7, 0x27, 0xe8, 0xfd, 0x12, 0x37, 0xae, 0xbc, 0x47, 0x7e, 0xbe, 0x27, 0x65, 0xca, - 0x08, 0x56, 0x62, 0xb4, 0x18, 0x23, 0xf6, 0xa1, 0x38, 0xc1, 0x93, 0xc0, 0x5c, 0xe5, 0x67, 0xf1, - 0x93, 0x4f, 0xa0, 0x28, 0xa6, 0xb7, 0x58, 0x40, 0x16, 0x61, 0x6e, 0xd7, 0x55, 0xa5, 0xd3, 0xed, - 0x18, 0x35, 0x38, 0x8e, 0xb3, 0xed, 0x38, 0x9a, 0xc8, 0xf7, 0x4c, 0xb1, 0xe5, 0x70, 0x2b, 0xe8, - 0x84, 0x11, 0x6d, 0xa6, 0x3d, 0x4a, 0x66, 0x65, 0x64, 0x64, 0x84, 0x49, 0xbe, 0x33, 0x4f, 0x56, - 0x70, 0x6e, 0x33, 0xc1, 0xdd, 0x5c, 0x6e, 0xd9, 0x62, 0x70, 0xea, 0x59, 0x53, 0xd7, 0x7a, 0xcc, - 0x3a, 0xe5, 0x95, 0x9d, 0x5b, 0x29, 0x79, 0xa0, 0x2d, 0xf4, 0x74, 0xcc, 0x26, 0xe6, 0xe9, 0xe9, - 0x03, 0x8c, 0x05, 0xe0, 0x3e, 0xc0, 0x5e, 0xea, 0x49, 0xde, 0x36, 0x22, 0x9f, 0xc2, 0xa8, 0x64, - 0xee, 0xad, 0x95, 0x24, 0x37, 0x6a, 0x65, 0x11, 0x26, 0x8c, 0xab, 0x54, 0xca, 0xc4, 0xc9, 0xba, - 0x60, 0xd5, 0xa5, 0xb3, 0x27, 0x8c, 0x2b, 0x53, 0x4a, 0x4a, 0xd6, 0x45, 0xaa, 0x5c, 0x29, 0x1f, - 0xc1, 0x98, 0x50, 0x69, 0x57, 0x6d, 0xe4, 0x3b, 0xdd, 0x66, 0xb4, 0xb0, 0xe4, 0x4e, 0xd3, 0x8d, - 0x16, 0x7c, 0xef, 0x91, 0xbb, 0xd7, 0x53, 0x31, 0x69, 0x96, 0x9d, 0x79, 0xf2, 0x15, 0x3e, 0x31, - 0x2e, 0x1f, 0x7e, 0xa7, 0xd1, 0x53, 0x3f, 0x78, 0xec, 0x7a, 0x7b, 0x3d, 0x44, 0x5e, 0x36, 0x45, - 0x26, 0xf9, 0xe4, 0xe0, 0xf9, 0x0a, 0xe6, 0x6a, 0xf9, 0xc2, 0x7b, 0x0a, 0xe9, 0xbe, 0xc6, 0xd4, - 0xe0, 0x02, 0x86, 0xd0, 0x9c, 0xb4, 0xee, 0x5d, 0x85, 0x7e, 0xc1, 0x53, 0x2a, 0x4a, 0x87, 0x7d, - 0xc3, 0x0f, 0x9a, 0xbd, 0x25, 0x96, 0xcd, 0x68, 0xda, 0x04, 0x9b, 0x54, 0xc6, 0x17, 0x70, 0xae, - 0x96, 0x2b, 0xba, 0x97, 0x88, 0x5e, 0xdb, 0xc9, 0xf3, 0xa8, 0x8a, 0x13, 0xd6, 0xbb, 0xab, 0xcc, - 0x15, 0x9c, 0xd8, 0xd8, 0x62, 0xb4, 0x19, 0xd0, 0x47, 0x34, 0xc0, 0x98, 0xed, 0x5e, 0xd1, 0xca, - 0x26, 0xb9, 0x6c, 0xf9, 0x0a, 0x9c, 0xa9, 0xa5, 0x44, 0xe5, 0xb1, 0xf4, 0x3a, 0x04, 0x9a, 0xc2, - 0x96, 0x1e, 0xb3, 0x5e, 0x3d, 0x42, 0x85, 0xc6, 0xee, 0xd1, 0x68, 0x7b, 0xa5, 0x87, 0x96, 0xe4, - 0xa5, 0x02, 0x49, 0xb8, 0x73, 0x87, 0x71, 0xd6, 0x34, 0xce, 0x34, 0x45, 0xee, 0xc7, 0xfb, 0xa9, - 0x3c, 0x10, 0xe9, 0x59, 0x6c, 0x9e, 0x84, 0x37, 0x71, 0x2e, 0x14, 0x71, 0xcb, 0xb3, 0xf1, 0x3e, - 0x80, 0x43, 0x62, 0x7f, 0x9d, 0x16, 0xc2, 0x1c, 0x92, 0x0a, 0xb7, 0x01, 0xf9, 0xf0, 0x10, 0xb0, - 0x4b, 0xa9, 0x78, 0xf6, 0xae, 0x22, 0xb8, 0x2b, 0x74, 0xd5, 0x6f, 0x3c, 0xd6, 0x5d, 0xa1, 0xec, - 0x77, 0xd2, 0x47, 0xc8, 0x60, 0x3b, 0xf3, 0x62, 0xc6, 0x67, 0x3f, 0x8c, 0xe8, 0x2f, 0x04, 0xc4, - 0x33, 0x7e, 0x12, 0x2e, 0xdc, 0x48, 0x6f, 0x4a, 0x07, 0x23, 0x16, 0x68, 0x4a, 0xce, 0x55, 0x8d, - 0xf2, 0x2d, 0x22, 0x93, 0xe9, 0x5b, 0xd4, 0x2b, 0x9a, 0xef, 0xd0, 0x27, 0x36, 0x6d, 0xb7, 0x30, - 0x14, 0xfa, 0xc0, 0xe7, 0x3c, 0x71, 0x74, 0x6c, 0x1a, 0xd5, 0x3b, 0x88, 0x6b, 0x4a, 0x84, 0xfe, - 0x18, 0x8a, 0x57, 0x29, 0x8f, 0xd3, 0xb8, 0x58, 0x95, 0x7a, 0x44, 0xd2, 0xed, 0x02, 0x59, 0x87, - 0xb3, 0xf7, 0x68, 0x24, 0xe6, 0x38, 0x9b, 0x86, 0x51, 0xe0, 0x36, 0xa2, 0xae, 0xa7, 0x83, 0xd2, - 0x40, 0xc9, 0xe0, 0xd9, 0x79, 0x8b, 0xc9, 0xab, 0x65, 0xcb, 0xeb, 0xca, 0xd7, 0x25, 0x4e, 0x56, - 0x1c, 0x39, 0x9c, 0xa4, 0x8a, 0xf9, 0x43, 0x7c, 0x98, 0x87, 0xe1, 0xe4, 0xb3, 0x16, 0xe3, 0x14, - 0x28, 0xc2, 0xe4, 0xba, 0x09, 0x43, 0x9c, 0x29, 0x77, 0x41, 0x1d, 0xd7, 0x79, 0xc8, 0x1d, 0x18, - 0x55, 0x71, 0x34, 0xc4, 0x40, 0xe5, 0xd6, 0xeb, 0x0e, 0x8c, 0x72, 0xfb, 0xea, 0xf8, 0x2c, 0x1f, - 0xc0, 0xa8, 0x0a, 0xbc, 0x39, 0xf1, 0x4a, 0xff, 0x09, 0x4c, 0xe8, 0x21, 0x38, 0x27, 0x57, 0xe4, - 0x47, 0x78, 0x86, 0x2b, 0x8f, 0x4a, 0xf2, 0xf9, 0x67, 0x12, 0x99, 0x61, 0x84, 0x4a, 0xf9, 0x04, - 0x29, 0x81, 0xb9, 0xd5, 0x3f, 0x93, 0xe2, 0x26, 0x1f, 0xc8, 0xeb, 0x4c, 0x8a, 0x39, 0x4d, 0xd4, - 0x45, 0x67, 0x93, 0x5c, 0xcd, 0xcf, 0xc3, 0xac, 0x26, 0xd8, 0x9e, 0xd5, 0x3e, 0xce, 0x59, 0x73, - 0x6f, 0xd5, 0xe5, 0x49, 0xd9, 0xc0, 0x5d, 0x5a, 0xea, 0x51, 0xbe, 0x7c, 0x41, 0x97, 0xf2, 0xdf, - 0xf1, 0xc3, 0xce, 0xb8, 0x8f, 0xa6, 0x60, 0x0a, 0x9b, 0xdb, 0xbc, 0x2e, 0xef, 0x02, 0xc6, 0xb6, - 0x6f, 0x5a, 0x5c, 0x17, 0xb6, 0x6e, 0xa6, 0xb4, 0xb8, 0xa4, 0xf9, 0x52, 0xc4, 0xad, 0xc8, 0x48, - 0xc6, 0xe3, 0x37, 0x36, 0xbf, 0x66, 0xe7, 0x33, 0x4e, 0xb7, 0x7b, 0xf6, 0x45, 0x9e, 0xb8, 0x5f, - 0xc0, 0xdd, 0x61, 0x66, 0x6a, 0xb0, 0x7c, 0x61, 0xd7, 0xb5, 0x00, 0x89, 0x4c, 0x4e, 0xb5, 0xe8, - 0x3d, 0xc6, 0x7b, 0x62, 0xd9, 0xcf, 0x16, 0xbe, 0xda, 0x43, 0x8a, 0xd4, 0xc4, 0x6b, 0x3d, 0xe9, - 0xd4, 0x59, 0xe9, 0x79, 0xbe, 0xc2, 0x66, 0x97, 0xd7, 0xe3, 0x19, 0xc6, 0x8c, 0xe3, 0x6b, 0x15, - 0x26, 0x9a, 0x2d, 0xd0, 0x0c, 0x13, 0xed, 0xda, 0x86, 0x3c, 0xf5, 0x7f, 0x06, 0xe5, 0x38, 0x0a, - 0xe4, 0x64, 0x9d, 0x90, 0x1f, 0x9d, 0x48, 0x52, 0x9a, 0x0a, 0x49, 0xb7, 0x07, 0x7f, 0xe6, 0xae, - 0xe4, 0x69, 0x58, 0xbf, 0x0b, 0x23, 0xa2, 0xdb, 0x12, 0x0f, 0x78, 0xe6, 0x3d, 0x05, 0xda, 0xc5, - 0x19, 0x2b, 0x2e, 0xce, 0xbd, 0x14, 0x41, 0xe9, 0xde, 0x3e, 0xb9, 0x20, 0x15, 0xa4, 0x91, 0x10, - 0x64, 0x75, 0xe9, 0xde, 0xde, 0xe7, 0x8f, 0xa5, 0x9c, 0x7e, 0x3d, 0x79, 0x87, 0x3a, 0xf1, 0x65, - 0xb1, 0x44, 0x26, 0x41, 0xfd, 0x82, 0x6e, 0x1a, 0x95, 0xbc, 0xe9, 0x94, 0x45, 0xa1, 0x22, 0xa3, - 0x4a, 0xb2, 0x08, 0x06, 0x67, 0xa6, 0x88, 0x1f, 0xb8, 0xd1, 0xb3, 0x05, 0x7b, 0x35, 0x76, 0x2b, - 0xe8, 0x08, 0x29, 0x1b, 0x24, 0xd2, 0x5e, 0x25, 0x5f, 0xe2, 0x54, 0x22, 0xc4, 0x57, 0x7d, 0x3f, - 0x0a, 0xa3, 0xc0, 0x69, 0xd7, 0xf0, 0x61, 0xe3, 0xdc, 0x46, 0xc7, 0x81, 0xdc, 0x59, 0x6c, 0x5a, - 0x5c, 0xa9, 0xc8, 0x34, 0x9f, 0x95, 0xfe, 0x46, 0xdd, 0xad, 0xc9, 0x42, 0x76, 0xb1, 0x5c, 0x6a, - 0x32, 0xb7, 0xfc, 0xcb, 0x14, 0x5a, 0x87, 0xd9, 0x9c, 0xa4, 0x41, 0xea, 0x08, 0xb7, 0x7b, 0x52, - 0xa1, 0xb9, 0xee, 0x05, 0x93, 0xaf, 0x60, 0x26, 0x33, 0xab, 0x90, 0x72, 0x43, 0x77, 0xcb, 0x39, - 0xd4, 0x4b, 0xf8, 0x63, 0x28, 0xf1, 0x5b, 0x1d, 0x18, 0xbc, 0x6c, 0x24, 0x98, 0x89, 0xef, 0xfa, - 0xe4, 0x10, 0x24, 0xe7, 0xeb, 0x7c, 0x3a, 0x75, 0xe3, 0x7c, 0x1a, 0x33, 0x8b, 0xc8, 0x97, 0x98, - 0xc5, 0x73, 0xfa, 0xea, 0xc3, 0xcb, 0x42, 0x76, 0xbb, 0x50, 0xb4, 0x09, 0x33, 0x3b, 0x34, 0x70, - 0x1f, 0x3d, 0x4b, 0x0a, 0x94, 0x9a, 0xc9, 0xc4, 0x76, 0x93, 0xf8, 0x39, 0xcc, 0x2e, 0xf8, 0x07, - 0x6d, 0x71, 0x75, 0xcf, 0x90, 0xa9, 0xce, 0xe3, 0xb3, 0xf1, 0xbd, 0x03, 0x9a, 0xe6, 0xd4, 0xdd, - 0x42, 0x9d, 0x6f, 0x01, 0xef, 0xb4, 0x5e, 0x37, 0x63, 0x0a, 0x32, 0x48, 0xe2, 0x1b, 0x19, 0xd2, - 0x94, 0xd3, 0xf9, 0xb7, 0x70, 0x10, 0x26, 0xf8, 0xb8, 0x6f, 0x4e, 0x1b, 0x84, 0x59, 0xf8, 0xee, - 0x17, 0xc1, 0x32, 0xa4, 0xf2, 0x02, 0xf3, 0xa5, 0x1e, 0xa3, 0xb6, 0xeb, 0x72, 0x6d, 0x31, 0x5f, - 0xce, 0x4f, 0x44, 0x4e, 0x67, 0x3e, 0xab, 0x9f, 0x59, 0x4f, 0x2d, 0xb5, 0x42, 0xab, 0xd5, 0x65, - 0x8b, 0x45, 0xf4, 0xdc, 0x0a, 0x8c, 0x12, 0x3d, 0xf9, 0x13, 0x3a, 0x6f, 0xb7, 0xd9, 0x3a, 0xc5, - 0x8c, 0x9b, 0xda, 0xf7, 0x61, 0xbc, 0xa6, 0x17, 0x9e, 0x51, 0x48, 0xee, 0xa0, 0x50, 0x57, 0x81, - 0x7a, 0xd7, 0xbd, 0x4b, 0x40, 0xa8, 0x5a, 0x78, 0x8e, 0xd5, 0x8a, 0xdc, 0xf8, 0x19, 0xe3, 0x75, - 0x38, 0xb5, 0x0a, 0x64, 0x3d, 0xde, 0xa8, 0xe2, 0x67, 0xb2, 0x1f, 0x94, 0xab, 0xf3, 0x37, 0x67, - 0x92, 0x6f, 0x73, 0x12, 0xab, 0xf7, 0x23, 0xb8, 0x2a, 0x30, 0xbe, 0xeb, 0xe3, 0x9e, 0x3c, 0xd8, - 0x27, 0x7e, 0x0f, 0x4f, 0x0f, 0xf6, 0x49, 0xbd, 0xb2, 0xa7, 0x07, 0xfb, 0x64, 0x3c, 0xa1, 0xb7, - 0x84, 0xb2, 0xe2, 0xc7, 0x7a, 0xba, 0x38, 0x23, 0x94, 0x98, 0x8c, 0x37, 0x81, 0x1e, 0xe8, 0x19, - 0x3a, 0xf8, 0x13, 0x3f, 0x5d, 0x7c, 0xad, 0xc9, 0xcc, 0x1c, 0x89, 0x37, 0x81, 0xee, 0x42, 0x91, - 0xbf, 0x76, 0x10, 0x27, 0x36, 0x8c, 0xe3, 0xff, 0xd2, 0x8f, 0x30, 0x74, 0xe9, 0xd4, 0x62, 0x32, - 0x1d, 0x9c, 0x72, 0x99, 0xe5, 0xe4, 0x89, 0xeb, 0x32, 0x54, 0x21, 0x4e, 0xfa, 0xa6, 0x1c, 0x53, - 0xa9, 0x3c, 0x70, 0x73, 0xe7, 0x32, 0x30, 0x6a, 0x4b, 0x39, 0xae, 0xa7, 0x88, 0x53, 0x4d, 0xca, - 0xc8, 0x1b, 0x37, 0x77, 0x3e, 0x13, 0x27, 0x04, 0x45, 0xfc, 0x1d, 0xe8, 0xec, 0x47, 0xb6, 0xe3, - 0xdb, 0x5c, 0x5d, 0x68, 0x64, 0x31, 0x37, 0x8e, 0x43, 0x2a, 0x4a, 0xa5, 0xea, 0xa9, 0xa2, 0x8c, - 0x97, 0xbd, 0x5f, 0xcb, 0xb8, 0x70, 0x61, 0x50, 0xc4, 0x21, 0x61, 0xdd, 0x9f, 0x19, 0x27, 0x0f, - 0xe5, 0xd3, 0x31, 0x39, 0x25, 0xf5, 0x12, 0x90, 0xdb, 0x83, 0x0f, 0xe5, 0x63, 0x31, 0x2f, 0x5b, - 0xf0, 0x2e, 0x5c, 0x48, 0xdc, 0xe2, 0x30, 0x05, 0xdf, 0xc8, 0xbe, 0xea, 0x91, 0xa9, 0x9e, 0xfc, - 0x3d, 0xfb, 0xe5, 0xf4, 0x6d, 0x8f, 0x44, 0xbf, 0x9f, 0x74, 0xce, 0x5b, 0x83, 0x49, 0x9c, 0x66, - 0xe4, 0x1b, 0xf5, 0x71, 0x82, 0x18, 0x13, 0x9c, 0xcc, 0x54, 0x94, 0xc4, 0xaa, 0x4b, 0xe4, 0xe3, - 0xe2, 0x66, 0x30, 0x7f, 0xf1, 0x7e, 0xce, 0xbc, 0x2e, 0x8c, 0xc0, 0xac, 0x55, 0x4c, 0x3c, 0xa4, - 0x4f, 0x3e, 0x82, 0xd3, 0xf1, 0x85, 0x61, 0x2e, 0x22, 0x83, 0xac, 0x8b, 0xa3, 0xec, 0x74, 0x7c, - 0x6b, 0xf8, 0xe4, 0xec, 0xcb, 0x72, 0x29, 0x8a, 0xd9, 0x2f, 0xa6, 0xee, 0xbc, 0x18, 0x6d, 0x38, - 0xce, 0x8a, 0xa4, 0xe9, 0xf6, 0xa4, 0xbd, 0xd3, 0xc0, 0xcf, 0x2d, 0x3b, 0xf7, 0xa1, 0xfe, 0xb9, - 0x75, 0xcd, 0xcf, 0xa8, 0xb6, 0xbf, 0x39, 0x72, 0xd6, 0xe0, 0x2a, 0xe6, 0x4b, 0xd9, 0xe4, 0x19, - 0xf2, 0xb2, 0xa9, 0xf2, 0xeb, 0x9e, 0xcc, 0xb2, 0xd2, 0x82, 0x2b, 0x3d, 0x93, 0x3f, 0x92, 0x5b, - 0x46, 0x9c, 0x4b, 0xef, 0x34, 0x91, 0x5d, 0x2c, 0x8f, 0xe9, 0xac, 0x1c, 0x8a, 0x6a, 0x9d, 0xed, - 0x92, 0xce, 0x51, 0xad, 0xb3, 0x5d, 0x93, 0x30, 0x7e, 0x8e, 0xef, 0x31, 0x89, 0x35, 0x0a, 0x73, - 0x20, 0x51, 0x8f, 0x67, 0x86, 0xee, 0x7a, 0xec, 0x73, 0xc5, 0x3c, 0x14, 0x4d, 0x31, 0xa2, 0x4d, - 0x73, 0x49, 0x58, 0x62, 0x79, 0xc2, 0x7b, 0x0b, 0xe9, 0x12, 0x5f, 0x7d, 0x89, 0x0f, 0xc0, 0x13, - 0xd7, 0x3c, 0x07, 0x5e, 0x5d, 0xfc, 0xc9, 0x7f, 0xbd, 0x54, 0xf8, 0xc9, 0x4f, 0x2f, 0x15, 0xfe, - 0xe3, 0x4f, 0x2f, 0x15, 0xfe, 0xcb, 0x4f, 0x2f, 0x15, 0xbe, 0x9c, 0x3f, 0x5e, 0x7e, 0x62, 0xfe, - 0x82, 0xe2, 0x2d, 0x2e, 0x6e, 0x08, 0xff, 0x7b, 0xf3, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0xdd, - 0x06, 0xcb, 0x2e, 0xa4, 0xee, 0x00, 0x00, + 0x87, 0x6d, 0xea, 0x84, 0xbe, 0xa7, 0x9b, 0xc3, 0x01, 0x42, 0x74, 0x73, 0x98, 0xd3, 0x90, 0xdf, + 0x2a, 0xc0, 0x58, 0xc5, 0xf3, 0x84, 0x63, 0x29, 0x14, 0x5a, 0x9f, 0xb9, 0xa9, 0x3c, 0xb1, 0xab, + 0xce, 0x2e, 0x6d, 0xed, 0x38, 0xad, 0x0e, 0x0d, 0xab, 0x5f, 0x33, 0x0b, 0xe5, 0x3f, 0x1f, 0x96, + 0x3f, 0x38, 0x81, 0xab, 0x28, 0xf6, 0xe9, 0x6e, 0x05, 0x8e, 0x1b, 0x85, 0xec, 0xab, 0x75, 0xe2, + 0x02, 0xf5, 0xef, 0x46, 0xab, 0x47, 0xbc, 0x36, 0x0c, 0xf5, 0x5a, 0x1b, 0xc8, 0x01, 0x9c, 0xae, + 0x84, 0x61, 0xe7, 0x80, 0xd6, 0x22, 0x27, 0x88, 0xb6, 0xdc, 0x03, 0x8a, 0x13, 0x52, 0x77, 0xe7, + 0xc2, 0x6b, 0x3f, 0x39, 0x2c, 0x17, 0x98, 0x51, 0xe4, 0x20, 0x2b, 0xdb, 0xf7, 0x04, 0x51, 0x3d, + 0x72, 0xf5, 0xe5, 0x0d, 0xdd, 0x0c, 0x49, 0xd9, 0xd6, 0x55, 0xb5, 0x21, 0x59, 0x59, 0xcc, 0xeb, + 0x71, 0x6b, 0x01, 0x2e, 0xdc, 0xa3, 0x91, 0x4d, 0x43, 0x1a, 0xc9, 0x6f, 0x04, 0x47, 0x78, 0xec, + 0xdc, 0x1d, 0xc6, 0xdf, 0x8a, 0x19, 0xbb, 0x9f, 0x7f, 0x17, 0x12, 0x63, 0xfd, 0x8d, 0x02, 0x94, + 0x17, 0x02, 0xca, 0xed, 0x89, 0x1c, 0x41, 0xdd, 0xe7, 0xae, 0x0b, 0x30, 0xb0, 0xf5, 0xac, 0x2d, + 0xbd, 0x32, 0x88, 0x65, 0x9d, 0x62, 0x23, 0xf4, 0x98, 0x4e, 0x2e, 0xeb, 0x11, 0xcc, 0xd8, 0xd4, + 0xa3, 0x4f, 0x9d, 0xdd, 0x16, 0x35, 0xfc, 0x44, 0x65, 0x18, 0xe4, 0x1f, 0x7a, 0xaa, 0x09, 0x1c, + 0x7e, 0x32, 0x9f, 0x9b, 0x35, 0x01, 0x63, 0x9b, 0xae, 0xb7, 0x27, 0xa4, 0x5b, 0x7f, 0x3e, 0x00, + 0xe3, 0xfc, 0xb7, 0x30, 0x91, 0x12, 0xcb, 0x65, 0xe1, 0x38, 0xcb, 0xe5, 0xbb, 0x30, 0xc1, 0xd6, + 0x1b, 0x1a, 0xec, 0xd0, 0x80, 0xcd, 0xff, 0x42, 0x13, 0x68, 0xee, 0x85, 0x88, 0xa8, 0x3f, 0xe1, + 0x18, 0xdb, 0x24, 0x24, 0xab, 0x30, 0xc9, 0x01, 0x77, 0xa9, 0x13, 0x75, 0x62, 0x8f, 0xd5, 0x69, + 0x61, 0x13, 0x49, 0x30, 0x1f, 0x9a, 0x42, 0xd6, 0x23, 0x01, 0xb4, 0x13, 0xbc, 0xe4, 0x13, 0x38, + 0xbd, 0x19, 0xf8, 0xdf, 0x3c, 0xd3, 0x36, 0x08, 0xfc, 0xeb, 0xe4, 0xd6, 0x13, 0x43, 0xd5, 0xf5, + 0x6d, 0x42, 0x92, 0x9a, 0xbc, 0x0e, 0x23, 0x2b, 0x61, 0xd5, 0x0f, 0x5c, 0x6f, 0x0f, 0xbf, 0xd1, + 0x11, 0xee, 0xe8, 0x77, 0xc3, 0xfa, 0x2e, 0x02, 0x6d, 0x85, 0x4e, 0xb8, 0xa4, 0x87, 0x7b, 0xbb, + 0xa4, 0x6f, 0x03, 0xac, 0xfa, 0x4e, 0xb3, 0xd2, 0x6a, 0x2d, 0x54, 0x42, 0x5c, 0x89, 0xc5, 0x7a, + 0xd4, 0xf2, 0x9d, 0x66, 0xdd, 0x69, 0xb5, 0xea, 0x0d, 0x27, 0xb4, 0x35, 0x1a, 0xf2, 0x25, 0x9c, + 0x0b, 0xdd, 0x3d, 0x0f, 0x1b, 0x57, 0x77, 0x5a, 0x7b, 0x7e, 0xe0, 0x46, 0xfb, 0x07, 0xf5, 0xb0, + 0xe3, 0x46, 0xdc, 0x1f, 0x34, 0x39, 0x7f, 0x49, 0x4c, 0x72, 0x35, 0x49, 0x57, 0x91, 0x64, 0x35, + 0x46, 0x65, 0xcf, 0x86, 0xd9, 0x08, 0xf2, 0x10, 0x26, 0x56, 0xdd, 0x06, 0xf5, 0x42, 0x8a, 0x0e, + 0xbe, 0x67, 0xe8, 0x2d, 0xea, 0xfe, 0x31, 0x33, 0x25, 0x4e, 0xb4, 0x74, 0x26, 0xfc, 0x74, 0x4d, + 0x39, 0xf7, 0x07, 0x46, 0x86, 0x8a, 0xc3, 0xf6, 0x69, 0x01, 0x7c, 0xe8, 0x04, 0x9e, 0xeb, 0xed, + 0x85, 0xd6, 0xdf, 0x21, 0x30, 0xa2, 0xfa, 0xe9, 0xa6, 0x6e, 0xa9, 0x88, 0xa5, 0x19, 0x87, 0x6c, + 0xec, 0x87, 0xb3, 0x35, 0x0a, 0x72, 0x0e, 0x6d, 0x17, 0xb1, 0x29, 0x18, 0x66, 0x9f, 0x90, 0xd3, + 0x6e, 0xdb, 0x0c, 0xc6, 0xa6, 0x86, 0xc5, 0x2a, 0x0e, 0x9a, 0x11, 0x3e, 0x35, 0x34, 0x77, 0xed, + 0xbe, 0xc5, 0x2a, 0xfb, 0x26, 0x37, 0x56, 0x16, 0x17, 0xb0, 0xff, 0x47, 0xf8, 0x37, 0xe9, 0xbb, + 0xcd, 0x86, 0x8d, 0x50, 0x86, 0xad, 0x55, 0xd6, 0x56, 0x45, 0x1f, 0x23, 0x36, 0x74, 0x0e, 0x5a, + 0x36, 0x42, 0xd9, 0x6e, 0x97, 0xbb, 0x54, 0x16, 0x7c, 0x2f, 0x0a, 0xfc, 0x56, 0x88, 0x5b, 0xb8, + 0x11, 0x3e, 0x06, 0x85, 0x2f, 0xa6, 0x21, 0x50, 0x76, 0x82, 0x94, 0x3c, 0x84, 0xd9, 0x4a, 0xf3, + 0x89, 0xe3, 0x35, 0x68, 0x93, 0x63, 0x1e, 0xfa, 0xc1, 0xe3, 0x47, 0x2d, 0xff, 0x69, 0x88, 0x83, + 0x64, 0x44, 0xb8, 0x2e, 0x05, 0x89, 0x74, 0xed, 0x3c, 0x95, 0x44, 0x76, 0x1e, 0x37, 0x9b, 0x07, + 0x16, 0x5a, 0x7e, 0xa7, 0x29, 0x86, 0x0e, 0xce, 0x03, 0x0d, 0x06, 0xb0, 0x39, 0x9c, 0x69, 0x69, + 0xb9, 0xb6, 0x86, 0x03, 0x43, 0x68, 0x69, 0x3f, 0x3c, 0xb0, 0x19, 0x8c, 0x5c, 0x83, 0x61, 0xb9, + 0x71, 0xe7, 0x27, 0x19, 0xe8, 0x41, 0x97, 0x1b, 0x76, 0x89, 0x63, 0xdf, 0xb1, 0x4d, 0x1b, 0xfe, + 0x13, 0x1a, 0x3c, 0x5b, 0xf0, 0x9b, 0x54, 0xba, 0xb5, 0x84, 0xdb, 0x86, 0x23, 0xea, 0x0d, 0x86, + 0xb1, 0x4d, 0x42, 0x56, 0x00, 0x5f, 0xb8, 0xc3, 0xd2, 0xe9, 0xb8, 0x00, 0xbe, 0xb0, 0x87, 0xb6, + 0xc4, 0x91, 0x45, 0x38, 0x53, 0xe9, 0x44, 0xfe, 0x81, 0x13, 0xb9, 0x8d, 0xed, 0xf6, 0x5e, 0xe0, + 0xb0, 0x42, 0x8a, 0xc8, 0x80, 0x86, 0x8c, 0x23, 0x91, 0xf5, 0x8e, 0xc0, 0xda, 0x69, 0x06, 0xf2, + 0x0e, 0x8c, 0xaf, 0x84, 0xdc, 0x75, 0xe9, 0x84, 0xb4, 0x89, 0xfe, 0x27, 0x51, 0x4b, 0x37, 0xac, + 0xa3, 0x23, 0xb3, 0xce, 0x4c, 0x9f, 0xa6, 0x6d, 0xd0, 0x11, 0x0b, 0x86, 0x2a, 0x61, 0xe8, 0x86, + 0x11, 0xba, 0x95, 0x46, 0xaa, 0x70, 0x74, 0x58, 0x1e, 0x72, 0x10, 0x62, 0x0b, 0x0c, 0x79, 0x08, + 0x63, 0x8b, 0x94, 0xed, 0x9c, 0xb7, 0x82, 0x4e, 0x18, 0xa1, 0x93, 0x68, 0x6c, 0xfe, 0x9c, 0x98, + 0x8d, 0x34, 0x8c, 0x18, 0xcb, 0x7c, 0x8b, 0xda, 0x44, 0x78, 0x3d, 0x62, 0x08, 0x7d, 0xa9, 0xd5, + 0xe8, 0x99, 0x59, 0x20, 0x78, 0x96, 0xdd, 0x26, 0x9b, 0x5f, 0xa6, 0xb1, 0x0e, 0x68, 0x16, 0x88, + 0x09, 0xad, 0xbe, 0x8f, 0x18, 0xdd, 0x2c, 0x30, 0x58, 0x48, 0x23, 0xe5, 0x0d, 0x9f, 0x31, 0x3c, + 0x9e, 0x26, 0x52, 0x56, 0xf1, 0x84, 0xbe, 0xf2, 0x0f, 0x61, 0x6c, 0xa1, 0x13, 0x46, 0xfe, 0xc1, + 0xd6, 0x3e, 0x3d, 0xa0, 0xe8, 0x48, 0x12, 0xc6, 0x4f, 0x03, 0xc1, 0xf5, 0x88, 0xc1, 0xf5, 0x66, + 0x6a, 0xe4, 0xe4, 0x33, 0x20, 0xd2, 0x8a, 0xb9, 0xc7, 0xc6, 0x87, 0xc7, 0xc6, 0x32, 0xfa, 0x92, + 0x46, 0xb8, 0xe9, 0x22, 0x8d, 0x9f, 0xfa, 0x9e, 0x42, 0xeb, 0xfe, 0xcc, 0x34, 0x33, 0xab, 0x10, + 0xaf, 0xe2, 0xbd, 0xc0, 0x69, 0xef, 0x97, 0x4a, 0xb1, 0x69, 0x20, 0x1a, 0xb5, 0xc7, 0xe0, 0xc6, + 0x16, 0x27, 0x26, 0x27, 0x35, 0x00, 0xfe, 0x73, 0x95, 0x75, 0x3c, 0xf7, 0x3e, 0x95, 0x0c, 0x7d, + 0x31, 0x84, 0xd4, 0x15, 0x9a, 0x3b, 0x42, 0x6c, 0xcb, 0x35, 0x7a, 0x53, 0x13, 0x43, 0x1e, 0x43, + 0x91, 0xff, 0x5a, 0xf3, 0x3d, 0x37, 0xe2, 0xeb, 0xc5, 0x9c, 0xe1, 0xaa, 0x4c, 0xa2, 0x65, 0x01, + 0xe8, 0x22, 0x16, 0x05, 0x1c, 0x28, 0xac, 0x56, 0x4c, 0x4a, 0x30, 0xd9, 0x84, 0xb1, 0xcd, 0xc0, + 0x6f, 0x76, 0x1a, 0x11, 0xee, 0x32, 0xce, 0xe3, 0xc4, 0x4f, 0x44, 0x39, 0x1a, 0x86, 0xeb, 0xa4, + 0xcd, 0x01, 0x75, 0xb6, 0x2e, 0xe8, 0x3a, 0xd1, 0x08, 0x49, 0x15, 0x86, 0x36, 0xfd, 0x96, 0xdb, + 0x78, 0x56, 0xba, 0x80, 0x95, 0x9e, 0x96, 0xc2, 0x10, 0x28, 0xab, 0x8a, 0x5b, 0xda, 0x36, 0x82, + 0xf4, 0x2d, 0x2d, 0x27, 0x22, 0x15, 0x98, 0xf8, 0x8c, 0x0d, 0x18, 0xd7, 0xf7, 0x3c, 0xc7, 0x0d, + 0x68, 0xe9, 0x22, 0xf6, 0x0b, 0xba, 0xf1, 0x7f, 0xa8, 0x23, 0xf4, 0xe1, 0x6c, 0x70, 0x90, 0x15, + 0x38, 0xbd, 0x12, 0xd6, 0xa2, 0xc0, 0x6d, 0xd3, 0x35, 0xc7, 0x73, 0xf6, 0x68, 0xb3, 0x74, 0x29, + 0xf6, 0xa3, 0xbb, 0x61, 0x3d, 0x44, 0x5c, 0xfd, 0x80, 0x23, 0x75, 0x3f, 0x7a, 0x82, 0x8f, 0x7c, + 0x0e, 0xd3, 0x4b, 0xdf, 0x44, 0x6c, 0xc4, 0xb4, 0x2a, 0x9d, 0xa6, 0x1b, 0xd5, 0x22, 0x3f, 0x70, + 0xf6, 0x68, 0xa9, 0x8c, 0xf2, 0x5e, 0x39, 0x3a, 0x2c, 0x5f, 0xa6, 0x02, 0x5f, 0x77, 0x18, 0x41, + 0x3d, 0xe4, 0x14, 0xfa, 0xf9, 0x78, 0x96, 0x04, 0xa6, 0xfd, 0x5a, 0xa7, 0xcd, 0x76, 0xdb, 0xa8, + 0xfd, 0xcb, 0x86, 0xf6, 0x35, 0x0c, 0xd7, 0x7e, 0xc8, 0x01, 0x29, 0xed, 0x6b, 0x84, 0xc4, 0x06, + 0x72, 0xdf, 0x77, 0xbd, 0x4a, 0x23, 0x72, 0x9f, 0x50, 0x61, 0x31, 0x87, 0xa5, 0x2b, 0x58, 0x53, + 0xf4, 0xf9, 0xff, 0xa2, 0xef, 0x7a, 0x75, 0x07, 0xd1, 0xf5, 0x50, 0xe0, 0xf5, 0x6f, 0x24, 0xcd, + 0x4d, 0xbe, 0x0f, 0x67, 0xd7, 0xfc, 0x5d, 0xb7, 0x45, 0xf9, 0x94, 0xc3, 0xd5, 0x82, 0xfe, 0x4b, + 0x0b, 0xe5, 0xa2, 0xcf, 0xff, 0x00, 0x29, 0xea, 0x62, 0xb6, 0x3a, 0x50, 0x34, 0xba, 0xcf, 0x3f, + 0x5b, 0x0a, 0x59, 0x82, 0x71, 0xfc, 0x2e, 0x5b, 0xf8, 0x33, 0x2c, 0x5d, 0x45, 0x93, 0xee, 0x4a, + 0x62, 0x97, 0x76, 0x73, 0x49, 0xa3, 0x59, 0xf2, 0xa2, 0xe0, 0x99, 0x6d, 0xb0, 0x91, 0x8f, 0x61, + 0x2e, 0x39, 0xbc, 0x17, 0x7c, 0xef, 0x91, 0xbb, 0xd7, 0x09, 0x68, 0xb3, 0xf4, 0x0a, 0xab, 0xaa, + 0xdd, 0x85, 0x82, 0x7c, 0x05, 0x33, 0xb8, 0xd6, 0x55, 0x3c, 0xdf, 0x7b, 0x76, 0xe0, 0xfe, 0x08, + 0xf7, 0xcf, 0x6c, 0xdb, 0x7b, 0x0d, 0xb7, 0xbd, 0xd7, 0x8e, 0x0e, 0xcb, 0x57, 0x70, 0x4d, 0xac, + 0x3b, 0x3a, 0x45, 0xc2, 0x6b, 0x9d, 0x2d, 0x63, 0xee, 0x21, 0x9c, 0x49, 0xd5, 0x9f, 0x14, 0xa1, + 0xff, 0xb1, 0x38, 0x9f, 0x1d, 0xb5, 0xd9, 0x9f, 0xe4, 0x0d, 0x18, 0x7c, 0xc2, 0x0c, 0x35, 0xdc, + 0x8e, 0xc4, 0x27, 0x7e, 0x1a, 0xeb, 0x8a, 0xf7, 0xc8, 0xb7, 0x39, 0xd1, 0xfb, 0x7d, 0xef, 0x16, + 0xee, 0x0f, 0x8c, 0x8c, 0x15, 0xc7, 0xf9, 0xb1, 0xfa, 0xfd, 0x81, 0x91, 0x89, 0xe2, 0xa4, 0x55, + 0x81, 0xd3, 0x09, 0x7a, 0x52, 0x82, 0x61, 0xea, 0xb1, 0xcd, 0x7f, 0x93, 0x6f, 0x88, 0x6c, 0xf9, + 0x93, 0x4c, 0xc3, 0x60, 0xcb, 0x3d, 0x70, 0x23, 0x2c, 0x70, 0xd0, 0xe6, 0x3f, 0xac, 0xdf, 0x2e, + 0x00, 0x49, 0xaf, 0x47, 0xe4, 0x56, 0x42, 0x0c, 0xdf, 0xfa, 0x0a, 0x90, 0x7e, 0x70, 0x20, 0xa5, + 0x7f, 0x06, 0x53, 0x7c, 0x40, 0xc8, 0x95, 0x53, 0x2b, 0x8b, 0xcf, 0xd8, 0x19, 0x68, 0xdd, 0xd9, + 0x24, 0xd0, 0xb8, 0xce, 0xae, 0x62, 0xd5, 0x3a, 0x30, 0x93, 0xb9, 0x12, 0x91, 0x35, 0x98, 0x39, + 0xf0, 0xbd, 0x68, 0xbf, 0xf5, 0x4c, 0x2e, 0x44, 0xa2, 0xb4, 0x02, 0x96, 0x86, 0x93, 0x6f, 0x26, + 0x81, 0x3d, 0x25, 0xc0, 0x42, 0x22, 0x96, 0x23, 0x9c, 0x4e, 0xb2, 0x25, 0x96, 0x0d, 0x67, 0x52, + 0x13, 0x3a, 0xf9, 0x08, 0xc6, 0x1b, 0x68, 0xdc, 0x19, 0x25, 0xf1, 0xe5, 0x4c, 0x83, 0xeb, 0xdf, + 0x2a, 0x87, 0xf3, 0xa6, 0xfc, 0xf3, 0x02, 0xcc, 0xe6, 0x4c, 0xe5, 0x27, 0x57, 0xf5, 0x17, 0x70, + 0xf6, 0xc0, 0xf9, 0xa6, 0x1e, 0xa0, 0xed, 0x5e, 0x0f, 0x1c, 0x2f, 0xa1, 0x6d, 0x9c, 0xa6, 0xb2, + 0x29, 0xf4, 0xd8, 0xa6, 0x03, 0xe7, 0x1b, 0x1b, 0x09, 0x6c, 0x86, 0xe7, 0xf5, 0xfc, 0x14, 0x26, + 0x8c, 0xc9, 0xfb, 0xc4, 0x95, 0xb3, 0xee, 0xc0, 0x99, 0x45, 0xda, 0xa2, 0x11, 0x3d, 0xb6, 0xcf, + 0xce, 0xda, 0x04, 0xa8, 0xd1, 0x03, 0xa7, 0xbd, 0xef, 0xb3, 0x4d, 0x7d, 0x55, 0xff, 0x25, 0x7c, + 0x3e, 0x44, 0x9a, 0x27, 0x12, 0xb1, 0xf3, 0x26, 0xdf, 0xe8, 0x87, 0x8a, 0xd2, 0xd6, 0xb8, 0xac, + 0xff, 0xd0, 0x07, 0x44, 0xcc, 0xbe, 0x01, 0x75, 0x0e, 0x64, 0x35, 0xde, 0x83, 0x71, 0x6e, 0xa1, + 0x73, 0x30, 0x56, 0x67, 0x6c, 0x7e, 0x4a, 0x7c, 0x79, 0x3a, 0x6a, 0xf9, 0x94, 0x6d, 0x90, 0x32, + 0x56, 0x9b, 0x72, 0xd7, 0x02, 0xb2, 0xf6, 0x19, 0xac, 0x3a, 0x8a, 0xb1, 0xea, 0xbf, 0xc9, 0x27, + 0x30, 0xb9, 0xe0, 0x1f, 0xb4, 0x99, 0x4e, 0x04, 0x73, 0xbf, 0x70, 0xdb, 0x88, 0x72, 0x0d, 0xe4, + 0xf2, 0x29, 0x3b, 0x41, 0x4e, 0xd6, 0x61, 0xea, 0x6e, 0xab, 0x13, 0xee, 0x57, 0xbc, 0xe6, 0x42, + 0xcb, 0x0f, 0xa5, 0x94, 0x01, 0x61, 0x69, 0x89, 0xb9, 0x33, 0x4d, 0xb1, 0x7c, 0xca, 0xce, 0x62, + 0x24, 0xd7, 0x60, 0x70, 0xe9, 0x09, 0x9b, 0xd3, 0x65, 0x84, 0x8b, 0x08, 0xc0, 0xdb, 0xf0, 0xe8, + 0xc6, 0xa3, 0xe5, 0x53, 0x36, 0xc7, 0x56, 0x47, 0x61, 0x58, 0x5a, 0xf7, 0xb7, 0xd8, 0x7e, 0x5b, + 0xa9, 0xb3, 0x16, 0x39, 0x51, 0x27, 0x24, 0x73, 0x30, 0xb2, 0xdd, 0x66, 0x46, 0xa7, 0x74, 0x8b, + 0xd8, 0xea, 0xb7, 0xf5, 0x86, 0xa9, 0x69, 0x72, 0x01, 0x62, 0x9f, 0xae, 0x20, 0xd6, 0x9c, 0xbc, + 0xcb, 0xa6, 0x72, 0xbb, 0x53, 0x1b, 0xe5, 0xf6, 0x25, 0xca, 0x2d, 0x26, 0x75, 0x6d, 0xcd, 0x64, + 0x2a, 0xcf, 0xfa, 0x1c, 0x2e, 0x6d, 0xb7, 0x43, 0x1a, 0x44, 0x95, 0x76, 0xbb, 0xe5, 0x36, 0xf8, + 0x09, 0x19, 0x7a, 0x01, 0xe4, 0x60, 0x79, 0x07, 0x86, 0x38, 0x40, 0x0c, 0x13, 0x39, 0x06, 0x2b, + 0xed, 0xb6, 0xf0, 0x3d, 0xbc, 0xc9, 0x77, 0xfe, 0xdc, 0x9b, 0x60, 0x0b, 0x6a, 0xeb, 0x37, 0x0a, + 0x70, 0x89, 0x7f, 0x01, 0xb9, 0xa2, 0xbf, 0x03, 0xa3, 0x18, 0xff, 0xd6, 0x76, 0x1a, 0xf2, 0x9b, + 0xe0, 0x81, 0x80, 0x12, 0x68, 0xc7, 0x78, 0x2d, 0xb2, 0xb0, 0x2f, 0x3f, 0xb2, 0x50, 0x7e, 0x60, + 0xfd, 0x99, 0x1f, 0xd8, 0x67, 0x60, 0x89, 0x1a, 0xb5, 0x5a, 0xa9, 0x4a, 0x85, 0xcf, 0x53, 0x2b, + 0xeb, 0x7f, 0xf4, 0xc1, 0xec, 0x3d, 0xea, 0xd1, 0xc0, 0xc1, 0x76, 0x1a, 0x5e, 0x2e, 0x3d, 0xc2, + 0xa8, 0xd0, 0x35, 0xc2, 0xa8, 0x2c, 0xfd, 0x86, 0x7d, 0xe8, 0x37, 0x4c, 0x85, 0x4b, 0x31, 0x5b, + 0x74, 0xdb, 0x5e, 0x11, 0xcd, 0x42, 0x5b, 0xb4, 0x13, 0xb8, 0xfc, 0x94, 0x61, 0x25, 0x8e, 0x4e, + 0x1a, 0xe8, 0xe9, 0x73, 0x98, 0x12, 0xd1, 0x1a, 0xc3, 0x22, 0x3a, 0xc9, 0x8c, 0x49, 0x5a, 0x87, + 0x21, 0xee, 0xee, 0xc4, 0xb3, 0xad, 0xb1, 0xf9, 0x1b, 0xe2, 0x9b, 0xca, 0x69, 0xa0, 0xf0, 0x8d, + 0xe2, 0xc2, 0xce, 0x87, 0x40, 0x84, 0x00, 0x5b, 0x48, 0x99, 0xfb, 0x0c, 0xc6, 0x34, 0x92, 0xe3, + 0xac, 0xfd, 0xca, 0xed, 0xca, 0xb6, 0xa3, 0xde, 0x1e, 0xf7, 0xe0, 0x6a, 0x6b, 0xbf, 0xf5, 0x01, + 0x94, 0xd2, 0xb5, 0x11, 0xae, 0xb6, 0x5e, 0x9e, 0x3d, 0x6b, 0x11, 0xa6, 0xef, 0xd1, 0x08, 0x07, + 0x2e, 0x7e, 0x44, 0x5a, 0x94, 0x5d, 0xe2, 0x3b, 0x93, 0xb3, 0x2a, 0x02, 0xd9, 0x00, 0xd3, 0xbe, + 0xd2, 0x1a, 0xcc, 0x24, 0xa4, 0x88, 0xf2, 0xdf, 0x87, 0x61, 0x01, 0x52, 0x33, 0xaa, 0x08, 0xd5, + 0xa5, 0xbb, 0x02, 0xb1, 0x33, 0xcf, 0xc7, 0xad, 0x90, 0x6c, 0x4b, 0x06, 0x6b, 0x1f, 0xce, 0xb2, + 0x65, 0x36, 0x96, 0xaa, 0x86, 0xe3, 0x79, 0x18, 0x6d, 0xb3, 0x8d, 0x42, 0xe8, 0xfe, 0x88, 0x0f, + 0xa3, 0x41, 0x7b, 0x84, 0x01, 0x6a, 0xee, 0x8f, 0x28, 0xb9, 0x08, 0x80, 0x48, 0x6c, 0xa6, 0x98, + 0x05, 0x90, 0x9c, 0xbb, 0x32, 0x09, 0x60, 0x8c, 0x1e, 0x1f, 0x37, 0x36, 0xfe, 0x6d, 0x05, 0x30, + 0x9b, 0x2a, 0x49, 0x34, 0xe0, 0x16, 0x8c, 0xc8, 0xfd, 0x71, 0xe2, 0x90, 0x41, 0x6f, 0x81, 0xad, + 0x88, 0xc8, 0xab, 0x70, 0xda, 0xa3, 0xdf, 0x44, 0xf5, 0x54, 0x1d, 0x26, 0x18, 0x78, 0x53, 0xd6, + 0xc3, 0xfa, 0x05, 0x74, 0x2c, 0xd7, 0x3c, 0xff, 0xe9, 0xa3, 0x96, 0xf3, 0x98, 0xa6, 0x0a, 0xfe, + 0x08, 0x46, 0x6a, 0xbd, 0x0b, 0xe6, 0x9f, 0x8f, 0x2c, 0xdc, 0x56, 0x2c, 0x56, 0x0b, 0xe6, 0x58, + 0x93, 0x6a, 0x95, 0xb5, 0xd5, 0x95, 0xe6, 0xe6, 0xb7, 0xad, 0xc0, 0x27, 0x70, 0x3e, 0xb3, 0xb4, + 0x6f, 0x5b, 0x89, 0x7f, 0x30, 0x00, 0xb3, 0x7c, 0x31, 0x49, 0x8f, 0xe0, 0xe3, 0x4f, 0x35, 0x3f, + 0x97, 0xf3, 0xde, 0xdb, 0x19, 0xe7, 0xbd, 0xc8, 0xa2, 0x9f, 0xf7, 0x1a, 0xa7, 0xbc, 0xef, 0x66, + 0x9f, 0xf2, 0xa2, 0x13, 0xca, 0x3c, 0xe5, 0x4d, 0x9e, 0xed, 0x2e, 0xe5, 0x9f, 0xed, 0xe2, 0xc1, + 0x53, 0xc6, 0xd9, 0x6e, 0xd6, 0x89, 0x6e, 0x22, 0x50, 0x6a, 0xe4, 0xe5, 0x06, 0x4a, 0xbd, 0x0a, + 0xc3, 0x95, 0x76, 0x5b, 0x0b, 0x3c, 0xc4, 0xee, 0x71, 0xda, 0x6d, 0xae, 0x3c, 0x89, 0x94, 0xf3, + 0x3c, 0x64, 0xcc, 0xf3, 0xef, 0x01, 0x2c, 0xe0, 0xf5, 0x08, 0xec, 0xb8, 0x31, 0xa4, 0xc0, 0x1d, + 0x3e, 0xbf, 0x34, 0x81, 0x1d, 0xa7, 0xbb, 0x57, 0x62, 0x62, 0xbe, 0xb1, 0xb7, 0x76, 0xa0, 0x94, + 0x1e, 0x3e, 0x2f, 0x61, 0xea, 0xfa, 0xfd, 0x02, 0x5c, 0x14, 0x9b, 0x9c, 0xc4, 0x07, 0x7e, 0xf2, + 0xd1, 0xf9, 0x36, 0x8c, 0x0b, 0xde, 0xad, 0xf8, 0x43, 0xe0, 0x07, 0xec, 0x72, 0x32, 0xe6, 0x33, + 0xba, 0x41, 0x46, 0xde, 0x86, 0x11, 0xfc, 0x23, 0x3e, 0x18, 0x62, 0x9a, 0x19, 0x45, 0xd2, 0x7a, + 0xf2, 0x78, 0x48, 0x91, 0x5a, 0x5f, 0xc3, 0xa5, 0xbc, 0x8a, 0xbf, 0x04, 0xbd, 0xfc, 0x9b, 0x02, + 0x9c, 0x17, 0xe2, 0x8d, 0xa9, 0xe2, 0xb9, 0x56, 0x9d, 0x13, 0x84, 0x2b, 0xdf, 0x87, 0x31, 0x56, + 0xa0, 0xac, 0x77, 0xbf, 0x58, 0x5a, 0x85, 0xe5, 0x10, 0x63, 0x16, 0x9d, 0xc8, 0x11, 0xe1, 0x37, + 0xce, 0x41, 0x4b, 0x7a, 0x46, 0x6c, 0x9d, 0xd9, 0xfa, 0x12, 0x2e, 0x64, 0x37, 0xe1, 0x25, 0xe8, + 0xe7, 0x3e, 0xcc, 0x65, 0x2c, 0x0a, 0xcf, 0xb7, 0x26, 0x7f, 0x01, 0xe7, 0x33, 0x65, 0xbd, 0x84, + 0x6a, 0x2e, 0xb3, 0x1d, 0x47, 0xf4, 0x12, 0xba, 0xd0, 0x7a, 0x08, 0xe7, 0x32, 0x24, 0xbd, 0x84, + 0x2a, 0xde, 0x83, 0x59, 0xb5, 0xd3, 0x7e, 0xa1, 0x1a, 0xae, 0xc1, 0x45, 0x2e, 0xe8, 0xe5, 0xf4, + 0xca, 0x03, 0x38, 0x2f, 0xc4, 0xbd, 0x04, 0xed, 0x2d, 0xc3, 0x85, 0xd8, 0xa0, 0xce, 0xd8, 0x27, + 0x1d, 0x7b, 0x92, 0xb1, 0x56, 0xe1, 0x72, 0x2c, 0x29, 0x67, 0xd3, 0x70, 0x7c, 0x69, 0x7c, 0x3b, + 0x18, 0xf7, 0xd2, 0x4b, 0xe9, 0xd1, 0x87, 0x70, 0xd6, 0x10, 0xfa, 0xd2, 0xb6, 0x4a, 0x2b, 0x30, + 0xc5, 0x05, 0x9b, 0x5b, 0xe7, 0x79, 0x7d, 0xeb, 0x3c, 0x36, 0x7f, 0x26, 0x16, 0x89, 0xe0, 0x9d, + 0x37, 0x33, 0x76, 0xd3, 0x6b, 0xb8, 0x9b, 0x96, 0x24, 0x71, 0x0d, 0xdf, 0x86, 0x21, 0x0e, 0x11, + 0xf5, 0xcb, 0x10, 0xc6, 0x8d, 0x05, 0xce, 0x26, 0x88, 0xad, 0xef, 0xc3, 0x45, 0x6e, 0x89, 0xc6, + 0x07, 0x95, 0xa6, 0xb5, 0xf8, 0x51, 0xc2, 0x10, 0x3d, 0x27, 0xe4, 0x26, 0xe9, 0x73, 0xec, 0xd1, + 0x5d, 0x39, 0xb6, 0xf3, 0xe4, 0x1f, 0xeb, 0xea, 0x9a, 0x34, 0x30, 0xfb, 0x32, 0x0d, 0xcc, 0xab, + 0x70, 0x45, 0x19, 0x98, 0xc9, 0x62, 0xe4, 0xd0, 0xb2, 0xbe, 0x84, 0xf3, 0xbc, 0xa1, 0x32, 0xa4, + 0xd0, 0xac, 0xc6, 0x07, 0x89, 0x66, 0xce, 0x8a, 0x66, 0x9a, 0xd4, 0x39, 0x8d, 0xfc, 0xbb, 0x05, + 0xf9, 0xc9, 0x65, 0x0b, 0xff, 0x79, 0x5b, 0xdc, 0xeb, 0x50, 0x56, 0x0a, 0x31, 0x6b, 0xf4, 0x7c, + 0xe6, 0xf6, 0x1a, 0xcc, 0xe8, 0x62, 0xdc, 0x06, 0xdd, 0xb9, 0x83, 0x27, 0x48, 0x6f, 0xb1, 0xcf, + 0x02, 0x01, 0x72, 0xd8, 0x95, 0x32, 0xf4, 0x86, 0xf4, 0xb6, 0xa2, 0xb4, 0xea, 0x70, 0x21, 0xdd, + 0x15, 0x6e, 0x43, 0xde, 0x27, 0x20, 0x9f, 0xb0, 0x4f, 0x18, 0x21, 0xa2, 0x33, 0x72, 0x85, 0xca, + 0xef, 0x98, 0xb3, 0x4b, 0x2e, 0xcb, 0x92, 0x53, 0x4d, 0xa2, 0xfd, 0xac, 0x74, 0x39, 0x1e, 0x7e, + 0x0c, 0x44, 0xa2, 0x16, 0x6a, 0xb6, 0x2c, 0xfa, 0x1c, 0xf4, 0x2f, 0xd4, 0x6c, 0x71, 0x91, 0x09, + 0x77, 0x82, 0x8d, 0x30, 0xb0, 0x19, 0x2c, 0xb9, 0x23, 0xef, 0x3b, 0xc6, 0x8e, 0xfc, 0xfe, 0xc0, + 0x48, 0x7f, 0x71, 0xc0, 0x26, 0x35, 0x77, 0xcf, 0x7b, 0xe8, 0x46, 0xfb, 0xaa, 0xc0, 0x8a, 0xf5, + 0x15, 0x4c, 0x19, 0xc5, 0x8b, 0xaf, 0xb8, 0xeb, 0x0d, 0x2c, 0xb6, 0x9f, 0x5d, 0xa8, 0x60, 0x58, + 0x0d, 0xba, 0x2c, 0xc6, 0xf9, 0x7c, 0xd3, 0x70, 0xea, 0x78, 0xbd, 0xd7, 0x96, 0x48, 0xeb, 0x77, + 0x07, 0x34, 0xe9, 0xda, 0xbd, 0xb6, 0x2e, 0xad, 0xbb, 0x03, 0xc0, 0x47, 0x88, 0xd6, 0x38, 0xb6, + 0x01, 0x1c, 0x13, 0xd1, 0x2a, 0x7c, 0x4a, 0xb6, 0x35, 0xa2, 0xe3, 0xde, 0x7b, 0x13, 0xf1, 0xc7, + 0x9c, 0x49, 0x5e, 0xf5, 0x54, 0xf1, 0xc7, 0x42, 0x74, 0x68, 0xeb, 0x44, 0xe4, 0xfb, 0xc9, 0xcb, + 0x19, 0x83, 0x78, 0x60, 0xf5, 0x8a, 0x3c, 0xc1, 0x4e, 0xb7, 0xed, 0x64, 0xf7, 0x33, 0x9e, 0xc2, + 0x0c, 0xe3, 0x75, 0x1f, 0xa1, 0x61, 0xb1, 0xf4, 0x4d, 0x44, 0x3d, 0x3e, 0xb7, 0x0f, 0x61, 0x39, + 0xd7, 0xba, 0x94, 0x13, 0x13, 0x0b, 0xff, 0x7b, 0x2c, 0xa7, 0x4e, 0x15, 0xce, 0xce, 0x96, 0x8f, + 0x83, 0xc8, 0x5e, 0x5d, 0xf2, 0x9a, 0x6d, 0xdf, 0x55, 0x06, 0x13, 0x1f, 0x44, 0x41, 0xab, 0x4e, + 0x05, 0xdc, 0xd6, 0x89, 0xac, 0x57, 0xbb, 0x46, 0xb5, 0x8f, 0xc0, 0xc0, 0xd6, 0xc2, 0xd6, 0x6a, + 0xb1, 0x60, 0xdd, 0x02, 0xd0, 0x4a, 0x02, 0x18, 0x5a, 0xdf, 0xb0, 0xd7, 0x2a, 0xab, 0xc5, 0x53, + 0x64, 0x06, 0xce, 0x3c, 0x5c, 0x59, 0x5f, 0xdc, 0x78, 0x58, 0xab, 0xd7, 0xd6, 0x2a, 0xf6, 0xd6, + 0x42, 0xc5, 0x5e, 0x2c, 0x16, 0xac, 0xaf, 0x61, 0xda, 0x6c, 0xe1, 0x4b, 0x1d, 0x84, 0x11, 0x4c, + 0xa9, 0xfd, 0xcc, 0xfd, 0x87, 0x5b, 0x5a, 0x44, 0xab, 0x30, 0xfe, 0x92, 0x91, 0x59, 0xc2, 0x4c, + 0x14, 0x9f, 0x91, 0x46, 0x44, 0x5e, 0xe7, 0xdb, 0x82, 0xe4, 0xcd, 0x65, 0xb6, 0x2d, 0xa8, 0xc7, + 0xfb, 0x02, 0x9c, 0xfa, 0xbe, 0x07, 0xd3, 0x66, 0xa9, 0xc7, 0xf5, 0x52, 0xbd, 0x82, 0xa1, 0xbe, + 0xda, 0xb5, 0x26, 0x42, 0xf4, 0x63, 0x03, 0x31, 0xb3, 0x7e, 0x0f, 0x8a, 0x82, 0x2a, 0x5e, 0x79, + 0xaf, 0x4a, 0x37, 0x62, 0x21, 0xe3, 0x12, 0xa6, 0x0c, 0x4a, 0xf7, 0xa1, 0xc8, 0x66, 0x4c, 0xc1, + 0xc9, 0x0b, 0x98, 0x86, 0xc1, 0xd5, 0xf8, 0x38, 0xc7, 0xe6, 0x3f, 0xf0, 0x76, 0x4f, 0xe4, 0x04, + 0x91, 0x8c, 0x83, 0x1b, 0xb5, 0xd5, 0x6f, 0xf2, 0x3a, 0x0c, 0xdd, 0x75, 0x5b, 0x91, 0x70, 0x8d, + 0xc4, 0x8b, 0x3c, 0x13, 0xcb, 0x11, 0xb6, 0x20, 0xb0, 0x6c, 0x38, 0xa3, 0x15, 0x78, 0x82, 0xaa, + 0x92, 0x12, 0x0c, 0xaf, 0xd3, 0x6f, 0xb4, 0xf2, 0xe5, 0x4f, 0xeb, 0x1d, 0x38, 0x23, 0x62, 0x0c, + 0x35, 0x35, 0x5d, 0x11, 0x77, 0xc5, 0x0b, 0xc6, 0x85, 0x55, 0x21, 0x12, 0x51, 0x8c, 0x6f, 0xbb, + 0xdd, 0x7c, 0x4e, 0x3e, 0xb6, 0x50, 0x9c, 0x90, 0xef, 0x35, 0x79, 0x0a, 0xd4, 0xab, 0x3b, 0xff, + 0x56, 0x1f, 0x94, 0x12, 0x5e, 0x86, 0x85, 0x7d, 0xa7, 0xd5, 0xa2, 0xde, 0x1e, 0x25, 0xd7, 0x61, + 0x60, 0x6b, 0x63, 0x6b, 0x53, 0x78, 0x49, 0x65, 0x74, 0x01, 0x03, 0x29, 0x1a, 0x1b, 0x29, 0xc8, + 0x03, 0x38, 0x23, 0xa3, 0x88, 0x15, 0x4a, 0xf4, 0xd0, 0xc5, 0xee, 0x31, 0xc9, 0x69, 0x3e, 0xf2, + 0x96, 0x70, 0x89, 0xfc, 0xb0, 0xe3, 0x06, 0xb4, 0x89, 0x9e, 0x9f, 0xf8, 0xa8, 0x5e, 0xc3, 0xd8, + 0x3a, 0x19, 0xf9, 0x1e, 0x8c, 0xd7, 0x6a, 0x1b, 0x71, 0xe9, 0x83, 0xc6, 0x09, 0x91, 0x8e, 0xb2, + 0x0d, 0x42, 0x7e, 0x25, 0xd8, 0xfa, 0x83, 0x02, 0xcc, 0xe6, 0xb8, 0x5b, 0xc8, 0xeb, 0x86, 0x1e, + 0xa6, 0x34, 0x3d, 0x48, 0x92, 0xe5, 0x53, 0x42, 0x11, 0x0b, 0x5a, 0x4c, 0x76, 0xff, 0x09, 0x62, + 0xb2, 0x97, 0x4f, 0xc5, 0x71, 0xd8, 0xe4, 0x55, 0xe8, 0xaf, 0xd5, 0x36, 0x84, 0x5b, 0x9d, 0xc4, + 0x2d, 0xd0, 0x88, 0x19, 0x41, 0x15, 0x60, 0x44, 0x82, 0xac, 0xd3, 0x30, 0x61, 0x74, 0x8c, 0x65, + 0xc1, 0xb8, 0x5e, 0x43, 0xd6, 0xfb, 0x0b, 0x7e, 0x53, 0xf5, 0x3e, 0xfb, 0xdb, 0xfa, 0xb1, 0xa9, + 0x33, 0x72, 0x11, 0x40, 0x9e, 0xd7, 0xba, 0x4d, 0x79, 0xf2, 0x23, 0x20, 0x2b, 0x4d, 0x72, 0x05, + 0xc6, 0x03, 0xda, 0x74, 0x03, 0xda, 0x88, 0xea, 0x9d, 0x40, 0x5c, 0x8c, 0xb1, 0xc7, 0x24, 0x6c, + 0x3b, 0x68, 0x91, 0xef, 0xc0, 0x10, 0x3f, 0x48, 0x16, 0xad, 0x97, 0x46, 0x42, 0xad, 0xb6, 0xb1, + 0x76, 0xb7, 0xc2, 0x0f, 0xba, 0x6d, 0x41, 0x62, 0x55, 0x61, 0x4c, 0x6b, 0x55, 0xaf, 0xd2, 0xa7, + 0x61, 0x50, 0xf7, 0x52, 0xf2, 0x1f, 0xd6, 0x6f, 0x16, 0x60, 0x1a, 0x87, 0xc1, 0x9e, 0xcb, 0x96, + 0x87, 0xb8, 0x2d, 0xf3, 0x46, 0xa7, 0x5d, 0x30, 0x3a, 0x2d, 0x41, 0xab, 0x7a, 0xef, 0xfd, 0x54, + 0xef, 0x5d, 0xc8, 0xea, 0x3d, 0x9c, 0x02, 0x5c, 0xdf, 0xd3, 0x3b, 0x4d, 0x3f, 0xae, 0xfb, 0xed, + 0x02, 0x4c, 0x69, 0x75, 0x52, 0x0d, 0xbc, 0x63, 0x54, 0xe9, 0x7c, 0x46, 0x95, 0x52, 0xe3, 0xa9, + 0x9a, 0xaa, 0xd1, 0x2b, 0xdd, 0x6a, 0x94, 0x35, 0x9c, 0x8c, 0x61, 0xf2, 0xe7, 0x05, 0x98, 0xc9, + 0xd4, 0x01, 0x39, 0xcb, 0xf6, 0xff, 0x8d, 0x80, 0x46, 0x42, 0xf3, 0xe2, 0x17, 0x83, 0xaf, 0x84, + 0x61, 0x87, 0x06, 0x42, 0xef, 0xe2, 0x17, 0x79, 0x05, 0x26, 0x36, 0x69, 0xe0, 0xfa, 0x4d, 0x7e, + 0x31, 0x81, 0x47, 0xfc, 0x4e, 0xd8, 0x26, 0x90, 0x5c, 0x80, 0x51, 0x15, 0xb1, 0xca, 0x7d, 0xb8, + 0x76, 0x0c, 0x60, 0xb2, 0x17, 0xdd, 0x3d, 0x7e, 0xf0, 0xc3, 0x98, 0xc5, 0x2f, 0x36, 0x01, 0x4b, + 0x8f, 0xea, 0x10, 0x9f, 0x80, 0xa5, 0xbb, 0xf4, 0x2c, 0x0c, 0x7d, 0x66, 0xe3, 0x38, 0xc6, 0x9c, + 0x13, 0xb6, 0xf8, 0x45, 0x26, 0x31, 0xb4, 0x1c, 0xef, 0xc5, 0x60, 0x48, 0xf9, 0xfb, 0x30, 0x9d, + 0xa5, 0xd7, 0xac, 0xaf, 0x40, 0xf0, 0xf6, 0x29, 0xde, 0x2f, 0x61, 0xaa, 0xd2, 0x6c, 0xc6, 0xc3, + 0x95, 0xf7, 0x2a, 0x9f, 0x27, 0xb8, 0x4f, 0x53, 0x6c, 0x6b, 0x07, 0x56, 0x3c, 0x37, 0xb2, 0xa7, + 0x96, 0xbe, 0x71, 0xc3, 0xc8, 0xf5, 0xf6, 0x34, 0xc7, 0xab, 0x7d, 0x76, 0x9d, 0x3e, 0xcd, 0x18, + 0x02, 0x6c, 0xc7, 0x61, 0xca, 0xe6, 0xf0, 0x0c, 0xe1, 0xd3, 0x9a, 0xd8, 0x78, 0xea, 0x9a, 0x35, + 0xe5, 0xc6, 0x88, 0xfe, 0x4a, 0xe3, 0xb1, 0xf5, 0x3d, 0x38, 0xcb, 0xa7, 0xfd, 0x6e, 0x95, 0x17, + 0xd5, 0xd6, 0xfd, 0xc4, 0xd6, 0xbb, 0xd2, 0x93, 0xd3, 0xb5, 0x66, 0xf6, 0xb8, 0x51, 0x17, 0x2c, + 0xf2, 0xbf, 0x17, 0x60, 0x2e, 0xc1, 0x5a, 0x7b, 0xe6, 0x35, 0xe4, 0x9a, 0xf3, 0x6a, 0x32, 0x74, + 0x1f, 0xf7, 0x4a, 0xdc, 0x41, 0xea, 0x36, 0x55, 0xf4, 0x3e, 0xb9, 0x05, 0xc0, 0x99, 0xb5, 0x2d, + 0x0e, 0x1e, 0x0f, 0x88, 0x28, 0x27, 0xdc, 0xe4, 0x68, 0x24, 0xa4, 0x03, 0x59, 0x7a, 0x17, 0xdf, + 0x48, 0x2f, 0xff, 0x39, 0xe6, 0x59, 0xa1, 0x82, 0xbd, 0x9e, 0xe3, 0x48, 0xcf, 0x92, 0x6f, 0xfd, + 0xbd, 0x7e, 0x98, 0xd5, 0x3b, 0xf0, 0x79, 0xda, 0xba, 0x09, 0x63, 0x0b, 0xbe, 0x17, 0xd1, 0x6f, + 0x22, 0x2d, 0xcf, 0x05, 0x51, 0xd1, 0x08, 0x0a, 0x23, 0xb6, 0xd7, 0x1c, 0x50, 0x67, 0x7b, 0x3d, + 0x23, 0x5a, 0x33, 0x26, 0x24, 0x0b, 0x30, 0xb1, 0x4e, 0x9f, 0xa6, 0x14, 0x88, 0x11, 0xa3, 0x1e, + 0x7d, 0x5a, 0xd7, 0x94, 0xa8, 0x87, 0xf1, 0x19, 0x3c, 0x64, 0x17, 0x26, 0xe5, 0xe0, 0x32, 0x94, + 0x39, 0xa7, 0xaf, 0xbc, 0xe6, 0x70, 0xe6, 0x79, 0x20, 0x58, 0x09, 0x39, 0x3a, 0x4c, 0x48, 0x64, + 0x4d, 0xe7, 0x25, 0xf2, 0xd4, 0x06, 0xe6, 0xd2, 0xae, 0x61, 0x8c, 0x78, 0xdc, 0x64, 0x4a, 0x03, + 0x5d, 0x84, 0xb5, 0x09, 0xa5, 0x74, 0x7f, 0x88, 0xd2, 0xde, 0x82, 0x21, 0x0e, 0x15, 0x5b, 0x25, + 0x99, 0xc2, 0x48, 0x51, 0x73, 0x5f, 0x46, 0x53, 0xac, 0x4a, 0x1c, 0x66, 0x2d, 0xa3, 0x7f, 0x49, + 0xd1, 0xa8, 0xcd, 0xea, 0xed, 0x64, 0xf7, 0x62, 0xa8, 0xb3, 0xec, 0x5e, 0x3d, 0x16, 0x47, 0x5e, + 0x49, 0x59, 0x40, 0x17, 0x9d, 0x2e, 0x49, 0x54, 0xec, 0x06, 0x0c, 0x0b, 0x50, 0x22, 0xb9, 0x52, + 0xfc, 0xf9, 0x49, 0x02, 0xeb, 0x7d, 0x38, 0x87, 0xfe, 0x42, 0xd7, 0xdb, 0x6b, 0xd1, 0xed, 0xd0, + 0xb8, 0x54, 0xd2, 0xeb, 0xb3, 0xfe, 0x10, 0xe6, 0xb2, 0x78, 0x7b, 0x7e, 0xd9, 0x3c, 0xdd, 0xc9, + 0x9f, 0xf6, 0xc1, 0xf4, 0x4a, 0xa8, 0x6f, 0xb8, 0x54, 0xca, 0x93, 0x8c, 0x34, 0x1c, 0xa8, 0x93, + 0xe5, 0x53, 0x59, 0x69, 0x36, 0xde, 0xd2, 0xae, 0xbb, 0xf6, 0x75, 0xcb, 0xaf, 0xc1, 0x96, 0x2d, + 0x75, 0xe1, 0xf5, 0x55, 0x18, 0x58, 0x67, 0x53, 0x75, 0xbf, 0xe8, 0x3b, 0xce, 0xc1, 0x40, 0x78, + 0xdd, 0x94, 0x2d, 0x91, 0xec, 0x07, 0xb9, 0x9b, 0xba, 0xd4, 0x3a, 0xd0, 0x3b, 0x7f, 0xc4, 0xf2, + 0xa9, 0xd4, 0xfd, 0xd6, 0x77, 0x60, 0xac, 0xd2, 0x3c, 0xe0, 0x21, 0x99, 0xbe, 0x97, 0xf8, 0x2c, + 0x35, 0xcc, 0xf2, 0x29, 0x5b, 0x27, 0x24, 0xd7, 0xf8, 0xad, 0x86, 0xa1, 0x9c, 0x9c, 0x1a, 0x6c, + 0xb3, 0x56, 0x69, 0xb7, 0xab, 0x23, 0x30, 0xc4, 0x2f, 0x5a, 0x5a, 0x5f, 0xc2, 0x9c, 0x08, 0xe4, + 0xe1, 0xde, 0x51, 0x0c, 0xf7, 0x09, 0xe3, 0x58, 0xad, 0x6e, 0xc1, 0x37, 0x97, 0x00, 0xd0, 0x16, + 0x5a, 0xf1, 0x9a, 0xf4, 0x1b, 0x11, 0x49, 0xa8, 0x41, 0xac, 0xb7, 0x61, 0x54, 0x69, 0x08, 0x37, + 0xfc, 0xda, 0x62, 0x87, 0xda, 0x9a, 0x36, 0x6e, 0xf1, 0xca, 0xab, 0xbb, 0xe7, 0x8c, 0xb6, 0x8b, + 0x2c, 0x39, 0xdc, 0x42, 0x70, 0x61, 0x26, 0x31, 0x08, 0xe2, 0x24, 0x0c, 0x6a, 0x8f, 0xce, 0x43, + 0x1d, 0xd5, 0xef, 0xe4, 0x16, 0xbe, 0xef, 0x58, 0x5b, 0x78, 0xeb, 0x5f, 0xf6, 0xa1, 0x71, 0x99, + 0xd2, 0x47, 0xc2, 0x4f, 0xa7, 0xfb, 0x0a, 0xab, 0x30, 0x8a, 0xad, 0x5f, 0x94, 0x17, 0x06, 0xbb, + 0xc7, 0xa1, 0x8c, 0xfc, 0xe4, 0xb0, 0x7c, 0x0a, 0x83, 0x4f, 0x62, 0x36, 0xf2, 0x31, 0x0c, 0x2f, + 0x79, 0x4d, 0x94, 0xd0, 0x7f, 0x02, 0x09, 0x92, 0x89, 0xf5, 0x09, 0x56, 0x79, 0x8b, 0x7d, 0xc2, + 0xdc, 0xbd, 0x63, 0x6b, 0x90, 0xd8, 0xca, 0x1d, 0xcc, 0xb3, 0x72, 0x87, 0x12, 0x56, 0xae, 0x05, + 0x83, 0x1b, 0x41, 0x53, 0xe4, 0xb6, 0x99, 0x9c, 0x1f, 0x17, 0x8a, 0x43, 0x98, 0xcd, 0x51, 0xd6, + 0xff, 0x2c, 0xc0, 0xec, 0x3d, 0x1a, 0x65, 0x8e, 0x21, 0x43, 0x2b, 0x85, 0x17, 0xd6, 0x4a, 0xdf, + 0xf3, 0x68, 0x45, 0xb5, 0xba, 0x3f, 0xaf, 0xd5, 0x03, 0x79, 0xad, 0x1e, 0xcc, 0x6f, 0xf5, 0x3d, + 0x18, 0xe2, 0x4d, 0x65, 0x96, 0xfc, 0x4a, 0x44, 0x0f, 0x62, 0x4b, 0x5e, 0x8f, 0xa2, 0xb3, 0x39, + 0x8e, 0x6d, 0x24, 0x57, 0x9d, 0x50, 0xb7, 0xe4, 0xc5, 0x4f, 0xeb, 0x07, 0x78, 0xd5, 0x78, 0xd5, + 0x6f, 0x3c, 0xd6, 0x3c, 0xc2, 0xc3, 0xfc, 0x0b, 0x4d, 0x9e, 0x20, 0x30, 0x2a, 0x8e, 0xb1, 0x25, + 0x05, 0xb9, 0x0c, 0x63, 0x2b, 0xde, 0x5d, 0x3f, 0x68, 0xd0, 0x0d, 0xaf, 0xc5, 0xa5, 0x8f, 0xd8, + 0x3a, 0x48, 0x78, 0x4a, 0x44, 0x09, 0xb1, 0xfb, 0x01, 0x01, 0x09, 0xf7, 0x03, 0x83, 0xed, 0xcc, + 0xdb, 0x1c, 0x27, 0x1c, 0x31, 0xec, 0xef, 0x6e, 0x96, 0xbb, 0x32, 0xf1, 0x7b, 0x11, 0xee, 0xc2, + 0x39, 0x9b, 0xb6, 0x5b, 0x0e, 0xdb, 0xd3, 0x1d, 0xf8, 0x9c, 0x5e, 0xb5, 0xf9, 0x72, 0xc6, 0x35, + 0x41, 0x33, 0xa6, 0x42, 0x55, 0xb9, 0xaf, 0x4b, 0x95, 0x0f, 0xe0, 0xca, 0x3d, 0x1a, 0x99, 0x13, + 0x6a, 0xec, 0x6f, 0x16, 0x8d, 0x5f, 0x86, 0x91, 0xd0, 0xf4, 0x95, 0xcb, 0x6b, 0x6f, 0x99, 0x8c, + 0x3b, 0x6f, 0xca, 0xd3, 0x24, 0x21, 0x47, 0xfd, 0x65, 0x7d, 0x02, 0xe5, 0xbc, 0xe2, 0x8e, 0x17, + 0xf2, 0xea, 0xc2, 0xe5, 0x7c, 0x01, 0xa2, 0xba, 0x4b, 0x20, 0xfd, 0xea, 0xe2, 0x13, 0xea, 0x55, + 0x5b, 0xd3, 0x15, 0x2f, 0xfe, 0xb0, 0xaa, 0x32, 0xf8, 0xef, 0x05, 0xaa, 0x5b, 0xc7, 0x23, 0x6b, + 0x53, 0x40, 0xac, 0xd7, 0x0a, 0x8c, 0x48, 0x98, 0xd0, 0xeb, 0x6c, 0x66, 0x4d, 0xa5, 0x42, 0x9b, + 0x52, 0x80, 0x62, 0xb3, 0x7e, 0x20, 0x8f, 0x6f, 0x4c, 0x8e, 0xe3, 0xdd, 0x9b, 0x3d, 0xce, 0x79, + 0x8d, 0xe5, 0xc3, 0x39, 0x53, 0xb6, 0xee, 0x96, 0x2f, 0x6a, 0x6e, 0x79, 0xee, 0x8d, 0xbf, 0x6c, + 0xba, 0x89, 0x85, 0xa7, 0x41, 0x03, 0x91, 0x4b, 0xba, 0xf3, 0x7d, 0x3c, 0x7d, 0x11, 0xf7, 0x36, + 0xcc, 0x65, 0x15, 0xa8, 0xd9, 0x81, 0xca, 0xc3, 0x2b, 0xf6, 0x3b, 0x8b, 0x70, 0x49, 0x66, 0x97, + 0xf2, 0xfd, 0x28, 0x8c, 0x02, 0xa7, 0x5d, 0x6b, 0x04, 0x6e, 0x3b, 0xe6, 0xb2, 0x60, 0x88, 0x43, + 0x84, 0x26, 0xf8, 0x51, 0x18, 0xa7, 0x11, 0x18, 0xeb, 0x57, 0x0a, 0x60, 0x19, 0x71, 0x5a, 0xd8, + 0xcf, 0x9b, 0x81, 0xff, 0xc4, 0x6d, 0x6a, 0xc7, 0x4f, 0xaf, 0x1b, 0xae, 0x4f, 0x7e, 0x27, 0x31, + 0x19, 0x22, 0x2e, 0xe6, 0xcc, 0xdb, 0x09, 0x77, 0x24, 0xdf, 0x78, 0x62, 0xec, 0x96, 0x79, 0x21, + 0x42, 0xb9, 0x29, 0xff, 0x77, 0x01, 0xae, 0x76, 0xad, 0x83, 0x68, 0xcf, 0x2e, 0x14, 0x93, 0x38, + 0x31, 0x82, 0xca, 0x5a, 0xdc, 0x46, 0x5a, 0xc2, 0xce, 0x1d, 0x1e, 0x87, 0x2e, 0xe3, 0x9b, 0xda, + 0x4a, 0x72, 0x4a, 0xde, 0xc9, 0x6b, 0x8f, 0xf9, 0x2b, 0xfc, 0xc8, 0x69, 0x2d, 0xa0, 0x03, 0xa0, + 0x3f, 0xbe, 0x53, 0x10, 0x31, 0x68, 0x3d, 0x99, 0x26, 0x43, 0x23, 0xb6, 0x3e, 0xc5, 0xef, 0x3a, + 0xbb, 0xd2, 0xc7, 0xfb, 0xd4, 0x16, 0xe0, 0x6a, 0x22, 0x76, 0xe0, 0x39, 0x84, 0x44, 0x30, 0xc3, + 0xd4, 0xcf, 0xf6, 0xde, 0xf7, 0x02, 0xbf, 0xd3, 0xfe, 0xf9, 0xf4, 0xfa, 0x1f, 0x16, 0x78, 0x30, + 0xa7, 0x5e, 0xac, 0xe8, 0xe8, 0x05, 0x80, 0x18, 0x9a, 0x08, 0xea, 0x57, 0x88, 0x9d, 0x3b, 0xdc, + 0xe4, 0xc6, 0x53, 0x85, 0x3d, 0x2e, 0x40, 0x63, 0xfb, 0xf9, 0xf6, 0xe4, 0x9b, 0x18, 0x30, 0xa0, + 0x4a, 0x3f, 0x9e, 0xde, 0xdf, 0x91, 0xfe, 0x8f, 0x13, 0xf2, 0xed, 0xc3, 0x34, 0x9b, 0x01, 0x2a, + 0x9d, 0x68, 0xdf, 0x0f, 0xdc, 0x48, 0x5e, 0x4f, 0x21, 0x9b, 0x22, 0x23, 0x00, 0xe7, 0xfa, 0xf0, + 0x67, 0x87, 0xe5, 0x77, 0x4f, 0x92, 0xf7, 0x53, 0xca, 0xdc, 0x52, 0x59, 0x04, 0xac, 0x59, 0xe8, + 0x5f, 0xb0, 0x57, 0x71, 0xc2, 0xb3, 0x57, 0xd5, 0x84, 0x67, 0xaf, 0x5a, 0x7f, 0xd1, 0x07, 0x65, + 0x9e, 0xb3, 0x04, 0xe3, 0x4c, 0x62, 0xaf, 0x85, 0x16, 0xb8, 0x72, 0x5c, 0x07, 0x43, 0x22, 0x27, + 0x49, 0xdf, 0x71, 0x72, 0x92, 0xfc, 0x12, 0xe4, 0xb8, 0xac, 0x8e, 0xe1, 0x05, 0x78, 0xed, 0xe8, + 0xb0, 0x7c, 0x35, 0xf6, 0x02, 0x70, 0x6c, 0x96, 0x3b, 0x20, 0xa7, 0x88, 0xb4, 0xff, 0x62, 0xe0, + 0x39, 0xfc, 0x17, 0xb7, 0x61, 0x18, 0x8d, 0x99, 0x95, 0x4d, 0x11, 0xf9, 0x89, 0xc3, 0x13, 0x33, + 0x14, 0xd5, 0x5d, 0x3d, 0x1d, 0xa0, 0x24, 0xb3, 0xfe, 0x61, 0x1f, 0x5c, 0xce, 0xd7, 0xb9, 0xa8, + 0xdb, 0x22, 0x40, 0x1c, 0xe1, 0xd2, 0x2d, 0xa2, 0x06, 0xbf, 0x9d, 0xa7, 0x74, 0x57, 0x45, 0xb4, + 0x69, 0x7c, 0x6c, 0xef, 0x23, 0x6f, 0x5a, 0x27, 0x8e, 0x53, 0x8c, 0x0b, 0xd8, 0x22, 0x9b, 0xad, + 0x00, 0x19, 0xd9, 0x6c, 0x05, 0x8c, 0xec, 0xc2, 0xec, 0x66, 0xe0, 0x3e, 0x71, 0x22, 0xfa, 0x80, + 0x3e, 0xe3, 0x97, 0x85, 0x96, 0xc4, 0x0d, 0x21, 0x7e, 0x7d, 0xfe, 0xfa, 0xd1, 0x61, 0xf9, 0x95, + 0x36, 0x27, 0xc1, 0x8c, 0x65, 0xfc, 0xee, 0x67, 0x3d, 0x7d, 0x69, 0x28, 0x4f, 0x90, 0xf5, 0xef, + 0x0b, 0x70, 0x1e, 0xb7, 0xe5, 0xc2, 0xed, 0x2a, 0x0b, 0x7f, 0xae, 0xc0, 0x4a, 0xbd, 0x81, 0x62, + 0x2c, 0x62, 0x60, 0xa5, 0x71, 0x13, 0xdd, 0x36, 0xc8, 0xc8, 0x0a, 0x8c, 0x89, 0xdf, 0xf8, 0xfd, + 0xf5, 0xa3, 0x41, 0x30, 0xa3, 0x4d, 0x58, 0x38, 0xd4, 0xb9, 0xab, 0x08, 0x07, 0xb6, 0x10, 0x86, + 0x17, 0x36, 0x6d, 0x9d, 0xd7, 0xfa, 0x69, 0x1f, 0x5c, 0xd8, 0xa1, 0x81, 0xfb, 0xe8, 0x59, 0x4e, + 0x63, 0x36, 0x60, 0x5a, 0x82, 0x78, 0xde, 0x12, 0xe3, 0x13, 0xe3, 0xf9, 0x2c, 0x65, 0x55, 0x45, + 0xe2, 0x13, 0xf9, 0xc5, 0x65, 0x32, 0x9e, 0x20, 0x64, 0xf2, 0x2d, 0x18, 0x49, 0x64, 0x0e, 0xc2, + 0xfe, 0x97, 0x5f, 0x68, 0xdc, 0x55, 0xcb, 0xa7, 0x6c, 0x45, 0x49, 0x7e, 0x2d, 0xff, 0xa8, 0x4a, + 0xb8, 0x3e, 0x7a, 0xf9, 0x3f, 0xf1, 0x83, 0x65, 0x1f, 0xab, 0xa3, 0x61, 0x33, 0x3e, 0xd8, 0xe5, + 0x53, 0x76, 0x5e, 0x49, 0xd5, 0x31, 0x18, 0xad, 0xe0, 0xb9, 0x1d, 0xb3, 0xdc, 0xff, 0x57, 0x1f, + 0x5c, 0x92, 0x17, 0x7f, 0x72, 0xd4, 0xfc, 0x39, 0xcc, 0x4a, 0x50, 0xa5, 0xcd, 0x36, 0x0c, 0xb4, + 0x69, 0x6a, 0x9a, 0xe7, 0x94, 0x95, 0x9a, 0x76, 0x04, 0x4d, 0xac, 0xec, 0x3c, 0xf6, 0x97, 0xe3, + 0xfd, 0xfc, 0x38, 0x2b, 0x8f, 0x13, 0x7a, 0x21, 0xf5, 0x39, 0xd3, 0x50, 0x8d, 0x31, 0x7f, 0x36, + 0x53, 0xde, 0xd3, 0x81, 0x17, 0xf5, 0x9e, 0x2e, 0x9f, 0x4a, 0xfa, 0x4f, 0xab, 0x93, 0x30, 0xbe, + 0x4e, 0x9f, 0xc6, 0x7a, 0xff, 0x9b, 0x85, 0x44, 0xaa, 0x07, 0xb6, 0xc3, 0xe0, 0x39, 0x1f, 0x0a, + 0x71, 0x2a, 0x20, 0x4c, 0xf5, 0xa0, 0xef, 0x30, 0x38, 0xe9, 0x0a, 0x0c, 0xf3, 0xc3, 0xec, 0xe6, + 0x31, 0x2c, 0x7c, 0x75, 0x83, 0x87, 0x5f, 0xab, 0x6c, 0x72, 0x63, 0x5f, 0xf0, 0x5b, 0x0f, 0xe0, + 0x8a, 0x88, 0xf1, 0x36, 0x3b, 0x1f, 0x0b, 0x3a, 0xe1, 0xf2, 0x65, 0x39, 0x70, 0xe9, 0x1e, 0x4d, + 0x4e, 0x3d, 0xc6, 0x0d, 0xa7, 0x4f, 0xe0, 0xb4, 0x01, 0x57, 0x12, 0x71, 0x57, 0xaa, 0xc6, 0x90, + 0x12, 0x9d, 0xa4, 0xb6, 0x2e, 0x67, 0x15, 0xa1, 0x57, 0xd6, 0xa2, 0x98, 0x1c, 0x36, 0x88, 0x8f, + 0xd8, 0xc2, 0x13, 0xcc, 0x7a, 0xd7, 0xb5, 0xef, 0x9a, 0xcf, 0x78, 0x3c, 0x7b, 0xa0, 0x5c, 0x79, + 0x15, 0xd6, 0x9a, 0x30, 0xce, 0x02, 0xac, 0x49, 0x18, 0x97, 0xa8, 0x16, 0x0d, 0x43, 0xeb, 0xbf, + 0x0c, 0x82, 0x25, 0x14, 0x9b, 0x75, 0x42, 0x2f, 0xf5, 0xb1, 0x9b, 0xaa, 0xac, 0x58, 0xa8, 0xce, + 0xea, 0x39, 0x49, 0x63, 0x2c, 0x1f, 0x79, 0xb8, 0xcf, 0x6b, 0xc4, 0x50, 0x63, 0xe4, 0xa5, 0x5a, + 0xff, 0x55, 0xce, 0x34, 0xc9, 0x3f, 0x36, 0xbc, 0xb2, 0x9d, 0x33, 0x4d, 0x1a, 0x72, 0xb3, 0xa7, + 0x4c, 0xdb, 0x3c, 0x12, 0xe9, 0x7f, 0x9e, 0x23, 0x11, 0xf6, 0x45, 0xea, 0x87, 0x22, 0xdb, 0xa6, + 0x2e, 0xc5, 0xf7, 0x28, 0x4f, 0xef, 0x75, 0x94, 0xc8, 0xb8, 0xa0, 0x41, 0x0c, 0xa9, 0x86, 0x18, + 0xe2, 0x42, 0x51, 0xf3, 0x59, 0x2e, 0xec, 0xd3, 0xc6, 0x63, 0xe1, 0x2b, 0x96, 0x07, 0xba, 0x59, + 0x3e, 0x73, 0x9e, 0x9f, 0x9a, 0x7f, 0xe7, 0x1c, 0x51, 0x6f, 0x30, 0x56, 0x3d, 0x63, 0x44, 0x52, + 0x2c, 0xf9, 0x11, 0x4c, 0xa9, 0xae, 0x4e, 0x84, 0x68, 0x8d, 0xcd, 0xbf, 0x12, 0xa7, 0x32, 0x3d, + 0x78, 0xe4, 0xdc, 0x7c, 0x72, 0xe7, 0x66, 0x06, 0x2d, 0x4f, 0x44, 0xd0, 0x90, 0x08, 0x2d, 0x3e, + 0x4b, 0x3f, 0xe8, 0xca, 0x60, 0x24, 0x5f, 0xc0, 0x74, 0xad, 0xb6, 0xc1, 0x2f, 0x73, 0xd8, 0xf2, + 0x80, 0xdf, 0x5e, 0x15, 0x01, 0x5b, 0xd8, 0xdd, 0x61, 0xe8, 0xd7, 0xc5, 0x25, 0x10, 0x3d, 0x2c, + 0x40, 0x4f, 0xc5, 0x90, 0x25, 0x42, 0x3f, 0x29, 0xff, 0x07, 0xea, 0xae, 0x02, 0xdb, 0x8a, 0xb8, + 0x2d, 0x2a, 0x2e, 0x1d, 0xc9, 0x81, 0x9d, 0x73, 0xca, 0x57, 0xf8, 0x96, 0x4f, 0xf9, 0x7e, 0xaf, + 0x4f, 0xde, 0xd0, 0x48, 0x1f, 0xb4, 0x9e, 0xf8, 0xb0, 0x2f, 0xb3, 0x05, 0xc7, 0x5a, 0xa7, 0x33, + 0x2b, 0x47, 0xaa, 0xf2, 0xa8, 0x54, 0x25, 0x2b, 0x9b, 0x54, 0xc7, 0x0e, 0x31, 0xc2, 0x38, 0x3d, + 0xc5, 0x5d, 0x91, 0xc6, 0x95, 0x3c, 0x87, 0xeb, 0x7f, 0xf1, 0x73, 0xb8, 0x1f, 0xc3, 0x8c, 0xbc, + 0x1a, 0xb5, 0x40, 0xbd, 0x88, 0x06, 0xf2, 0xc4, 0x7e, 0x32, 0x4e, 0xfa, 0x86, 0xe9, 0xfd, 0x8a, + 0xd0, 0x5f, 0xb1, 0xd7, 0x85, 0x47, 0x87, 0xfd, 0x49, 0x2e, 0x9b, 0x01, 0x71, 0xfc, 0xce, 0x9b, + 0x11, 0xfe, 0x76, 0x99, 0x55, 0x97, 0xfb, 0x59, 0x5c, 0x99, 0xaa, 0xcf, 0xd6, 0x41, 0xd6, 0x02, + 0x9c, 0x37, 0x8b, 0xdf, 0xa4, 0xc1, 0x81, 0x8b, 0x7b, 0xef, 0x1a, 0x8d, 0x64, 0xa1, 0x85, 0xb8, + 0x50, 0xa2, 0x07, 0x54, 0x0b, 0x33, 0xf0, 0xff, 0xf6, 0x41, 0x39, 0xb3, 0x11, 0x95, 0x30, 0x74, + 0xf7, 0x3c, 0xcc, 0xa0, 0x71, 0x01, 0x06, 0x1e, 0xb8, 0x5e, 0x53, 0x37, 0x24, 0x1f, 0xbb, 0x5e, + 0xd3, 0x46, 0x28, 0xb3, 0x41, 0x6a, 0x9d, 0x5d, 0x24, 0xd0, 0x4c, 0xe4, 0xb0, 0xb3, 0x5b, 0x67, + 0x44, 0xba, 0x0d, 0x22, 0xc8, 0xc8, 0x35, 0x18, 0x96, 0xd9, 0xd6, 0xfa, 0x63, 0xef, 0x99, 0x4c, + 0xb3, 0x26, 0x71, 0xe4, 0x23, 0x18, 0x59, 0xa3, 0x91, 0xd3, 0x74, 0x22, 0x47, 0x8c, 0x1d, 0xf9, + 0x10, 0x86, 0x04, 0x57, 0x8b, 0x62, 0x85, 0x1e, 0x39, 0x10, 0x10, 0x5b, 0xb1, 0xa0, 0x02, 0xdd, + 0xb0, 0xdd, 0x72, 0x9e, 0xa9, 0x60, 0x52, 0xa6, 0xc0, 0x18, 0x44, 0xde, 0x31, 0x43, 0x2e, 0xe2, + 0xe3, 0xb3, 0x4c, 0x85, 0xc4, 0x01, 0x19, 0xcb, 0x18, 0x06, 0x12, 0xab, 0x5a, 0x64, 0x13, 0xb4, + 0x32, 0xb9, 0x0d, 0x4a, 0xdb, 0x64, 0xb4, 0x7e, 0x6b, 0x0c, 0xce, 0x6c, 0x3a, 0x7b, 0xae, 0xc7, + 0x76, 0x14, 0x36, 0x0d, 0xfd, 0x4e, 0xd0, 0xa0, 0xa4, 0x02, 0x93, 0x66, 0x00, 0x77, 0x8f, 0xf0, + 0x74, 0xb6, 0x69, 0x32, 0x61, 0x64, 0x1e, 0x46, 0xd5, 0xa5, 0x71, 0xb1, 0xd3, 0xc9, 0xb8, 0x4c, + 0xbe, 0x7c, 0xca, 0x8e, 0xc9, 0xc8, 0x7b, 0xc6, 0xe1, 0xe3, 0x69, 0x95, 0xff, 0x00, 0x69, 0xe7, + 0x79, 0x84, 0xad, 0xe7, 0x37, 0xcd, 0xdd, 0x1a, 0x3f, 0x61, 0xfb, 0x41, 0xea, 0x3c, 0x72, 0xd0, + 0xa8, 0x71, 0xca, 0x29, 0x8b, 0x1b, 0xd5, 0xdc, 0xec, 0xf5, 0x19, 0x27, 0x95, 0x5f, 0xc2, 0xd8, + 0x83, 0xce, 0x2e, 0x95, 0x27, 0xaf, 0x43, 0x62, 0xf3, 0x96, 0xbc, 0x96, 0x20, 0xf0, 0x3b, 0x6f, + 0xf2, 0xaf, 0xf8, 0x71, 0x67, 0x97, 0xa6, 0x9f, 0x45, 0x60, 0xab, 0xa6, 0x26, 0x8c, 0xec, 0x43, + 0x31, 0x79, 0x83, 0x40, 0x74, 0x69, 0x97, 0x7b, 0x0f, 0x98, 0xe8, 0x47, 0x7b, 0x7c, 0x81, 0xc7, + 0x35, 0x1b, 0x85, 0xa4, 0xa4, 0x92, 0x1f, 0xc3, 0x4c, 0xa6, 0x4b, 0x5c, 0xdd, 0x81, 0xec, 0xee, + 0x6d, 0xc7, 0x25, 0x28, 0xa1, 0x35, 0x79, 0xe1, 0xd2, 0x28, 0x39, 0xbb, 0x14, 0xd2, 0x84, 0xd3, + 0x89, 0xc8, 0x78, 0xf1, 0xc2, 0x4c, 0x7e, 0xac, 0x3d, 0xee, 0x9a, 0x64, 0x92, 0xe6, 0xcc, 0xb2, + 0x92, 0x22, 0xc9, 0x2a, 0x8c, 0x2a, 0x5f, 0x94, 0xc8, 0xcd, 0x97, 0xe5, 0x77, 0x2b, 0x1d, 0x1d, + 0x96, 0xa7, 0x63, 0xbf, 0x9b, 0x21, 0x33, 0x16, 0x40, 0x7e, 0x19, 0xae, 0xa8, 0x21, 0xba, 0x11, + 0x64, 0x7b, 0x28, 0xc5, 0xe3, 0x0e, 0x37, 0x92, 0x23, 0x3c, 0x8f, 0x7e, 0xe7, 0x4e, 0xb5, 0xaf, + 0x54, 0x58, 0x3e, 0x65, 0xf7, 0x16, 0x4d, 0x7e, 0xb5, 0x00, 0x67, 0x73, 0x4a, 0x1d, 0xc7, 0x52, + 0x7b, 0xba, 0x8d, 0xd1, 0xf2, 0xc4, 0x7b, 0x7f, 0x6e, 0x33, 0xbe, 0x1f, 0x2b, 0xfd, 0xc7, 0x46, + 0xbb, 0x73, 0x4a, 0x22, 0xb7, 0x01, 0xf6, 0xdc, 0x48, 0x8c, 0x31, 0x4c, 0x53, 0x97, 0xfe, 0x40, + 0x99, 0xda, 0xf6, 0xdc, 0x48, 0x8c, 0xb4, 0xdf, 0x2d, 0xf4, 0x9c, 0xd7, 0x31, 0x7b, 0xdd, 0xd8, + 0xfc, 0xab, 0xdd, 0x26, 0xbd, 0x98, 0xba, 0x7a, 0xfb, 0xe8, 0xb0, 0xfc, 0x86, 0x4a, 0x81, 0xd6, + 0x40, 0x2a, 0x79, 0xcb, 0xb7, 0xee, 0x28, 0x3a, 0xa3, 0x3d, 0x3d, 0x97, 0x96, 0x37, 0x60, 0x08, + 0x3d, 0x53, 0x61, 0x69, 0x02, 0x6d, 0x37, 0x4c, 0xdc, 0x85, 0xfe, 0x2b, 0x7d, 0xb7, 0x26, 0x68, + 0xc8, 0x32, 0xb3, 0x81, 0x70, 0xb7, 0x28, 0x6d, 0x16, 0x91, 0xe6, 0x4f, 0xd8, 0xd1, 0x1c, 0x25, + 0xf3, 0xef, 0x18, 0xcf, 0x93, 0x98, 0x6c, 0x55, 0x80, 0x91, 0x40, 0x4c, 0xb7, 0xf7, 0x07, 0x46, + 0x06, 0x8a, 0x83, 0x7c, 0x46, 0x90, 0x77, 0x49, 0x7e, 0x7d, 0x84, 0x5f, 0x3c, 0xdf, 0xf6, 0xdc, + 0x47, 0x6e, 0x3c, 0x33, 0xeb, 0x3e, 0xed, 0xf8, 0x9d, 0x30, 0x61, 0x71, 0xe6, 0xbc, 0x08, 0xa6, + 0xdc, 0xdf, 0x7d, 0x3d, 0xdd, 0xdf, 0x6f, 0x6a, 0x07, 0xc5, 0x5a, 0x3a, 0x5f, 0x6e, 0x59, 0x98, + 0xee, 0xe6, 0xf8, 0x04, 0xf9, 0x6b, 0x18, 0xc2, 0x0c, 0xbc, 0xfc, 0x14, 0x7e, 0x6c, 0xfe, 0xa6, + 0xe8, 0xce, 0x2e, 0xd5, 0xe7, 0x29, 0x7b, 0x45, 0x32, 0x09, 0xae, 0x71, 0x04, 0x18, 0x1a, 0x47, + 0x08, 0xd9, 0x82, 0xa9, 0x4d, 0xb6, 0xd1, 0xe5, 0x37, 0x1a, 0xda, 0x81, 0x70, 0x09, 0x72, 0x67, + 0x23, 0x6e, 0xb4, 0xdb, 0x12, 0x5d, 0xa7, 0x0a, 0xaf, 0xef, 0x35, 0x33, 0xd8, 0xc9, 0x12, 0x4c, + 0xd6, 0xa8, 0x13, 0x34, 0xf6, 0x1f, 0xd0, 0x67, 0xcc, 0xc8, 0x30, 0x9e, 0xc6, 0x09, 0x11, 0xc3, + 0xda, 0x8b, 0x28, 0x3d, 0xb2, 0xca, 0x64, 0x22, 0x9f, 0xc2, 0x50, 0xcd, 0x0f, 0xa2, 0xea, 0x33, + 0x31, 0x5b, 0xcb, 0x73, 0x5a, 0x0e, 0xac, 0x9e, 0x93, 0xcf, 0x03, 0x85, 0x7e, 0x10, 0xd5, 0x77, + 0x8d, 0x4c, 0x70, 0x9c, 0x84, 0x3c, 0x83, 0x69, 0x73, 0xa6, 0x14, 0x81, 0xf6, 0x23, 0xc2, 0xb8, + 0xc9, 0x9a, 0x8e, 0x39, 0x49, 0xf5, 0xba, 0x90, 0x7e, 0x39, 0x39, 0x1f, 0x3f, 0x42, 0xbc, 0x6e, + 0x11, 0x64, 0xf1, 0x93, 0x35, 0x7c, 0x57, 0x89, 0xb7, 0xa8, 0x12, 0xf2, 0x00, 0xfd, 0xd1, 0x38, + 0xd7, 0x60, 0x07, 0x67, 0x5b, 0xd4, 0x84, 0x13, 0x26, 0x1f, 0xe3, 0xb2, 0x53, 0xac, 0x64, 0x13, + 0xce, 0x6c, 0x87, 0x74, 0x33, 0xa0, 0x4f, 0x5c, 0xfa, 0x54, 0xca, 0x83, 0x38, 0x31, 0x1b, 0x93, + 0xd7, 0xe6, 0xd8, 0x2c, 0x81, 0x69, 0x66, 0xf2, 0x1e, 0xc0, 0xa6, 0xeb, 0x79, 0xb4, 0x89, 0x87, + 0xfd, 0x63, 0x28, 0x0a, 0x0f, 0x32, 0xda, 0x08, 0xad, 0xfb, 0x5e, 0x4b, 0x57, 0xa9, 0x46, 0x4c, + 0xaa, 0x30, 0xb1, 0xe2, 0x35, 0x5a, 0x1d, 0x11, 0x94, 0x13, 0xe2, 0x4c, 0x29, 0x12, 0x46, 0xba, + 0x1c, 0x51, 0x4f, 0x7d, 0xe4, 0x26, 0x0b, 0x79, 0x00, 0x44, 0x00, 0xc4, 0xa8, 0x75, 0x76, 0x5b, + 0x54, 0x7c, 0xee, 0xe8, 0xa0, 0x94, 0x82, 0x70, 0xb8, 0x1b, 0x79, 0x18, 0x53, 0x6c, 0x73, 0xef, + 0xc1, 0x98, 0x36, 0xe6, 0x33, 0xb2, 0xa3, 0x4c, 0xeb, 0xd9, 0x51, 0x46, 0xf5, 0x2c, 0x28, 0xff, + 0xac, 0x00, 0x17, 0xb2, 0xbf, 0x25, 0x61, 0x9b, 0x6c, 0xc0, 0xa8, 0x02, 0xaa, 0xfb, 0x70, 0xd2, + 0xe0, 0x4e, 0x6c, 0xed, 0xf8, 0x07, 0x2d, 0x67, 0x1e, 0xbd, 0xf5, 0xb1, 0x8c, 0xe7, 0x38, 0x05, + 0xfb, 0xdb, 0x23, 0x30, 0x8d, 0xf7, 0x3e, 0x92, 0xf3, 0xd4, 0x27, 0x98, 0xe5, 0x08, 0x61, 0xda, + 0xa1, 0x8e, 0xf0, 0xef, 0x72, 0x78, 0x32, 0xdf, 0x9f, 0xc1, 0x40, 0xde, 0xd6, 0x23, 0x91, 0xfa, + 0xb4, 0x77, 0x9c, 0x24, 0x50, 0x6f, 0x42, 0x1c, 0xa2, 0xf4, 0xba, 0x11, 0x08, 0x73, 0xec, 0x49, + 0x6f, 0xe0, 0xb8, 0x93, 0xde, 0xb6, 0x9a, 0xf4, 0x78, 0xf6, 0x9c, 0xd7, 0xb4, 0x49, 0xef, 0xe5, + 0xcf, 0x76, 0x43, 0x2f, 0x7b, 0xb6, 0x1b, 0x7e, 0xb1, 0xd9, 0x6e, 0xe4, 0x39, 0x67, 0xbb, 0xbb, + 0x30, 0xb9, 0x4e, 0x69, 0x53, 0x3b, 0x9e, 0x1c, 0x8d, 0x57, 0x4f, 0x8f, 0xa2, 0xe3, 0x39, 0xeb, + 0x8c, 0x32, 0xc1, 0x95, 0x3b, 0x6b, 0xc2, 0x5f, 0xcd, 0xac, 0x39, 0xf6, 0x92, 0x67, 0xcd, 0xf1, + 0x17, 0x99, 0x35, 0x53, 0x53, 0xdf, 0xc4, 0x89, 0xa7, 0xbe, 0x17, 0x99, 0xad, 0x3e, 0xc6, 0x40, + 0xde, 0x5a, 0x6d, 0x59, 0xc4, 0x6c, 0x69, 0x41, 0x52, 0xcb, 0x7e, 0x28, 0xef, 0x39, 0xe0, 0xdf, + 0x0c, 0x86, 0xaf, 0x65, 0x08, 0x77, 0x00, 0xfb, 0xdb, 0xaa, 0x62, 0xf8, 0xae, 0xce, 0xaf, 0xee, + 0x03, 0x0d, 0x8b, 0xcb, 0xc4, 0x62, 0x8e, 0x4b, 0x6e, 0x3f, 0x6d, 0x89, 0xb7, 0xfe, 0xb4, 0xc0, + 0x43, 0x01, 0xfe, 0x7f, 0x9c, 0x2a, 0x5f, 0xe4, 0x78, 0xfe, 0xd7, 0xe2, 0x24, 0x23, 0x22, 0x21, + 0x4a, 0xe0, 0x34, 0x1e, 0xc7, 0xf1, 0x11, 0xdf, 0x67, 0xdf, 0xb9, 0x8e, 0x10, 0x1b, 0xf5, 0x59, + 0xa5, 0x29, 0x1d, 0xb9, 0x73, 0x47, 0x4e, 0x00, 0x22, 0xd7, 0x0a, 0x07, 0x9b, 0x13, 0x80, 0xce, + 0x80, 0x11, 0xaa, 0xa7, 0x2d, 0x9b, 0xe7, 0xc8, 0xc8, 0xac, 0xc1, 0x3b, 0xe9, 0x2c, 0x0f, 0x68, + 0x65, 0xc5, 0x59, 0x1e, 0x74, 0x35, 0xc6, 0xf9, 0x1e, 0xb6, 0xe1, 0xbc, 0x4d, 0x0f, 0xfc, 0x27, + 0xf4, 0xe5, 0x8a, 0xfd, 0x0a, 0xce, 0x99, 0x02, 0xf9, 0x7d, 0x40, 0xfe, 0x78, 0xc5, 0xc7, 0xd9, + 0x4f, 0x5e, 0x08, 0x06, 0xfe, 0xe4, 0x05, 0xcf, 0x9c, 0xcf, 0xfe, 0xd4, 0xd7, 0x0d, 0xc4, 0x59, + 0x3e, 0x5c, 0x30, 0x85, 0x57, 0x9a, 0x4d, 0x7c, 0x35, 0xb7, 0xe1, 0xb6, 0x1d, 0x2f, 0x22, 0x1b, + 0x30, 0xa6, 0xfd, 0x4c, 0xf8, 0x40, 0x34, 0x8c, 0xd8, 0xd3, 0xc4, 0x00, 0x23, 0xf3, 0x70, 0x0c, + 0xb6, 0x28, 0x94, 0x93, 0xea, 0x61, 0x2a, 0xd3, 0xcb, 0xac, 0xc2, 0x84, 0xf6, 0x53, 0x1d, 0x14, + 0xe0, 0xc7, 0xaf, 0x95, 0x60, 0x2a, 0xcc, 0x64, 0xb1, 0x1a, 0x30, 0x97, 0xa5, 0x34, 0x9e, 0xa2, + 0x9e, 0x2c, 0xc5, 0x19, 0xe8, 0x7a, 0xc7, 0xb8, 0x9e, 0xce, 0xcb, 0x3e, 0x67, 0xfd, 0xfd, 0x01, + 0x38, 0x2f, 0x3a, 0xe3, 0x65, 0xf6, 0x38, 0xf9, 0x01, 0x8c, 0x69, 0x7d, 0x2c, 0x94, 0x7e, 0x59, + 0xde, 0xe6, 0xcb, 0x1b, 0x0b, 0xdc, 0x57, 0xd3, 0x41, 0x40, 0x3d, 0xd1, 0xdd, 0xcb, 0xa7, 0x6c, + 0x5d, 0x24, 0x69, 0xc1, 0xa4, 0xd9, 0xd1, 0xc2, 0x5d, 0x75, 0x35, 0xb3, 0x10, 0x93, 0x54, 0xe6, + 0xaf, 0x6f, 0xd6, 0x33, 0xbb, 0x7b, 0xf9, 0x94, 0x9d, 0x90, 0x4d, 0xbe, 0x81, 0x33, 0xa9, 0x5e, + 0x16, 0xbe, 0xc8, 0x57, 0x33, 0x0b, 0x4c, 0x51, 0xf3, 0x43, 0x90, 0x00, 0xc1, 0xb9, 0xc5, 0xa6, + 0x0b, 0x21, 0x4d, 0x18, 0xd7, 0x3b, 0x5e, 0xf8, 0xd3, 0xae, 0x74, 0x51, 0x25, 0x27, 0xe4, 0x9b, + 0x3b, 0xa1, 0x4b, 0xec, 0xfb, 0x67, 0xe6, 0xc1, 0x8e, 0x41, 0x3c, 0x02, 0x43, 0xfc, 0xb7, 0xf5, + 0x7b, 0x05, 0x38, 0xbf, 0x19, 0xd0, 0x90, 0x7a, 0x0d, 0x6a, 0xdc, 0x8b, 0x78, 0xc1, 0x11, 0x91, + 0x77, 0xa6, 0xd2, 0xf7, 0xc2, 0x67, 0x2a, 0xd6, 0xbf, 0x2b, 0x40, 0x29, 0xab, 0xca, 0x35, 0xea, + 0x35, 0xc9, 0x26, 0x14, 0x93, 0x6d, 0x10, 0x5f, 0x8c, 0xa5, 0xd2, 0x8f, 0xe7, 0xb6, 0x76, 0xf9, + 0x94, 0x9d, 0xe2, 0x26, 0xeb, 0x70, 0x46, 0x83, 0x89, 0x33, 0x8d, 0xbe, 0xe3, 0x9c, 0x69, 0xb0, + 0x1e, 0x4e, 0xb1, 0xea, 0x47, 0x42, 0xcb, 0xb8, 0xea, 0x2e, 0xfa, 0x07, 0x8e, 0xeb, 0xb1, 0x4d, + 0xb4, 0x96, 0xe0, 0x0e, 0x62, 0xa8, 0x50, 0x3b, 0x3f, 0xe4, 0x40, 0xa8, 0xbc, 0x22, 0xa6, 0x48, + 0xac, 0x0f, 0x71, 0x75, 0x10, 0x8e, 0x4d, 0x7e, 0x29, 0x5f, 0x09, 0xbb, 0x0c, 0x83, 0x5b, 0xab, + 0xb5, 0x85, 0x8a, 0xb8, 0xe2, 0xcf, 0x13, 0xc3, 0xb4, 0xc2, 0x7a, 0xc3, 0xb1, 0x39, 0xc2, 0xfa, + 0x00, 0xc8, 0x3d, 0x1a, 0x89, 0xf7, 0x2f, 0x14, 0xdf, 0x35, 0x18, 0x16, 0x20, 0xc1, 0x89, 0xee, + 0x7a, 0xf1, 0x9a, 0x86, 0x2d, 0x71, 0xd6, 0xa6, 0xb4, 0x41, 0x5a, 0xd4, 0x09, 0xb5, 0x45, 0xff, + 0x5d, 0x18, 0x09, 0x04, 0x4c, 0xac, 0xf9, 0x93, 0xea, 0x79, 0x23, 0x04, 0xf3, 0x63, 0x24, 0x49, + 0x63, 0xab, 0xbf, 0xac, 0x55, 0x4c, 0xe2, 0xb4, 0xb1, 0xb2, 0xb8, 0xc0, 0xb4, 0x2a, 0x94, 0x25, + 0xbb, 0xe3, 0x16, 0xde, 0x0a, 0x89, 0xa8, 0x7e, 0xc1, 0x1f, 0x55, 0x83, 0x13, 0x88, 0x48, 0x5d, + 0xa6, 0x91, 0x58, 0x6f, 0xaa, 0x94, 0x50, 0x19, 0xd2, 0xf2, 0x9e, 0xe9, 0x59, 0xc7, 0x64, 0x57, + 0xf7, 0x30, 0x00, 0xee, 0x65, 0x54, 0xc2, 0x81, 0x39, 0xbe, 0x85, 0x60, 0xad, 0x12, 0x8f, 0x94, + 0xfa, 0x6a, 0xda, 0x5d, 0x80, 0x51, 0x05, 0x53, 0xa7, 0xd9, 0x5c, 0x57, 0x06, 0xfd, 0xce, 0x9b, + 0x3c, 0x17, 0x42, 0x43, 0x09, 0x88, 0xf9, 0x58, 0x11, 0xfc, 0x9b, 0xfe, 0x96, 0x8b, 0x08, 0x69, + 0x10, 0x7d, 0xab, 0x45, 0xc4, 0xd9, 0xd0, 0x4e, 0x52, 0x84, 0x41, 0xbf, 0x33, 0x7f, 0x1c, 0x45, + 0x7d, 0xcb, 0x45, 0x30, 0x45, 0x7d, 0x7b, 0x45, 0x50, 0x99, 0x36, 0x8e, 0x0f, 0xd2, 0x54, 0x21, + 0x4b, 0xe9, 0x42, 0xa4, 0xb7, 0x3f, 0xc1, 0xd1, 0xb5, 0x3f, 0x28, 0x5c, 0xe0, 0xca, 0xfa, 0x39, + 0x14, 0xc3, 0x14, 0xf6, 0xed, 0x16, 0xf3, 0x8f, 0x0a, 0x3c, 0x89, 0x5d, 0x6d, 0x43, 0x7b, 0x1e, + 0xd8, 0x7b, 0xe4, 0x6b, 0xc1, 0x36, 0xda, 0xd7, 0xae, 0x1d, 0x7e, 0x62, 0xb0, 0x8d, 0xd3, 0x89, + 0xf6, 0x55, 0x92, 0x77, 0x3c, 0x09, 0x4d, 0x52, 0x93, 0xf7, 0x60, 0x42, 0x03, 0xa9, 0x9d, 0x20, + 0x7f, 0x86, 0x47, 0x67, 0x77, 0x9b, 0xb6, 0x49, 0x69, 0xfd, 0x65, 0x01, 0xa6, 0x32, 0x1e, 0xae, + 0x47, 0x47, 0x09, 0x5a, 0x58, 0x6a, 0xa2, 0x12, 0x0f, 0xe7, 0x61, 0x3e, 0x1d, 0x63, 0xfd, 0x55, + 0x84, 0xf8, 0x00, 0x89, 0xf6, 0xc8, 0x7e, 0x9f, 0xf6, 0x1c, 0x64, 0xf6, 0xc3, 0xfa, 0x3a, 0x39, + 0x09, 0x01, 0xe2, 0x9a, 0x08, 0x97, 0x74, 0x8d, 0x6d, 0x97, 0xb5, 0x17, 0xfa, 0x63, 0xde, 0x9f, + 0x1d, 0x96, 0xdf, 0x39, 0x49, 0xa8, 0x70, 0x2c, 0xda, 0xd6, 0x8a, 0xb1, 0x7e, 0xad, 0x0f, 0xce, + 0x66, 0xb4, 0xbf, 0x46, 0xa3, 0xbf, 0x0a, 0x15, 0x3c, 0x81, 0xb1, 0xb8, 0x32, 0x61, 0xa9, 0x1f, + 0x3d, 0x37, 0x5b, 0xf8, 0x5e, 0x46, 0xac, 0x83, 0xf0, 0xa5, 0x28, 0x41, 0x2f, 0xc8, 0xfa, 0xa3, + 0x3e, 0x38, 0xbb, 0xdd, 0x0e, 0xf1, 0xce, 0xe4, 0x8a, 0xf7, 0x84, 0x7a, 0x91, 0x1f, 0x3c, 0xc3, + 0x7b, 0x5e, 0xe4, 0x6d, 0x18, 0x5c, 0xa6, 0xad, 0x96, 0x2f, 0xc6, 0xff, 0x45, 0x19, 0xef, 0x94, + 0xa4, 0x46, 0xa2, 0xe5, 0x53, 0x36, 0xa7, 0x26, 0xef, 0xc1, 0xe8, 0x32, 0x75, 0x82, 0x68, 0x97, + 0x3a, 0xd2, 0x1c, 0x92, 0x8f, 0x03, 0x69, 0x2c, 0x82, 0x60, 0xf9, 0x94, 0x1d, 0x53, 0x93, 0x79, + 0x18, 0xd8, 0xf4, 0xbd, 0x3d, 0x95, 0x1f, 0x22, 0xa7, 0x40, 0x46, 0xb3, 0x7c, 0xca, 0x46, 0x5a, + 0xb2, 0x06, 0x13, 0x95, 0x3d, 0xea, 0x45, 0x89, 0x23, 0xfc, 0x6b, 0x79, 0xcc, 0x06, 0xf1, 0xf2, + 0x29, 0xdb, 0xe4, 0x26, 0x1f, 0xc0, 0xf0, 0x3d, 0xdf, 0x6f, 0xee, 0x3e, 0x93, 0x59, 0x4e, 0xca, + 0x79, 0x82, 0x04, 0xd9, 0xf2, 0x29, 0x5b, 0x72, 0x54, 0x07, 0xa1, 0x7f, 0x2d, 0xdc, 0xb3, 0x0e, + 0x0b, 0x50, 0x5a, 0xf4, 0x9f, 0x7a, 0x99, 0x5a, 0xfd, 0x9e, 0xa9, 0x55, 0x29, 0x3e, 0x83, 0x3e, + 0xa1, 0xd7, 0xb7, 0x60, 0x60, 0xd3, 0xf5, 0xf6, 0x12, 0x5b, 0xc1, 0x0c, 0x3e, 0x46, 0x85, 0xea, + 0x71, 0xbd, 0x3d, 0xb2, 0x2a, 0xf7, 0xf7, 0xc2, 0x8f, 0xd9, 0x6f, 0x18, 0x15, 0x19, 0xdc, 0x3a, + 0x75, 0xbc, 0x8f, 0xe7, 0xbf, 0x65, 0x03, 0x5f, 0x87, 0xd9, 0x9c, 0x72, 0xb5, 0x90, 0x94, 0x01, + 0xdc, 0xd8, 0xbc, 0x06, 0x33, 0x99, 0xfd, 0x97, 0x22, 0xfc, 0x17, 0x59, 0x03, 0x91, 0xb7, 0xbc, + 0x14, 0xc7, 0x71, 0x70, 0xbf, 0x92, 0x0a, 0xdd, 0x98, 0xd3, 0x3e, 0x54, 0x99, 0xce, 0x48, 0x7e, + 0x8f, 0x3b, 0x5a, 0xfa, 0x38, 0xfe, 0x39, 0xbd, 0xff, 0x02, 0x1f, 0x8d, 0x92, 0xc5, 0xca, 0x5c, + 0xf6, 0xc3, 0xc8, 0x53, 0xb1, 0xf4, 0xb6, 0xfa, 0x4d, 0x6e, 0x40, 0x51, 0xbe, 0x90, 0x23, 0x9e, + 0xe2, 0x0a, 0x44, 0x40, 0x48, 0x0a, 0x4e, 0xde, 0x85, 0xd9, 0x24, 0x4c, 0xb6, 0x92, 0xdf, 0x59, + 0xcd, 0x43, 0x5b, 0x7f, 0xd2, 0x87, 0x19, 0xfe, 0xbb, 0x8c, 0x6b, 0xa6, 0xdd, 0x8d, 0x9a, 0x8c, + 0x0c, 0xda, 0xa8, 0x91, 0x0b, 0x30, 0xba, 0x51, 0x33, 0x9e, 0x1e, 0xb4, 0x63, 0x00, 0xab, 0x36, + 0x6b, 0x42, 0x25, 0x68, 0xec, 0xbb, 0x11, 0x6d, 0x44, 0x9d, 0x40, 0x86, 0x0a, 0xa5, 0xe0, 0xc4, + 0x82, 0xf1, 0x7b, 0x2d, 0x77, 0xb7, 0x21, 0x85, 0x71, 0x15, 0x18, 0x30, 0xf2, 0x2a, 0x4c, 0xae, + 0x78, 0x61, 0xe4, 0xb4, 0x5a, 0x6b, 0x34, 0xda, 0xf7, 0x9b, 0xe2, 0x61, 0x65, 0x3b, 0x01, 0x65, + 0xe5, 0x2e, 0xf8, 0x5e, 0xe4, 0xb8, 0x1e, 0x0d, 0xec, 0x8e, 0x17, 0xb9, 0x07, 0x54, 0xb4, 0x3d, + 0x05, 0x27, 0x6f, 0xc1, 0x8c, 0x82, 0x6d, 0x04, 0x8d, 0x7d, 0x1a, 0x46, 0x01, 0x3e, 0x48, 0x8a, + 0x51, 0x73, 0x76, 0x36, 0x12, 0x4b, 0x68, 0xf9, 0x9d, 0xe6, 0x92, 0xf7, 0xc4, 0x0d, 0x7c, 0x7e, + 0x1c, 0x3d, 0x22, 0x4a, 0x48, 0xc0, 0xad, 0xdf, 0x19, 0xc9, 0xfc, 0x6c, 0x5f, 0x64, 0x0c, 0x7e, + 0x01, 0xe3, 0x0b, 0x4e, 0xdb, 0xd9, 0x75, 0x5b, 0x6e, 0xe4, 0xaa, 0x97, 0x1b, 0xdf, 0xee, 0xf1, + 0xcd, 0xcb, 0x37, 0x93, 0x68, 0x53, 0x67, 0xb6, 0x0d, 0x51, 0x73, 0x7f, 0x31, 0x04, 0x33, 0x99, + 0x74, 0xe4, 0xba, 0x78, 0xe2, 0x51, 0xcd, 0xab, 0xe2, 0xfd, 0x40, 0x3b, 0x09, 0x66, 0x7d, 0x89, + 0xa0, 0x85, 0x16, 0x75, 0xbc, 0x8e, 0x78, 0x3d, 0xd0, 0x36, 0x60, 0xac, 0x2f, 0xd9, 0xbe, 0x41, + 0x13, 0x86, 0x57, 0x21, 0xec, 0x04, 0x14, 0x23, 0xcd, 0x3a, 0xd1, 0xbe, 0x14, 0x35, 0xc0, 0x2f, + 0xed, 0x6a, 0x20, 0x26, 0x69, 0xdd, 0x6f, 0x52, 0x4d, 0xd2, 0x20, 0x97, 0x64, 0x42, 0x99, 0x24, + 0x06, 0x91, 0x92, 0x86, 0xb8, 0x24, 0x0d, 0x44, 0x5e, 0x81, 0x89, 0x4a, 0xbb, 0xad, 0x09, 0xc2, + 0x67, 0x03, 0x6d, 0x13, 0x48, 0x2e, 0x01, 0x54, 0xda, 0x6d, 0x29, 0x06, 0x9f, 0x04, 0xb4, 0x35, + 0x08, 0xb9, 0x19, 0x27, 0x69, 0xd4, 0x44, 0xe1, 0x51, 0x85, 0x9d, 0x81, 0x61, 0x7a, 0x55, 0x19, + 0xed, 0x84, 0x50, 0xe0, 0x7a, 0x4d, 0x80, 0xc9, 0x87, 0x70, 0x2e, 0x11, 0xac, 0xa2, 0x15, 0x80, + 0xc7, 0x08, 0x76, 0x3e, 0x01, 0x79, 0x07, 0xce, 0x26, 0x90, 0xb2, 0x38, 0x3c, 0x31, 0xb0, 0x73, + 0xb0, 0xe4, 0x7d, 0x28, 0x25, 0x12, 0x31, 0xc4, 0x85, 0xe2, 0xe9, 0x80, 0x9d, 0x8b, 0x67, 0x5f, + 0x57, 0xe2, 0x46, 0xa7, 0x28, 0x12, 0x0f, 0x42, 0xed, 0x6c, 0x24, 0x59, 0x86, 0x72, 0x66, 0x00, + 0x90, 0x56, 0x30, 0x3e, 0x75, 0x68, 0xf7, 0x22, 0x23, 0x55, 0xb8, 0x90, 0x49, 0x22, 0xab, 0x81, + 0x0f, 0x20, 0xda, 0x5d, 0x69, 0xc8, 0x3c, 0x4c, 0xc7, 0x81, 0x50, 0x5a, 0x15, 0xf0, 0xed, 0x43, + 0x3b, 0x13, 0x47, 0xde, 0x30, 0xd3, 0x6d, 0xf0, 0xc2, 0xf0, 0xe9, 0x43, 0x3b, 0x8d, 0xb0, 0x8e, + 0x0a, 0x70, 0x21, 0x73, 0xa1, 0x94, 0xfb, 0xf9, 0xb9, 0xe4, 0xc6, 0x51, 0x9b, 0x0b, 0x6e, 0x88, + 0xe8, 0x46, 0xee, 0x87, 0x96, 0xd1, 0xe3, 0xc8, 0xcf, 0x45, 0x3d, 0x88, 0x63, 0x1d, 0xef, 0xa9, + 0x73, 0xc7, 0x7e, 0xf4, 0x64, 0xdc, 0x4a, 0x6e, 0xa0, 0x32, 0x0a, 0xd7, 0xcf, 0x1f, 0xe5, 0x49, + 0xe3, 0x8b, 0x1c, 0xf1, 0xfc, 0x49, 0x01, 0xca, 0x3d, 0xf6, 0x07, 0xaa, 0x4d, 0x85, 0x63, 0xb4, + 0xe9, 0xbe, 0x6a, 0x13, 0xbf, 0xed, 0x3e, 0x7f, 0xbc, 0x3d, 0xc8, 0xcb, 0x6e, 0xd6, 0x5f, 0x16, + 0x80, 0xa4, 0xf7, 0xa1, 0xe4, 0xbb, 0x30, 0x5a, 0xab, 0x2d, 0x1b, 0x61, 0x90, 0xa9, 0x93, 0xa7, + 0x98, 0x82, 0xdc, 0x3e, 0x56, 0xdc, 0xa3, 0x1e, 0xf5, 0xf8, 0x49, 0x2a, 0xd8, 0xb2, 0xbf, 0x6b, + 0xb0, 0x65, 0x2a, 0xd4, 0x72, 0x29, 0x23, 0x7a, 0x70, 0xa0, 0x47, 0xf4, 0x60, 0x3a, 0x34, 0xd0, + 0x5a, 0x84, 0x52, 0xde, 0x56, 0x16, 0x67, 0x38, 0x9e, 0xda, 0x50, 0x3b, 0x3d, 0xe3, 0x33, 0x9c, + 0x09, 0xb6, 0xde, 0x81, 0xb3, 0x8a, 0x9b, 0xbf, 0x99, 0xa4, 0xe5, 0x14, 0x11, 0xf6, 0xaf, 0xca, + 0x5d, 0x12, 0x03, 0xac, 0x3f, 0x1e, 0x48, 0x31, 0xd6, 0x3a, 0x07, 0x07, 0x4e, 0xf0, 0x8c, 0x54, + 0x4c, 0xc6, 0xfe, 0x9e, 0x26, 0x47, 0x75, 0xe0, 0x27, 0x87, 0xe5, 0x53, 0x9a, 0x74, 0xb6, 0x2e, + 0xe0, 0x0e, 0xc3, 0x6b, 0x50, 0x7e, 0xee, 0xd6, 0xc7, 0xf3, 0xa6, 0x19, 0x40, 0xb2, 0x03, 0x13, + 0x62, 0xed, 0xc6, 0xdf, 0xf2, 0x1b, 0xbb, 0x9d, 0xfc, 0xc6, 0x8c, 0xea, 0xdd, 0x34, 0x58, 0xf8, + 0x68, 0x34, 0xc5, 0x90, 0x2f, 0x60, 0x52, 0xee, 0xd4, 0x84, 0x60, 0x1e, 0x29, 0x75, 0xa7, 0xbb, + 0x60, 0x93, 0x87, 0x4b, 0x4e, 0x08, 0x62, 0x55, 0x96, 0x93, 0x1d, 0x97, 0x3c, 0x78, 0x9c, 0x2a, + 0x1b, 0x2c, 0xa2, 0xca, 0x06, 0x6c, 0xee, 0x53, 0x20, 0xe9, 0x76, 0xf5, 0xfa, 0x9c, 0x26, 0xb4, + 0xcf, 0x69, 0xae, 0x02, 0x53, 0x19, 0x0d, 0x38, 0x91, 0x88, 0x4f, 0x81, 0xa4, 0x6b, 0x7a, 0x12, + 0x09, 0xd6, 0x75, 0x78, 0x55, 0xa9, 0x40, 0x8d, 0x06, 0x43, 0xa6, 0xf4, 0x80, 0xff, 0x4a, 0x1f, + 0x94, 0x7b, 0x90, 0x92, 0x7f, 0x52, 0x48, 0x6a, 0x9b, 0x8f, 0xc6, 0xf7, 0x92, 0xda, 0xce, 0xe6, + 0xcf, 0x50, 0x7b, 0xf5, 0xfd, 0x5f, 0xfd, 0xb3, 0xe7, 0xb6, 0x3c, 0xd2, 0x5d, 0x76, 0x72, 0x6d, + 0x0d, 0xe8, 0xda, 0xda, 0x81, 0x69, 0xc3, 0x66, 0x3b, 0xce, 0xe2, 0x65, 0x01, 0x88, 0xe7, 0x9b, + 0x57, 0xfd, 0x3d, 0xf1, 0xca, 0x74, 0x5f, 0xa9, 0x60, 0x6b, 0x50, 0xeb, 0x2e, 0xcc, 0x24, 0xe4, + 0x0a, 0xcf, 0xfc, 0x77, 0x41, 0xe5, 0x8f, 0x40, 0xc1, 0xfd, 0xd5, 0x33, 0x3f, 0x3b, 0x2c, 0x4f, + 0xb0, 0x6d, 0xfd, 0xcd, 0xf8, 0x09, 0x0f, 0xf9, 0x97, 0xb5, 0xa6, 0x9f, 0x2d, 0x54, 0x5a, 0x7a, + 0x5e, 0x2d, 0x72, 0x07, 0x86, 0x38, 0x24, 0x91, 0x28, 0x5f, 0xa7, 0x16, 0xf3, 0x82, 0x20, 0xb4, + 0x66, 0xf0, 0xb6, 0x3b, 0xfe, 0xa8, 0xc4, 0xd9, 0x59, 0xac, 0x6d, 0xfe, 0x70, 0x54, 0x0c, 0x56, + 0xc9, 0xf8, 0x07, 0x2a, 0x71, 0x16, 0x19, 0x19, 0x64, 0x22, 0xe9, 0x3c, 0xff, 0x69, 0x8b, 0x36, + 0xf9, 0x8b, 0x9f, 0xd5, 0x71, 0x11, 0x64, 0x32, 0xe0, 0x30, 0x01, 0xc8, 0x66, 0x7d, 0x02, 0x33, + 0x6c, 0xb7, 0x10, 0x24, 0xcb, 0xc3, 0xe7, 0x62, 0x18, 0xcc, 0xbc, 0xd4, 0xe2, 0x30, 0x10, 0x5e, + 0x6a, 0x11, 0x48, 0x6b, 0x15, 0xce, 0x71, 0xcf, 0xa4, 0xde, 0xa4, 0xf8, 0x1c, 0x60, 0x10, 0x7f, + 0x27, 0xee, 0x4a, 0x67, 0xb4, 0x9e, 0xd3, 0x59, 0x1f, 0xe3, 0x65, 0x3c, 0x31, 0x50, 0x5d, 0xdf, + 0x8b, 0xdd, 0x90, 0xc7, 0xbb, 0xbd, 0xff, 0xd7, 0xe1, 0x42, 0xa5, 0xdd, 0xa6, 0x5e, 0x33, 0x66, + 0xdc, 0x0a, 0x9c, 0x63, 0xe6, 0x56, 0x21, 0x15, 0x18, 0x44, 0x6a, 0x75, 0x40, 0x2b, 0xaa, 0x9b, + 0x51, 0x1d, 0xa4, 0x13, 0x99, 0x93, 0xb1, 0x00, 0xce, 0x69, 0x35, 0x61, 0xb6, 0xd6, 0xd9, 0x3d, + 0x70, 0x23, 0xbc, 0x0a, 0x83, 0xf9, 0x89, 0x64, 0xd9, 0x2b, 0xf2, 0xad, 0x3f, 0xae, 0x8c, 0xeb, + 0xf1, 0xa5, 0x2d, 0xbc, 0x4d, 0x23, 0x72, 0x16, 0x3d, 0xb9, 0x73, 0x33, 0x66, 0x45, 0x17, 0x0c, + 0x2f, 0x05, 0xd1, 0xe2, 0x3d, 0x40, 0x6b, 0x0a, 0xce, 0xe8, 0x07, 0x52, 0x7c, 0x84, 0xcc, 0xc0, + 0x94, 0x79, 0xd0, 0xc4, 0xc1, 0x5f, 0xc3, 0x34, 0x77, 0x84, 0xf3, 0x97, 0x0f, 0xe6, 0xe3, 0x24, + 0xff, 0x7d, 0x3b, 0xf3, 0x89, 0x1b, 0x14, 0x18, 0x58, 0xad, 0xde, 0xb4, 0xd9, 0x99, 0xe7, 0x17, + 0xaa, 0x9f, 0xcc, 0x1b, 0x47, 0xa5, 0x7d, 0x3b, 0xf3, 0xd5, 0x61, 0x91, 0x41, 0x9a, 0x49, 0xe7, + 0xdd, 0xff, 0xad, 0x48, 0x9f, 0xc7, 0x1c, 0x1e, 0xcb, 0xd4, 0xc1, 0xfb, 0x76, 0xd9, 0x99, 0x10, + 0x26, 0xa1, 0x4f, 0xa5, 0x88, 0xed, 0x73, 0x9b, 0xd6, 0xef, 0x17, 0xe0, 0x3a, 0xdf, 0x90, 0x65, + 0xf3, 0xe1, 0xa9, 0x53, 0x0e, 0x33, 0x79, 0x17, 0x06, 0x43, 0x2d, 0xfa, 0xc2, 0x12, 0x35, 0xef, + 0x26, 0x89, 0x33, 0x90, 0x0a, 0x8c, 0xeb, 0xd7, 0xca, 0x8e, 0x97, 0x7d, 0xd2, 0x1e, 0x3b, 0x78, + 0xe4, 0xa8, 0xab, 0x66, 0x8f, 0xe1, 0xfc, 0xd2, 0x37, 0x6c, 0x40, 0x88, 0x15, 0x4a, 0x58, 0x0f, + 0xf1, 0x4d, 0xfb, 0xd3, 0x5b, 0x62, 0xc4, 0x98, 0xa6, 0x7d, 0x12, 0xcc, 0xec, 0x64, 0xb9, 0xc8, + 0xc5, 0xf7, 0x8f, 0x6c, 0x03, 0x66, 0xfd, 0x71, 0x01, 0x2e, 0x64, 0x97, 0x26, 0x26, 0x96, 0x15, + 0x38, 0xb3, 0xe0, 0x78, 0xbe, 0xe7, 0x36, 0x9c, 0x56, 0xad, 0xb1, 0x4f, 0x9b, 0x1d, 0x95, 0x67, + 0x5a, 0xcd, 0x32, 0x7b, 0xd4, 0x93, 0xec, 0x92, 0xc4, 0x4e, 0x73, 0x31, 0x0b, 0x11, 0xef, 0x95, + 0xf0, 0xb9, 0xb7, 0x45, 0x03, 0x25, 0x8f, 0xd7, 0x2c, 0x07, 0x4b, 0x6e, 0x4b, 0x8f, 0x7f, 0x73, + 0xdb, 0x73, 0x23, 0xc5, 0xc4, 0x5d, 0x3d, 0x59, 0x28, 0xeb, 0x3f, 0x16, 0xe0, 0x1c, 0x3e, 0x2d, + 0x67, 0x3c, 0x56, 0x1b, 0xa7, 0x5b, 0x97, 0x19, 0xc3, 0x0b, 0xc6, 0x3d, 0x19, 0x83, 0xda, 0x4c, + 0x1d, 0x4e, 0xde, 0x80, 0x81, 0x9a, 0x8c, 0x06, 0x9b, 0x4c, 0x3c, 0x33, 0x2e, 0x38, 0x18, 0xde, + 0x46, 0x2a, 0x66, 0xc3, 0x2f, 0xd2, 0xb0, 0x41, 0x3d, 0x7c, 0x0f, 0x9e, 0x7b, 0x1e, 0x34, 0x48, + 0x9c, 0x09, 0x6d, 0x20, 0x2f, 0x13, 0xda, 0xa0, 0x99, 0x09, 0xcd, 0x7a, 0xc2, 0x1f, 0x96, 0x4b, + 0x36, 0x48, 0x74, 0xd2, 0xc7, 0xa9, 0xe7, 0xe3, 0xf9, 0x3a, 0x70, 0x36, 0xab, 0x65, 0x6c, 0x93, + 0x9e, 0x78, 0x19, 0x3e, 0x3f, 0xbd, 0xf9, 0x26, 0xbc, 0x62, 0xd0, 0x56, 0x5a, 0x2d, 0xff, 0x29, + 0x6d, 0x6e, 0x06, 0xfe, 0x81, 0x1f, 0x19, 0x0f, 0x6b, 0x9d, 0x76, 0x74, 0x3a, 0xb5, 0x18, 0x27, + 0xc1, 0xd6, 0x5f, 0x83, 0x6b, 0x3d, 0x24, 0x8a, 0x46, 0xd5, 0xe0, 0x8c, 0x93, 0xc0, 0xc9, 0xb0, + 0x9e, 0x6b, 0x59, 0xed, 0x4a, 0x0a, 0x0a, 0xed, 0x34, 0xff, 0x8d, 0x2d, 0xe3, 0xc9, 0x75, 0x52, + 0x82, 0xe9, 0x4d, 0x7b, 0x63, 0x71, 0x7b, 0x61, 0xab, 0xbe, 0xf5, 0xc5, 0xe6, 0x52, 0x7d, 0x7b, + 0xfd, 0xc1, 0xfa, 0xc6, 0xc3, 0x75, 0xfe, 0x3e, 0x80, 0x81, 0xd9, 0x5a, 0xaa, 0xac, 0x15, 0x0b, + 0x64, 0x1a, 0x8a, 0x06, 0x78, 0x69, 0xbb, 0x5a, 0xec, 0xbb, 0xf1, 0xb5, 0xf1, 0x94, 0x38, 0xb9, + 0x00, 0xa5, 0xda, 0xf6, 0xe6, 0xe6, 0x86, 0xad, 0xa4, 0xea, 0xaf, 0x13, 0xcc, 0xc0, 0x19, 0x03, + 0x7b, 0xd7, 0x5e, 0x5a, 0x2a, 0x16, 0x58, 0x55, 0x0c, 0xf0, 0xa6, 0xbd, 0xb4, 0xb6, 0xb2, 0xbd, + 0x56, 0xec, 0xbb, 0x51, 0xd7, 0xaf, 0x77, 0x92, 0xf3, 0x30, 0xbb, 0xb8, 0xb4, 0xb3, 0xb2, 0xb0, + 0x94, 0x25, 0x7b, 0x1a, 0x8a, 0x3a, 0x72, 0x6b, 0x63, 0x6b, 0x93, 0x8b, 0xd6, 0xa1, 0x0f, 0x97, + 0xaa, 0x95, 0xed, 0xad, 0xe5, 0xf5, 0x62, 0xbf, 0x35, 0x30, 0xd2, 0x57, 0xec, 0xbb, 0xf1, 0x03, + 0xe3, 0xee, 0x27, 0xab, 0xbe, 0x20, 0xdf, 0xae, 0x55, 0xee, 0xe5, 0x17, 0xc1, 0xb1, 0x6b, 0x77, + 0x2b, 0xc5, 0x02, 0xb9, 0x08, 0xe7, 0x0c, 0xe8, 0x66, 0xa5, 0x56, 0x7b, 0xb8, 0x61, 0x2f, 0xae, + 0x2e, 0xd5, 0x6a, 0xc5, 0xbe, 0x1b, 0x3b, 0x46, 0xf6, 0x47, 0x56, 0xc2, 0xda, 0xdd, 0x4a, 0xdd, + 0x5e, 0xfa, 0x6c, 0x7b, 0xc5, 0x5e, 0x5a, 0x4c, 0x97, 0x60, 0x60, 0xbf, 0x58, 0xaa, 0x15, 0x0b, + 0x64, 0x0a, 0x4e, 0x1b, 0xd0, 0xf5, 0x8d, 0x62, 0xdf, 0x8d, 0x57, 0x45, 0x82, 0x40, 0x32, 0x09, + 0xb0, 0xb8, 0x54, 0x5b, 0x58, 0x5a, 0x5f, 0x5c, 0x59, 0xbf, 0x57, 0x3c, 0x45, 0x26, 0x60, 0xb4, + 0xa2, 0x7e, 0x16, 0x6e, 0xbc, 0x0f, 0xa7, 0x13, 0xe6, 0x3d, 0xa3, 0x50, 0x86, 0x71, 0xf1, 0x14, + 0xaa, 0x5f, 0xfe, 0x44, 0x1f, 0x2b, 0xb7, 0xd4, 0x8b, 0x85, 0x1b, 0x55, 0xf9, 0xfa, 0xb4, 0xf6, + 0x9d, 0x93, 0x31, 0x18, 0x5e, 0x5c, 0xba, 0x5b, 0xd9, 0x5e, 0xdd, 0x2a, 0x9e, 0x62, 0x3f, 0x16, + 0xec, 0xa5, 0xca, 0xd6, 0xd2, 0x62, 0xb1, 0x40, 0x46, 0x61, 0xb0, 0xb6, 0x55, 0xd9, 0x5a, 0x2a, + 0xf6, 0x91, 0x11, 0x18, 0xd8, 0xae, 0x2d, 0xd9, 0xc5, 0xfe, 0xf9, 0x7f, 0xfb, 0x8f, 0x0b, 0xdc, + 0xd1, 0x28, 0x6f, 0x81, 0x7d, 0xad, 0x19, 0x94, 0x62, 0xca, 0x13, 0x4f, 0xed, 0xe6, 0x5a, 0x8f, + 0xb8, 0x0b, 0x98, 0xeb, 0x72, 0xf2, 0x82, 0x04, 0xd7, 0x0b, 0xb7, 0x0b, 0xc4, 0xc6, 0x48, 0x95, + 0x84, 0x7d, 0xa5, 0x24, 0x67, 0x9b, 0xc0, 0x73, 0x17, 0xbb, 0x9a, 0x65, 0xe4, 0x97, 0xc0, 0xd2, + 0x65, 0xe6, 0x58, 0x21, 0xdf, 0x3d, 0x9e, 0xb5, 0x21, 0xcb, 0x7c, 0xf5, 0x78, 0xe4, 0xe4, 0x3e, + 0x4c, 0xb0, 0xbd, 0xb9, 0x22, 0x23, 0xe7, 0x93, 0x8c, 0x9a, 0x49, 0x30, 0x77, 0x21, 0x1b, 0xa9, + 0x5e, 0xc3, 0x1a, 0xc7, 0x86, 0x70, 0xe3, 0x3a, 0x24, 0x32, 0x89, 0x8c, 0x84, 0xf0, 0x19, 0x7f, + 0xee, 0x4c, 0x02, 0xbc, 0x73, 0xe7, 0x76, 0x81, 0xd4, 0x30, 0x83, 0xa3, 0xb1, 0xc9, 0x27, 0xf2, + 0x5a, 0x62, 0x7a, 0xf7, 0xcf, 0x6b, 0x53, 0x56, 0x6f, 0xd7, 0xe6, 0x58, 0x07, 0xeb, 0x40, 0xd2, + 0x7b, 0x67, 0x72, 0x39, 0x1e, 0x07, 0xd9, 0xdb, 0xea, 0xb9, 0xb3, 0xa9, 0xe0, 0xc6, 0x25, 0xb6, + 0x7b, 0x22, 0x4b, 0x30, 0x29, 0x32, 0x44, 0x88, 0xdd, 0x3c, 0xe9, 0x66, 0x0f, 0xe4, 0x8a, 0xb9, + 0x87, 0x7a, 0x52, 0x16, 0x01, 0x99, 0x8b, 0xdb, 0x91, 0x34, 0x13, 0xe6, 0xce, 0x67, 0xe2, 0x44, + 0xfb, 0xee, 0xc2, 0xa4, 0x69, 0x5c, 0x10, 0xd9, 0x41, 0x99, 0x36, 0x47, 0x6e, 0x85, 0xea, 0x30, + 0xbb, 0xe6, 0xb8, 0x78, 0x5e, 0x22, 0x22, 0xe8, 0x64, 0x90, 0x1a, 0x29, 0x77, 0x89, 0x5a, 0xab, + 0x51, 0xaf, 0xa9, 0x3a, 0x21, 0xef, 0x65, 0x0b, 0xfc, 0x6c, 0x6a, 0x72, 0x8f, 0x6c, 0x06, 0x10, + 0x12, 0xcb, 0x7c, 0x8f, 0x3c, 0x2b, 0x26, 0x74, 0x2e, 0x2f, 0x8c, 0x99, 0xac, 0xe1, 0x26, 0x3d, + 0x21, 0x51, 0x1b, 0x13, 0x27, 0x16, 0x57, 0xc2, 0x3c, 0x25, 0x91, 0x9b, 0x8c, 0x47, 0x0e, 0x49, + 0x8e, 0xe2, 0x72, 0x85, 0xdd, 0x2e, 0x90, 0xaf, 0xf1, 0xab, 0xce, 0x14, 0xf7, 0xd0, 0x8d, 0xf6, + 0xc5, 0xee, 0xe7, 0x7c, 0xa6, 0x00, 0xf1, 0xa1, 0x74, 0x91, 0x6e, 0xc3, 0x74, 0x56, 0xe4, 0xb4, + 0x52, 0x68, 0x97, 0xb0, 0xea, 0xdc, 0x51, 0x60, 0x33, 0x53, 0xa3, 0x99, 0xdf, 0x49, 0x5d, 0x02, + 0x77, 0x73, 0x65, 0x7e, 0x08, 0x93, 0x6c, 0x94, 0x3c, 0xa0, 0xb4, 0x5d, 0x69, 0xb9, 0x4f, 0x68, + 0x48, 0x64, 0xfa, 0x6d, 0x05, 0xca, 0xe3, 0xbd, 0x5e, 0x20, 0xdf, 0x81, 0xb1, 0x87, 0x4e, 0xd4, + 0xd8, 0x17, 0x69, 0x68, 0x65, 0x96, 0x5a, 0x84, 0xcd, 0xc9, 0x5f, 0x88, 0xbc, 0x5d, 0x20, 0x1f, + 0xc1, 0xf0, 0x3d, 0x1a, 0xe1, 0xb5, 0xf0, 0x2b, 0x2a, 0xd0, 0x8f, 0xfb, 0x27, 0x57, 0x3c, 0x75, + 0x45, 0x48, 0x56, 0x38, 0xe9, 0xcc, 0x25, 0xb7, 0x00, 0xf8, 0x84, 0x80, 0x12, 0x92, 0xe8, 0xb9, + 0x54, 0xb5, 0xc9, 0x3d, 0xb6, 0x79, 0x68, 0xd1, 0x88, 0x1e, 0xb7, 0xc8, 0x3c, 0x1d, 0xad, 0xc2, + 0xa4, 0x7a, 0x40, 0x6c, 0x1d, 0xb3, 0x05, 0x59, 0x09, 0x61, 0xe1, 0x09, 0xa4, 0xbd, 0xcf, 0xbe, + 0x0a, 0xfe, 0x7a, 0x36, 0xa6, 0x95, 0xc1, 0x99, 0x74, 0x56, 0xcf, 0x4d, 0xa3, 0x4f, 0xa1, 0x52, + 0x89, 0x9c, 0x4c, 0xe3, 0x5d, 0xf6, 0xc3, 0xc8, 0xe4, 0x55, 0x90, 0x6c, 0xde, 0x5f, 0x84, 0x39, + 0xbd, 0x5c, 0x33, 0x0f, 0x7a, 0x3c, 0xe7, 0xe6, 0xa5, 0x57, 0x9f, 0xbb, 0xd2, 0x85, 0x42, 0xd8, + 0x6f, 0xfd, 0xbf, 0xde, 0x57, 0xc0, 0xe9, 0x64, 0x11, 0xa6, 0x64, 0x59, 0x1b, 0x6d, 0xea, 0xd5, + 0x6a, 0xcb, 0xf8, 0x58, 0x94, 0x0c, 0x2b, 0xd1, 0x60, 0x52, 0x3a, 0x49, 0xa3, 0xd8, 0xd2, 0x67, + 0xa4, 0x8f, 0x21, 0xdd, 0x92, 0xca, 0xc4, 0x4b, 0x5f, 0x66, 0x82, 0xee, 0x07, 0xdc, 0xa9, 0x64, + 0x6c, 0xfe, 0x77, 0xe6, 0x49, 0x17, 0x03, 0x68, 0x2e, 0xc7, 0x84, 0xb8, 0x5d, 0x20, 0x5f, 0x00, + 0x49, 0x9b, 0x24, 0x4a, 0x85, 0xb9, 0xe6, 0x97, 0x52, 0x61, 0x17, 0x7b, 0xe6, 0x1e, 0xcc, 0xa8, + 0xe4, 0x51, 0x5a, 0xa9, 0xf3, 0x24, 0xa7, 0x36, 0x79, 0xb5, 0x24, 0x9f, 0xc0, 0x94, 0x18, 0xb4, + 0x3a, 0x82, 0x14, 0xd5, 0xfc, 0x23, 0xac, 0x92, 0xdc, 0x71, 0x7a, 0x1f, 0x66, 0x6a, 0x09, 0x8d, + 0xf1, 0x48, 0xfb, 0x73, 0xa6, 0x08, 0x04, 0xd6, 0x68, 0xc4, 0x55, 0x96, 0x2d, 0xeb, 0x01, 0x10, + 0xee, 0x14, 0x92, 0xe2, 0x9e, 0xb8, 0xf4, 0x29, 0xb9, 0x98, 0xa8, 0x3a, 0x03, 0x22, 0x19, 0x4e, + 0x60, 0xb9, 0x2d, 0xdb, 0xe2, 0x6f, 0xbf, 0x23, 0xd4, 0x38, 0x47, 0xbf, 0x6c, 0x30, 0x18, 0x47, + 0xf1, 0xa2, 0x03, 0xce, 0xe5, 0x52, 0x90, 0x5f, 0xc6, 0xac, 0xcd, 0xdd, 0xcd, 0x2a, 0xf2, 0x9d, + 0x2c, 0xeb, 0x37, 0xc7, 0x30, 0x9c, 0x7b, 0xe3, 0x78, 0xc4, 0xca, 0x90, 0x9d, 0xb8, 0x47, 0xa3, + 0xcd, 0x56, 0x67, 0xcf, 0xc5, 0x57, 0x81, 0x89, 0x72, 0x1a, 0x29, 0x90, 0x18, 0x97, 0x32, 0x59, + 0x62, 0x8c, 0xa8, 0xd1, 0x1f, 0x92, 0x15, 0x28, 0xf2, 0xf9, 0x5f, 0x13, 0x71, 0x31, 0x25, 0x42, + 0x90, 0x38, 0x81, 0x73, 0x10, 0xe6, 0xf6, 0xd6, 0x2d, 0x1e, 0xb8, 0x44, 0xe4, 0x37, 0xa9, 0x6f, + 0x30, 0xa7, 0x0c, 0x98, 0x7a, 0xc9, 0x82, 0xf5, 0x88, 0x4d, 0x43, 0x1a, 0xc9, 0xf4, 0x50, 0xfc, + 0x4d, 0xe8, 0xab, 0xf1, 0x62, 0x9f, 0xc6, 0xc6, 0x9f, 0x7e, 0x22, 0x95, 0xe1, 0xce, 0x9b, 0x44, + 0xbd, 0x93, 0x9d, 0x21, 0xf4, 0x55, 0x63, 0x4f, 0x72, 0x32, 0xb9, 0x6f, 0xe1, 0x1a, 0x84, 0x29, + 0xb1, 0x66, 0xe2, 0xba, 0xb1, 0xdf, 0x92, 0x6b, 0x42, 0xe3, 0xda, 0x99, 0xc7, 0x29, 0x8d, 0x2d, + 0x92, 0x6c, 0x0b, 0xdb, 0x09, 0x02, 0xea, 0x71, 0xe6, 0xbc, 0xfd, 0x46, 0x16, 0xf7, 0xc7, 0x38, + 0xf5, 0x68, 0xdc, 0xfc, 0x42, 0x60, 0x2f, 0x11, 0xfc, 0x0d, 0xb3, 0xdb, 0x05, 0xf2, 0x2e, 0x8c, + 0x88, 0x3a, 0x32, 0x26, 0xa3, 0xd2, 0x61, 0x97, 0x5a, 0x23, 0x27, 0x70, 0x25, 0x61, 0x9d, 0x4d, + 0x9a, 0xbc, 0xde, 0xe7, 0x75, 0x7e, 0x97, 0x2d, 0xb6, 0xcd, 0xe7, 0xe1, 0x5c, 0x90, 0xab, 0x2e, + 0x72, 0x96, 0x54, 0x1a, 0x25, 0x09, 0xea, 0xb1, 0x3c, 0x72, 0x21, 0x6c, 0xdf, 0x8c, 0xb9, 0x48, + 0x55, 0x4a, 0x41, 0xb5, 0x6f, 0x36, 0xc0, 0xbd, 0xd6, 0xda, 0x15, 0x28, 0x56, 0x1a, 0xb8, 0x12, + 0xd4, 0xe8, 0x81, 0xd3, 0xde, 0xf7, 0x03, 0xaa, 0x8c, 0x96, 0x24, 0x42, 0xca, 0x9a, 0x51, 0x3b, + 0x0b, 0x81, 0x58, 0xa5, 0x0e, 0x26, 0x6c, 0x9f, 0x55, 0x5b, 0x8b, 0x04, 0x2a, 0x9b, 0xa3, 0x8b, + 0x91, 0x32, 0xbd, 0xc0, 0xcc, 0xaa, 0xd6, 0x8b, 0x89, 0x79, 0x1f, 0x27, 0x0c, 0x45, 0x1c, 0xaa, + 0x15, 0x42, 0x81, 0x94, 0x39, 0x27, 0xef, 0x06, 0x29, 0xd2, 0x8a, 0x3c, 0x37, 0x8e, 0xd5, 0x92, + 0xc7, 0x9d, 0x57, 0xfc, 0xf7, 0x60, 0x72, 0x89, 0x4d, 0xe8, 0x9d, 0xa6, 0xcb, 0x1f, 0xa9, 0x20, + 0xe6, 0xab, 0x03, 0xb9, 0x8c, 0xcb, 0xf2, 0xd9, 0x40, 0x64, 0x15, 0xa6, 0xbf, 0x5c, 0x53, 0x34, + 0x98, 0xec, 0x8f, 0x69, 0x29, 0x56, 0xbc, 0x13, 0x82, 0xa6, 0xb9, 0xb0, 0xf5, 0x67, 0xf9, 0x8e, + 0xb0, 0xd2, 0x6e, 0xb7, 0xa4, 0x4b, 0x9a, 0x9f, 0xbd, 0x5f, 0x33, 0x4c, 0xc8, 0x14, 0x5e, 0xca, + 0x4e, 0x6f, 0x1a, 0x3f, 0xd7, 0x9e, 0xf1, 0xce, 0x91, 0x99, 0x83, 0xef, 0x35, 0x16, 0x55, 0x5a, + 0xf9, 0x4a, 0xab, 0x95, 0x62, 0x0e, 0xc9, 0xeb, 0xa6, 0xf4, 0x2c, 0x9a, 0x5e, 0x25, 0xa0, 0x89, + 0xce, 0x77, 0x5d, 0x95, 0x76, 0x9b, 0x4f, 0x96, 0x97, 0xd4, 0x84, 0x61, 0x22, 0xd2, 0x26, 0x7a, + 0x12, 0x2f, 0xe6, 0xf6, 0xfb, 0x38, 0xcc, 0xe2, 0xb7, 0xbe, 0x89, 0x6e, 0xf0, 0x26, 0x9f, 0x3a, + 0x57, 0x9b, 0xb0, 0x04, 0x52, 0xad, 0x13, 0xa7, 0x71, 0xeb, 0x13, 0x3f, 0x1c, 0xae, 0x3c, 0x33, + 0x09, 0xb8, 0x94, 0x77, 0x29, 0x0f, 0xad, 0x3c, 0xa5, 0x45, 0x31, 0x98, 0xe2, 0x0a, 0x5e, 0x32, + 0xd6, 0x87, 0x74, 0x1d, 0xcb, 0xb9, 0x78, 0xd5, 0xe4, 0x62, 0xf2, 0x29, 0x77, 0x25, 0x34, 0xe7, + 0x8d, 0xf7, 0xdc, 0x3e, 0xb9, 0x0b, 0xd3, 0x7a, 0x8f, 0xaa, 0x76, 0xe7, 0xcd, 0xfe, 0x79, 0x72, + 0xb6, 0x60, 0x26, 0xf3, 0xe5, 0x75, 0xb5, 0xc4, 0x76, 0x7b, 0x97, 0x3d, 0x57, 0x2a, 0x85, 0xb3, + 0xc2, 0xb2, 0x4f, 0xbc, 0x35, 0x4f, 0x5e, 0x31, 0x0d, 0xff, 0xec, 0xa7, 0xe8, 0xe7, 0xae, 0xf5, + 0xa0, 0x12, 0x0a, 0xfd, 0x1a, 0x57, 0xc0, 0x54, 0x19, 0x57, 0x34, 0x57, 0x40, 0x4e, 0x01, 0x56, + 0x37, 0x12, 0x35, 0x06, 0xa6, 0x33, 0xd0, 0xf9, 0x2a, 0xbe, 0x9a, 0x2f, 0x33, 0x1e, 0x58, 0x3b, + 0x32, 0x7b, 0x7a, 0xae, 0x66, 0xba, 0x3e, 0xd2, 0xdf, 0xc5, 0x96, 0x9c, 0x53, 0xe3, 0xe1, 0xf8, + 0x55, 0xce, 0x93, 0xd6, 0x54, 0x6e, 0x1b, 0xe3, 0x05, 0xfd, 0xa4, 0xdb, 0x26, 0xeb, 0xe5, 0x7f, + 0xa5, 0x86, 0x6c, 0x1a, 0xcd, 0xa2, 0x23, 0x5f, 0x71, 0x3f, 0x8e, 0x59, 0x84, 0xee, 0xc7, 0xc9, + 0x94, 0x7f, 0x39, 0x9f, 0x40, 0x17, 0xee, 0xf0, 0x43, 0x5b, 0x93, 0x24, 0x24, 0xba, 0xa9, 0x94, + 0xc0, 0x25, 0xc7, 0x46, 0x26, 0x89, 0x5e, 0xc4, 0x43, 0xf9, 0x0d, 0xe6, 0x68, 0x29, 0x0b, 0x79, + 0xac, 0x6d, 0xca, 0x06, 0x94, 0xe2, 0xce, 0x4c, 0x34, 0xe0, 0x84, 0x5d, 0x29, 0x95, 0x71, 0x2e, + 0xfe, 0x8e, 0x93, 0x12, 0x5f, 0x4b, 0x7d, 0xe9, 0x39, 0x8a, 0xe9, 0x5a, 0x04, 0x9f, 0xcf, 0xb5, + 0x6c, 0xec, 0xe7, 0x63, 0x27, 0x6e, 0x0c, 0xcd, 0x98, 0xcf, 0x75, 0xa4, 0x32, 0x56, 0x27, 0x0d, + 0x44, 0x7e, 0xab, 0x2f, 0x66, 0xc9, 0x09, 0xd3, 0x33, 0xae, 0x56, 0x2f, 0xb9, 0x4f, 0x4b, 0x22, + 0x4e, 0x32, 0xe3, 0x1e, 0xa7, 0x6a, 0x79, 0x72, 0x16, 0x61, 0x8c, 0xd7, 0x96, 0x2f, 0xa4, 0xe7, + 0x0c, 0x35, 0x19, 0x6b, 0xe8, 0x9c, 0xd1, 0x38, 0x73, 0xf9, 0x5c, 0x40, 0x57, 0xb2, 0x04, 0xe7, + 0xd7, 0xe2, 0x7c, 0x5a, 0x86, 0xe1, 0x46, 0x56, 0x5a, 0xe0, 0xb5, 0xb9, 0x90, 0x54, 0x8e, 0x51, + 0xa1, 0xfc, 0x26, 0x11, 0x5d, 0x35, 0x3d, 0xaa, 0x94, 0xbf, 0x7f, 0x9d, 0x12, 0xef, 0x37, 0xe3, + 0x13, 0x4a, 0x32, 0x59, 0xe2, 0x59, 0xe5, 0x13, 0xd3, 0xa0, 0xe8, 0xa0, 0xc8, 0x16, 0xb3, 0x89, + 0xd7, 0x47, 0x68, 0x10, 0xa5, 0x92, 0x21, 0xbe, 0x62, 0x6c, 0xde, 0x92, 0xe8, 0xfc, 0xbd, 0x9b, + 0x9a, 0xb3, 0x73, 0x25, 0x66, 0xa3, 0x7b, 0xa9, 0xed, 0xfb, 0xda, 0x9c, 0x9d, 0xe4, 0x0d, 0xc9, + 0xf5, 0xe4, 0xc6, 0x2d, 0x45, 0xd2, 0x7b, 0x4d, 0x10, 0x21, 0x24, 0x89, 0x00, 0x52, 0xcb, 0xd0, + 0x83, 0x89, 0xcc, 0xd7, 0x82, 0x2d, 0xc7, 0x7f, 0x8e, 0xb4, 0x2c, 0x64, 0xaf, 0x1a, 0x7e, 0xa9, + 0x4d, 0x74, 0x26, 0x67, 0xa8, 0xcc, 0xf1, 0x3c, 0x82, 0x5e, 0xb2, 0xd7, 0xf1, 0xc2, 0x51, 0xa2, + 0x81, 0x6e, 0x83, 0xaa, 0x9d, 0x4d, 0x26, 0x36, 0xbf, 0xfd, 0xf7, 0xe4, 0x4e, 0x29, 0x29, 0xef, + 0x6c, 0xc2, 0x69, 0xdb, 0xab, 0x62, 0x5f, 0xcb, 0xc9, 0x38, 0xd1, 0x26, 0xbc, 0x54, 0xf4, 0x5a, + 0xb7, 0x56, 0x6b, 0x2f, 0x65, 0x76, 0x31, 0x83, 0x4e, 0xd7, 0xdc, 0x3d, 0x4f, 0xdd, 0x44, 0xa8, + 0xd9, 0xca, 0x08, 0xd2, 0x60, 0xc9, 0x29, 0xc6, 0x40, 0xa9, 0xe4, 0x39, 0xd3, 0x72, 0xf7, 0xae, + 0x3f, 0xe0, 0x4f, 0x52, 0x3c, 0x9a, 0xbb, 0xf5, 0x7c, 0x26, 0x2e, 0x2d, 0x50, 0x7f, 0x3d, 0x5f, + 0x09, 0xcc, 0x78, 0xc8, 0x5f, 0x09, 0xcc, 0x7c, 0x6e, 0xff, 0x16, 0x7a, 0x5d, 0x6c, 0xbf, 0x45, + 0x75, 0xaf, 0x8b, 0xf6, 0x1c, 0x7b, 0xc2, 0xe9, 0x41, 0x3e, 0x86, 0x51, 0xf5, 0x5c, 0xbd, 0xf2, + 0x6f, 0x27, 0x5f, 0xcc, 0x9f, 0x2b, 0xa5, 0x11, 0xa2, 0xc0, 0xb7, 0xa5, 0xe3, 0x03, 0xcb, 0x2c, + 0x99, 0x0e, 0xa3, 0xfc, 0x62, 0xdf, 0x96, 0x5e, 0x0f, 0x83, 0x2d, 0xf5, 0x58, 0x7d, 0x92, 0xed, + 0x7b, 0x30, 0x1e, 0x3f, 0x4c, 0xbf, 0x33, 0xaf, 0x31, 0x26, 0x5e, 0xab, 0x4f, 0x32, 0xbe, 0x2b, + 0x8f, 0x34, 0xb0, 0x3c, 0x13, 0xd9, 0x7d, 0x15, 0xff, 0x58, 0x7a, 0x59, 0x8c, 0x9a, 0xa6, 0x9e, + 0xb9, 0xef, 0x32, 0xf9, 0x8e, 0xeb, 0x2f, 0xc5, 0xaa, 0xae, 0xcd, 0x78, 0xeb, 0x59, 0x75, 0x6d, + 0xd6, 0x5b, 0xcd, 0xb1, 0xcb, 0xff, 0x0b, 0xe9, 0x52, 0x88, 0x85, 0x5e, 0x34, 0xaa, 0x95, 0x92, + 0x7b, 0x29, 0x0f, 0x9d, 0x14, 0x5d, 0x83, 0x62, 0xf2, 0x59, 0x5b, 0x65, 0x8f, 0xe5, 0xbc, 0x3f, + 0xac, 0x8c, 0xbc, 0xdc, 0xf7, 0x70, 0x37, 0xa5, 0x7f, 0xdc, 0x94, 0x7b, 0x25, 0xbb, 0x52, 0xba, + 0xe8, 0x7c, 0x87, 0xf9, 0x84, 0xf1, 0xc2, 0xad, 0x6e, 0x29, 0xa7, 0x5e, 0xd0, 0xd5, 0x77, 0x56, + 0x19, 0x8f, 0xe2, 0xba, 0x32, 0xa3, 0x54, 0xe6, 0x91, 0xad, 0x72, 0x16, 0xf4, 0x7e, 0x0e, 0xa1, + 0xe7, 0xf1, 0x2f, 0xf9, 0x05, 0x98, 0xcd, 0x49, 0xef, 0x4e, 0xae, 0x25, 0x3c, 0xad, 0xd9, 0xe9, + 0xdf, 0xd5, 0x00, 0xc9, 0x7c, 0x7a, 0x7e, 0x0d, 0xe3, 0x06, 0x8c, 0xfc, 0x0e, 0xa9, 0xb3, 0xb8, + 0x87, 0x6e, 0xb4, 0xcf, 0x5f, 0x58, 0xd7, 0xa6, 0xcd, 0xcc, 0xc4, 0x10, 0xa4, 0x86, 0xb6, 0x88, + 0x01, 0xcd, 0x38, 0x8e, 0xcb, 0x10, 0x38, 0x97, 0x2d, 0x90, 0xcd, 0x1d, 0x6c, 0x2c, 0x64, 0x24, + 0xdf, 0x50, 0x63, 0x21, 0x3f, 0x31, 0x47, 0x6e, 0x35, 0x37, 0xe5, 0x1e, 0x29, 0x5b, 0x62, 0x7e, + 0x1e, 0x8e, 0x5c, 0x89, 0xf7, 0x99, 0xc4, 0x54, 0x6a, 0x0d, 0x92, 0x43, 0xde, 0x7d, 0xf6, 0xb0, + 0xe5, 0x92, 0x6b, 0x72, 0xcd, 0x6b, 0xf5, 0xcb, 0x4b, 0xe2, 0x91, 0x5b, 0xbf, 0x25, 0xf9, 0x3d, + 0x65, 0xd7, 0xef, 0xb8, 0x8b, 0xae, 0x3a, 0xff, 0x4a, 0x64, 0x77, 0x31, 0x1a, 0xaa, 0xc1, 0xe7, + 0x72, 0xe0, 0x64, 0x1d, 0x03, 0x81, 0x92, 0x50, 0xcd, 0x28, 0xcd, 0x4e, 0x1f, 0x93, 0x2b, 0x8f, + 0x8f, 0x63, 0x23, 0xfd, 0xc6, 0x49, 0xc6, 0x71, 0x22, 0x6f, 0x87, 0x18, 0xc7, 0x06, 0xf4, 0x64, + 0xe3, 0x38, 0x21, 0xd0, 0x1c, 0xc7, 0xc9, 0x6a, 0x26, 0x2d, 0xfd, 0xdc, 0x5e, 0x4d, 0x56, 0x53, + 0x8d, 0xe3, 0x6c, 0x89, 0xf9, 0x69, 0x52, 0x72, 0x25, 0xaa, 0x71, 0x6c, 0x4a, 0xcc, 0x21, 0x3f, + 0xe6, 0x38, 0x4e, 0x16, 0x62, 0x8e, 0xe3, 0x13, 0xd5, 0x4f, 0x8d, 0xe3, 0xec, 0xfa, 0x9d, 0x78, + 0x1c, 0x27, 0xf2, 0x0a, 0x19, 0x0d, 0xcd, 0x1a, 0xc7, 0x49, 0x7a, 0x3e, 0x8e, 0x93, 0xd0, 0x84, + 0x73, 0xa5, 0xcb, 0x38, 0x4e, 0x72, 0x7e, 0x86, 0xf2, 0x12, 0x39, 0x51, 0x8e, 0x33, 0x92, 0x73, + 0xd3, 0xa9, 0x90, 0x87, 0xe8, 0xde, 0x4b, 0xc0, 0x8f, 0x37, 0x9a, 0x2f, 0xe4, 0x09, 0xc5, 0xf1, + 0xbc, 0x23, 0x95, 0x98, 0xac, 0xae, 0xe9, 0xbb, 0xca, 0x4e, 0x09, 0xd3, 0xa5, 0xc2, 0x3b, 0x6c, + 0xdc, 0x34, 0xbb, 0xc8, 0xed, 0x96, 0xd1, 0xa6, 0x8b, 0x5c, 0x65, 0xca, 0x24, 0xe5, 0xe6, 0xb2, + 0x74, 0x1f, 0xdf, 0x9f, 0xcb, 0x03, 0x8e, 0x24, 0xdf, 0x7c, 0xc2, 0x38, 0x3a, 0x71, 0x4d, 0x95, + 0x91, 0x94, 0xac, 0xe9, 0x49, 0xc7, 0xf9, 0x9a, 0xdc, 0x3d, 0xa4, 0x52, 0x61, 0x25, 0x1a, 0xad, + 0x8f, 0xf5, 0x5c, 0x0c, 0xd9, 0x42, 0x5f, 0x6e, 0x1a, 0xae, 0xf9, 0x81, 0xf3, 0x72, 0x6e, 0xf5, + 0x94, 0x9a, 0x4a, 0xea, 0xa3, 0x4b, 0xcd, 0xcb, 0xf8, 0xa3, 0xa4, 0xa6, 0xb9, 0x3f, 0x41, 0xef, + 0x97, 0xb8, 0x71, 0xe5, 0x3d, 0xf2, 0xf3, 0x3d, 0x29, 0x53, 0x46, 0xb0, 0x12, 0xa3, 0xc5, 0x18, + 0xb1, 0x0f, 0xc5, 0x09, 0x9e, 0x04, 0xe6, 0x2a, 0x3f, 0x8b, 0x9f, 0x7c, 0x02, 0x45, 0x31, 0xbd, + 0xc5, 0x02, 0xb2, 0x08, 0x73, 0xbb, 0xae, 0x2a, 0x9d, 0x6e, 0xc7, 0xa8, 0xc1, 0x71, 0x9c, 0x6d, + 0xc7, 0xd1, 0x44, 0xbe, 0x67, 0x8a, 0x2d, 0x87, 0x5b, 0x41, 0x27, 0x8c, 0x68, 0x33, 0xed, 0x51, + 0x32, 0x2b, 0x23, 0x23, 0x23, 0x4c, 0xf2, 0x9d, 0x79, 0xb2, 0x82, 0x73, 0x9b, 0x09, 0xee, 0xe6, + 0x72, 0xcb, 0x16, 0x83, 0x53, 0xcf, 0x9a, 0xba, 0xd6, 0x63, 0xd6, 0x29, 0xaf, 0xec, 0xdc, 0x4a, + 0xc9, 0x03, 0x6d, 0xa1, 0xa7, 0x63, 0x36, 0x31, 0x4f, 0x4f, 0x1f, 0x60, 0x2c, 0x00, 0xf7, 0x01, + 0xf6, 0x52, 0x4f, 0xf2, 0xb6, 0x11, 0xf9, 0x14, 0x46, 0x25, 0x73, 0x6f, 0xad, 0x24, 0xb9, 0x51, + 0x2b, 0x8b, 0x30, 0x61, 0x5c, 0xa5, 0x52, 0x26, 0x4e, 0xd6, 0x05, 0xab, 0x2e, 0x9d, 0x3d, 0x61, + 0x5c, 0x99, 0x52, 0x52, 0xb2, 0x2e, 0x52, 0xe5, 0x4a, 0xf9, 0x08, 0xc6, 0x84, 0x4a, 0xbb, 0x6a, + 0x23, 0xdf, 0xe9, 0x36, 0xa3, 0x85, 0x25, 0x77, 0x9a, 0x6e, 0xb4, 0xe0, 0x7b, 0x8f, 0xdc, 0xbd, + 0x9e, 0x8a, 0x49, 0xb3, 0xec, 0xcc, 0x93, 0xaf, 0xf0, 0x51, 0x72, 0xf9, 0x54, 0x3c, 0x8d, 0x9e, + 0xfa, 0xc1, 0x63, 0xd7, 0xdb, 0xeb, 0x21, 0xf2, 0xb2, 0x29, 0x32, 0xc9, 0x27, 0x07, 0xcf, 0x57, + 0x30, 0x57, 0xcb, 0x17, 0xde, 0x53, 0x48, 0xf7, 0x35, 0xa6, 0x06, 0x17, 0x30, 0x84, 0xe6, 0xa4, + 0x75, 0xef, 0x2a, 0xf4, 0x0b, 0x9e, 0x52, 0x51, 0x3a, 0xec, 0x1b, 0x7e, 0xd0, 0xec, 0x2d, 0xb1, + 0x6c, 0x46, 0xd3, 0x26, 0xd8, 0xa4, 0x32, 0xbe, 0x80, 0x73, 0xb5, 0x5c, 0xd1, 0xbd, 0x44, 0xf4, + 0xda, 0x4e, 0x9e, 0x47, 0x55, 0x9c, 0xb0, 0xde, 0x5d, 0x65, 0xae, 0xe0, 0xc4, 0xc6, 0x16, 0xa3, + 0xcd, 0x80, 0x3e, 0xa2, 0x01, 0xc6, 0x6c, 0xf7, 0x8a, 0x56, 0x36, 0xc9, 0x65, 0xcb, 0x57, 0xe0, + 0x4c, 0x2d, 0x25, 0x2a, 0x8f, 0xa5, 0xd7, 0x21, 0xd0, 0x14, 0xb6, 0xf4, 0x98, 0xf5, 0xea, 0x11, + 0x2a, 0x34, 0x76, 0x8f, 0x46, 0xdb, 0x2b, 0x3d, 0xb4, 0x24, 0x2f, 0x15, 0x48, 0xc2, 0x9d, 0x3b, + 0x8c, 0xb3, 0xa6, 0x71, 0xa6, 0x29, 0x72, 0x3f, 0xde, 0x4f, 0xe5, 0x81, 0x48, 0xcf, 0x62, 0xf3, + 0x24, 0xbc, 0x89, 0x73, 0xa1, 0x88, 0x5b, 0x9e, 0x8d, 0xf7, 0x01, 0x1c, 0x12, 0xfb, 0xeb, 0xb4, + 0x10, 0xe6, 0x90, 0x54, 0xb8, 0x0d, 0xc8, 0x87, 0x87, 0x80, 0x5d, 0x4a, 0xc5, 0xb3, 0x77, 0x15, + 0xc1, 0x5d, 0xa1, 0xab, 0x7e, 0xe3, 0xb1, 0xee, 0x0a, 0x65, 0xbf, 0x93, 0x3e, 0x42, 0x06, 0xdb, + 0x99, 0x17, 0x33, 0x3e, 0xfb, 0x61, 0x44, 0x7f, 0x21, 0x20, 0x9e, 0xf1, 0x93, 0x70, 0xe1, 0x46, + 0x7a, 0x53, 0x3a, 0x18, 0xb1, 0x40, 0x53, 0x72, 0xae, 0x6a, 0x94, 0x6f, 0x11, 0x99, 0x4c, 0xdf, + 0xa2, 0x5e, 0xd1, 0x7c, 0x87, 0x3e, 0xb1, 0x69, 0xbb, 0x85, 0xa1, 0xd0, 0x07, 0x3e, 0xe7, 0x89, + 0xa3, 0x63, 0xd3, 0xa8, 0xde, 0x41, 0x5c, 0x53, 0x22, 0xf4, 0xc7, 0x50, 0xbc, 0x4a, 0x79, 0x9c, + 0xc6, 0xc5, 0xaa, 0xd4, 0x23, 0x92, 0x6e, 0x17, 0xc8, 0x3a, 0x9c, 0xbd, 0x47, 0x23, 0x31, 0xc7, + 0xd9, 0x34, 0x8c, 0x02, 0xb7, 0x11, 0x75, 0x3d, 0x1d, 0x94, 0x06, 0x4a, 0x06, 0xcf, 0xce, 0x5b, + 0x4c, 0x5e, 0x2d, 0x5b, 0x5e, 0x57, 0xbe, 0x2e, 0x71, 0xb2, 0xe2, 0xc8, 0xe1, 0x24, 0x55, 0xcc, + 0x1f, 0xe2, 0xc3, 0x3c, 0x0c, 0x27, 0x9f, 0xb5, 0x18, 0xa7, 0x40, 0x11, 0x26, 0xd7, 0x4d, 0x18, + 0xe2, 0x4c, 0xb9, 0x0b, 0xea, 0xb8, 0xce, 0x43, 0xee, 0xc0, 0xa8, 0x8a, 0xa3, 0x21, 0x06, 0x2a, + 0xb7, 0x5e, 0x77, 0x60, 0x94, 0xdb, 0x57, 0xc7, 0x67, 0xf9, 0x00, 0x46, 0x55, 0xe0, 0xcd, 0x89, + 0x57, 0xfa, 0x4f, 0x60, 0x42, 0x0f, 0xc1, 0x39, 0xb9, 0x22, 0x3f, 0xc2, 0x33, 0x5c, 0x79, 0x54, + 0x92, 0xcf, 0x3f, 0x93, 0xc8, 0x0c, 0x23, 0x54, 0xca, 0x27, 0x48, 0x09, 0xcc, 0xad, 0xfe, 0x99, + 0x14, 0x37, 0xf9, 0x40, 0x5e, 0x67, 0x52, 0xcc, 0x69, 0xa2, 0x2e, 0x3a, 0x9b, 0xe4, 0x6a, 0x7e, + 0x1e, 0x66, 0x35, 0xc1, 0xf6, 0xac, 0xf6, 0x71, 0xce, 0x9a, 0x7b, 0xab, 0x2e, 0x4f, 0xca, 0x06, + 0xee, 0xd2, 0x52, 0xcf, 0xf8, 0xe5, 0x0b, 0xba, 0x94, 0xff, 0xf2, 0x1f, 0x76, 0xc6, 0x7d, 0x34, + 0x05, 0x53, 0xd8, 0xdc, 0xe6, 0x75, 0x79, 0x49, 0x30, 0xb6, 0x7d, 0xd3, 0xe2, 0xba, 0xb0, 0x75, + 0x33, 0xa5, 0xc5, 0x25, 0xcd, 0x97, 0x22, 0x6e, 0x45, 0x46, 0x32, 0x1e, 0xbf, 0xb1, 0xf9, 0x35, + 0x3b, 0x9f, 0x71, 0xba, 0xdd, 0xb3, 0x2f, 0xf2, 0xc4, 0xfd, 0x02, 0xee, 0x0e, 0x33, 0x53, 0x83, + 0xe5, 0x0b, 0xbb, 0xae, 0x05, 0x48, 0x64, 0x72, 0xaa, 0x45, 0xef, 0x31, 0xde, 0x13, 0xcb, 0x7e, + 0xe8, 0xf0, 0xd5, 0x1e, 0x52, 0xa4, 0x26, 0x5e, 0xeb, 0x49, 0xa7, 0xce, 0x4a, 0xcf, 0xf3, 0x15, + 0x36, 0xbb, 0xbc, 0x1e, 0x0f, 0x37, 0x66, 0x1c, 0x5f, 0xab, 0x30, 0xd1, 0x6c, 0x81, 0x66, 0x98, + 0x68, 0xd7, 0x36, 0xe4, 0xa9, 0xff, 0x33, 0x28, 0xc7, 0x51, 0x20, 0x27, 0xeb, 0x84, 0xfc, 0xe8, + 0x44, 0x92, 0xd2, 0x54, 0x48, 0xba, 0x3d, 0xf8, 0x33, 0x77, 0x25, 0x4f, 0xc3, 0xfa, 0x5d, 0x18, + 0x11, 0xdd, 0x96, 0x78, 0xf2, 0x33, 0xef, 0xf1, 0xd0, 0x2e, 0xce, 0x58, 0x71, 0x71, 0xee, 0xa5, + 0x08, 0x4a, 0xf7, 0xf6, 0xc9, 0x05, 0xa9, 0x20, 0x8d, 0x84, 0x20, 0xab, 0x4b, 0xf7, 0xf6, 0x3e, + 0x7f, 0x2c, 0xe5, 0xf4, 0xeb, 0xc9, 0x3b, 0xd4, 0x89, 0x2f, 0x8b, 0x25, 0x32, 0x09, 0xea, 0x17, + 0x74, 0xd3, 0xa8, 0xe4, 0x4d, 0xa7, 0x2c, 0x0a, 0x15, 0x19, 0x55, 0x92, 0x45, 0x30, 0x38, 0x33, + 0x45, 0xfc, 0xc0, 0x8d, 0x9e, 0x2d, 0xd8, 0xab, 0xb1, 0x5b, 0x41, 0x47, 0x48, 0xd9, 0x20, 0x91, + 0xf6, 0x2a, 0xf9, 0x12, 0xa7, 0x12, 0x21, 0xbe, 0xea, 0xfb, 0x51, 0x18, 0x05, 0x4e, 0xbb, 0x86, + 0x4f, 0x21, 0xe7, 0x36, 0x3a, 0x0e, 0xe4, 0xce, 0x62, 0xd3, 0xe2, 0x4a, 0x45, 0xa6, 0xf9, 0xac, + 0xf4, 0x37, 0xea, 0x6e, 0x4d, 0x16, 0xb2, 0x8b, 0xe5, 0x52, 0x93, 0xb9, 0xe5, 0x5f, 0xa6, 0xd0, + 0x3a, 0xcc, 0xe6, 0x24, 0x0d, 0x52, 0x47, 0xb8, 0xdd, 0x93, 0x0a, 0xcd, 0x75, 0x2f, 0x98, 0x7c, + 0x05, 0x33, 0x99, 0x59, 0x85, 0x94, 0x1b, 0xba, 0x5b, 0xce, 0xa1, 0x5e, 0xc2, 0x1f, 0x43, 0x89, + 0xdf, 0xea, 0xc0, 0xe0, 0x65, 0x23, 0xc1, 0x4c, 0x7c, 0xd7, 0x27, 0x87, 0x20, 0x39, 0x5f, 0xe7, + 0xd3, 0xa9, 0x1b, 0xe7, 0xd3, 0x98, 0x59, 0x44, 0xbe, 0xdd, 0x2c, 0x1e, 0xe0, 0x57, 0x1f, 0x5e, + 0x16, 0xb2, 0xdb, 0x85, 0xa2, 0x4d, 0x98, 0xd9, 0xa1, 0x81, 0xfb, 0xe8, 0x59, 0x52, 0xa0, 0xd4, + 0x4c, 0x26, 0xb6, 0x9b, 0xc4, 0xcf, 0x61, 0x76, 0xc1, 0x3f, 0x68, 0x8b, 0xab, 0x7b, 0x86, 0x4c, + 0x75, 0x1e, 0x9f, 0x8d, 0xef, 0x1d, 0xd0, 0x34, 0xa7, 0xee, 0x16, 0xea, 0x7c, 0x0b, 0x78, 0xa7, + 0xf5, 0xba, 0x19, 0x53, 0x90, 0x41, 0x12, 0xdf, 0xc8, 0x90, 0xa6, 0x9c, 0xce, 0xbf, 0x85, 0x83, + 0x30, 0xc1, 0xc7, 0x7d, 0x73, 0xda, 0x20, 0xcc, 0xc2, 0x77, 0xbf, 0x08, 0x96, 0x21, 0x95, 0x17, + 0x98, 0x2f, 0xf5, 0x18, 0xb5, 0x5d, 0x97, 0x6b, 0x8b, 0xf9, 0xd6, 0x7e, 0x22, 0x72, 0x3a, 0xf3, + 0x21, 0xfe, 0xcc, 0x7a, 0x6a, 0xa9, 0x15, 0x5a, 0xad, 0x2e, 0x5b, 0x2c, 0xa2, 0xe7, 0x56, 0x60, + 0x94, 0xe8, 0xc9, 0x9f, 0xd0, 0x79, 0xbb, 0xcd, 0xd6, 0x29, 0x66, 0xdc, 0xd4, 0xbe, 0x0f, 0xe3, + 0x35, 0xbd, 0xf0, 0x8c, 0x42, 0x72, 0x07, 0x85, 0xba, 0x0a, 0xd4, 0xbb, 0xee, 0x5d, 0x02, 0x42, + 0xd5, 0xc2, 0x73, 0xac, 0x56, 0xe4, 0xc6, 0xcf, 0x18, 0xaf, 0xc3, 0xa9, 0x55, 0x20, 0xeb, 0xf1, + 0x46, 0x15, 0x3f, 0x93, 0xfd, 0xa0, 0x5c, 0x9d, 0xbf, 0x39, 0x93, 0x7c, 0x9b, 0x93, 0x58, 0xbd, + 0x1f, 0xc1, 0x55, 0x81, 0xf1, 0x5d, 0x1f, 0xf7, 0xe4, 0xc1, 0x3e, 0xf1, 0x7b, 0x78, 0x7a, 0xb0, + 0x4f, 0xea, 0x95, 0x3d, 0x3d, 0xd8, 0x27, 0xe3, 0x09, 0xbd, 0x25, 0x94, 0x15, 0x3f, 0xd6, 0xd3, + 0xc5, 0x19, 0xa1, 0xc4, 0x64, 0xbc, 0x09, 0xf4, 0x40, 0xcf, 0xd0, 0xc1, 0x9f, 0xf8, 0xe9, 0xe2, + 0x6b, 0x4d, 0x66, 0xe6, 0x48, 0xbc, 0x09, 0x74, 0x17, 0x8a, 0xfc, 0xb5, 0x83, 0x38, 0xb1, 0x61, + 0x1c, 0xff, 0x97, 0x7e, 0x84, 0xa1, 0x4b, 0xa7, 0x16, 0x93, 0xe9, 0xe0, 0x94, 0xcb, 0x2c, 0x27, + 0x4f, 0x5c, 0x97, 0xa1, 0x0a, 0x71, 0xd2, 0x37, 0xe5, 0x98, 0x4a, 0xe5, 0x81, 0x9b, 0x3b, 0x97, + 0x81, 0x51, 0x5b, 0xca, 0x71, 0x3d, 0x45, 0x9c, 0x6a, 0x52, 0x46, 0xde, 0xb8, 0xb9, 0xf3, 0x99, + 0x38, 0x21, 0x28, 0xe2, 0xef, 0x40, 0x67, 0x3f, 0xcb, 0x1d, 0xdf, 0xe6, 0xea, 0x42, 0x23, 0x8b, + 0xb9, 0x71, 0x1c, 0x52, 0x51, 0x2a, 0x55, 0x4f, 0x15, 0x65, 0xbc, 0x05, 0xfe, 0x5a, 0xc6, 0x85, + 0x0b, 0x83, 0x22, 0x0e, 0x09, 0xeb, 0xfe, 0x30, 0x39, 0x79, 0x28, 0x9f, 0x8e, 0xc9, 0x29, 0xa9, + 0x97, 0x80, 0xdc, 0x1e, 0x7c, 0x28, 0x1f, 0x8b, 0x79, 0xd9, 0x82, 0x77, 0xe1, 0x42, 0xe2, 0x16, + 0x87, 0x29, 0xf8, 0x46, 0xf6, 0x55, 0x8f, 0x4c, 0xf5, 0xe4, 0xef, 0xd9, 0x2f, 0xa7, 0x6f, 0x7b, + 0x24, 0xfa, 0xfd, 0xa4, 0x73, 0xde, 0x1a, 0x4c, 0xe2, 0x34, 0x23, 0x5f, 0xb5, 0x8f, 0x13, 0xc4, + 0x98, 0xe0, 0x64, 0xa6, 0xa2, 0x24, 0x56, 0x5d, 0x22, 0x1f, 0x17, 0x37, 0x83, 0xf9, 0x1b, 0xf9, + 0x73, 0xe6, 0x75, 0x61, 0x04, 0x66, 0xad, 0x62, 0xe2, 0xe9, 0x7d, 0xf2, 0x11, 0x9c, 0x8e, 0x2f, + 0x0c, 0x73, 0x11, 0x19, 0x64, 0x5d, 0x1c, 0x65, 0xa7, 0xe3, 0x5b, 0xc3, 0x27, 0x67, 0x5f, 0x96, + 0x4b, 0x51, 0xcc, 0x7e, 0x31, 0x75, 0xe7, 0xc5, 0x68, 0xc3, 0x71, 0x56, 0x24, 0x4d, 0xb7, 0x27, + 0xed, 0x9d, 0x06, 0x7e, 0x6e, 0xd9, 0xb9, 0x0f, 0xf5, 0xcf, 0xad, 0x6b, 0x7e, 0x46, 0xb5, 0xfd, + 0xcd, 0x91, 0xb3, 0x06, 0x57, 0x31, 0x5f, 0xca, 0x26, 0xcf, 0x90, 0x97, 0x4d, 0x95, 0x5f, 0xf7, + 0x64, 0x96, 0x95, 0x16, 0x5c, 0xe9, 0x99, 0xfc, 0x91, 0xdc, 0x32, 0xe2, 0x5c, 0x7a, 0xa7, 0x89, + 0xec, 0x62, 0x79, 0x4c, 0x67, 0xe5, 0x50, 0x54, 0xeb, 0x6c, 0x97, 0x74, 0x8e, 0x6a, 0x9d, 0xed, + 0x9a, 0x84, 0xf1, 0x73, 0x7c, 0x8f, 0x49, 0xac, 0x51, 0x98, 0x03, 0x89, 0x7a, 0x3c, 0x33, 0x74, + 0xd7, 0x63, 0x9f, 0x2b, 0xe6, 0xa1, 0x68, 0x8a, 0x11, 0x6d, 0x9a, 0x4b, 0xc2, 0x12, 0xcb, 0x13, + 0xde, 0x5b, 0x48, 0x97, 0xf8, 0xea, 0x4b, 0x7c, 0x00, 0x9e, 0xb8, 0xe6, 0x39, 0xf0, 0xea, 0xe2, + 0x4f, 0xfe, 0xdb, 0xa5, 0xc2, 0x4f, 0x7e, 0x7a, 0xa9, 0xf0, 0x9f, 0x7e, 0x7a, 0xa9, 0xf0, 0x5f, + 0x7f, 0x7a, 0xa9, 0xf0, 0xe5, 0xfc, 0xf1, 0xf2, 0x13, 0xf3, 0x17, 0x14, 0x6f, 0x71, 0x71, 0x43, + 0xf8, 0xdf, 0x9b, 0xff, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xd8, 0x60, 0x0b, 0x51, 0xd6, 0xee, 0x00, + 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -35898,6 +35913,27 @@ func (m *PaginatedResource_SAMLIdPServiceProvider) MarshalToSizedBuffer(dAtA []b } return len(dAtA) - i, nil } +func (m *PaginatedResource_GitServer) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PaginatedResource_GitServer) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.GitServer != nil { + { + size, err := m.GitServer.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintAuthservice(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x7a + } + return len(dAtA) - i, nil +} func (m *PaginatedResource_IdentityCenterAccountAssignment) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) @@ -36642,12 +36678,12 @@ func (m *SessionTrackerUpdateExpiry) MarshalToSizedBuffer(dAtA []byte) (int, err copy(dAtA[i:], m.XXX_unrecognized) } if m.Expires != nil { - n106, err106 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) - if err106 != nil { - return 0, err106 + n107, err107 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) + if err107 != nil { + return 0, err107 } - i -= n106 - i = encodeVarintAuthservice(dAtA, i, uint64(n106)) + i -= n107 + i = encodeVarintAuthservice(dAtA, i, uint64(n107)) i-- dAtA[i] = 0xa } @@ -43537,6 +43573,18 @@ func (m *PaginatedResource_SAMLIdPServiceProvider) Size() (n int) { } return n } +func (m *PaginatedResource_GitServer) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.GitServer != nil { + l = m.GitServer.Size() + n += 1 + l + sovAuthservice(uint64(l)) + } + return n +} func (m *PaginatedResource_IdentityCenterAccountAssignment) Size() (n int) { if m == nil { return 0 @@ -65830,6 +65878,41 @@ func (m *PaginatedResource) Unmarshal(dAtA []byte) error { } } m.RequiresRequest = bool(v != 0) + case 15: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GitServer", 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 + } + v := &types.ServerV2{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Resource = &PaginatedResource_GitServer{v} + iNdEx = postIndex case 16: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field IdentityCenterAccountAssignment", wireType) diff --git a/api/client/proto/event.pb.go b/api/client/proto/event.pb.go index e1a9b29a48355..b766fa816fd44 100644 --- a/api/client/proto/event.pb.go +++ b/api/client/proto/event.pb.go @@ -187,6 +187,7 @@ type Event struct { // *Event_IdentityCenterAccount // *Event_IdentityCenterPrincipalAssignment // *Event_IdentityCenterAccountAssignment + // *Event_PluginStaticCredentials // *Event_WorkloadIdentity Resource isEvent_Resource `protobuf_oneof:"Resource"` } @@ -718,6 +719,13 @@ func (x *Event) GetIdentityCenterAccountAssignment() *v114.AccountAssignment { return nil } +func (x *Event) GetPluginStaticCredentials() *types.PluginStaticCredentialsV1 { + if x, ok := x.GetResource().(*Event_PluginStaticCredentials); ok { + return x.PluginStaticCredentials + } + return nil +} + func (x *Event) GetWorkloadIdentity() *v115.WorkloadIdentity { if x, ok := x.GetResource().(*Event_WorkloadIdentity); ok { return x.WorkloadIdentity @@ -1080,6 +1088,11 @@ type Event_IdentityCenterAccountAssignment struct { IdentityCenterAccountAssignment *v114.AccountAssignment `protobuf:"bytes,74,opt,name=IdentityCenterAccountAssignment,proto3,oneof"` } +type Event_PluginStaticCredentials struct { + // PluginStaticCredentials is filled in PluginStaticCredentials related events + PluginStaticCredentials *types.PluginStaticCredentialsV1 `protobuf:"bytes,75,opt,name=PluginStaticCredentials,proto3,oneof"` +} + type Event_WorkloadIdentity struct { // WorkloadIdentity is a resource for workload identity. WorkloadIdentity *v115.WorkloadIdentity `protobuf:"bytes,76,opt,name=WorkloadIdentity,proto3,oneof"` @@ -1223,6 +1236,8 @@ func (*Event_IdentityCenterPrincipalAssignment) isEvent_Resource() {} func (*Event_IdentityCenterAccountAssignment) isEvent_Resource() {} +func (*Event_PluginStaticCredentials) isEvent_Resource() {} + func (*Event_WorkloadIdentity) isEvent_Resource() {} var File_teleport_legacy_client_proto_event_proto protoreflect.FileDescriptor @@ -1285,7 +1300,7 @@ var file_teleport_legacy_client_proto_event_proto_rawDesc = []byte{ 0x75, 0x73, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2b, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xad, 0x29, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8b, 0x2a, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3f, 0x0a, @@ -1605,25 +1620,31 @@ var file_teleport_legacy_client_proto_event_proto_rawDesc = []byte{ 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1f, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x5c, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, - 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x48, 0x00, 0x52, 0x10, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x42, 0x0a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4a, 0x04, 0x08, 0x07, - 0x10, 0x08, 0x4a, 0x04, 0x08, 0x31, 0x10, 0x32, 0x4a, 0x04, 0x08, 0x3f, 0x10, 0x40, 0x4a, 0x04, - 0x08, 0x44, 0x10, 0x45, 0x52, 0x12, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6c, - 0x6f, 0x75, 0x64, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, - 0x48, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x13, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x2a, 0x2a, 0x0a, - 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, - 0x49, 0x54, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x55, 0x54, 0x10, 0x01, 0x12, 0x0a, 0x0a, - 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x02, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x74, 0x12, 0x5c, 0x0a, 0x17, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x69, 0x63, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x4b, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x50, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x73, 0x56, 0x31, 0x48, 0x00, 0x52, 0x17, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x53, + 0x74, 0x61, 0x74, 0x69, 0x63, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, + 0x12, 0x5c, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x65, 0x6c, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x48, 0x00, 0x52, 0x10, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x42, 0x0a, + 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, + 0x4a, 0x04, 0x08, 0x31, 0x10, 0x32, 0x4a, 0x04, 0x08, 0x3f, 0x10, 0x40, 0x4a, 0x04, 0x08, 0x44, + 0x10, 0x45, 0x52, 0x12, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6c, 0x6f, 0x75, + 0x64, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x48, 0x6f, + 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x13, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x2a, 0x2a, 0x0a, 0x09, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x49, 0x54, + 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x55, 0x54, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x44, + 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x02, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1709,7 +1730,8 @@ var file_teleport_legacy_client_proto_event_proto_goTypes = []any{ (*v114.Account)(nil), // 65: teleport.identitycenter.v1.Account (*v114.PrincipalAssignment)(nil), // 66: teleport.identitycenter.v1.PrincipalAssignment (*v114.AccountAssignment)(nil), // 67: teleport.identitycenter.v1.AccountAssignment - (*v115.WorkloadIdentity)(nil), // 68: teleport.workloadidentity.v1.WorkloadIdentity + (*types.PluginStaticCredentialsV1)(nil), // 68: types.PluginStaticCredentialsV1 + (*v115.WorkloadIdentity)(nil), // 69: teleport.workloadidentity.v1.WorkloadIdentity } var file_teleport_legacy_client_proto_event_proto_depIdxs = []int32{ 0, // 0: proto.Event.Type:type_name -> proto.Operation @@ -1782,12 +1804,13 @@ var file_teleport_legacy_client_proto_event_proto_depIdxs = []int32{ 65, // 67: proto.Event.IdentityCenterAccount:type_name -> teleport.identitycenter.v1.Account 66, // 68: proto.Event.IdentityCenterPrincipalAssignment:type_name -> teleport.identitycenter.v1.PrincipalAssignment 67, // 69: proto.Event.IdentityCenterAccountAssignment:type_name -> teleport.identitycenter.v1.AccountAssignment - 68, // 70: proto.Event.WorkloadIdentity:type_name -> teleport.workloadidentity.v1.WorkloadIdentity - 71, // [71:71] is the sub-list for method output_type - 71, // [71:71] is the sub-list for method input_type - 71, // [71:71] is the sub-list for extension type_name - 71, // [71:71] is the sub-list for extension extendee - 0, // [0:71] is the sub-list for field type_name + 68, // 70: proto.Event.PluginStaticCredentials:type_name -> types.PluginStaticCredentialsV1 + 69, // 71: proto.Event.WorkloadIdentity:type_name -> teleport.workloadidentity.v1.WorkloadIdentity + 72, // [72:72] is the sub-list for method output_type + 72, // [72:72] is the sub-list for method input_type + 72, // [72:72] is the sub-list for extension type_name + 72, // [72:72] is the sub-list for extension extendee + 0, // [0:72] is the sub-list for field type_name } func init() { file_teleport_legacy_client_proto_event_proto_init() } @@ -1865,6 +1888,7 @@ func file_teleport_legacy_client_proto_event_proto_init() { (*Event_IdentityCenterAccount)(nil), (*Event_IdentityCenterPrincipalAssignment)(nil), (*Event_IdentityCenterAccountAssignment)(nil), + (*Event_PluginStaticCredentials)(nil), (*Event_WorkloadIdentity)(nil), } type x struct{} diff --git a/api/gen/proto/go/teleport/gitserver/v1/git_server_service.pb.go b/api/gen/proto/go/teleport/gitserver/v1/git_server_service.pb.go new file mode 100644 index 0000000000000..eff1e83e6ebc1 --- /dev/null +++ b/api/gen/proto/go/teleport/gitserver/v1/git_server_service.pb.go @@ -0,0 +1,619 @@ +// Copyright 2024 Gravitational, Inc +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.35.1 +// protoc (unknown) +// source: teleport/gitserver/v1/git_server_service.proto + +package gitserverv1 + +import ( + types "github.com/gravitational/teleport/api/types" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + emptypb "google.golang.org/protobuf/types/known/emptypb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// CreateGitServerRequest is a request to create a Git server. +type CreateGitServerRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Server is the Git server to create. + Server *types.ServerV2 `protobuf:"bytes,1,opt,name=server,proto3" json:"server,omitempty"` +} + +func (x *CreateGitServerRequest) Reset() { + *x = CreateGitServerRequest{} + mi := &file_teleport_gitserver_v1_git_server_service_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateGitServerRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateGitServerRequest) ProtoMessage() {} + +func (x *CreateGitServerRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_gitserver_v1_git_server_service_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateGitServerRequest.ProtoReflect.Descriptor instead. +func (*CreateGitServerRequest) Descriptor() ([]byte, []int) { + return file_teleport_gitserver_v1_git_server_service_proto_rawDescGZIP(), []int{0} +} + +func (x *CreateGitServerRequest) GetServer() *types.ServerV2 { + if x != nil { + return x.Server + } + return nil +} + +// GetGitServerRequest is a request to get a Git server. +type GetGitServerRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Name is the uuid of the server. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *GetGitServerRequest) Reset() { + *x = GetGitServerRequest{} + mi := &file_teleport_gitserver_v1_git_server_service_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetGitServerRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetGitServerRequest) ProtoMessage() {} + +func (x *GetGitServerRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_gitserver_v1_git_server_service_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetGitServerRequest.ProtoReflect.Descriptor instead. +func (*GetGitServerRequest) Descriptor() ([]byte, []int) { + return file_teleport_gitserver_v1_git_server_service_proto_rawDescGZIP(), []int{1} +} + +func (x *GetGitServerRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// ListGitServersRequest is the request to list Git servers. +type ListGitServersRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The maximum number of items to return. + // The server may impose a different page size at its discretion. + PageSize int32 `protobuf:"varint,1,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // The page_token is the next_page_token value returned from a previous List request, if any. + PageToken string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` +} + +func (x *ListGitServersRequest) Reset() { + *x = ListGitServersRequest{} + mi := &file_teleport_gitserver_v1_git_server_service_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListGitServersRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListGitServersRequest) ProtoMessage() {} + +func (x *ListGitServersRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_gitserver_v1_git_server_service_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListGitServersRequest.ProtoReflect.Descriptor instead. +func (*ListGitServersRequest) Descriptor() ([]byte, []int) { + return file_teleport_gitserver_v1_git_server_service_proto_rawDescGZIP(), []int{2} +} + +func (x *ListGitServersRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListGitServersRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +// ListGitServersResponse is the response to ListGitServers. +type ListGitServersResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The page of Git servers that matched the request. + Servers []*types.ServerV2 `protobuf:"bytes,1,rep,name=servers,proto3" json:"servers,omitempty"` + // Token to retrieve the next page of results, or empty if there are no + // more results in the list. + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` +} + +func (x *ListGitServersResponse) Reset() { + *x = ListGitServersResponse{} + mi := &file_teleport_gitserver_v1_git_server_service_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListGitServersResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListGitServersResponse) ProtoMessage() {} + +func (x *ListGitServersResponse) ProtoReflect() protoreflect.Message { + mi := &file_teleport_gitserver_v1_git_server_service_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListGitServersResponse.ProtoReflect.Descriptor instead. +func (*ListGitServersResponse) Descriptor() ([]byte, []int) { + return file_teleport_gitserver_v1_git_server_service_proto_rawDescGZIP(), []int{3} +} + +func (x *ListGitServersResponse) GetServers() []*types.ServerV2 { + if x != nil { + return x.Servers + } + return nil +} + +func (x *ListGitServersResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +// UpdateGitServerRequest is the request to update a Git server. +type UpdateGitServerRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Server is the Git server to update. + Server *types.ServerV2 `protobuf:"bytes,1,opt,name=server,proto3" json:"server,omitempty"` +} + +func (x *UpdateGitServerRequest) Reset() { + *x = UpdateGitServerRequest{} + mi := &file_teleport_gitserver_v1_git_server_service_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateGitServerRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateGitServerRequest) ProtoMessage() {} + +func (x *UpdateGitServerRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_gitserver_v1_git_server_service_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateGitServerRequest.ProtoReflect.Descriptor instead. +func (*UpdateGitServerRequest) Descriptor() ([]byte, []int) { + return file_teleport_gitserver_v1_git_server_service_proto_rawDescGZIP(), []int{4} +} + +func (x *UpdateGitServerRequest) GetServer() *types.ServerV2 { + if x != nil { + return x.Server + } + return nil +} + +// UpsertGitServerRequest is the request to upsert a Git server. +type UpsertGitServerRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Server is the Git server to upsert. + Server *types.ServerV2 `protobuf:"bytes,1,opt,name=server,proto3" json:"server,omitempty"` +} + +func (x *UpsertGitServerRequest) Reset() { + *x = UpsertGitServerRequest{} + mi := &file_teleport_gitserver_v1_git_server_service_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpsertGitServerRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpsertGitServerRequest) ProtoMessage() {} + +func (x *UpsertGitServerRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_gitserver_v1_git_server_service_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpsertGitServerRequest.ProtoReflect.Descriptor instead. +func (*UpsertGitServerRequest) Descriptor() ([]byte, []int) { + return file_teleport_gitserver_v1_git_server_service_proto_rawDescGZIP(), []int{5} +} + +func (x *UpsertGitServerRequest) GetServer() *types.ServerV2 { + if x != nil { + return x.Server + } + return nil +} + +// DeleteGitServerRequest is the request to delete a Git server. +type DeleteGitServerRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Name is the uuid of the server. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *DeleteGitServerRequest) Reset() { + *x = DeleteGitServerRequest{} + mi := &file_teleport_gitserver_v1_git_server_service_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteGitServerRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteGitServerRequest) ProtoMessage() {} + +func (x *DeleteGitServerRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_gitserver_v1_git_server_service_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteGitServerRequest.ProtoReflect.Descriptor instead. +func (*DeleteGitServerRequest) Descriptor() ([]byte, []int) { + return file_teleport_gitserver_v1_git_server_service_proto_rawDescGZIP(), []int{6} +} + +func (x *DeleteGitServerRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// CreateGitHubAuthRequestRequest is the request for CreateGitHubAuthRequest. +type CreateGitHubAuthRequestRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Request is the basic GitHub auth request. + Request *types.GithubAuthRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` + // Organization is the GitHub organization that the user is accessing. + Organization string `protobuf:"bytes,2,opt,name=organization,proto3" json:"organization,omitempty"` +} + +func (x *CreateGitHubAuthRequestRequest) Reset() { + *x = CreateGitHubAuthRequestRequest{} + mi := &file_teleport_gitserver_v1_git_server_service_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateGitHubAuthRequestRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateGitHubAuthRequestRequest) ProtoMessage() {} + +func (x *CreateGitHubAuthRequestRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_gitserver_v1_git_server_service_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateGitHubAuthRequestRequest.ProtoReflect.Descriptor instead. +func (*CreateGitHubAuthRequestRequest) Descriptor() ([]byte, []int) { + return file_teleport_gitserver_v1_git_server_service_proto_rawDescGZIP(), []int{7} +} + +func (x *CreateGitHubAuthRequestRequest) GetRequest() *types.GithubAuthRequest { + if x != nil { + return x.Request + } + return nil +} + +func (x *CreateGitHubAuthRequestRequest) GetOrganization() string { + if x != nil { + return x.Organization + } + return "" +} + +var File_teleport_gitserver_v1_git_server_service_proto protoreflect.FileDescriptor + +var file_teleport_gitserver_v1_git_server_service_proto_rawDesc = []byte{ + 0x0a, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x67, 0x69, 0x74, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x69, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x12, 0x15, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x67, 0x69, 0x74, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6c, + 0x65, 0x67, 0x61, 0x63, 0x79, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x41, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x47, 0x69, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x27, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x56, 0x32, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x22, 0x29, 0x0a, 0x13, 0x47, 0x65, + 0x74, 0x47, 0x69, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x53, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x69, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, + 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, + 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x6b, 0x0a, 0x16, 0x4c, 0x69, + 0x73, 0x74, 0x47, 0x69, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x56, 0x32, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, + 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, + 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x41, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x47, 0x69, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x27, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x56, 0x32, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x22, 0x41, 0x0a, 0x16, 0x55, 0x70, + 0x73, 0x65, 0x72, 0x74, 0x47, 0x69, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x56, 0x32, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x22, 0x2c, 0x0a, + 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x69, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x78, 0x0a, 0x1e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x69, 0x74, 0x48, 0x75, 0x62, 0x41, 0x75, 0x74, 0x68, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, + 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x47, 0x69, 0x74, 0x68, 0x75, 0x62, 0x41, 0x75, 0x74, + 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x32, 0x8d, 0x05, 0x0a, 0x10, 0x47, 0x69, 0x74, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x51, 0x0a, 0x0f, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x47, 0x69, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x2d, 0x2e, + 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x67, 0x69, 0x74, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x69, 0x74, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x32, 0x12, 0x4b, 0x0a, + 0x0c, 0x47, 0x65, 0x74, 0x47, 0x69, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x2a, 0x2e, + 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x67, 0x69, 0x74, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x47, 0x69, 0x74, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x32, 0x12, 0x6d, 0x0a, 0x0e, 0x4c, 0x69, + 0x73, 0x74, 0x47, 0x69, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x2c, 0x2e, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x67, 0x69, 0x74, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x69, 0x74, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x74, 0x65, 0x6c, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x67, 0x69, 0x74, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x69, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0f, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x47, 0x69, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x2d, 0x2e, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x67, 0x69, 0x74, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x69, 0x74, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x32, 0x12, 0x51, 0x0a, 0x0f, + 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x47, 0x69, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, + 0x2d, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x67, 0x69, 0x74, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x47, 0x69, + 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x32, 0x12, + 0x58, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x69, 0x74, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x12, 0x2d, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x67, 0x69, + 0x74, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x47, 0x69, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x6a, 0x0a, 0x17, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x47, 0x69, 0x74, 0x48, 0x75, 0x62, 0x41, 0x75, 0x74, 0x68, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, + 0x67, 0x69, 0x74, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x47, 0x69, 0x74, 0x48, 0x75, 0x62, 0x41, 0x75, 0x74, 0x68, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x2e, 0x47, 0x69, 0x74, 0x68, 0x75, 0x62, 0x41, 0x75, 0x74, 0x68, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x56, 0x5a, 0x54, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, + 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x67, 0x69, 0x74, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f, 0x76, + 0x31, 0x3b, 0x67, 0x69, 0x74, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x76, 0x31, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_teleport_gitserver_v1_git_server_service_proto_rawDescOnce sync.Once + file_teleport_gitserver_v1_git_server_service_proto_rawDescData = file_teleport_gitserver_v1_git_server_service_proto_rawDesc +) + +func file_teleport_gitserver_v1_git_server_service_proto_rawDescGZIP() []byte { + file_teleport_gitserver_v1_git_server_service_proto_rawDescOnce.Do(func() { + file_teleport_gitserver_v1_git_server_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_teleport_gitserver_v1_git_server_service_proto_rawDescData) + }) + return file_teleport_gitserver_v1_git_server_service_proto_rawDescData +} + +var file_teleport_gitserver_v1_git_server_service_proto_msgTypes = make([]protoimpl.MessageInfo, 8) +var file_teleport_gitserver_v1_git_server_service_proto_goTypes = []any{ + (*CreateGitServerRequest)(nil), // 0: teleport.gitserver.v1.CreateGitServerRequest + (*GetGitServerRequest)(nil), // 1: teleport.gitserver.v1.GetGitServerRequest + (*ListGitServersRequest)(nil), // 2: teleport.gitserver.v1.ListGitServersRequest + (*ListGitServersResponse)(nil), // 3: teleport.gitserver.v1.ListGitServersResponse + (*UpdateGitServerRequest)(nil), // 4: teleport.gitserver.v1.UpdateGitServerRequest + (*UpsertGitServerRequest)(nil), // 5: teleport.gitserver.v1.UpsertGitServerRequest + (*DeleteGitServerRequest)(nil), // 6: teleport.gitserver.v1.DeleteGitServerRequest + (*CreateGitHubAuthRequestRequest)(nil), // 7: teleport.gitserver.v1.CreateGitHubAuthRequestRequest + (*types.ServerV2)(nil), // 8: types.ServerV2 + (*types.GithubAuthRequest)(nil), // 9: types.GithubAuthRequest + (*emptypb.Empty)(nil), // 10: google.protobuf.Empty +} +var file_teleport_gitserver_v1_git_server_service_proto_depIdxs = []int32{ + 8, // 0: teleport.gitserver.v1.CreateGitServerRequest.server:type_name -> types.ServerV2 + 8, // 1: teleport.gitserver.v1.ListGitServersResponse.servers:type_name -> types.ServerV2 + 8, // 2: teleport.gitserver.v1.UpdateGitServerRequest.server:type_name -> types.ServerV2 + 8, // 3: teleport.gitserver.v1.UpsertGitServerRequest.server:type_name -> types.ServerV2 + 9, // 4: teleport.gitserver.v1.CreateGitHubAuthRequestRequest.request:type_name -> types.GithubAuthRequest + 0, // 5: teleport.gitserver.v1.GitServerService.CreateGitServer:input_type -> teleport.gitserver.v1.CreateGitServerRequest + 1, // 6: teleport.gitserver.v1.GitServerService.GetGitServer:input_type -> teleport.gitserver.v1.GetGitServerRequest + 2, // 7: teleport.gitserver.v1.GitServerService.ListGitServers:input_type -> teleport.gitserver.v1.ListGitServersRequest + 4, // 8: teleport.gitserver.v1.GitServerService.UpdateGitServer:input_type -> teleport.gitserver.v1.UpdateGitServerRequest + 5, // 9: teleport.gitserver.v1.GitServerService.UpsertGitServer:input_type -> teleport.gitserver.v1.UpsertGitServerRequest + 6, // 10: teleport.gitserver.v1.GitServerService.DeleteGitServer:input_type -> teleport.gitserver.v1.DeleteGitServerRequest + 7, // 11: teleport.gitserver.v1.GitServerService.CreateGitHubAuthRequest:input_type -> teleport.gitserver.v1.CreateGitHubAuthRequestRequest + 8, // 12: teleport.gitserver.v1.GitServerService.CreateGitServer:output_type -> types.ServerV2 + 8, // 13: teleport.gitserver.v1.GitServerService.GetGitServer:output_type -> types.ServerV2 + 3, // 14: teleport.gitserver.v1.GitServerService.ListGitServers:output_type -> teleport.gitserver.v1.ListGitServersResponse + 8, // 15: teleport.gitserver.v1.GitServerService.UpdateGitServer:output_type -> types.ServerV2 + 8, // 16: teleport.gitserver.v1.GitServerService.UpsertGitServer:output_type -> types.ServerV2 + 10, // 17: teleport.gitserver.v1.GitServerService.DeleteGitServer:output_type -> google.protobuf.Empty + 9, // 18: teleport.gitserver.v1.GitServerService.CreateGitHubAuthRequest:output_type -> types.GithubAuthRequest + 12, // [12:19] is the sub-list for method output_type + 5, // [5:12] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name +} + +func init() { file_teleport_gitserver_v1_git_server_service_proto_init() } +func file_teleport_gitserver_v1_git_server_service_proto_init() { + if File_teleport_gitserver_v1_git_server_service_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_teleport_gitserver_v1_git_server_service_proto_rawDesc, + NumEnums: 0, + NumMessages: 8, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_teleport_gitserver_v1_git_server_service_proto_goTypes, + DependencyIndexes: file_teleport_gitserver_v1_git_server_service_proto_depIdxs, + MessageInfos: file_teleport_gitserver_v1_git_server_service_proto_msgTypes, + }.Build() + File_teleport_gitserver_v1_git_server_service_proto = out.File + file_teleport_gitserver_v1_git_server_service_proto_rawDesc = nil + file_teleport_gitserver_v1_git_server_service_proto_goTypes = nil + file_teleport_gitserver_v1_git_server_service_proto_depIdxs = nil +} diff --git a/api/gen/proto/go/teleport/gitserver/v1/git_server_service_grpc.pb.go b/api/gen/proto/go/teleport/gitserver/v1/git_server_service_grpc.pb.go new file mode 100644 index 0000000000000..5c55448c37d00 --- /dev/null +++ b/api/gen/proto/go/teleport/gitserver/v1/git_server_service_grpc.pb.go @@ -0,0 +1,383 @@ +// Copyright 2024 Gravitational, Inc +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: teleport/gitserver/v1/git_server_service.proto + +package gitserverv1 + +import ( + context "context" + types "github.com/gravitational/teleport/api/types" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + emptypb "google.golang.org/protobuf/types/known/emptypb" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + GitServerService_CreateGitServer_FullMethodName = "/teleport.gitserver.v1.GitServerService/CreateGitServer" + GitServerService_GetGitServer_FullMethodName = "/teleport.gitserver.v1.GitServerService/GetGitServer" + GitServerService_ListGitServers_FullMethodName = "/teleport.gitserver.v1.GitServerService/ListGitServers" + GitServerService_UpdateGitServer_FullMethodName = "/teleport.gitserver.v1.GitServerService/UpdateGitServer" + GitServerService_UpsertGitServer_FullMethodName = "/teleport.gitserver.v1.GitServerService/UpsertGitServer" + GitServerService_DeleteGitServer_FullMethodName = "/teleport.gitserver.v1.GitServerService/DeleteGitServer" + GitServerService_CreateGitHubAuthRequest_FullMethodName = "/teleport.gitserver.v1.GitServerService/CreateGitHubAuthRequest" +) + +// GitServerServiceClient is the client API for GitServerService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// GitServerService provides methods to manage Git server. +type GitServerServiceClient interface { + // CreateGitServer is used to create a Git server object. + CreateGitServer(ctx context.Context, in *CreateGitServerRequest, opts ...grpc.CallOption) (*types.ServerV2, error) + // GetGitServer is used to retrieve a Git server object. + GetGitServer(ctx context.Context, in *GetGitServerRequest, opts ...grpc.CallOption) (*types.ServerV2, error) + // ListGitServers is used to query Git servers. + ListGitServers(ctx context.Context, in *ListGitServersRequest, opts ...grpc.CallOption) (*ListGitServersResponse, error) + // UpdateGitServer is used to update a Git server object. + UpdateGitServer(ctx context.Context, in *UpdateGitServerRequest, opts ...grpc.CallOption) (*types.ServerV2, error) + // UpsertGitServer is used to create or replace a Git server object. + UpsertGitServer(ctx context.Context, in *UpsertGitServerRequest, opts ...grpc.CallOption) (*types.ServerV2, error) + // DeleteGitServer is used to delete a Git server object. + DeleteGitServer(ctx context.Context, in *DeleteGitServerRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // CreateGitHubAuthRequest starts GitHub OAuth flow for authenticated user. + CreateGitHubAuthRequest(ctx context.Context, in *CreateGitHubAuthRequestRequest, opts ...grpc.CallOption) (*types.GithubAuthRequest, error) +} + +type gitServerServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewGitServerServiceClient(cc grpc.ClientConnInterface) GitServerServiceClient { + return &gitServerServiceClient{cc} +} + +func (c *gitServerServiceClient) CreateGitServer(ctx context.Context, in *CreateGitServerRequest, opts ...grpc.CallOption) (*types.ServerV2, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(types.ServerV2) + err := c.cc.Invoke(ctx, GitServerService_CreateGitServer_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *gitServerServiceClient) GetGitServer(ctx context.Context, in *GetGitServerRequest, opts ...grpc.CallOption) (*types.ServerV2, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(types.ServerV2) + err := c.cc.Invoke(ctx, GitServerService_GetGitServer_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *gitServerServiceClient) ListGitServers(ctx context.Context, in *ListGitServersRequest, opts ...grpc.CallOption) (*ListGitServersResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListGitServersResponse) + err := c.cc.Invoke(ctx, GitServerService_ListGitServers_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *gitServerServiceClient) UpdateGitServer(ctx context.Context, in *UpdateGitServerRequest, opts ...grpc.CallOption) (*types.ServerV2, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(types.ServerV2) + err := c.cc.Invoke(ctx, GitServerService_UpdateGitServer_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *gitServerServiceClient) UpsertGitServer(ctx context.Context, in *UpsertGitServerRequest, opts ...grpc.CallOption) (*types.ServerV2, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(types.ServerV2) + err := c.cc.Invoke(ctx, GitServerService_UpsertGitServer_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *gitServerServiceClient) DeleteGitServer(ctx context.Context, in *DeleteGitServerRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, GitServerService_DeleteGitServer_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *gitServerServiceClient) CreateGitHubAuthRequest(ctx context.Context, in *CreateGitHubAuthRequestRequest, opts ...grpc.CallOption) (*types.GithubAuthRequest, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(types.GithubAuthRequest) + err := c.cc.Invoke(ctx, GitServerService_CreateGitHubAuthRequest_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// GitServerServiceServer is the server API for GitServerService service. +// All implementations must embed UnimplementedGitServerServiceServer +// for forward compatibility. +// +// GitServerService provides methods to manage Git server. +type GitServerServiceServer interface { + // CreateGitServer is used to create a Git server object. + CreateGitServer(context.Context, *CreateGitServerRequest) (*types.ServerV2, error) + // GetGitServer is used to retrieve a Git server object. + GetGitServer(context.Context, *GetGitServerRequest) (*types.ServerV2, error) + // ListGitServers is used to query Git servers. + ListGitServers(context.Context, *ListGitServersRequest) (*ListGitServersResponse, error) + // UpdateGitServer is used to update a Git server object. + UpdateGitServer(context.Context, *UpdateGitServerRequest) (*types.ServerV2, error) + // UpsertGitServer is used to create or replace a Git server object. + UpsertGitServer(context.Context, *UpsertGitServerRequest) (*types.ServerV2, error) + // DeleteGitServer is used to delete a Git server object. + DeleteGitServer(context.Context, *DeleteGitServerRequest) (*emptypb.Empty, error) + // CreateGitHubAuthRequest starts GitHub OAuth flow for authenticated user. + CreateGitHubAuthRequest(context.Context, *CreateGitHubAuthRequestRequest) (*types.GithubAuthRequest, error) + mustEmbedUnimplementedGitServerServiceServer() +} + +// UnimplementedGitServerServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedGitServerServiceServer struct{} + +func (UnimplementedGitServerServiceServer) CreateGitServer(context.Context, *CreateGitServerRequest) (*types.ServerV2, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateGitServer not implemented") +} +func (UnimplementedGitServerServiceServer) GetGitServer(context.Context, *GetGitServerRequest) (*types.ServerV2, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetGitServer not implemented") +} +func (UnimplementedGitServerServiceServer) ListGitServers(context.Context, *ListGitServersRequest) (*ListGitServersResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListGitServers not implemented") +} +func (UnimplementedGitServerServiceServer) UpdateGitServer(context.Context, *UpdateGitServerRequest) (*types.ServerV2, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateGitServer not implemented") +} +func (UnimplementedGitServerServiceServer) UpsertGitServer(context.Context, *UpsertGitServerRequest) (*types.ServerV2, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpsertGitServer not implemented") +} +func (UnimplementedGitServerServiceServer) DeleteGitServer(context.Context, *DeleteGitServerRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteGitServer not implemented") +} +func (UnimplementedGitServerServiceServer) CreateGitHubAuthRequest(context.Context, *CreateGitHubAuthRequestRequest) (*types.GithubAuthRequest, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateGitHubAuthRequest not implemented") +} +func (UnimplementedGitServerServiceServer) mustEmbedUnimplementedGitServerServiceServer() {} +func (UnimplementedGitServerServiceServer) testEmbeddedByValue() {} + +// UnsafeGitServerServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to GitServerServiceServer will +// result in compilation errors. +type UnsafeGitServerServiceServer interface { + mustEmbedUnimplementedGitServerServiceServer() +} + +func RegisterGitServerServiceServer(s grpc.ServiceRegistrar, srv GitServerServiceServer) { + // If the following call pancis, it indicates UnimplementedGitServerServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&GitServerService_ServiceDesc, srv) +} + +func _GitServerService_CreateGitServer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateGitServerRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GitServerServiceServer).CreateGitServer(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GitServerService_CreateGitServer_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GitServerServiceServer).CreateGitServer(ctx, req.(*CreateGitServerRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GitServerService_GetGitServer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetGitServerRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GitServerServiceServer).GetGitServer(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GitServerService_GetGitServer_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GitServerServiceServer).GetGitServer(ctx, req.(*GetGitServerRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GitServerService_ListGitServers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListGitServersRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GitServerServiceServer).ListGitServers(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GitServerService_ListGitServers_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GitServerServiceServer).ListGitServers(ctx, req.(*ListGitServersRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GitServerService_UpdateGitServer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateGitServerRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GitServerServiceServer).UpdateGitServer(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GitServerService_UpdateGitServer_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GitServerServiceServer).UpdateGitServer(ctx, req.(*UpdateGitServerRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GitServerService_UpsertGitServer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpsertGitServerRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GitServerServiceServer).UpsertGitServer(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GitServerService_UpsertGitServer_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GitServerServiceServer).UpsertGitServer(ctx, req.(*UpsertGitServerRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GitServerService_DeleteGitServer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteGitServerRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GitServerServiceServer).DeleteGitServer(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GitServerService_DeleteGitServer_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GitServerServiceServer).DeleteGitServer(ctx, req.(*DeleteGitServerRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GitServerService_CreateGitHubAuthRequest_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateGitHubAuthRequestRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GitServerServiceServer).CreateGitHubAuthRequest(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GitServerService_CreateGitHubAuthRequest_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GitServerServiceServer).CreateGitHubAuthRequest(ctx, req.(*CreateGitHubAuthRequestRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// GitServerService_ServiceDesc is the grpc.ServiceDesc for GitServerService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var GitServerService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "teleport.gitserver.v1.GitServerService", + HandlerType: (*GitServerServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateGitServer", + Handler: _GitServerService_CreateGitServer_Handler, + }, + { + MethodName: "GetGitServer", + Handler: _GitServerService_GetGitServer_Handler, + }, + { + MethodName: "ListGitServers", + Handler: _GitServerService_ListGitServers_Handler, + }, + { + MethodName: "UpdateGitServer", + Handler: _GitServerService_UpdateGitServer_Handler, + }, + { + MethodName: "UpsertGitServer", + Handler: _GitServerService_UpsertGitServer_Handler, + }, + { + MethodName: "DeleteGitServer", + Handler: _GitServerService_DeleteGitServer_Handler, + }, + { + MethodName: "CreateGitHubAuthRequest", + Handler: _GitServerService_CreateGitHubAuthRequest_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "teleport/gitserver/v1/git_server_service.proto", +} diff --git a/api/gen/proto/go/teleport/integration/v1/integration_service.pb.go b/api/gen/proto/go/teleport/integration/v1/integration_service.pb.go index 4bf4813a11236..caebbb68f43fd 100644 --- a/api/gen/proto/go/teleport/integration/v1/integration_service.pb.go +++ b/api/gen/proto/go/teleport/integration/v1/integration_service.pb.go @@ -24,6 +24,7 @@ import ( types "github.com/gravitational/teleport/api/types" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + durationpb "google.golang.org/protobuf/types/known/durationpb" emptypb "google.golang.org/protobuf/types/known/emptypb" reflect "reflect" sync "sync" @@ -494,6 +495,233 @@ func (x *GenerateAWSOIDCTokenResponse) GetToken() string { return "" } +// GenerateGitHubUserCertRequest is a request to sign a client certificate used by +// GitHub integration to authenticate with GitHub enterprise. +type GenerateGitHubUserCertRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Integration is the name of the integration; + Integration string `protobuf:"bytes,1,opt,name=integration,proto3" json:"integration,omitempty"` + // PublicKey is the public key to be signed. + PublicKey []byte `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` + // UserId is the GitHub user id. + UserId string `protobuf:"bytes,3,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + // KeyId is the certificate ID, usually the Teleport username. + KeyId string `protobuf:"bytes,4,opt,name=key_id,json=keyId,proto3" json:"key_id,omitempty"` + // Ttl is the duration the certificate will be valid for. + Ttl *durationpb.Duration `protobuf:"bytes,5,opt,name=ttl,proto3" json:"ttl,omitempty"` +} + +func (x *GenerateGitHubUserCertRequest) Reset() { + *x = GenerateGitHubUserCertRequest{} + mi := &file_teleport_integration_v1_integration_service_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GenerateGitHubUserCertRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GenerateGitHubUserCertRequest) ProtoMessage() {} + +func (x *GenerateGitHubUserCertRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_integration_v1_integration_service_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GenerateGitHubUserCertRequest.ProtoReflect.Descriptor instead. +func (*GenerateGitHubUserCertRequest) Descriptor() ([]byte, []int) { + return file_teleport_integration_v1_integration_service_proto_rawDescGZIP(), []int{9} +} + +func (x *GenerateGitHubUserCertRequest) GetIntegration() string { + if x != nil { + return x.Integration + } + return "" +} + +func (x *GenerateGitHubUserCertRequest) GetPublicKey() []byte { + if x != nil { + return x.PublicKey + } + return nil +} + +func (x *GenerateGitHubUserCertRequest) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +func (x *GenerateGitHubUserCertRequest) GetKeyId() string { + if x != nil { + return x.KeyId + } + return "" +} + +func (x *GenerateGitHubUserCertRequest) GetTtl() *durationpb.Duration { + if x != nil { + return x.Ttl + } + return nil +} + +// GenerateGitHubUserCertResponse contains a signed certificate. +type GenerateGitHubUserCertResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // AuthorizedKey is the signed certificate. + AuthorizedKey []byte `protobuf:"bytes,1,opt,name=authorized_key,json=authorizedKey,proto3" json:"authorized_key,omitempty"` +} + +func (x *GenerateGitHubUserCertResponse) Reset() { + *x = GenerateGitHubUserCertResponse{} + mi := &file_teleport_integration_v1_integration_service_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GenerateGitHubUserCertResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GenerateGitHubUserCertResponse) ProtoMessage() {} + +func (x *GenerateGitHubUserCertResponse) ProtoReflect() protoreflect.Message { + mi := &file_teleport_integration_v1_integration_service_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GenerateGitHubUserCertResponse.ProtoReflect.Descriptor instead. +func (*GenerateGitHubUserCertResponse) Descriptor() ([]byte, []int) { + return file_teleport_integration_v1_integration_service_proto_rawDescGZIP(), []int{10} +} + +func (x *GenerateGitHubUserCertResponse) GetAuthorizedKey() []byte { + if x != nil { + return x.AuthorizedKey + } + return nil +} + +// ExportIntegrationCertAuthoritiesRequest is the request to export cert +// authorities for an integration. +type ExportIntegrationCertAuthoritiesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Integration is the name of the integration; + Integration string `protobuf:"bytes,1,opt,name=integration,proto3" json:"integration,omitempty"` +} + +func (x *ExportIntegrationCertAuthoritiesRequest) Reset() { + *x = ExportIntegrationCertAuthoritiesRequest{} + mi := &file_teleport_integration_v1_integration_service_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExportIntegrationCertAuthoritiesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExportIntegrationCertAuthoritiesRequest) ProtoMessage() {} + +func (x *ExportIntegrationCertAuthoritiesRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_integration_v1_integration_service_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExportIntegrationCertAuthoritiesRequest.ProtoReflect.Descriptor instead. +func (*ExportIntegrationCertAuthoritiesRequest) Descriptor() ([]byte, []int) { + return file_teleport_integration_v1_integration_service_proto_rawDescGZIP(), []int{11} +} + +func (x *ExportIntegrationCertAuthoritiesRequest) GetIntegration() string { + if x != nil { + return x.Integration + } + return "" +} + +// ExportIntegrationCertAuthoritiesResponse is the response to +// ExportIntegrationCertAuthorities. +type ExportIntegrationCertAuthoritiesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // CertAuthorities are the CA key sets used to sign any new certificates. + CertAuthorities *types.CAKeySet `protobuf:"bytes,1,opt,name=cert_authorities,json=certAuthorities,proto3" json:"cert_authorities,omitempty"` +} + +func (x *ExportIntegrationCertAuthoritiesResponse) Reset() { + *x = ExportIntegrationCertAuthoritiesResponse{} + mi := &file_teleport_integration_v1_integration_service_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExportIntegrationCertAuthoritiesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExportIntegrationCertAuthoritiesResponse) ProtoMessage() {} + +func (x *ExportIntegrationCertAuthoritiesResponse) ProtoReflect() protoreflect.Message { + mi := &file_teleport_integration_v1_integration_service_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExportIntegrationCertAuthoritiesResponse.ProtoReflect.Descriptor instead. +func (*ExportIntegrationCertAuthoritiesResponse) Descriptor() ([]byte, []int) { + return file_teleport_integration_v1_integration_service_proto_rawDescGZIP(), []int{12} +} + +func (x *ExportIntegrationCertAuthoritiesResponse) GetCertAuthorities() *types.CAKeySet { + if x != nil { + return x.CertAuthorities + } + return nil +} + var File_teleport_integration_v1_integration_service_proto protoreflect.FileDescriptor var file_teleport_integration_v1_integration_service_proto_rawDesc = []byte{ @@ -501,7 +729,9 @@ var file_teleport_integration_v1_integration_service_proto_rawDesc = []byte{ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x17, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x67, 0x6f, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x1a, 0x1e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, @@ -547,60 +777,107 @@ var file_teleport_integration_v1_integration_service_proto_rawDesc = []byte{ 0x1c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, 0x57, 0x53, 0x4f, 0x49, 0x44, 0x43, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x32, 0xef, 0x05, 0x0a, 0x12, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x77, 0x0a, 0x10, 0x4c, 0x69, - 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, + 0x6b, 0x65, 0x6e, 0x22, 0xbd, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x47, 0x69, 0x74, 0x48, 0x75, 0x62, 0x55, 0x73, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, + 0x15, 0x0a, 0x06, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x6b, 0x65, 0x79, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, + 0x74, 0x74, 0x6c, 0x22, 0x47, 0x0a, 0x1e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x47, + 0x69, 0x74, 0x48, 0x75, 0x62, 0x55, 0x73, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x7a, 0x65, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x61, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x22, 0x4b, 0x0a, 0x27, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x66, 0x0a, 0x28, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x65, + 0x72, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x10, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x61, 0x75, + 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0f, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x41, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x74, + 0x52, 0x0f, 0x63, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x32, 0xa5, 0x08, 0x0a, 0x12, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x77, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x2e, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x31, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x31, 0x12, 0x5c, 0x0a, 0x11, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x31, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x56, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x31, 0x12, 0x5c, 0x0a, 0x11, 0x55, 0x70, 0x64, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x31, 0x12, 0x5c, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x31, 0x12, 0x5e, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x31, 0x12, 0x5c, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x66, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x35, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, - 0x83, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, 0x57, 0x53, 0x4f, - 0x49, 0x44, 0x43, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x34, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, 0x57, 0x53, 0x4f, 0x49, - 0x44, 0x43, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, + 0x14, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x56, 0x31, 0x12, 0x5e, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x2e, 0x74, 0x65, 0x6c, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x66, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, + 0x6c, 0x6c, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, + 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, + 0x6c, 0x6c, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x83, 0x01, + 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, 0x57, 0x53, 0x4f, 0x49, 0x44, + 0x43, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x34, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, 0x57, 0x53, 0x4f, 0x49, 0x44, 0x43, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, + 0x57, 0x53, 0x4f, 0x49, 0x44, 0x43, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x89, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x47, 0x69, 0x74, 0x48, 0x75, 0x62, 0x55, 0x73, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x12, 0x36, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x41, 0x57, 0x53, 0x4f, 0x49, 0x44, 0x43, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x5a, 0x5a, 0x58, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, - 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, - 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x2f, 0x76, 0x31, 0x3b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x76, - 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x47, 0x69, 0x74, 0x48, 0x75, 0x62, 0x55, 0x73, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x47, 0x69, 0x74, 0x48, 0x75, 0x62, 0x55, + 0x73, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0xa7, 0x01, 0x0a, 0x20, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x74, 0x69, 0x65, 0x73, 0x12, 0x40, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x41, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x5a, 0x5a, 0x58, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, + 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x3b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -615,43 +892,55 @@ func file_teleport_integration_v1_integration_service_proto_rawDescGZIP() []byte return file_teleport_integration_v1_integration_service_proto_rawDescData } -var file_teleport_integration_v1_integration_service_proto_msgTypes = make([]protoimpl.MessageInfo, 9) +var file_teleport_integration_v1_integration_service_proto_msgTypes = make([]protoimpl.MessageInfo, 13) var file_teleport_integration_v1_integration_service_proto_goTypes = []any{ - (*ListIntegrationsRequest)(nil), // 0: teleport.integration.v1.ListIntegrationsRequest - (*ListIntegrationsResponse)(nil), // 1: teleport.integration.v1.ListIntegrationsResponse - (*GetIntegrationRequest)(nil), // 2: teleport.integration.v1.GetIntegrationRequest - (*CreateIntegrationRequest)(nil), // 3: teleport.integration.v1.CreateIntegrationRequest - (*UpdateIntegrationRequest)(nil), // 4: teleport.integration.v1.UpdateIntegrationRequest - (*DeleteIntegrationRequest)(nil), // 5: teleport.integration.v1.DeleteIntegrationRequest - (*DeleteAllIntegrationsRequest)(nil), // 6: teleport.integration.v1.DeleteAllIntegrationsRequest - (*GenerateAWSOIDCTokenRequest)(nil), // 7: teleport.integration.v1.GenerateAWSOIDCTokenRequest - (*GenerateAWSOIDCTokenResponse)(nil), // 8: teleport.integration.v1.GenerateAWSOIDCTokenResponse - (*types.IntegrationV1)(nil), // 9: types.IntegrationV1 - (*emptypb.Empty)(nil), // 10: google.protobuf.Empty + (*ListIntegrationsRequest)(nil), // 0: teleport.integration.v1.ListIntegrationsRequest + (*ListIntegrationsResponse)(nil), // 1: teleport.integration.v1.ListIntegrationsResponse + (*GetIntegrationRequest)(nil), // 2: teleport.integration.v1.GetIntegrationRequest + (*CreateIntegrationRequest)(nil), // 3: teleport.integration.v1.CreateIntegrationRequest + (*UpdateIntegrationRequest)(nil), // 4: teleport.integration.v1.UpdateIntegrationRequest + (*DeleteIntegrationRequest)(nil), // 5: teleport.integration.v1.DeleteIntegrationRequest + (*DeleteAllIntegrationsRequest)(nil), // 6: teleport.integration.v1.DeleteAllIntegrationsRequest + (*GenerateAWSOIDCTokenRequest)(nil), // 7: teleport.integration.v1.GenerateAWSOIDCTokenRequest + (*GenerateAWSOIDCTokenResponse)(nil), // 8: teleport.integration.v1.GenerateAWSOIDCTokenResponse + (*GenerateGitHubUserCertRequest)(nil), // 9: teleport.integration.v1.GenerateGitHubUserCertRequest + (*GenerateGitHubUserCertResponse)(nil), // 10: teleport.integration.v1.GenerateGitHubUserCertResponse + (*ExportIntegrationCertAuthoritiesRequest)(nil), // 11: teleport.integration.v1.ExportIntegrationCertAuthoritiesRequest + (*ExportIntegrationCertAuthoritiesResponse)(nil), // 12: teleport.integration.v1.ExportIntegrationCertAuthoritiesResponse + (*types.IntegrationV1)(nil), // 13: types.IntegrationV1 + (*durationpb.Duration)(nil), // 14: google.protobuf.Duration + (*types.CAKeySet)(nil), // 15: types.CAKeySet + (*emptypb.Empty)(nil), // 16: google.protobuf.Empty } var file_teleport_integration_v1_integration_service_proto_depIdxs = []int32{ - 9, // 0: teleport.integration.v1.ListIntegrationsResponse.integrations:type_name -> types.IntegrationV1 - 9, // 1: teleport.integration.v1.CreateIntegrationRequest.integration:type_name -> types.IntegrationV1 - 9, // 2: teleport.integration.v1.UpdateIntegrationRequest.integration:type_name -> types.IntegrationV1 - 0, // 3: teleport.integration.v1.IntegrationService.ListIntegrations:input_type -> teleport.integration.v1.ListIntegrationsRequest - 2, // 4: teleport.integration.v1.IntegrationService.GetIntegration:input_type -> teleport.integration.v1.GetIntegrationRequest - 3, // 5: teleport.integration.v1.IntegrationService.CreateIntegration:input_type -> teleport.integration.v1.CreateIntegrationRequest - 4, // 6: teleport.integration.v1.IntegrationService.UpdateIntegration:input_type -> teleport.integration.v1.UpdateIntegrationRequest - 5, // 7: teleport.integration.v1.IntegrationService.DeleteIntegration:input_type -> teleport.integration.v1.DeleteIntegrationRequest - 6, // 8: teleport.integration.v1.IntegrationService.DeleteAllIntegrations:input_type -> teleport.integration.v1.DeleteAllIntegrationsRequest - 7, // 9: teleport.integration.v1.IntegrationService.GenerateAWSOIDCToken:input_type -> teleport.integration.v1.GenerateAWSOIDCTokenRequest - 1, // 10: teleport.integration.v1.IntegrationService.ListIntegrations:output_type -> teleport.integration.v1.ListIntegrationsResponse - 9, // 11: teleport.integration.v1.IntegrationService.GetIntegration:output_type -> types.IntegrationV1 - 9, // 12: teleport.integration.v1.IntegrationService.CreateIntegration:output_type -> types.IntegrationV1 - 9, // 13: teleport.integration.v1.IntegrationService.UpdateIntegration:output_type -> types.IntegrationV1 - 10, // 14: teleport.integration.v1.IntegrationService.DeleteIntegration:output_type -> google.protobuf.Empty - 10, // 15: teleport.integration.v1.IntegrationService.DeleteAllIntegrations:output_type -> google.protobuf.Empty - 8, // 16: teleport.integration.v1.IntegrationService.GenerateAWSOIDCToken:output_type -> teleport.integration.v1.GenerateAWSOIDCTokenResponse - 10, // [10:17] is the sub-list for method output_type - 3, // [3:10] is the sub-list for method input_type - 3, // [3:3] is the sub-list for extension type_name - 3, // [3:3] is the sub-list for extension extendee - 0, // [0:3] is the sub-list for field type_name + 13, // 0: teleport.integration.v1.ListIntegrationsResponse.integrations:type_name -> types.IntegrationV1 + 13, // 1: teleport.integration.v1.CreateIntegrationRequest.integration:type_name -> types.IntegrationV1 + 13, // 2: teleport.integration.v1.UpdateIntegrationRequest.integration:type_name -> types.IntegrationV1 + 14, // 3: teleport.integration.v1.GenerateGitHubUserCertRequest.ttl:type_name -> google.protobuf.Duration + 15, // 4: teleport.integration.v1.ExportIntegrationCertAuthoritiesResponse.cert_authorities:type_name -> types.CAKeySet + 0, // 5: teleport.integration.v1.IntegrationService.ListIntegrations:input_type -> teleport.integration.v1.ListIntegrationsRequest + 2, // 6: teleport.integration.v1.IntegrationService.GetIntegration:input_type -> teleport.integration.v1.GetIntegrationRequest + 3, // 7: teleport.integration.v1.IntegrationService.CreateIntegration:input_type -> teleport.integration.v1.CreateIntegrationRequest + 4, // 8: teleport.integration.v1.IntegrationService.UpdateIntegration:input_type -> teleport.integration.v1.UpdateIntegrationRequest + 5, // 9: teleport.integration.v1.IntegrationService.DeleteIntegration:input_type -> teleport.integration.v1.DeleteIntegrationRequest + 6, // 10: teleport.integration.v1.IntegrationService.DeleteAllIntegrations:input_type -> teleport.integration.v1.DeleteAllIntegrationsRequest + 7, // 11: teleport.integration.v1.IntegrationService.GenerateAWSOIDCToken:input_type -> teleport.integration.v1.GenerateAWSOIDCTokenRequest + 9, // 12: teleport.integration.v1.IntegrationService.GenerateGitHubUserCert:input_type -> teleport.integration.v1.GenerateGitHubUserCertRequest + 11, // 13: teleport.integration.v1.IntegrationService.ExportIntegrationCertAuthorities:input_type -> teleport.integration.v1.ExportIntegrationCertAuthoritiesRequest + 1, // 14: teleport.integration.v1.IntegrationService.ListIntegrations:output_type -> teleport.integration.v1.ListIntegrationsResponse + 13, // 15: teleport.integration.v1.IntegrationService.GetIntegration:output_type -> types.IntegrationV1 + 13, // 16: teleport.integration.v1.IntegrationService.CreateIntegration:output_type -> types.IntegrationV1 + 13, // 17: teleport.integration.v1.IntegrationService.UpdateIntegration:output_type -> types.IntegrationV1 + 16, // 18: teleport.integration.v1.IntegrationService.DeleteIntegration:output_type -> google.protobuf.Empty + 16, // 19: teleport.integration.v1.IntegrationService.DeleteAllIntegrations:output_type -> google.protobuf.Empty + 8, // 20: teleport.integration.v1.IntegrationService.GenerateAWSOIDCToken:output_type -> teleport.integration.v1.GenerateAWSOIDCTokenResponse + 10, // 21: teleport.integration.v1.IntegrationService.GenerateGitHubUserCert:output_type -> teleport.integration.v1.GenerateGitHubUserCertResponse + 12, // 22: teleport.integration.v1.IntegrationService.ExportIntegrationCertAuthorities:output_type -> teleport.integration.v1.ExportIntegrationCertAuthoritiesResponse + 14, // [14:23] is the sub-list for method output_type + 5, // [5:14] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name } func init() { file_teleport_integration_v1_integration_service_proto_init() } @@ -665,7 +954,7 @@ func file_teleport_integration_v1_integration_service_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_teleport_integration_v1_integration_service_proto_rawDesc, NumEnums: 0, - NumMessages: 9, + NumMessages: 13, NumExtensions: 0, NumServices: 1, }, diff --git a/api/gen/proto/go/teleport/integration/v1/integration_service_grpc.pb.go b/api/gen/proto/go/teleport/integration/v1/integration_service_grpc.pb.go index f88c39e9d6154..e003922829236 100644 --- a/api/gen/proto/go/teleport/integration/v1/integration_service_grpc.pb.go +++ b/api/gen/proto/go/teleport/integration/v1/integration_service_grpc.pb.go @@ -35,13 +35,15 @@ import ( const _ = grpc.SupportPackageIsVersion9 const ( - IntegrationService_ListIntegrations_FullMethodName = "/teleport.integration.v1.IntegrationService/ListIntegrations" - IntegrationService_GetIntegration_FullMethodName = "/teleport.integration.v1.IntegrationService/GetIntegration" - IntegrationService_CreateIntegration_FullMethodName = "/teleport.integration.v1.IntegrationService/CreateIntegration" - IntegrationService_UpdateIntegration_FullMethodName = "/teleport.integration.v1.IntegrationService/UpdateIntegration" - IntegrationService_DeleteIntegration_FullMethodName = "/teleport.integration.v1.IntegrationService/DeleteIntegration" - IntegrationService_DeleteAllIntegrations_FullMethodName = "/teleport.integration.v1.IntegrationService/DeleteAllIntegrations" - IntegrationService_GenerateAWSOIDCToken_FullMethodName = "/teleport.integration.v1.IntegrationService/GenerateAWSOIDCToken" + IntegrationService_ListIntegrations_FullMethodName = "/teleport.integration.v1.IntegrationService/ListIntegrations" + IntegrationService_GetIntegration_FullMethodName = "/teleport.integration.v1.IntegrationService/GetIntegration" + IntegrationService_CreateIntegration_FullMethodName = "/teleport.integration.v1.IntegrationService/CreateIntegration" + IntegrationService_UpdateIntegration_FullMethodName = "/teleport.integration.v1.IntegrationService/UpdateIntegration" + IntegrationService_DeleteIntegration_FullMethodName = "/teleport.integration.v1.IntegrationService/DeleteIntegration" + IntegrationService_DeleteAllIntegrations_FullMethodName = "/teleport.integration.v1.IntegrationService/DeleteAllIntegrations" + IntegrationService_GenerateAWSOIDCToken_FullMethodName = "/teleport.integration.v1.IntegrationService/GenerateAWSOIDCToken" + IntegrationService_GenerateGitHubUserCert_FullMethodName = "/teleport.integration.v1.IntegrationService/GenerateGitHubUserCert" + IntegrationService_ExportIntegrationCertAuthorities_FullMethodName = "/teleport.integration.v1.IntegrationService/ExportIntegrationCertAuthorities" ) // IntegrationServiceClient is the client API for IntegrationService service. @@ -65,6 +67,10 @@ type IntegrationServiceClient interface { DeleteAllIntegrations(ctx context.Context, in *DeleteAllIntegrationsRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) // GenerateAWSOIDCToken generates a token to be used when executing an AWS OIDC Integration action. GenerateAWSOIDCToken(ctx context.Context, in *GenerateAWSOIDCTokenRequest, opts ...grpc.CallOption) (*GenerateAWSOIDCTokenResponse, error) + // GenerateGitHubUserCert signs a SSH certificate for GitHub integration. + GenerateGitHubUserCert(ctx context.Context, in *GenerateGitHubUserCertRequest, opts ...grpc.CallOption) (*GenerateGitHubUserCertResponse, error) + // ExportIntegrationCertAuthorities exports cert authorities for an integration. + ExportIntegrationCertAuthorities(ctx context.Context, in *ExportIntegrationCertAuthoritiesRequest, opts ...grpc.CallOption) (*ExportIntegrationCertAuthoritiesResponse, error) } type integrationServiceClient struct { @@ -145,6 +151,26 @@ func (c *integrationServiceClient) GenerateAWSOIDCToken(ctx context.Context, in return out, nil } +func (c *integrationServiceClient) GenerateGitHubUserCert(ctx context.Context, in *GenerateGitHubUserCertRequest, opts ...grpc.CallOption) (*GenerateGitHubUserCertResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GenerateGitHubUserCertResponse) + err := c.cc.Invoke(ctx, IntegrationService_GenerateGitHubUserCert_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *integrationServiceClient) ExportIntegrationCertAuthorities(ctx context.Context, in *ExportIntegrationCertAuthoritiesRequest, opts ...grpc.CallOption) (*ExportIntegrationCertAuthoritiesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ExportIntegrationCertAuthoritiesResponse) + err := c.cc.Invoke(ctx, IntegrationService_ExportIntegrationCertAuthorities_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // IntegrationServiceServer is the server API for IntegrationService service. // All implementations must embed UnimplementedIntegrationServiceServer // for forward compatibility. @@ -166,6 +192,10 @@ type IntegrationServiceServer interface { DeleteAllIntegrations(context.Context, *DeleteAllIntegrationsRequest) (*emptypb.Empty, error) // GenerateAWSOIDCToken generates a token to be used when executing an AWS OIDC Integration action. GenerateAWSOIDCToken(context.Context, *GenerateAWSOIDCTokenRequest) (*GenerateAWSOIDCTokenResponse, error) + // GenerateGitHubUserCert signs a SSH certificate for GitHub integration. + GenerateGitHubUserCert(context.Context, *GenerateGitHubUserCertRequest) (*GenerateGitHubUserCertResponse, error) + // ExportIntegrationCertAuthorities exports cert authorities for an integration. + ExportIntegrationCertAuthorities(context.Context, *ExportIntegrationCertAuthoritiesRequest) (*ExportIntegrationCertAuthoritiesResponse, error) mustEmbedUnimplementedIntegrationServiceServer() } @@ -197,6 +227,12 @@ func (UnimplementedIntegrationServiceServer) DeleteAllIntegrations(context.Conte func (UnimplementedIntegrationServiceServer) GenerateAWSOIDCToken(context.Context, *GenerateAWSOIDCTokenRequest) (*GenerateAWSOIDCTokenResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GenerateAWSOIDCToken not implemented") } +func (UnimplementedIntegrationServiceServer) GenerateGitHubUserCert(context.Context, *GenerateGitHubUserCertRequest) (*GenerateGitHubUserCertResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GenerateGitHubUserCert not implemented") +} +func (UnimplementedIntegrationServiceServer) ExportIntegrationCertAuthorities(context.Context, *ExportIntegrationCertAuthoritiesRequest) (*ExportIntegrationCertAuthoritiesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ExportIntegrationCertAuthorities not implemented") +} func (UnimplementedIntegrationServiceServer) mustEmbedUnimplementedIntegrationServiceServer() {} func (UnimplementedIntegrationServiceServer) testEmbeddedByValue() {} @@ -344,6 +380,42 @@ func _IntegrationService_GenerateAWSOIDCToken_Handler(srv interface{}, ctx conte return interceptor(ctx, in, info, handler) } +func _IntegrationService_GenerateGitHubUserCert_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GenerateGitHubUserCertRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IntegrationServiceServer).GenerateGitHubUserCert(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IntegrationService_GenerateGitHubUserCert_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IntegrationServiceServer).GenerateGitHubUserCert(ctx, req.(*GenerateGitHubUserCertRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _IntegrationService_ExportIntegrationCertAuthorities_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ExportIntegrationCertAuthoritiesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IntegrationServiceServer).ExportIntegrationCertAuthorities(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IntegrationService_ExportIntegrationCertAuthorities_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IntegrationServiceServer).ExportIntegrationCertAuthorities(ctx, req.(*ExportIntegrationCertAuthoritiesRequest)) + } + return interceptor(ctx, in, info, handler) +} + // IntegrationService_ServiceDesc is the grpc.ServiceDesc for IntegrationService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -379,6 +451,14 @@ var IntegrationService_ServiceDesc = grpc.ServiceDesc{ MethodName: "GenerateAWSOIDCToken", Handler: _IntegrationService_GenerateAWSOIDCToken_Handler, }, + { + MethodName: "GenerateGitHubUserCert", + Handler: _IntegrationService_GenerateGitHubUserCert_Handler, + }, + { + MethodName: "ExportIntegrationCertAuthorities", + Handler: _IntegrationService_ExportIntegrationCertAuthorities_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "teleport/integration/v1/integration_service.proto", diff --git a/api/gen/proto/go/teleport/userloginstate/v1/userloginstate.pb.go b/api/gen/proto/go/teleport/userloginstate/v1/userloginstate.pb.go index 86dce5291377c..10cbc8aa41a75 100644 --- a/api/gen/proto/go/teleport/userloginstate/v1/userloginstate.pb.go +++ b/api/gen/proto/go/teleport/userloginstate/v1/userloginstate.pb.go @@ -110,6 +110,8 @@ type Spec struct { // original_traits are the user traits that are part of the user's static definition. These traits are // not affected by access granted by access lists and are obtained prior to granting access list access. OriginalTraits []*v11.Trait `protobuf:"bytes,5,rep,name=original_traits,json=originalTraits,proto3" json:"original_traits,omitempty"` + // GitHubIdentity is the external identity attached to this user state. + GitHubIdentity *ExternalIdentity `protobuf:"bytes,6,opt,name=git_hub_identity,json=gitHubIdentity,proto3" json:"git_hub_identity,omitempty"` } func (x *Spec) Reset() { @@ -177,6 +179,70 @@ func (x *Spec) GetOriginalTraits() []*v11.Trait { return nil } +func (x *Spec) GetGitHubIdentity() *ExternalIdentity { + if x != nil { + return x.GitHubIdentity + } + return nil +} + +// ExternalIdentity defines an external identity attached to this user state. +type ExternalIdentity struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // UserId is the unique identifier of the external identity such as GitHub user + // ID. + UserId string `protobuf:"bytes,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + // Username is the username of the external identity. + Username string `protobuf:"bytes,2,opt,name=username,proto3" json:"username,omitempty"` +} + +func (x *ExternalIdentity) Reset() { + *x = ExternalIdentity{} + mi := &file_teleport_userloginstate_v1_userloginstate_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIdentity) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIdentity) ProtoMessage() {} + +func (x *ExternalIdentity) ProtoReflect() protoreflect.Message { + mi := &file_teleport_userloginstate_v1_userloginstate_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExternalIdentity.ProtoReflect.Descriptor instead. +func (*ExternalIdentity) Descriptor() ([]byte, []int) { + return file_teleport_userloginstate_v1_userloginstate_proto_rawDescGZIP(), []int{2} +} + +func (x *ExternalIdentity) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +func (x *ExternalIdentity) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + var File_teleport_userloginstate_v1_userloginstate_proto protoreflect.FileDescriptor var file_teleport_userloginstate_v1_userloginstate_proto_rawDesc = []byte{ @@ -197,7 +263,7 @@ var file_teleport_userloginstate_v1_userloginstate_proto_rawDesc = []byte{ 0x61, 0x64, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0xd5, 0x01, 0x0a, 0x04, 0x53, + 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0xad, 0x02, 0x0a, 0x04, 0x53, 0x70, 0x65, 0x63, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x6c, 0x65, @@ -211,13 +277,23 @@ var file_teleport_userloginstate_v1_userloginstate_proto_rawDesc = []byte{ 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x74, 0x72, 0x61, 0x69, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x74, 0x52, 0x0e, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x54, 0x72, 0x61, 0x69, - 0x74, 0x73, 0x42, 0x60, 0x5a, 0x5e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, - 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x2f, 0x76, 0x31, 0x3b, 0x75, 0x73, 0x65, 0x72, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x73, 0x12, 0x56, 0x0a, 0x10, 0x67, 0x69, 0x74, 0x5f, 0x68, 0x75, 0x62, 0x5f, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x6c, 0x6f, 0x67, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x0e, 0x67, 0x69, 0x74, 0x48, + 0x75, 0x62, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x47, 0x0a, 0x10, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x17, + 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x42, 0x60, 0x5a, 0x5e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, + 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x75, 0x73, 0x65, 0x72, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -232,23 +308,25 @@ func file_teleport_userloginstate_v1_userloginstate_proto_rawDescGZIP() []byte { return file_teleport_userloginstate_v1_userloginstate_proto_rawDescData } -var file_teleport_userloginstate_v1_userloginstate_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_teleport_userloginstate_v1_userloginstate_proto_msgTypes = make([]protoimpl.MessageInfo, 3) var file_teleport_userloginstate_v1_userloginstate_proto_goTypes = []any{ (*UserLoginState)(nil), // 0: teleport.userloginstate.v1.UserLoginState (*Spec)(nil), // 1: teleport.userloginstate.v1.Spec - (*v1.ResourceHeader)(nil), // 2: teleport.header.v1.ResourceHeader - (*v11.Trait)(nil), // 3: teleport.trait.v1.Trait + (*ExternalIdentity)(nil), // 2: teleport.userloginstate.v1.ExternalIdentity + (*v1.ResourceHeader)(nil), // 3: teleport.header.v1.ResourceHeader + (*v11.Trait)(nil), // 4: teleport.trait.v1.Trait } var file_teleport_userloginstate_v1_userloginstate_proto_depIdxs = []int32{ - 2, // 0: teleport.userloginstate.v1.UserLoginState.header:type_name -> teleport.header.v1.ResourceHeader + 3, // 0: teleport.userloginstate.v1.UserLoginState.header:type_name -> teleport.header.v1.ResourceHeader 1, // 1: teleport.userloginstate.v1.UserLoginState.spec:type_name -> teleport.userloginstate.v1.Spec - 3, // 2: teleport.userloginstate.v1.Spec.traits:type_name -> teleport.trait.v1.Trait - 3, // 3: teleport.userloginstate.v1.Spec.original_traits:type_name -> teleport.trait.v1.Trait - 4, // [4:4] is the sub-list for method output_type - 4, // [4:4] is the sub-list for method input_type - 4, // [4:4] is the sub-list for extension type_name - 4, // [4:4] is the sub-list for extension extendee - 0, // [0:4] is the sub-list for field type_name + 4, // 2: teleport.userloginstate.v1.Spec.traits:type_name -> teleport.trait.v1.Trait + 4, // 3: teleport.userloginstate.v1.Spec.original_traits:type_name -> teleport.trait.v1.Trait + 2, // 4: teleport.userloginstate.v1.Spec.git_hub_identity:type_name -> teleport.userloginstate.v1.ExternalIdentity + 5, // [5:5] is the sub-list for method output_type + 5, // [5:5] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name } func init() { file_teleport_userloginstate_v1_userloginstate_proto_init() } @@ -262,7 +340,7 @@ func file_teleport_userloginstate_v1_userloginstate_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_teleport_userloginstate_v1_userloginstate_proto_rawDesc, NumEnums: 0, - NumMessages: 2, + NumMessages: 3, NumExtensions: 0, NumServices: 0, }, diff --git a/api/proto/teleport/gitserver/v1/git_server_service.proto b/api/proto/teleport/gitserver/v1/git_server_service.proto new file mode 100644 index 0000000000000..a23a6ab45a45e --- /dev/null +++ b/api/proto/teleport/gitserver/v1/git_server_service.proto @@ -0,0 +1,97 @@ +// Copyright 2024 Gravitational, Inc +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package teleport.gitserver.v1; + +import "google/protobuf/empty.proto"; +import "teleport/legacy/types/types.proto"; + +option go_package = "github.com/gravitational/teleport/api/gen/proto/go/teleport/gitserver/v1;gitserverv1"; + +// GitServerService provides methods to manage Git server. +service GitServerService { + // CreateGitServer is used to create a Git server object. + rpc CreateGitServer(CreateGitServerRequest) returns (types.ServerV2); + // GetGitServer is used to retrieve a Git server object. + rpc GetGitServer(GetGitServerRequest) returns (types.ServerV2); + // ListGitServers is used to query Git servers. + rpc ListGitServers(ListGitServersRequest) returns (ListGitServersResponse); + // UpdateGitServer is used to update a Git server object. + rpc UpdateGitServer(UpdateGitServerRequest) returns (types.ServerV2); + // UpsertGitServer is used to create or replace a Git server object. + rpc UpsertGitServer(UpsertGitServerRequest) returns (types.ServerV2); + // DeleteGitServer is used to delete a Git server object. + rpc DeleteGitServer(DeleteGitServerRequest) returns (google.protobuf.Empty); + + // CreateGitHubAuthRequest starts GitHub OAuth flow for authenticated user. + rpc CreateGitHubAuthRequest(CreateGitHubAuthRequestRequest) returns (types.GithubAuthRequest); +} + +// CreateGitServerRequest is a request to create a Git server. +message CreateGitServerRequest { + // Server is the Git server to create. + types.ServerV2 server = 1; +} + +// GetGitServerRequest is a request to get a Git server. +message GetGitServerRequest { + // Name is the uuid of the server. + string name = 1; +} + +// ListGitServersRequest is the request to list Git servers. +message ListGitServersRequest { + // The maximum number of items to return. + // The server may impose a different page size at its discretion. + int32 page_size = 1; + // The page_token is the next_page_token value returned from a previous List request, if any. + string page_token = 2; +} + +// ListGitServersResponse is the response to ListGitServers. +message ListGitServersResponse { + // The page of Git servers that matched the request. + repeated types.ServerV2 servers = 1; + // Token to retrieve the next page of results, or empty if there are no + // more results in the list. + string next_page_token = 2; +} + +// UpdateGitServerRequest is the request to update a Git server. +message UpdateGitServerRequest { + // Server is the Git server to update. + types.ServerV2 server = 1; +} + +// UpsertGitServerRequest is the request to upsert a Git server. +message UpsertGitServerRequest { + // Server is the Git server to upsert. + types.ServerV2 server = 1; +} + +// DeleteGitServerRequest is the request to delete a Git server. +message DeleteGitServerRequest { + // Name is the uuid of the server. + string name = 1; +} + +// CreateGitHubAuthRequestRequest is the request for CreateGitHubAuthRequest. +message CreateGitHubAuthRequestRequest { + // Request is the basic GitHub auth request. + types.GithubAuthRequest request = 1; + // Organization is the GitHub organization that the user is accessing. + string organization = 2; +} diff --git a/api/proto/teleport/integration/v1/integration_service.proto b/api/proto/teleport/integration/v1/integration_service.proto index 6306a204a79d7..0528f521f684e 100644 --- a/api/proto/teleport/integration/v1/integration_service.proto +++ b/api/proto/teleport/integration/v1/integration_service.proto @@ -16,6 +16,7 @@ syntax = "proto3"; package teleport.integration.v1; +import "google/protobuf/duration.proto"; import "google/protobuf/empty.proto"; import "teleport/legacy/types/types.proto"; @@ -44,6 +45,12 @@ service IntegrationService { // GenerateAWSOIDCToken generates a token to be used when executing an AWS OIDC Integration action. rpc GenerateAWSOIDCToken(GenerateAWSOIDCTokenRequest) returns (GenerateAWSOIDCTokenResponse); + + // GenerateGitHubUserCert signs a SSH certificate for GitHub integration. + rpc GenerateGitHubUserCert(GenerateGitHubUserCertRequest) returns (GenerateGitHubUserCertResponse); + + // ExportIntegrationCertAuthorities exports cert authorities for an integration. + rpc ExportIntegrationCertAuthorities(ExportIntegrationCertAuthoritiesRequest) returns (ExportIntegrationCertAuthoritiesResponse); } // ListIntegrationsRequest is a request for a paginated list of Integrations. @@ -111,3 +118,38 @@ message GenerateAWSOIDCTokenResponse { // Token is the signed JWT ready to be used string token = 1; } + +// GenerateGitHubUserCertRequest is a request to sign a client certificate used by +// GitHub integration to authenticate with GitHub enterprise. +message GenerateGitHubUserCertRequest { + // Integration is the name of the integration; + string integration = 1; + // PublicKey is the public key to be signed. + bytes public_key = 2; + // UserId is the GitHub user id. + string user_id = 3; + // KeyId is the certificate ID, usually the Teleport username. + string key_id = 4; + // Ttl is the duration the certificate will be valid for. + google.protobuf.Duration ttl = 5; +} + +// GenerateGitHubUserCertResponse contains a signed certificate. +message GenerateGitHubUserCertResponse { + // AuthorizedKey is the signed certificate. + bytes authorized_key = 1; +} + +// ExportIntegrationCertAuthoritiesRequest is the request to export cert +// authorities for an integration. +message ExportIntegrationCertAuthoritiesRequest { + // Integration is the name of the integration; + string integration = 1; +} + +// ExportIntegrationCertAuthoritiesResponse is the response to +// ExportIntegrationCertAuthorities. +message ExportIntegrationCertAuthoritiesResponse { + // CertAuthorities are the CA key sets used to sign any new certificates. + types.CAKeySet cert_authorities = 1; +} diff --git a/api/proto/teleport/legacy/client/proto/authservice.proto b/api/proto/teleport/legacy/client/proto/authservice.proto index f6b278b056802..dcc0e9948e89e 100644 --- a/api/proto/teleport/legacy/client/proto/authservice.proto +++ b/api/proto/teleport/legacy/client/proto/authservice.proto @@ -2022,6 +2022,8 @@ message PaginatedResource { types.AppServerOrSAMLIdPServiceProviderV1 AppServerOrSAMLIdPServiceProvider = 11 [deprecated = true]; // SAMLIdPServiceProvider represents a SAML IdP service provider resource. types.SAMLIdPServiceProviderV1 SAMLIdPServiceProvider = 12 [(gogoproto.jsontag) = "saml_idp_service_provider,omitempty"]; + // GitServer represents a Git server resource. + types.ServerV2 git_server = 15; // IdentityCenterAccountAssignment represents a requestable Identity Center // Account Assignment IdentityCenterAccountAssignment IdentityCenterAccountAssignment = 16 [(gogoproto.jsontag) = "identity_center_account_assignment,omitempty"]; diff --git a/api/proto/teleport/legacy/client/proto/event.proto b/api/proto/teleport/legacy/client/proto/event.proto index e221a9c25ad14..b8c39fec6054e 100644 --- a/api/proto/teleport/legacy/client/proto/event.proto +++ b/api/proto/teleport/legacy/client/proto/event.proto @@ -207,6 +207,8 @@ message Event { // IdentityCenterAccountlAssignment is a resource representing a potential // Permission Set grant on a specific AWS account. teleport.identitycenter.v1.AccountAssignment IdentityCenterAccountAssignment = 74; + // PluginStaticCredentials is filled in PluginStaticCredentials related events + types.PluginStaticCredentialsV1 PluginStaticCredentials = 75; // WorkloadIdentity is a resource for workload identity. teleport.workloadidentity.v1.WorkloadIdentity WorkloadIdentity = 76; } diff --git a/api/proto/teleport/legacy/types/events/events.proto b/api/proto/teleport/legacy/types/events/events.proto index 067b78ea6dd5b..201a33505260a 100644 --- a/api/proto/teleport/legacy/types/events/events.proto +++ b/api/proto/teleport/legacy/types/events/events.proto @@ -4381,6 +4381,8 @@ message IntegrationMetadata { AWSOIDCIntegrationMetadata AWSOIDC = 2 [(gogoproto.jsontag) = "aws_oidc,omitempty"]; // AzureOIDC contains metadata for Azure OIDC integrations. AzureOIDCIntegrationMetadata AzureOIDC = 3 [(gogoproto.jsontag) = "azure_oidc,omitempty"]; + // GitHub contains metadata for GitHub integrations. + GitHubIntegrationMetadata GitHub = 4 [(gogoproto.jsontag) = "github,omitempty"]; } // AWSOIDCIntegrationMetadata contains metadata for AWS OIDC integrations. @@ -4402,6 +4404,12 @@ message AzureOIDCIntegrationMetadata { string ClientID = 2 [(gogoproto.jsontag) = "client_id,omitempty"]; } +// GitHubIntegrationMetadata contains metadata for GitHub integrations. +message GitHubIntegrationMetadata { + // Organization specifies the name of the organization for the GitHub integration. + string Organization = 1 [(gogoproto.jsontag) = "organization,omitempty"]; +} + // PluginCreate is emitted when a plugin resource is created. message PluginCreate { // Metadata is a common event metadata. @@ -4732,6 +4740,7 @@ message OneOf { events.WorkloadIdentityCreate WorkloadIdentityCreate = 194; events.WorkloadIdentityUpdate WorkloadIdentityUpdate = 195; events.WorkloadIdentityDelete WorkloadIdentityDelete = 196; + events.GitCommand GitCommand = 197; events.UserLoginAccessListInvalid UserLoginAccessListInvalid = 198; events.AccessRequestExpire AccessRequestExpire = 199; } @@ -7869,3 +7878,69 @@ enum ContactType { CONTACT_TYPE_BUSINESS = 1; CONTACT_TYPE_SECURITY = 2; } + +// GitCommand is emitted when a user performs a Git fetch or push command. +message GitCommand { + // Metadata is a common event metadata + Metadata Metadata = 1 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // User is a common user event metadata + UserMetadata User = 2 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ConnectionMetadata holds information about the connection + ConnectionMetadata Connection = 3 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // SessionMetadata is a common event session metadata + SessionMetadata Session = 4 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ServerMetadata is a common server metadata + ServerMetadata Server = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // CommandMetadata is a common command metadata + CommandMetadata Command = 6 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // Service is the type of the git request like git-upload-pack or + // git-receive-pack. + string service = 8 [(gogoproto.jsontag) = "service"]; + // Path is the Git repo path, usually /. + string path = 9 [(gogoproto.jsontag) = "path"]; + + // Actions defines details for a Git push. + repeated GitCommandAction actions = 10 [(gogoproto.jsontag) = "actions,omitempty"]; +} + +// GitCommandAction defines details for a Git push. +message GitCommandAction { + // Action type like create or update. + string Action = 1 [(gogoproto.jsontag) = "action,omitempty"]; + // Reference name like ref/main/my_branch. + string Reference = 2 [(gogoproto.jsontag) = "reference,omitempty"]; + // Old is the old hash. + string Old = 3 [(gogoproto.jsontag) = "old,omitempty"]; + // New is the new hash. + string New = 4 [(gogoproto.jsontag) = "new,omitempty"]; +} diff --git a/api/proto/teleport/legacy/types/types.proto b/api/proto/teleport/legacy/types/types.proto index a07a8b0e39013..ad6c39db04307 100644 --- a/api/proto/teleport/legacy/types/types.proto +++ b/api/proto/teleport/legacy/types/types.proto @@ -843,6 +843,9 @@ message ServerSpecV2 { // CloudMetadata contains info about the cloud instance the server is running // on, if any. CloudMetadata CloudMetadata = 14 [(gogoproto.jsontag) = "cloud_metadata,omitempty"]; + // GitHub contains info about GitHub proxies where each server represents a + // GitHub organization. + GitHubServerMetadata git_hub = 15 [(gogoproto.jsontag) = "github,omitempty"]; reserved 8; reserved 10; @@ -876,6 +879,15 @@ message CloudMetadata { AWSInfo AWS = 1 [(gogoproto.jsontag) = "aws,omitempty"]; } +// GitHubServerMetadata contains info about GitHub proxies where each server +// represents a GitHub organization. +message GitHubServerMetadata { + // Organization specifies the name of the organization for the GitHub integration. + string organization = 1 [(gogoproto.jsontag) = "organization,omitempty"]; + // Integration is the integration that is associated with this Server. + string integration = 2 [(gogoproto.jsontag) = "integration,omitempty"]; +} + // AppServerV3 represents a single proxied web app. message AppServerV3 { option (gogoproto.goproto_stringer) = false; @@ -3408,6 +3420,12 @@ message RoleConditions { (gogoproto.jsontag) = "account_assignments,omitempty" ]; + // GitHubPermissions defines GitHub integration related permissions. + repeated GitHubPermission git_hub_permissions = 43 [ + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "github_permissions,omitempty" + ]; + // WorkloadIdentityLabels controls whether or not specific WorkloadIdentity // resources can be invoked. Further authorization controls exist on the // WorkloadIdentity resource itself. @@ -3428,6 +3446,11 @@ message IdentityCenterAccountAssignment { string Account = 2 [(gogoproto.jsontag) = "account,omitempty"]; } +// GitHubPermission defines GitHub integration related permissions. +message GitHubPermission { + repeated string organizations = 1 [(gogoproto.jsontag) = "orgs,omitempty"]; +} + // SPIFFERoleCondition sets out which SPIFFE identities this role is allowed or // denied to generate. The Path matcher is required, and is evaluated first. If, // the Path does not match then the other matcher fields are not evaluated. @@ -3850,6 +3873,10 @@ message ExternalIdentity { // SAMLSingleLogoutURL is the SAML Single log-out URL to initiate SAML SLO (single log-out), if applicable. string SAMLSingleLogoutURL = 3 [(gogoproto.jsontag) = "samlSingleLogoutUrl,omitempty"]; + + // UserID is the ID of the identity. Some connectors like GitHub have an + // unique ID apart from the username. + string UserID = 4 [(gogoproto.jsontag) = "user_id,omitempty"]; } // LoginStatus is a login status of the user @@ -5227,7 +5254,7 @@ message GithubAuthRequest { string KubernetesCluster = 13 [(gogoproto.jsontag) = "kubernetes_cluster,omitempty"]; // SSOTestFlow indicates if the request is part of the test flow. bool SSOTestFlow = 14 [(gogoproto.jsontag) = "sso_test_flow"]; - // ConnectorSpec is embedded connector spec for use in test flow. + // ConnectorSpec is embedded connector spec for use in test flow or authenticated user flow. GithubConnectorSpecV3 ConnectorSpec = 15 [(gogoproto.jsontag) = "connector_spec,omitempty"]; // AttestationStatement is an attestation statement for the given public key. // @@ -5251,6 +5278,10 @@ message GithubAuthRequest { teleport.attestation.v1.AttestationStatement ssh_attestation_statement = 21 [(gogoproto.jsontag) = "ssh_attestation_statement,omitempty"]; // TlsAttestationStatement is an attestation statement for the given TLS public key. teleport.attestation.v1.AttestationStatement tls_attestation_statement = 22 [(gogoproto.jsontag) = "tls_attestation_statement,omitempty"]; + // AuthenticatedUser is the username of an authenticated Teleport user. This + // OAuth flow is used to retrieve GitHub identity info which will be added to + // the existing user. + string authenticated_user = 23 [(gogoproto.jsontag) = "authenticated_user,omitempty"]; } // SSOWarnings conveys a user-facing main message along with auxiliary warnings. @@ -5421,6 +5452,12 @@ message GithubClaims { // Teams is the users team membership repeated string Teams = 3 [(gogoproto.jsontag) = "teams"]; + + // UserID is a global unique integer that is assigned to each GitHub user. The + // user ID is immutable (unlike the GitHub username) and can be found in APIs + // like get user. + // https://docs.github.com/en/rest/users/users + string UserID = 4 [(gogoproto.jsontag) = "user_id,omitempty"]; } // TeamMapping represents a single team membership mapping. @@ -7153,6 +7190,7 @@ message PluginStaticCredentialsSpecV1 { string APIToken = 1; PluginStaticCredentialsBasicAuth BasicAuth = 2; PluginStaticCredentialsOAuthClientSecret OAuthClientSecret = 3; + PluginStaticCredentialsSSHCertAuthorities SSHCertAuthorities = 4; } } @@ -7174,6 +7212,14 @@ message PluginStaticCredentialsOAuthClientSecret { string ClientSecret = 2 [(gogoproto.jsontag) = "client_secret"]; } +// PluginStaticCredentialsSSHCertAuthorities contains the active SSH CAs used +// for the integration or plugin. +message PluginStaticCredentialsSSHCertAuthorities { + // CertAuthorities contains the active SSH CAs used for the integration or + // plugin. + repeated SSHKeyPair cert_authorities = 1; +} + // SAMLIdPServiceProviderV1 is the representation of a SAML IdP service provider. message SAMLIdPServiceProviderV1 { option (gogoproto.goproto_stringer) = false; @@ -7521,7 +7567,12 @@ message IntegrationSpecV1 { AWSOIDCIntegrationSpecV1 AWSOIDC = 1 [(gogoproto.jsontag) = "aws_oidc,omitempty"]; // AzureOIDC contains the specific fields to handle the Azure OIDC Integration subkind AzureOIDCIntegrationSpecV1 AzureOIDC = 2 [(gogoproto.jsontag) = "azure_oidc,omitempty"]; + // GitHub contains the specific fields to handle the GitHub integration subkind. + GitHubIntegrationSpecV1 GitHub = 3 [(gogoproto.jsontag) = "github,omitempty"]; } + + // Credentials contains credentials for the integration. + PluginCredentialsV1 credentials = 4; } // AWSOIDCIntegrationSpecV1 contains the spec properties for the AWS OIDC SubKind Integration. @@ -7566,6 +7617,12 @@ message AzureOIDCIntegrationSpecV1 { string ClientID = 2 [(gogoproto.jsontag) = "client_id,omitempty"]; } +// GitHubIntegrationSpecV1 contains the specific fields to handle the GitHub integration subkind. +message GitHubIntegrationSpecV1 { + // Organization specifies the name of the organization for the GitHub integration. + string Organization = 1 [(gogoproto.jsontag) = "organization,omitempty"]; +} + // HeadlessAuthentication holds data for an ongoing headless authentication attempt. message HeadlessAuthentication { // Header is the resource header. diff --git a/api/proto/teleport/userloginstate/v1/userloginstate.proto b/api/proto/teleport/userloginstate/v1/userloginstate.proto index 5adaf0e952e9b..85e8401161b80 100644 --- a/api/proto/teleport/userloginstate/v1/userloginstate.proto +++ b/api/proto/teleport/userloginstate/v1/userloginstate.proto @@ -48,4 +48,16 @@ message Spec { // original_traits are the user traits that are part of the user's static definition. These traits are // not affected by access granted by access lists and are obtained prior to granting access list access. repeated teleport.trait.v1.Trait original_traits = 5; + + // GitHubIdentity is the external identity attached to this user state. + ExternalIdentity git_hub_identity = 6; +} + +// ExternalIdentity defines an external identity attached to this user state. +message ExternalIdentity { + // UserId is the unique identifier of the external identity such as GitHub user + // ID. + string user_id = 1; + // Username is the username of the external identity. + string username = 2; } diff --git a/api/types/constants.go b/api/types/constants.go index 61d830633e80c..10aa2322998d3 100644 --- a/api/types/constants.go +++ b/api/types/constants.go @@ -605,6 +605,11 @@ const ( // KindWorkloadIdentity is the WorkloadIdentity resource. KindWorkloadIdentity = "workload_identity" + // KindGitServer represents a Git server that can proxy git commands. + KindGitServer = "git_server" + // SubKindGitHub specifies the GitHub subkind of a Git server. + SubKindGitHub = "github" + // MetaNameAccessGraphSettings is the exact name of the singleton resource holding // access graph settings. MetaNameAccessGraphSettings = "access-graph-settings" @@ -1126,6 +1131,9 @@ const ( // EntraSAMAccountNameLabel is the label for user's on-premises sAMAccountName. EntraSAMAccountNameLabel = TeleportInternalLabelPrefix + "entra-sam-account-name" + + // GitHubOrgLabel is the label for GitHub organization. + GitHubOrgLabel = TeleportInternalLabelPrefix + "github-org" ) const ( @@ -1484,3 +1492,9 @@ const ( // a Datadog Application key. DatadogCredentialApplicationKey = "datadog-application-key" ) + +const ( + // GitHubOrgServerDomain is the sub domain used in the hostname of a + // types.Server to indicate the GitHub organization of a Git server. + GitHubOrgServerDomain = "teleport-github-org" +) diff --git a/api/types/events/events.go b/api/types/events/events.go index 3c824249a179e..66df063371f00 100644 --- a/api/types/events/events.go +++ b/api/types/events/events.go @@ -2425,3 +2425,7 @@ func (m *ContactCreate) TrimToMaxSize(_ int) AuditEvent { func (m *ContactDelete) TrimToMaxSize(_ int) AuditEvent { return m } + +func (m *GitCommand) TrimToMaxSize(_ int) AuditEvent { + return m +} diff --git a/api/types/events/events.pb.go b/api/types/events/events.pb.go index 162cf8a08fe46..78229feee1c38 100644 --- a/api/types/events/events.pb.go +++ b/api/types/events/events.pb.go @@ -7407,10 +7407,12 @@ type IntegrationMetadata struct { // AWSOIDC contains metadata for AWS OIDC integrations. AWSOIDC *AWSOIDCIntegrationMetadata `protobuf:"bytes,2,opt,name=AWSOIDC,proto3" json:"aws_oidc,omitempty"` // AzureOIDC contains metadata for Azure OIDC integrations. - AzureOIDC *AzureOIDCIntegrationMetadata `protobuf:"bytes,3,opt,name=AzureOIDC,proto3" json:"azure_oidc,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + AzureOIDC *AzureOIDCIntegrationMetadata `protobuf:"bytes,3,opt,name=AzureOIDC,proto3" json:"azure_oidc,omitempty"` + // GitHub contains metadata for GitHub integrations. + GitHub *GitHubIntegrationMetadata `protobuf:"bytes,4,opt,name=GitHub,proto3" json:"github,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *IntegrationMetadata) Reset() { *m = IntegrationMetadata{} } @@ -7535,6 +7537,48 @@ func (m *AzureOIDCIntegrationMetadata) XXX_DiscardUnknown() { var xxx_messageInfo_AzureOIDCIntegrationMetadata proto.InternalMessageInfo +// GitHubIntegrationMetadata contains metadata for GitHub integrations. +type GitHubIntegrationMetadata struct { + // Organization specifies the name of the organization for the GitHub integration. + Organization string `protobuf:"bytes,1,opt,name=Organization,proto3" json:"organization,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GitHubIntegrationMetadata) Reset() { *m = GitHubIntegrationMetadata{} } +func (m *GitHubIntegrationMetadata) String() string { return proto.CompactTextString(m) } +func (*GitHubIntegrationMetadata) ProtoMessage() {} +func (*GitHubIntegrationMetadata) Descriptor() ([]byte, []int) { + return fileDescriptor_007ba1c3d6266d56, []int{139} +} +func (m *GitHubIntegrationMetadata) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GitHubIntegrationMetadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GitHubIntegrationMetadata.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 *GitHubIntegrationMetadata) XXX_Merge(src proto.Message) { + xxx_messageInfo_GitHubIntegrationMetadata.Merge(m, src) +} +func (m *GitHubIntegrationMetadata) XXX_Size() int { + return m.Size() +} +func (m *GitHubIntegrationMetadata) XXX_DiscardUnknown() { + xxx_messageInfo_GitHubIntegrationMetadata.DiscardUnknown(m) +} + +var xxx_messageInfo_GitHubIntegrationMetadata proto.InternalMessageInfo + // PluginCreate is emitted when a plugin resource is created. type PluginCreate struct { // Metadata is a common event metadata. @@ -7555,7 +7599,7 @@ func (m *PluginCreate) Reset() { *m = PluginCreate{} } func (m *PluginCreate) String() string { return proto.CompactTextString(m) } func (*PluginCreate) ProtoMessage() {} func (*PluginCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{139} + return fileDescriptor_007ba1c3d6266d56, []int{140} } func (m *PluginCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7604,7 +7648,7 @@ func (m *PluginUpdate) Reset() { *m = PluginUpdate{} } func (m *PluginUpdate) String() string { return proto.CompactTextString(m) } func (*PluginUpdate) ProtoMessage() {} func (*PluginUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{140} + return fileDescriptor_007ba1c3d6266d56, []int{141} } func (m *PluginUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7653,7 +7697,7 @@ func (m *PluginDelete) Reset() { *m = PluginDelete{} } func (m *PluginDelete) String() string { return proto.CompactTextString(m) } func (*PluginDelete) ProtoMessage() {} func (*PluginDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{141} + return fileDescriptor_007ba1c3d6266d56, []int{142} } func (m *PluginDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7702,7 +7746,7 @@ func (m *PluginMetadata) Reset() { *m = PluginMetadata{} } func (m *PluginMetadata) String() string { return proto.CompactTextString(m) } func (*PluginMetadata) ProtoMessage() {} func (*PluginMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{142} + return fileDescriptor_007ba1c3d6266d56, []int{143} } func (m *PluginMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7926,6 +7970,7 @@ type OneOf struct { // *OneOf_WorkloadIdentityCreate // *OneOf_WorkloadIdentityUpdate // *OneOf_WorkloadIdentityDelete + // *OneOf_GitCommand // *OneOf_UserLoginAccessListInvalid // *OneOf_AccessRequestExpire Event isOneOf_Event `protobuf_oneof:"Event"` @@ -7938,7 +7983,7 @@ func (m *OneOf) Reset() { *m = OneOf{} } func (m *OneOf) String() string { return proto.CompactTextString(m) } func (*OneOf) ProtoMessage() {} func (*OneOf) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{143} + return fileDescriptor_007ba1c3d6266d56, []int{144} } func (m *OneOf) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8549,6 +8594,9 @@ type OneOf_WorkloadIdentityUpdate struct { type OneOf_WorkloadIdentityDelete struct { WorkloadIdentityDelete *WorkloadIdentityDelete `protobuf:"bytes,196,opt,name=WorkloadIdentityDelete,proto3,oneof" json:"WorkloadIdentityDelete,omitempty"` } +type OneOf_GitCommand struct { + GitCommand *GitCommand `protobuf:"bytes,197,opt,name=GitCommand,proto3,oneof" json:"GitCommand,omitempty"` +} type OneOf_UserLoginAccessListInvalid struct { UserLoginAccessListInvalid *UserLoginAccessListInvalid `protobuf:"bytes,198,opt,name=UserLoginAccessListInvalid,proto3,oneof" json:"UserLoginAccessListInvalid,omitempty"` } @@ -8748,6 +8796,7 @@ func (*OneOf_ContactDelete) isOneOf_Event() {} func (*OneOf_WorkloadIdentityCreate) isOneOf_Event() {} func (*OneOf_WorkloadIdentityUpdate) isOneOf_Event() {} func (*OneOf_WorkloadIdentityDelete) isOneOf_Event() {} +func (*OneOf_GitCommand) isOneOf_Event() {} func (*OneOf_UserLoginAccessListInvalid) isOneOf_Event() {} func (*OneOf_AccessRequestExpire) isOneOf_Event() {} @@ -10102,6 +10151,13 @@ func (m *OneOf) GetWorkloadIdentityDelete() *WorkloadIdentityDelete { return nil } +func (m *OneOf) GetGitCommand() *GitCommand { + if x, ok := m.GetEvent().(*OneOf_GitCommand); ok { + return x.GitCommand + } + return nil +} + func (m *OneOf) GetUserLoginAccessListInvalid() *UserLoginAccessListInvalid { if x, ok := m.GetEvent().(*OneOf_UserLoginAccessListInvalid); ok { return x.UserLoginAccessListInvalid @@ -10311,6 +10367,7 @@ func (*OneOf) XXX_OneofWrappers() []interface{} { (*OneOf_WorkloadIdentityCreate)(nil), (*OneOf_WorkloadIdentityUpdate)(nil), (*OneOf_WorkloadIdentityDelete)(nil), + (*OneOf_GitCommand)(nil), (*OneOf_UserLoginAccessListInvalid)(nil), (*OneOf_AccessRequestExpire)(nil), } @@ -10333,7 +10390,7 @@ func (m *StreamStatus) Reset() { *m = StreamStatus{} } func (m *StreamStatus) String() string { return proto.CompactTextString(m) } func (*StreamStatus) ProtoMessage() {} func (*StreamStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{144} + return fileDescriptor_007ba1c3d6266d56, []int{145} } func (m *StreamStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10379,7 +10436,7 @@ func (m *SessionUpload) Reset() { *m = SessionUpload{} } func (m *SessionUpload) String() string { return proto.CompactTextString(m) } func (*SessionUpload) ProtoMessage() {} func (*SessionUpload) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{145} + return fileDescriptor_007ba1c3d6266d56, []int{146} } func (m *SessionUpload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10498,7 +10555,7 @@ func (m *Identity) Reset() { *m = Identity{} } func (m *Identity) String() string { return proto.CompactTextString(m) } func (*Identity) ProtoMessage() {} func (*Identity) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{146} + return fileDescriptor_007ba1c3d6266d56, []int{147} } func (m *Identity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10557,7 +10614,7 @@ func (m *RouteToApp) Reset() { *m = RouteToApp{} } func (m *RouteToApp) String() string { return proto.CompactTextString(m) } func (*RouteToApp) ProtoMessage() {} func (*RouteToApp) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{147} + return fileDescriptor_007ba1c3d6266d56, []int{148} } func (m *RouteToApp) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10607,7 +10664,7 @@ func (m *RouteToDatabase) Reset() { *m = RouteToDatabase{} } func (m *RouteToDatabase) String() string { return proto.CompactTextString(m) } func (*RouteToDatabase) ProtoMessage() {} func (*RouteToDatabase) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{148} + return fileDescriptor_007ba1c3d6266d56, []int{149} } func (m *RouteToDatabase) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10657,7 +10714,7 @@ func (m *DeviceExtensions) Reset() { *m = DeviceExtensions{} } func (m *DeviceExtensions) String() string { return proto.CompactTextString(m) } func (*DeviceExtensions) ProtoMessage() {} func (*DeviceExtensions) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{149} + return fileDescriptor_007ba1c3d6266d56, []int{150} } func (m *DeviceExtensions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10714,7 +10771,7 @@ func (m *AccessRequestResourceSearch) Reset() { *m = AccessRequestResour func (m *AccessRequestResourceSearch) String() string { return proto.CompactTextString(m) } func (*AccessRequestResourceSearch) ProtoMessage() {} func (*AccessRequestResourceSearch) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{150} + return fileDescriptor_007ba1c3d6266d56, []int{151} } func (m *AccessRequestResourceSearch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10765,7 +10822,7 @@ func (m *MySQLStatementPrepare) Reset() { *m = MySQLStatementPrepare{} } func (m *MySQLStatementPrepare) String() string { return proto.CompactTextString(m) } func (*MySQLStatementPrepare) ProtoMessage() {} func (*MySQLStatementPrepare) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{151} + return fileDescriptor_007ba1c3d6266d56, []int{152} } func (m *MySQLStatementPrepare) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10818,7 +10875,7 @@ func (m *MySQLStatementExecute) Reset() { *m = MySQLStatementExecute{} } func (m *MySQLStatementExecute) String() string { return proto.CompactTextString(m) } func (*MySQLStatementExecute) ProtoMessage() {} func (*MySQLStatementExecute) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{152} + return fileDescriptor_007ba1c3d6266d56, []int{153} } func (m *MySQLStatementExecute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10873,7 +10930,7 @@ func (m *MySQLStatementSendLongData) Reset() { *m = MySQLStatementSendLo func (m *MySQLStatementSendLongData) String() string { return proto.CompactTextString(m) } func (*MySQLStatementSendLongData) ProtoMessage() {} func (*MySQLStatementSendLongData) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{153} + return fileDescriptor_007ba1c3d6266d56, []int{154} } func (m *MySQLStatementSendLongData) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10924,7 +10981,7 @@ func (m *MySQLStatementClose) Reset() { *m = MySQLStatementClose{} } func (m *MySQLStatementClose) String() string { return proto.CompactTextString(m) } func (*MySQLStatementClose) ProtoMessage() {} func (*MySQLStatementClose) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{154} + return fileDescriptor_007ba1c3d6266d56, []int{155} } func (m *MySQLStatementClose) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10975,7 +11032,7 @@ func (m *MySQLStatementReset) Reset() { *m = MySQLStatementReset{} } func (m *MySQLStatementReset) String() string { return proto.CompactTextString(m) } func (*MySQLStatementReset) ProtoMessage() {} func (*MySQLStatementReset) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{155} + return fileDescriptor_007ba1c3d6266d56, []int{156} } func (m *MySQLStatementReset) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11028,7 +11085,7 @@ func (m *MySQLStatementFetch) Reset() { *m = MySQLStatementFetch{} } func (m *MySQLStatementFetch) String() string { return proto.CompactTextString(m) } func (*MySQLStatementFetch) ProtoMessage() {} func (*MySQLStatementFetch) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{156} + return fileDescriptor_007ba1c3d6266d56, []int{157} } func (m *MySQLStatementFetch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11081,7 +11138,7 @@ func (m *MySQLStatementBulkExecute) Reset() { *m = MySQLStatementBulkExe func (m *MySQLStatementBulkExecute) String() string { return proto.CompactTextString(m) } func (*MySQLStatementBulkExecute) ProtoMessage() {} func (*MySQLStatementBulkExecute) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{157} + return fileDescriptor_007ba1c3d6266d56, []int{158} } func (m *MySQLStatementBulkExecute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11132,7 +11189,7 @@ func (m *MySQLInitDB) Reset() { *m = MySQLInitDB{} } func (m *MySQLInitDB) String() string { return proto.CompactTextString(m) } func (*MySQLInitDB) ProtoMessage() {} func (*MySQLInitDB) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{158} + return fileDescriptor_007ba1c3d6266d56, []int{159} } func (m *MySQLInitDB) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11182,7 +11239,7 @@ func (m *MySQLCreateDB) Reset() { *m = MySQLCreateDB{} } func (m *MySQLCreateDB) String() string { return proto.CompactTextString(m) } func (*MySQLCreateDB) ProtoMessage() {} func (*MySQLCreateDB) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{159} + return fileDescriptor_007ba1c3d6266d56, []int{160} } func (m *MySQLCreateDB) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11232,7 +11289,7 @@ func (m *MySQLDropDB) Reset() { *m = MySQLDropDB{} } func (m *MySQLDropDB) String() string { return proto.CompactTextString(m) } func (*MySQLDropDB) ProtoMessage() {} func (*MySQLDropDB) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{160} + return fileDescriptor_007ba1c3d6266d56, []int{161} } func (m *MySQLDropDB) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11280,7 +11337,7 @@ func (m *MySQLShutDown) Reset() { *m = MySQLShutDown{} } func (m *MySQLShutDown) String() string { return proto.CompactTextString(m) } func (*MySQLShutDown) ProtoMessage() {} func (*MySQLShutDown) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{161} + return fileDescriptor_007ba1c3d6266d56, []int{162} } func (m *MySQLShutDown) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11331,7 +11388,7 @@ func (m *MySQLProcessKill) Reset() { *m = MySQLProcessKill{} } func (m *MySQLProcessKill) String() string { return proto.CompactTextString(m) } func (*MySQLProcessKill) ProtoMessage() {} func (*MySQLProcessKill) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{162} + return fileDescriptor_007ba1c3d6266d56, []int{163} } func (m *MySQLProcessKill) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11380,7 +11437,7 @@ func (m *MySQLDebug) Reset() { *m = MySQLDebug{} } func (m *MySQLDebug) String() string { return proto.CompactTextString(m) } func (*MySQLDebug) ProtoMessage() {} func (*MySQLDebug) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{163} + return fileDescriptor_007ba1c3d6266d56, []int{164} } func (m *MySQLDebug) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11430,7 +11487,7 @@ func (m *MySQLRefresh) Reset() { *m = MySQLRefresh{} } func (m *MySQLRefresh) String() string { return proto.CompactTextString(m) } func (*MySQLRefresh) ProtoMessage() {} func (*MySQLRefresh) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{164} + return fileDescriptor_007ba1c3d6266d56, []int{165} } func (m *MySQLRefresh) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11482,7 +11539,7 @@ func (m *SQLServerRPCRequest) Reset() { *m = SQLServerRPCRequest{} } func (m *SQLServerRPCRequest) String() string { return proto.CompactTextString(m) } func (*SQLServerRPCRequest) ProtoMessage() {} func (*SQLServerRPCRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{165} + return fileDescriptor_007ba1c3d6266d56, []int{166} } func (m *SQLServerRPCRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11532,7 +11589,7 @@ func (m *DatabaseSessionMalformedPacket) Reset() { *m = DatabaseSessionM func (m *DatabaseSessionMalformedPacket) String() string { return proto.CompactTextString(m) } func (*DatabaseSessionMalformedPacket) ProtoMessage() {} func (*DatabaseSessionMalformedPacket) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{166} + return fileDescriptor_007ba1c3d6266d56, []int{167} } func (m *DatabaseSessionMalformedPacket) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11599,7 +11656,7 @@ func (m *ElasticsearchRequest) Reset() { *m = ElasticsearchRequest{} } func (m *ElasticsearchRequest) String() string { return proto.CompactTextString(m) } func (*ElasticsearchRequest) ProtoMessage() {} func (*ElasticsearchRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{167} + return fileDescriptor_007ba1c3d6266d56, []int{168} } func (m *ElasticsearchRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11665,7 +11722,7 @@ func (m *OpenSearchRequest) Reset() { *m = OpenSearchRequest{} } func (m *OpenSearchRequest) String() string { return proto.CompactTextString(m) } func (*OpenSearchRequest) ProtoMessage() {} func (*OpenSearchRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{168} + return fileDescriptor_007ba1c3d6266d56, []int{169} } func (m *OpenSearchRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11725,7 +11782,7 @@ func (m *DynamoDBRequest) Reset() { *m = DynamoDBRequest{} } func (m *DynamoDBRequest) String() string { return proto.CompactTextString(m) } func (*DynamoDBRequest) ProtoMessage() {} func (*DynamoDBRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{169} + return fileDescriptor_007ba1c3d6266d56, []int{170} } func (m *DynamoDBRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11791,7 +11848,7 @@ func (m *AppSessionDynamoDBRequest) Reset() { *m = AppSessionDynamoDBReq func (m *AppSessionDynamoDBRequest) String() string { return proto.CompactTextString(m) } func (*AppSessionDynamoDBRequest) ProtoMessage() {} func (*AppSessionDynamoDBRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{170} + return fileDescriptor_007ba1c3d6266d56, []int{171} } func (m *AppSessionDynamoDBRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11833,7 +11890,7 @@ func (m *UpgradeWindowStartMetadata) Reset() { *m = UpgradeWindowStartMe func (m *UpgradeWindowStartMetadata) String() string { return proto.CompactTextString(m) } func (*UpgradeWindowStartMetadata) ProtoMessage() {} func (*UpgradeWindowStartMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{171} + return fileDescriptor_007ba1c3d6266d56, []int{172} } func (m *UpgradeWindowStartMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11881,7 +11938,7 @@ func (m *UpgradeWindowStartUpdate) Reset() { *m = UpgradeWindowStartUpda func (m *UpgradeWindowStartUpdate) String() string { return proto.CompactTextString(m) } func (*UpgradeWindowStartUpdate) ProtoMessage() {} func (*UpgradeWindowStartUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{172} + return fileDescriptor_007ba1c3d6266d56, []int{173} } func (m *UpgradeWindowStartUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11932,7 +11989,7 @@ func (m *SessionRecordingAccess) Reset() { *m = SessionRecordingAccess{} func (m *SessionRecordingAccess) String() string { return proto.CompactTextString(m) } func (*SessionRecordingAccess) ProtoMessage() {} func (*SessionRecordingAccess) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{173} + return fileDescriptor_007ba1c3d6266d56, []int{174} } func (m *SessionRecordingAccess) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11974,7 +12031,7 @@ func (m *KubeClusterMetadata) Reset() { *m = KubeClusterMetadata{} } func (m *KubeClusterMetadata) String() string { return proto.CompactTextString(m) } func (*KubeClusterMetadata) ProtoMessage() {} func (*KubeClusterMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{174} + return fileDescriptor_007ba1c3d6266d56, []int{175} } func (m *KubeClusterMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12022,7 +12079,7 @@ func (m *KubernetesClusterCreate) Reset() { *m = KubernetesClusterCreate func (m *KubernetesClusterCreate) String() string { return proto.CompactTextString(m) } func (*KubernetesClusterCreate) ProtoMessage() {} func (*KubernetesClusterCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{175} + return fileDescriptor_007ba1c3d6266d56, []int{176} } func (m *KubernetesClusterCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12070,7 +12127,7 @@ func (m *KubernetesClusterUpdate) Reset() { *m = KubernetesClusterUpdate func (m *KubernetesClusterUpdate) String() string { return proto.CompactTextString(m) } func (*KubernetesClusterUpdate) ProtoMessage() {} func (*KubernetesClusterUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{176} + return fileDescriptor_007ba1c3d6266d56, []int{177} } func (m *KubernetesClusterUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12116,7 +12173,7 @@ func (m *KubernetesClusterDelete) Reset() { *m = KubernetesClusterDelete func (m *KubernetesClusterDelete) String() string { return proto.CompactTextString(m) } func (*KubernetesClusterDelete) ProtoMessage() {} func (*KubernetesClusterDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{177} + return fileDescriptor_007ba1c3d6266d56, []int{178} } func (m *KubernetesClusterDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12179,7 +12236,7 @@ func (m *SSMRun) Reset() { *m = SSMRun{} } func (m *SSMRun) String() string { return proto.CompactTextString(m) } func (*SSMRun) ProtoMessage() {} func (*SSMRun) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{178} + return fileDescriptor_007ba1c3d6266d56, []int{179} } func (m *SSMRun) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12232,7 +12289,7 @@ func (m *CassandraPrepare) Reset() { *m = CassandraPrepare{} } func (m *CassandraPrepare) String() string { return proto.CompactTextString(m) } func (*CassandraPrepare) ProtoMessage() {} func (*CassandraPrepare) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{179} + return fileDescriptor_007ba1c3d6266d56, []int{180} } func (m *CassandraPrepare) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12282,7 +12339,7 @@ func (m *CassandraExecute) Reset() { *m = CassandraExecute{} } func (m *CassandraExecute) String() string { return proto.CompactTextString(m) } func (*CassandraExecute) ProtoMessage() {} func (*CassandraExecute) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{180} + return fileDescriptor_007ba1c3d6266d56, []int{181} } func (m *CassandraExecute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12338,7 +12395,7 @@ func (m *CassandraBatch) Reset() { *m = CassandraBatch{} } func (m *CassandraBatch) String() string { return proto.CompactTextString(m) } func (*CassandraBatch) ProtoMessage() {} func (*CassandraBatch) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{181} + return fileDescriptor_007ba1c3d6266d56, []int{182} } func (m *CassandraBatch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12384,7 +12441,7 @@ func (m *CassandraBatch_BatchChild) Reset() { *m = CassandraBatch_BatchC func (m *CassandraBatch_BatchChild) String() string { return proto.CompactTextString(m) } func (*CassandraBatch_BatchChild) ProtoMessage() {} func (*CassandraBatch_BatchChild) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{181, 0} + return fileDescriptor_007ba1c3d6266d56, []int{182, 0} } func (m *CassandraBatch_BatchChild) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12428,7 +12485,7 @@ func (m *CassandraBatch_BatchChild_Value) Reset() { *m = CassandraBatch_ func (m *CassandraBatch_BatchChild_Value) String() string { return proto.CompactTextString(m) } func (*CassandraBatch_BatchChild_Value) ProtoMessage() {} func (*CassandraBatch_BatchChild_Value) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{181, 0, 0} + return fileDescriptor_007ba1c3d6266d56, []int{182, 0, 0} } func (m *CassandraBatch_BatchChild_Value) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12479,7 +12536,7 @@ func (m *CassandraRegister) Reset() { *m = CassandraRegister{} } func (m *CassandraRegister) String() string { return proto.CompactTextString(m) } func (*CassandraRegister) ProtoMessage() {} func (*CassandraRegister) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{182} + return fileDescriptor_007ba1c3d6266d56, []int{183} } func (m *CassandraRegister) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12525,7 +12582,7 @@ func (m *LoginRuleCreate) Reset() { *m = LoginRuleCreate{} } func (m *LoginRuleCreate) String() string { return proto.CompactTextString(m) } func (*LoginRuleCreate) ProtoMessage() {} func (*LoginRuleCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{183} + return fileDescriptor_007ba1c3d6266d56, []int{184} } func (m *LoginRuleCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12571,7 +12628,7 @@ func (m *LoginRuleDelete) Reset() { *m = LoginRuleDelete{} } func (m *LoginRuleDelete) String() string { return proto.CompactTextString(m) } func (*LoginRuleDelete) ProtoMessage() {} func (*LoginRuleDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{184} + return fileDescriptor_007ba1c3d6266d56, []int{185} } func (m *LoginRuleDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12621,7 +12678,7 @@ func (m *SAMLIdPAuthAttempt) Reset() { *m = SAMLIdPAuthAttempt{} } func (m *SAMLIdPAuthAttempt) String() string { return proto.CompactTextString(m) } func (*SAMLIdPAuthAttempt) ProtoMessage() {} func (*SAMLIdPAuthAttempt) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{185} + return fileDescriptor_007ba1c3d6266d56, []int{186} } func (m *SAMLIdPAuthAttempt) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12667,7 +12724,7 @@ func (m *SAMLIdPServiceProviderCreate) Reset() { *m = SAMLIdPServiceProv func (m *SAMLIdPServiceProviderCreate) String() string { return proto.CompactTextString(m) } func (*SAMLIdPServiceProviderCreate) ProtoMessage() {} func (*SAMLIdPServiceProviderCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{186} + return fileDescriptor_007ba1c3d6266d56, []int{187} } func (m *SAMLIdPServiceProviderCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12713,7 +12770,7 @@ func (m *SAMLIdPServiceProviderUpdate) Reset() { *m = SAMLIdPServiceProv func (m *SAMLIdPServiceProviderUpdate) String() string { return proto.CompactTextString(m) } func (*SAMLIdPServiceProviderUpdate) ProtoMessage() {} func (*SAMLIdPServiceProviderUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{187} + return fileDescriptor_007ba1c3d6266d56, []int{188} } func (m *SAMLIdPServiceProviderUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12759,7 +12816,7 @@ func (m *SAMLIdPServiceProviderDelete) Reset() { *m = SAMLIdPServiceProv func (m *SAMLIdPServiceProviderDelete) String() string { return proto.CompactTextString(m) } func (*SAMLIdPServiceProviderDelete) ProtoMessage() {} func (*SAMLIdPServiceProviderDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{188} + return fileDescriptor_007ba1c3d6266d56, []int{189} } func (m *SAMLIdPServiceProviderDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12803,7 +12860,7 @@ func (m *SAMLIdPServiceProviderDeleteAll) Reset() { *m = SAMLIdPServiceP func (m *SAMLIdPServiceProviderDeleteAll) String() string { return proto.CompactTextString(m) } func (*SAMLIdPServiceProviderDeleteAll) ProtoMessage() {} func (*SAMLIdPServiceProviderDeleteAll) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{189} + return fileDescriptor_007ba1c3d6266d56, []int{190} } func (m *SAMLIdPServiceProviderDeleteAll) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12849,7 +12906,7 @@ func (m *OktaResourcesUpdate) Reset() { *m = OktaResourcesUpdate{} } func (m *OktaResourcesUpdate) String() string { return proto.CompactTextString(m) } func (*OktaResourcesUpdate) ProtoMessage() {} func (*OktaResourcesUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{190} + return fileDescriptor_007ba1c3d6266d56, []int{191} } func (m *OktaResourcesUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12895,7 +12952,7 @@ func (m *OktaSyncFailure) Reset() { *m = OktaSyncFailure{} } func (m *OktaSyncFailure) String() string { return proto.CompactTextString(m) } func (*OktaSyncFailure) ProtoMessage() {} func (*OktaSyncFailure) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{191} + return fileDescriptor_007ba1c3d6266d56, []int{192} } func (m *OktaSyncFailure) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12945,7 +13002,7 @@ func (m *OktaAssignmentResult) Reset() { *m = OktaAssignmentResult{} } func (m *OktaAssignmentResult) String() string { return proto.CompactTextString(m) } func (*OktaAssignmentResult) ProtoMessage() {} func (*OktaAssignmentResult) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{192} + return fileDescriptor_007ba1c3d6266d56, []int{193} } func (m *OktaAssignmentResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12991,7 +13048,7 @@ func (m *AccessListCreate) Reset() { *m = AccessListCreate{} } func (m *AccessListCreate) String() string { return proto.CompactTextString(m) } func (*AccessListCreate) ProtoMessage() {} func (*AccessListCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{193} + return fileDescriptor_007ba1c3d6266d56, []int{194} } func (m *AccessListCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13037,7 +13094,7 @@ func (m *AccessListUpdate) Reset() { *m = AccessListUpdate{} } func (m *AccessListUpdate) String() string { return proto.CompactTextString(m) } func (*AccessListUpdate) ProtoMessage() {} func (*AccessListUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{194} + return fileDescriptor_007ba1c3d6266d56, []int{195} } func (m *AccessListUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13083,7 +13140,7 @@ func (m *AccessListDelete) Reset() { *m = AccessListDelete{} } func (m *AccessListDelete) String() string { return proto.CompactTextString(m) } func (*AccessListDelete) ProtoMessage() {} func (*AccessListDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{195} + return fileDescriptor_007ba1c3d6266d56, []int{196} } func (m *AccessListDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13131,7 +13188,7 @@ func (m *AccessListMemberCreate) Reset() { *m = AccessListMemberCreate{} func (m *AccessListMemberCreate) String() string { return proto.CompactTextString(m) } func (*AccessListMemberCreate) ProtoMessage() {} func (*AccessListMemberCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{196} + return fileDescriptor_007ba1c3d6266d56, []int{197} } func (m *AccessListMemberCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13179,7 +13236,7 @@ func (m *AccessListMemberUpdate) Reset() { *m = AccessListMemberUpdate{} func (m *AccessListMemberUpdate) String() string { return proto.CompactTextString(m) } func (*AccessListMemberUpdate) ProtoMessage() {} func (*AccessListMemberUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{197} + return fileDescriptor_007ba1c3d6266d56, []int{198} } func (m *AccessListMemberUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13227,7 +13284,7 @@ func (m *AccessListMemberDelete) Reset() { *m = AccessListMemberDelete{} func (m *AccessListMemberDelete) String() string { return proto.CompactTextString(m) } func (*AccessListMemberDelete) ProtoMessage() {} func (*AccessListMemberDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{198} + return fileDescriptor_007ba1c3d6266d56, []int{199} } func (m *AccessListMemberDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13277,7 +13334,7 @@ func (m *AccessListMemberDeleteAllForAccessList) Reset() { func (m *AccessListMemberDeleteAllForAccessList) String() string { return proto.CompactTextString(m) } func (*AccessListMemberDeleteAllForAccessList) ProtoMessage() {} func (*AccessListMemberDeleteAllForAccessList) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{199} + return fileDescriptor_007ba1c3d6266d56, []int{200} } func (m *AccessListMemberDeleteAllForAccessList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13325,7 +13382,7 @@ func (m *AccessListReview) Reset() { *m = AccessListReview{} } func (m *AccessListReview) String() string { return proto.CompactTextString(m) } func (*AccessListReview) ProtoMessage() {} func (*AccessListReview) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{200} + return fileDescriptor_007ba1c3d6266d56, []int{201} } func (m *AccessListReview) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13373,7 +13430,7 @@ func (m *AuditQueryRun) Reset() { *m = AuditQueryRun{} } func (m *AuditQueryRun) String() string { return proto.CompactTextString(m) } func (*AuditQueryRun) ProtoMessage() {} func (*AuditQueryRun) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{201} + return fileDescriptor_007ba1c3d6266d56, []int{202} } func (m *AuditQueryRun) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13423,7 +13480,7 @@ func (m *AuditQueryDetails) Reset() { *m = AuditQueryDetails{} } func (m *AuditQueryDetails) String() string { return proto.CompactTextString(m) } func (*AuditQueryDetails) ProtoMessage() {} func (*AuditQueryDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{202} + return fileDescriptor_007ba1c3d6266d56, []int{203} } func (m *AuditQueryDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13479,7 +13536,7 @@ func (m *SecurityReportRun) Reset() { *m = SecurityReportRun{} } func (m *SecurityReportRun) String() string { return proto.CompactTextString(m) } func (*SecurityReportRun) ProtoMessage() {} func (*SecurityReportRun) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{203} + return fileDescriptor_007ba1c3d6266d56, []int{204} } func (m *SecurityReportRun) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13527,7 +13584,7 @@ func (m *ExternalAuditStorageEnable) Reset() { *m = ExternalAuditStorage func (m *ExternalAuditStorageEnable) String() string { return proto.CompactTextString(m) } func (*ExternalAuditStorageEnable) ProtoMessage() {} func (*ExternalAuditStorageEnable) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{204} + return fileDescriptor_007ba1c3d6266d56, []int{205} } func (m *ExternalAuditStorageEnable) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13575,7 +13632,7 @@ func (m *ExternalAuditStorageDisable) Reset() { *m = ExternalAuditStorag func (m *ExternalAuditStorageDisable) String() string { return proto.CompactTextString(m) } func (*ExternalAuditStorageDisable) ProtoMessage() {} func (*ExternalAuditStorageDisable) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{205} + return fileDescriptor_007ba1c3d6266d56, []int{206} } func (m *ExternalAuditStorageDisable) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13636,7 +13693,7 @@ func (m *ExternalAuditStorageDetails) Reset() { *m = ExternalAuditStorag func (m *ExternalAuditStorageDetails) String() string { return proto.CompactTextString(m) } func (*ExternalAuditStorageDetails) ProtoMessage() {} func (*ExternalAuditStorageDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{206} + return fileDescriptor_007ba1c3d6266d56, []int{207} } func (m *ExternalAuditStorageDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13694,7 +13751,7 @@ func (m *OktaAccessListSync) Reset() { *m = OktaAccessListSync{} } func (m *OktaAccessListSync) String() string { return proto.CompactTextString(m) } func (*OktaAccessListSync) ProtoMessage() {} func (*OktaAccessListSync) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{207} + return fileDescriptor_007ba1c3d6266d56, []int{208} } func (m *OktaAccessListSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13758,7 +13815,7 @@ func (m *OktaUserSync) Reset() { *m = OktaUserSync{} } func (m *OktaUserSync) String() string { return proto.CompactTextString(m) } func (*OktaUserSync) ProtoMessage() {} func (*OktaUserSync) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{208} + return fileDescriptor_007ba1c3d6266d56, []int{209} } func (m *OktaUserSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13828,7 +13885,7 @@ func (m *SPIFFESVIDIssued) Reset() { *m = SPIFFESVIDIssued{} } func (m *SPIFFESVIDIssued) String() string { return proto.CompactTextString(m) } func (*SPIFFESVIDIssued) ProtoMessage() {} func (*SPIFFESVIDIssued) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{209} + return fileDescriptor_007ba1c3d6266d56, []int{210} } func (m *SPIFFESVIDIssued) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13879,7 +13936,7 @@ func (m *AuthPreferenceUpdate) Reset() { *m = AuthPreferenceUpdate{} } func (m *AuthPreferenceUpdate) String() string { return proto.CompactTextString(m) } func (*AuthPreferenceUpdate) ProtoMessage() {} func (*AuthPreferenceUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{210} + return fileDescriptor_007ba1c3d6266d56, []int{211} } func (m *AuthPreferenceUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13927,7 +13984,7 @@ func (m *ClusterNetworkingConfigUpdate) Reset() { *m = ClusterNetworking func (m *ClusterNetworkingConfigUpdate) String() string { return proto.CompactTextString(m) } func (*ClusterNetworkingConfigUpdate) ProtoMessage() {} func (*ClusterNetworkingConfigUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{211} + return fileDescriptor_007ba1c3d6266d56, []int{212} } func (m *ClusterNetworkingConfigUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13975,7 +14032,7 @@ func (m *SessionRecordingConfigUpdate) Reset() { *m = SessionRecordingCo func (m *SessionRecordingConfigUpdate) String() string { return proto.CompactTextString(m) } func (*SessionRecordingConfigUpdate) ProtoMessage() {} func (*SessionRecordingConfigUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{212} + return fileDescriptor_007ba1c3d6266d56, []int{213} } func (m *SessionRecordingConfigUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14025,7 +14082,7 @@ func (m *AccessPathChanged) Reset() { *m = AccessPathChanged{} } func (m *AccessPathChanged) String() string { return proto.CompactTextString(m) } func (*AccessPathChanged) ProtoMessage() {} func (*AccessPathChanged) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{213} + return fileDescriptor_007ba1c3d6266d56, []int{214} } func (m *AccessPathChanged) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14079,7 +14136,7 @@ func (m *SpannerRPC) Reset() { *m = SpannerRPC{} } func (m *SpannerRPC) String() string { return proto.CompactTextString(m) } func (*SpannerRPC) ProtoMessage() {} func (*SpannerRPC) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{214} + return fileDescriptor_007ba1c3d6266d56, []int{215} } func (m *SpannerRPC) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14127,7 +14184,7 @@ func (m *AccessGraphSettingsUpdate) Reset() { *m = AccessGraphSettingsUp func (m *AccessGraphSettingsUpdate) String() string { return proto.CompactTextString(m) } func (*AccessGraphSettingsUpdate) ProtoMessage() {} func (*AccessGraphSettingsUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{215} + return fileDescriptor_007ba1c3d6266d56, []int{216} } func (m *AccessGraphSettingsUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14175,7 +14232,7 @@ func (m *SPIFFEFederationCreate) Reset() { *m = SPIFFEFederationCreate{} func (m *SPIFFEFederationCreate) String() string { return proto.CompactTextString(m) } func (*SPIFFEFederationCreate) ProtoMessage() {} func (*SPIFFEFederationCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{216} + return fileDescriptor_007ba1c3d6266d56, []int{217} } func (m *SPIFFEFederationCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14223,7 +14280,7 @@ func (m *SPIFFEFederationDelete) Reset() { *m = SPIFFEFederationDelete{} func (m *SPIFFEFederationDelete) String() string { return proto.CompactTextString(m) } func (*SPIFFEFederationDelete) ProtoMessage() {} func (*SPIFFEFederationDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{217} + return fileDescriptor_007ba1c3d6266d56, []int{218} } func (m *SPIFFEFederationDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14273,7 +14330,7 @@ func (m *AutoUpdateConfigCreate) Reset() { *m = AutoUpdateConfigCreate{} func (m *AutoUpdateConfigCreate) String() string { return proto.CompactTextString(m) } func (*AutoUpdateConfigCreate) ProtoMessage() {} func (*AutoUpdateConfigCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{218} + return fileDescriptor_007ba1c3d6266d56, []int{219} } func (m *AutoUpdateConfigCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14323,7 +14380,7 @@ func (m *AutoUpdateConfigUpdate) Reset() { *m = AutoUpdateConfigUpdate{} func (m *AutoUpdateConfigUpdate) String() string { return proto.CompactTextString(m) } func (*AutoUpdateConfigUpdate) ProtoMessage() {} func (*AutoUpdateConfigUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{219} + return fileDescriptor_007ba1c3d6266d56, []int{220} } func (m *AutoUpdateConfigUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14373,7 +14430,7 @@ func (m *AutoUpdateConfigDelete) Reset() { *m = AutoUpdateConfigDelete{} func (m *AutoUpdateConfigDelete) String() string { return proto.CompactTextString(m) } func (*AutoUpdateConfigDelete) ProtoMessage() {} func (*AutoUpdateConfigDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{220} + return fileDescriptor_007ba1c3d6266d56, []int{221} } func (m *AutoUpdateConfigDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14423,7 +14480,7 @@ func (m *AutoUpdateVersionCreate) Reset() { *m = AutoUpdateVersionCreate func (m *AutoUpdateVersionCreate) String() string { return proto.CompactTextString(m) } func (*AutoUpdateVersionCreate) ProtoMessage() {} func (*AutoUpdateVersionCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{221} + return fileDescriptor_007ba1c3d6266d56, []int{222} } func (m *AutoUpdateVersionCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14473,7 +14530,7 @@ func (m *AutoUpdateVersionUpdate) Reset() { *m = AutoUpdateVersionUpdate func (m *AutoUpdateVersionUpdate) String() string { return proto.CompactTextString(m) } func (*AutoUpdateVersionUpdate) ProtoMessage() {} func (*AutoUpdateVersionUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{222} + return fileDescriptor_007ba1c3d6266d56, []int{223} } func (m *AutoUpdateVersionUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14523,7 +14580,7 @@ func (m *AutoUpdateVersionDelete) Reset() { *m = AutoUpdateVersionDelete func (m *AutoUpdateVersionDelete) String() string { return proto.CompactTextString(m) } func (*AutoUpdateVersionDelete) ProtoMessage() {} func (*AutoUpdateVersionDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{223} + return fileDescriptor_007ba1c3d6266d56, []int{224} } func (m *AutoUpdateVersionDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14573,7 +14630,7 @@ func (m *StaticHostUserCreate) Reset() { *m = StaticHostUserCreate{} } func (m *StaticHostUserCreate) String() string { return proto.CompactTextString(m) } func (*StaticHostUserCreate) ProtoMessage() {} func (*StaticHostUserCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{224} + return fileDescriptor_007ba1c3d6266d56, []int{225} } func (m *StaticHostUserCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14623,7 +14680,7 @@ func (m *StaticHostUserUpdate) Reset() { *m = StaticHostUserUpdate{} } func (m *StaticHostUserUpdate) String() string { return proto.CompactTextString(m) } func (*StaticHostUserUpdate) ProtoMessage() {} func (*StaticHostUserUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{225} + return fileDescriptor_007ba1c3d6266d56, []int{226} } func (m *StaticHostUserUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14673,7 +14730,7 @@ func (m *StaticHostUserDelete) Reset() { *m = StaticHostUserDelete{} } func (m *StaticHostUserDelete) String() string { return proto.CompactTextString(m) } func (*StaticHostUserDelete) ProtoMessage() {} func (*StaticHostUserDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{226} + return fileDescriptor_007ba1c3d6266d56, []int{227} } func (m *StaticHostUserDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14725,7 +14782,7 @@ func (m *CrownJewelCreate) Reset() { *m = CrownJewelCreate{} } func (m *CrownJewelCreate) String() string { return proto.CompactTextString(m) } func (*CrownJewelCreate) ProtoMessage() {} func (*CrownJewelCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{227} + return fileDescriptor_007ba1c3d6266d56, []int{228} } func (m *CrownJewelCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14779,7 +14836,7 @@ func (m *CrownJewelUpdate) Reset() { *m = CrownJewelUpdate{} } func (m *CrownJewelUpdate) String() string { return proto.CompactTextString(m) } func (*CrownJewelUpdate) ProtoMessage() {} func (*CrownJewelUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{228} + return fileDescriptor_007ba1c3d6266d56, []int{229} } func (m *CrownJewelUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14829,7 +14886,7 @@ func (m *CrownJewelDelete) Reset() { *m = CrownJewelDelete{} } func (m *CrownJewelDelete) String() string { return proto.CompactTextString(m) } func (*CrownJewelDelete) ProtoMessage() {} func (*CrownJewelDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{229} + return fileDescriptor_007ba1c3d6266d56, []int{230} } func (m *CrownJewelDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14881,7 +14938,7 @@ func (m *UserTaskCreate) Reset() { *m = UserTaskCreate{} } func (m *UserTaskCreate) String() string { return proto.CompactTextString(m) } func (*UserTaskCreate) ProtoMessage() {} func (*UserTaskCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{230} + return fileDescriptor_007ba1c3d6266d56, []int{231} } func (m *UserTaskCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14937,7 +14994,7 @@ func (m *UserTaskUpdate) Reset() { *m = UserTaskUpdate{} } func (m *UserTaskUpdate) String() string { return proto.CompactTextString(m) } func (*UserTaskUpdate) ProtoMessage() {} func (*UserTaskUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{231} + return fileDescriptor_007ba1c3d6266d56, []int{232} } func (m *UserTaskUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14983,7 +15040,7 @@ func (m *UserTaskMetadata) Reset() { *m = UserTaskMetadata{} } func (m *UserTaskMetadata) String() string { return proto.CompactTextString(m) } func (*UserTaskMetadata) ProtoMessage() {} func (*UserTaskMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{232} + return fileDescriptor_007ba1c3d6266d56, []int{233} } func (m *UserTaskMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15033,7 +15090,7 @@ func (m *UserTaskDelete) Reset() { *m = UserTaskDelete{} } func (m *UserTaskDelete) String() string { return proto.CompactTextString(m) } func (*UserTaskDelete) ProtoMessage() {} func (*UserTaskDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{233} + return fileDescriptor_007ba1c3d6266d56, []int{234} } func (m *UserTaskDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15083,7 +15140,7 @@ func (m *WorkloadIdentityCreate) Reset() { *m = WorkloadIdentityCreate{} func (m *WorkloadIdentityCreate) String() string { return proto.CompactTextString(m) } func (*WorkloadIdentityCreate) ProtoMessage() {} func (*WorkloadIdentityCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{234} + return fileDescriptor_007ba1c3d6266d56, []int{235} } func (m *WorkloadIdentityCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15133,7 +15190,7 @@ func (m *WorkloadIdentityUpdate) Reset() { *m = WorkloadIdentityUpdate{} func (m *WorkloadIdentityUpdate) String() string { return proto.CompactTextString(m) } func (*WorkloadIdentityUpdate) ProtoMessage() {} func (*WorkloadIdentityUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{235} + return fileDescriptor_007ba1c3d6266d56, []int{236} } func (m *WorkloadIdentityUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15181,7 +15238,7 @@ func (m *WorkloadIdentityDelete) Reset() { *m = WorkloadIdentityDelete{} func (m *WorkloadIdentityDelete) String() string { return proto.CompactTextString(m) } func (*WorkloadIdentityDelete) ProtoMessage() {} func (*WorkloadIdentityDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{236} + return fileDescriptor_007ba1c3d6266d56, []int{237} } func (m *WorkloadIdentityDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15227,7 +15284,7 @@ func (m *AccessListInvalidMetadata) Reset() { *m = AccessListInvalidMeta func (m *AccessListInvalidMetadata) String() string { return proto.CompactTextString(m) } func (*AccessListInvalidMetadata) ProtoMessage() {} func (*AccessListInvalidMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{237} + return fileDescriptor_007ba1c3d6266d56, []int{238} } func (m *AccessListInvalidMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15275,7 +15332,7 @@ func (m *UserLoginAccessListInvalid) Reset() { *m = UserLoginAccessListI func (m *UserLoginAccessListInvalid) String() string { return proto.CompactTextString(m) } func (*UserLoginAccessListInvalid) ProtoMessage() {} func (*UserLoginAccessListInvalid) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{238} + return fileDescriptor_007ba1c3d6266d56, []int{239} } func (m *UserLoginAccessListInvalid) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15329,7 +15386,7 @@ func (m *ContactCreate) Reset() { *m = ContactCreate{} } func (m *ContactCreate) String() string { return proto.CompactTextString(m) } func (*ContactCreate) ProtoMessage() {} func (*ContactCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{239} + return fileDescriptor_007ba1c3d6266d56, []int{240} } func (m *ContactCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15383,7 +15440,7 @@ func (m *ContactDelete) Reset() { *m = ContactDelete{} } func (m *ContactDelete) String() string { return proto.CompactTextString(m) } func (*ContactDelete) ProtoMessage() {} func (*ContactDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{240} + return fileDescriptor_007ba1c3d6266d56, []int{241} } func (m *ContactDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15412,6 +15469,113 @@ func (m *ContactDelete) XXX_DiscardUnknown() { var xxx_messageInfo_ContactDelete proto.InternalMessageInfo +// GitCommand is emitted when a user performs a Git fetch or push command. +type GitCommand struct { + // Metadata is a common event metadata + Metadata `protobuf:"bytes,1,opt,name=Metadata,proto3,embedded=Metadata" json:""` + // User is a common user event metadata + UserMetadata `protobuf:"bytes,2,opt,name=User,proto3,embedded=User" json:""` + // ConnectionMetadata holds information about the connection + ConnectionMetadata `protobuf:"bytes,3,opt,name=Connection,proto3,embedded=Connection" json:""` + // SessionMetadata is a common event session metadata + SessionMetadata `protobuf:"bytes,4,opt,name=Session,proto3,embedded=Session" json:""` + // ServerMetadata is a common server metadata + ServerMetadata `protobuf:"bytes,5,opt,name=Server,proto3,embedded=Server" json:""` + // CommandMetadata is a common command metadata + CommandMetadata `protobuf:"bytes,6,opt,name=Command,proto3,embedded=Command" json:""` + // Service is the type of the git request like git-upload-pack or + // git-receive-pack. + Service string `protobuf:"bytes,8,opt,name=service,proto3" json:"service"` + // Path is the Git repo path, usually /. + Path string `protobuf:"bytes,9,opt,name=path,proto3" json:"path"` + // Actions defines details for a Git push. + Actions []*GitCommandAction `protobuf:"bytes,10,rep,name=actions,proto3" json:"actions,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GitCommand) Reset() { *m = GitCommand{} } +func (m *GitCommand) String() string { return proto.CompactTextString(m) } +func (*GitCommand) ProtoMessage() {} +func (*GitCommand) Descriptor() ([]byte, []int) { + return fileDescriptor_007ba1c3d6266d56, []int{242} +} +func (m *GitCommand) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GitCommand) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GitCommand.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 *GitCommand) XXX_Merge(src proto.Message) { + xxx_messageInfo_GitCommand.Merge(m, src) +} +func (m *GitCommand) XXX_Size() int { + return m.Size() +} +func (m *GitCommand) XXX_DiscardUnknown() { + xxx_messageInfo_GitCommand.DiscardUnknown(m) +} + +var xxx_messageInfo_GitCommand proto.InternalMessageInfo + +// GitCommandAction defines details for a Git push. +type GitCommandAction struct { + // Action type like create or update. + Action string `protobuf:"bytes,1,opt,name=Action,proto3" json:"action,omitempty"` + // Reference name like ref/main/my_branch. + Reference string `protobuf:"bytes,2,opt,name=Reference,proto3" json:"reference,omitempty"` + // Old is the old hash. + Old string `protobuf:"bytes,3,opt,name=Old,proto3" json:"old,omitempty"` + // New is the new hash. + New string `protobuf:"bytes,4,opt,name=New,proto3" json:"new,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GitCommandAction) Reset() { *m = GitCommandAction{} } +func (m *GitCommandAction) String() string { return proto.CompactTextString(m) } +func (*GitCommandAction) ProtoMessage() {} +func (*GitCommandAction) Descriptor() ([]byte, []int) { + return fileDescriptor_007ba1c3d6266d56, []int{243} +} +func (m *GitCommandAction) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GitCommandAction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GitCommandAction.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 *GitCommandAction) XXX_Merge(src proto.Message) { + xxx_messageInfo_GitCommandAction.Merge(m, src) +} +func (m *GitCommandAction) XXX_Size() int { + return m.Size() +} +func (m *GitCommandAction) XXX_DiscardUnknown() { + xxx_messageInfo_GitCommandAction.DiscardUnknown(m) +} + +var xxx_messageInfo_GitCommandAction proto.InternalMessageInfo + func init() { proto.RegisterEnum("events.UserKind", UserKind_name, UserKind_value) proto.RegisterEnum("events.EventAction", EventAction_name, EventAction_value) @@ -15572,6 +15736,7 @@ func init() { proto.RegisterType((*IntegrationMetadata)(nil), "events.IntegrationMetadata") proto.RegisterType((*AWSOIDCIntegrationMetadata)(nil), "events.AWSOIDCIntegrationMetadata") proto.RegisterType((*AzureOIDCIntegrationMetadata)(nil), "events.AzureOIDCIntegrationMetadata") + proto.RegisterType((*GitHubIntegrationMetadata)(nil), "events.GitHubIntegrationMetadata") proto.RegisterType((*PluginCreate)(nil), "events.PluginCreate") proto.RegisterType((*PluginUpdate)(nil), "events.PluginUpdate") proto.RegisterType((*PluginDelete)(nil), "events.PluginDelete") @@ -15678,6 +15843,8 @@ func init() { proto.RegisterType((*UserLoginAccessListInvalid)(nil), "events.UserLoginAccessListInvalid") proto.RegisterType((*ContactCreate)(nil), "events.ContactCreate") proto.RegisterType((*ContactDelete)(nil), "events.ContactDelete") + proto.RegisterType((*GitCommand)(nil), "events.GitCommand") + proto.RegisterType((*GitCommandAction)(nil), "events.GitCommandAction") } func init() { @@ -15685,1098 +15852,1114 @@ func init() { } var fileDescriptor_007ba1c3d6266d56 = []byte{ - // 17452 bytes of a gzipped FileDescriptorProto + // 17697 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x78, 0x25, 0xc9, 0x75, 0x18, 0x86, 0xfb, 0xc0, 0x05, 0x70, 0xf0, 0x18, 0x4c, 0xcd, 0xab, 0x67, 0x76, 0x66, 0xef, - 0x6e, 0xef, 0x72, 0x38, 0xb3, 0xdc, 0xc5, 0x70, 0x67, 0x67, 0x77, 0xb9, 0x2f, 0x2e, 0x2f, 0x70, - 0x81, 0xc1, 0x9d, 0xc1, 0x6b, 0xfb, 0x62, 0x66, 0xb8, 0x94, 0xc8, 0xab, 0xc6, 0xed, 0x1a, 0xa0, - 0x77, 0xee, 0xed, 0xbe, 0xea, 0xee, 0x3b, 0x18, 0xac, 0xf3, 0x10, 0x1d, 0x59, 0x96, 0x6c, 0x8a, + 0x6e, 0x2f, 0x77, 0x38, 0xb3, 0xdc, 0xc5, 0x70, 0x67, 0x67, 0x77, 0xb9, 0x2f, 0x2e, 0x2f, 0x70, + 0x81, 0xc1, 0x9d, 0xc1, 0x6b, 0xfb, 0x62, 0x66, 0xb8, 0xa4, 0xc8, 0xab, 0xc6, 0xed, 0x1a, 0xa0, + 0x77, 0xee, 0xed, 0xbe, 0xea, 0xee, 0x3b, 0x18, 0xac, 0xf3, 0x10, 0x6d, 0x59, 0x96, 0x6c, 0x8a, 0x66, 0xa8, 0x48, 0x94, 0x65, 0x3b, 0xa1, 0xec, 0x38, 0x91, 0x65, 0x59, 0x8c, 0x1c, 0x45, 0x12, - 0x25, 0x31, 0x96, 0x4c, 0xc7, 0xa6, 0xa4, 0x58, 0x9f, 0xe4, 0x24, 0x8e, 0xbf, 0xc4, 0x01, 0x1d, - 0x25, 0xfe, 0x83, 0x2f, 0xc9, 0xa7, 0x24, 0xfc, 0x62, 0xc6, 0xb1, 0xf3, 0xf9, 0xab, 0x53, 0xd5, - 0xdd, 0xd5, 0xaf, 0x8b, 0xe7, 0x0a, 0x0b, 0x0e, 0xfe, 0xcc, 0xe0, 0x9e, 0x73, 0xea, 0x54, 0xf5, - 0xa9, 0x53, 0x55, 0xa7, 0xaa, 0x4e, 0x9d, 0x03, 0x57, 0x3d, 0xda, 0xa2, 0x1d, 0xdb, 0xf1, 0xae, - 0xb5, 0xe8, 0xaa, 0xde, 0xdc, 0xb8, 0xe6, 0x6d, 0x74, 0xa8, 0x7b, 0x8d, 0x3e, 0xa4, 0x96, 0xe7, - 0xff, 0x37, 0xd1, 0x71, 0x6c, 0xcf, 0x26, 0x25, 0xfe, 0xeb, 0xc2, 0xe9, 0x55, 0x7b, 0xd5, 0x46, - 0xd0, 0x35, 0xf6, 0x17, 0xc7, 0x5e, 0xb8, 0xb8, 0x6a, 0xdb, 0xab, 0x2d, 0x7a, 0x0d, 0x7f, 0xad, - 0x74, 0xef, 0x5f, 0x73, 0x3d, 0xa7, 0xdb, 0xf4, 0x04, 0xb6, 0x1c, 0xc7, 0x7a, 0x66, 0x9b, 0xba, - 0x9e, 0xde, 0xee, 0x08, 0x82, 0x27, 0xe3, 0x04, 0xeb, 0x8e, 0xde, 0xe9, 0x50, 0x47, 0x54, 0x7e, - 0xe1, 0xa3, 0x41, 0x3b, 0xf5, 0x66, 0x93, 0xba, 0x6e, 0xcb, 0x74, 0xbd, 0x6b, 0x0f, 0x5f, 0x94, - 0x7e, 0x09, 0xc2, 0xa7, 0xd3, 0x3f, 0x08, 0xff, 0x15, 0x24, 0x2f, 0xa4, 0x93, 0xf8, 0x35, 0xc6, - 0xaa, 0x56, 0xbf, 0x9c, 0x87, 0xc1, 0x79, 0xea, 0xe9, 0x86, 0xee, 0xe9, 0xe4, 0x22, 0xf4, 0xd7, - 0x2c, 0x83, 0x3e, 0x52, 0x72, 0x4f, 0xe5, 0xae, 0x14, 0x26, 0x4b, 0x5b, 0x9b, 0xe5, 0x3c, 0x35, - 0x35, 0x0e, 0x24, 0x97, 0xa0, 0xb8, 0xbc, 0xd1, 0xa1, 0x4a, 0xfe, 0xa9, 0xdc, 0x95, 0xa1, 0xc9, - 0xa1, 0xad, 0xcd, 0x72, 0x3f, 0x0a, 0x4d, 0x43, 0x30, 0x79, 0x1a, 0xf2, 0xb5, 0xaa, 0x52, 0x40, - 0xe4, 0xc9, 0xad, 0xcd, 0xf2, 0x68, 0xd7, 0x34, 0x9e, 0xb7, 0xdb, 0xa6, 0x47, 0xdb, 0x1d, 0x6f, - 0x43, 0xcb, 0xd7, 0xaa, 0xe4, 0x32, 0x14, 0xa7, 0x6c, 0x83, 0x2a, 0x45, 0x24, 0x22, 0x5b, 0x9b, - 0xe5, 0xb1, 0xa6, 0x6d, 0x50, 0x89, 0x0a, 0xf1, 0xe4, 0x53, 0x50, 0x5c, 0x36, 0xdb, 0x54, 0xe9, - 0x7f, 0x2a, 0x77, 0x65, 0xf8, 0xfa, 0x85, 0x09, 0x2e, 0xbe, 0x09, 0x5f, 0x7c, 0x13, 0xcb, 0xbe, - 0x7c, 0x27, 0xc7, 0xbf, 0xb5, 0x59, 0xee, 0xdb, 0xda, 0x2c, 0x17, 0x99, 0xc8, 0xbf, 0xf4, 0xed, - 0x72, 0x4e, 0xc3, 0x92, 0xe4, 0x4d, 0x18, 0x9e, 0x6a, 0x75, 0x5d, 0x8f, 0x3a, 0x0b, 0x7a, 0x9b, - 0x2a, 0x25, 0xac, 0xf0, 0xc2, 0xd6, 0x66, 0xf9, 0x6c, 0x93, 0x83, 0x1b, 0x96, 0xde, 0x96, 0x2b, - 0x96, 0xc9, 0xd5, 0x5f, 0xcb, 0xc1, 0x89, 0x3a, 0x75, 0x5d, 0xd3, 0xb6, 0x02, 0xd9, 0x7c, 0x04, - 0x86, 0x04, 0xa8, 0x56, 0x45, 0xf9, 0x0c, 0x4d, 0x0e, 0x6c, 0x6d, 0x96, 0x0b, 0xae, 0x69, 0x68, - 0x21, 0x86, 0x7c, 0x1c, 0x06, 0xee, 0x99, 0xde, 0xda, 0xfc, 0x4c, 0x45, 0xc8, 0xe9, 0xec, 0xd6, - 0x66, 0x99, 0xac, 0x9b, 0xde, 0x5a, 0xa3, 0x7d, 0x5f, 0x97, 0x2a, 0xf4, 0xc9, 0xc8, 0x1c, 0x8c, - 0x2f, 0x39, 0xe6, 0x43, 0xdd, 0xa3, 0xb7, 0xe9, 0xc6, 0x92, 0xdd, 0x32, 0x9b, 0x1b, 0x42, 0x8a, - 0x4f, 0x6d, 0x6d, 0x96, 0x2f, 0x76, 0x38, 0xae, 0xf1, 0x80, 0x6e, 0x34, 0x3a, 0x88, 0x95, 0x98, - 0x24, 0x4a, 0xaa, 0xbf, 0x5e, 0x82, 0x91, 0x3b, 0x2e, 0x75, 0x82, 0x76, 0x5f, 0x86, 0x22, 0xfb, - 0x2d, 0x9a, 0x8c, 0x32, 0xef, 0xba, 0xd4, 0x91, 0x65, 0xce, 0xf0, 0xe4, 0x2a, 0xf4, 0xcf, 0xd9, - 0xab, 0xa6, 0x25, 0x9a, 0x7d, 0x6a, 0x6b, 0xb3, 0x7c, 0xa2, 0xc5, 0x00, 0x12, 0x25, 0xa7, 0x20, - 0x9f, 0x84, 0x91, 0x5a, 0x9b, 0xe9, 0x90, 0x6d, 0xe9, 0x9e, 0xed, 0x88, 0xd6, 0xa2, 0x74, 0x4d, - 0x09, 0x2e, 0x15, 0x8c, 0xd0, 0x93, 0xd7, 0x01, 0x2a, 0xf7, 0xea, 0x9a, 0xdd, 0xa2, 0x15, 0x6d, - 0x41, 0x28, 0x03, 0x96, 0xd6, 0xd7, 0xdd, 0x86, 0x63, 0xb7, 0x68, 0x43, 0x77, 0xe4, 0x6a, 0x25, - 0x6a, 0x32, 0x0d, 0x63, 0x15, 0x1c, 0x15, 0x1a, 0xfd, 0xc1, 0x2e, 0x75, 0x3d, 0x57, 0xe9, 0x7f, - 0xaa, 0x70, 0x65, 0x68, 0xf2, 0xd2, 0xd6, 0x66, 0xf9, 0x3c, 0x1f, 0x2f, 0x0d, 0x47, 0xa0, 0x24, - 0x16, 0xb1, 0x42, 0x64, 0x12, 0x46, 0x2b, 0xef, 0x77, 0x1d, 0x5a, 0x33, 0xa8, 0xe5, 0x99, 0xde, - 0x86, 0xd0, 0x90, 0x8b, 0x5b, 0x9b, 0x65, 0x45, 0x67, 0x88, 0x86, 0x29, 0x30, 0x12, 0x93, 0x68, - 0x11, 0xb2, 0x08, 0x27, 0x6f, 0x4e, 0x2d, 0xd5, 0xa9, 0xf3, 0xd0, 0x6c, 0xd2, 0x4a, 0xb3, 0x69, - 0x77, 0x2d, 0x4f, 0x19, 0x40, 0x3e, 0x4f, 0x6f, 0x6d, 0x96, 0x2f, 0xad, 0x36, 0x3b, 0x0d, 0x97, - 0x63, 0x1b, 0x3a, 0x47, 0x4b, 0xcc, 0x92, 0x65, 0xc9, 0x67, 0x60, 0x74, 0xd9, 0x61, 0x5a, 0x68, - 0x54, 0x29, 0x83, 0x2b, 0x83, 0xa8, 0xff, 0x67, 0x27, 0xc4, 0x4c, 0xc5, 0xa1, 0x7e, 0xcf, 0xf2, - 0xc6, 0x7a, 0xbc, 0x40, 0xc3, 0x40, 0x9c, 0xdc, 0xd8, 0x08, 0x2b, 0x42, 0x41, 0x61, 0x1f, 0x6f, - 0x3a, 0xd4, 0x48, 0x68, 0xdb, 0x10, 0xb6, 0xf9, 0xea, 0xd6, 0x66, 0xf9, 0x23, 0x8e, 0xa0, 0x69, - 0xf4, 0x54, 0xbb, 0x4c, 0x56, 0x64, 0x1a, 0x06, 0x99, 0x36, 0xdd, 0x36, 0x2d, 0x43, 0x81, 0xa7, - 0x72, 0x57, 0xc6, 0xae, 0x8f, 0xfb, 0xad, 0xf7, 0xe1, 0x93, 0xe7, 0xb6, 0x36, 0xcb, 0xa7, 0x98, - 0x0e, 0x36, 0x1e, 0x98, 0x96, 0x3c, 0x45, 0x04, 0x45, 0xd9, 0x28, 0x9a, 0xb4, 0x3d, 0x1c, 0xba, - 0xc3, 0xe1, 0x28, 0x5a, 0xb1, 0xbd, 0xf8, 0xb0, 0xf5, 0xc9, 0xc8, 0x14, 0x8c, 0x4e, 0xda, 0x5e, - 0xcd, 0x72, 0x3d, 0xdd, 0x6a, 0xd2, 0x5a, 0x55, 0x19, 0xc1, 0x72, 0xa8, 0x16, 0xac, 0x9c, 0x29, - 0x30, 0x8d, 0xc8, 0xa4, 0x14, 0x2d, 0xa3, 0xfe, 0x8b, 0x22, 0x8c, 0xb1, 0x3e, 0x91, 0x86, 0x4f, - 0x85, 0xcd, 0x04, 0x0c, 0xc2, 0x6a, 0x71, 0x3b, 0x7a, 0x93, 0x8a, 0x91, 0x84, 0x5f, 0x61, 0xf9, - 0x40, 0x89, 0x67, 0x9c, 0x9e, 0x5c, 0x85, 0x41, 0x0e, 0xaa, 0x55, 0xc5, 0xe0, 0x1a, 0xdd, 0xda, - 0x2c, 0x0f, 0xb9, 0x08, 0x6b, 0x98, 0x86, 0x16, 0xa0, 0x99, 0x76, 0xf3, 0xbf, 0x67, 0x6d, 0xd7, - 0x63, 0xcc, 0xc5, 0xd8, 0xc2, 0xcf, 0x10, 0x05, 0xd6, 0x04, 0x4a, 0xd6, 0xee, 0x68, 0x21, 0xf2, - 0x1a, 0x00, 0x87, 0x54, 0x0c, 0xc3, 0x11, 0x03, 0xec, 0xfc, 0xd6, 0x66, 0xf9, 0x8c, 0x60, 0xa1, - 0x1b, 0x86, 0x3c, 0x3a, 0x25, 0x62, 0xd2, 0x86, 0x11, 0xfe, 0x6b, 0x4e, 0x5f, 0xa1, 0x2d, 0x3e, - 0xba, 0x86, 0xaf, 0x5f, 0xf1, 0x3b, 0x31, 0x2a, 0x9d, 0x09, 0x99, 0x74, 0xda, 0xf2, 0x9c, 0x8d, - 0xc9, 0xb2, 0x98, 0x90, 0xcf, 0x89, 0xaa, 0x5a, 0x88, 0x93, 0xa7, 0x02, 0xb9, 0x0c, 0x9b, 0xa7, - 0x67, 0x6c, 0x67, 0x5d, 0x77, 0x0c, 0x6a, 0x4c, 0x6e, 0xc8, 0xf3, 0xf4, 0x7d, 0x1f, 0xdc, 0x58, - 0x91, 0x55, 0x4f, 0x26, 0x67, 0x9d, 0xce, 0xb9, 0xd5, 0xbb, 0x2b, 0xa8, 0x72, 0x03, 0x09, 0x69, - 0xb9, 0xdd, 0x95, 0xb8, 0x9a, 0x45, 0xcb, 0xb0, 0xa9, 0x80, 0x03, 0xee, 0x52, 0x87, 0x4d, 0xe2, - 0x38, 0xea, 0xc4, 0x54, 0x20, 0x98, 0x3c, 0xe4, 0x98, 0x24, 0x0f, 0x51, 0xe4, 0xc2, 0xdb, 0x70, - 0x32, 0x21, 0x0a, 0x32, 0x0e, 0x85, 0x07, 0x74, 0x83, 0xab, 0x8b, 0xc6, 0xfe, 0x24, 0xa7, 0xa1, - 0xff, 0xa1, 0xde, 0xea, 0x8a, 0x25, 0x54, 0xe3, 0x3f, 0x5e, 0xcf, 0x7f, 0x22, 0xc7, 0x56, 0x1c, - 0x32, 0x65, 0x5b, 0x16, 0x6d, 0x7a, 0xf2, 0xa2, 0xf3, 0x0a, 0x0c, 0xcd, 0xd9, 0x4d, 0xbd, 0x85, - 0xfd, 0xc8, 0xf5, 0x4e, 0xd9, 0xda, 0x2c, 0x9f, 0x66, 0x1d, 0x38, 0xd1, 0x62, 0x18, 0xa9, 0x4d, - 0x21, 0x29, 0x53, 0x00, 0x8d, 0xb6, 0x6d, 0x8f, 0x62, 0xc1, 0x7c, 0xa8, 0x00, 0x58, 0xd0, 0x41, - 0x94, 0xac, 0x00, 0x21, 0x31, 0xb9, 0x06, 0x83, 0x4b, 0x6c, 0x9d, 0x6d, 0xda, 0x2d, 0xa1, 0x7c, - 0xb8, 0x14, 0xe0, 0xda, 0x2b, 0x8f, 0x55, 0x9f, 0x48, 0x9d, 0x85, 0xb1, 0xa9, 0x96, 0x49, 0x2d, - 0x4f, 0x6e, 0x35, 0x1b, 0xc9, 0x95, 0x55, 0x6a, 0x79, 0x72, 0xab, 0x71, 0xcc, 0xeb, 0x0c, 0x2a, - 0xb7, 0x3a, 0x20, 0x55, 0x7f, 0xbf, 0x00, 0xe7, 0x6f, 0x77, 0x57, 0xa8, 0x63, 0x51, 0x8f, 0xba, - 0x62, 0x41, 0x0e, 0xb8, 0x2e, 0xc0, 0xc9, 0x04, 0x52, 0x70, 0xc7, 0x85, 0xf2, 0x41, 0x80, 0x6c, - 0x88, 0x35, 0x5e, 0x9e, 0x6d, 0x13, 0x45, 0xc9, 0x2c, 0x9c, 0x08, 0x81, 0xac, 0x11, 0xae, 0x92, - 0xc7, 0xa5, 0xe4, 0xc9, 0xad, 0xcd, 0xf2, 0x05, 0x89, 0x1b, 0x6b, 0xb6, 0xac, 0xc1, 0xf1, 0x62, - 0xe4, 0x36, 0x8c, 0x87, 0xa0, 0x9b, 0x8e, 0xdd, 0xed, 0xb8, 0x4a, 0x01, 0x59, 0x95, 0xb7, 0x36, - 0xcb, 0x4f, 0x48, 0xac, 0x56, 0x11, 0x29, 0x2f, 0xe0, 0xf1, 0x82, 0xe4, 0x87, 0x73, 0x32, 0x37, - 0x31, 0x0a, 0x8b, 0x38, 0x0a, 0x5f, 0xf5, 0x47, 0x61, 0xa6, 0x90, 0x26, 0xe2, 0x25, 0xc5, 0xa0, - 0x8c, 0x35, 0x23, 0x31, 0x28, 0x13, 0x35, 0x5e, 0x98, 0x82, 0x33, 0xa9, 0xbc, 0x76, 0xa5, 0xd5, - 0xff, 0xbc, 0x20, 0x73, 0x59, 0xb2, 0x8d, 0xa0, 0x33, 0x17, 0xe5, 0xce, 0x5c, 0xb2, 0x0d, 0x9c, - 0xea, 0x73, 0xe1, 0xda, 0x29, 0x35, 0xb6, 0x63, 0x1b, 0xf1, 0x59, 0x3f, 0x59, 0x96, 0x7c, 0x0e, - 0xce, 0x26, 0x80, 0x7c, 0xba, 0xe6, 0xda, 0x7f, 0x79, 0x6b, 0xb3, 0xac, 0xa6, 0x70, 0x8d, 0xcf, - 0xde, 0x19, 0x5c, 0x88, 0x0e, 0xe7, 0x24, 0xa9, 0xdb, 0x96, 0xa7, 0x9b, 0x96, 0x30, 0x2e, 0xf9, - 0x28, 0xf9, 0xe8, 0xd6, 0x66, 0xf9, 0x19, 0x59, 0x07, 0x7d, 0x9a, 0x78, 0xe3, 0xb3, 0xf8, 0x10, - 0x03, 0x94, 0x14, 0x54, 0xad, 0xad, 0xaf, 0xfa, 0x16, 0xf3, 0x95, 0xad, 0xcd, 0xf2, 0xb3, 0xa9, - 0x75, 0x98, 0x8c, 0x4a, 0x5e, 0xa1, 0xb3, 0x38, 0x11, 0x0d, 0x48, 0x88, 0x5b, 0xb0, 0x0d, 0x8a, - 0xdf, 0xd0, 0x8f, 0xfc, 0xd5, 0xad, 0xcd, 0xf2, 0x93, 0x12, 0x7f, 0xcb, 0x36, 0x68, 0xbc, 0xf9, - 0x29, 0xa5, 0xd5, 0x5f, 0x2b, 0xc0, 0x93, 0xf5, 0xca, 0xfc, 0x5c, 0xcd, 0xf0, 0x4d, 0x9a, 0x25, - 0xc7, 0x7e, 0x68, 0x1a, 0xd2, 0xe8, 0x5d, 0x81, 0x73, 0x31, 0xd4, 0x34, 0x5a, 0x51, 0x81, 0x31, - 0x8d, 0xdf, 0xe6, 0x9b, 0x4b, 0x1d, 0x41, 0xd3, 0xe0, 0xa6, 0x56, 0x74, 0xd1, 0xce, 0x62, 0xc4, - 0xfa, 0x28, 0x86, 0xaa, 0xaf, 0xd9, 0x8e, 0xd7, 0xec, 0x7a, 0x42, 0x09, 0xb0, 0x8f, 0x12, 0x75, - 0xb8, 0x82, 0xa8, 0x47, 0x15, 0x3e, 0x1f, 0xf2, 0x63, 0x39, 0x18, 0xaf, 0x78, 0x9e, 0x63, 0xae, - 0x74, 0x3d, 0x3a, 0xaf, 0x77, 0x3a, 0xa6, 0xb5, 0x8a, 0x63, 0x7d, 0xf8, 0xfa, 0x9b, 0xc1, 0x1a, - 0xd9, 0x53, 0x12, 0x13, 0xf1, 0xe2, 0xd2, 0x10, 0xd5, 0x7d, 0x54, 0xa3, 0xcd, 0x71, 0xf2, 0x10, - 0x8d, 0x97, 0x63, 0x43, 0x34, 0x95, 0xd7, 0xae, 0x86, 0xe8, 0x97, 0x0b, 0x70, 0x71, 0xf1, 0x81, - 0xa7, 0x6b, 0xd4, 0xb5, 0xbb, 0x4e, 0x93, 0xba, 0x77, 0x3a, 0x86, 0xee, 0xd1, 0x70, 0xa4, 0x96, - 0xa1, 0xbf, 0x62, 0x18, 0xd4, 0x40, 0x76, 0xfd, 0x7c, 0xdb, 0xa7, 0x33, 0x80, 0xc6, 0xe1, 0xe4, - 0x23, 0x30, 0x20, 0xca, 0x20, 0xf7, 0xfe, 0xc9, 0xe1, 0xad, 0xcd, 0xf2, 0x40, 0x97, 0x83, 0x34, - 0x1f, 0xc7, 0xc8, 0xaa, 0xb4, 0x45, 0x19, 0x59, 0x21, 0x24, 0x33, 0x38, 0x48, 0xf3, 0x71, 0xe4, - 0x1d, 0x18, 0x43, 0xb6, 0x41, 0x7b, 0xc4, 0xdc, 0x77, 0xda, 0x97, 0xae, 0xdc, 0x58, 0xbe, 0x34, - 0x61, 0x6b, 0x1a, 0x8e, 0x5f, 0x40, 0x8b, 0x31, 0x20, 0xf7, 0x60, 0x5c, 0x34, 0x22, 0x64, 0xda, - 0xdf, 0x83, 0xe9, 0x99, 0xad, 0xcd, 0xf2, 0x49, 0xd1, 0x7e, 0x89, 0x6d, 0x82, 0x09, 0x63, 0x2c, - 0x9a, 0x1d, 0x32, 0x2e, 0x6d, 0xc7, 0x58, 0x7c, 0xb1, 0xcc, 0x38, 0xce, 0x44, 0x7d, 0x17, 0x46, - 0xe4, 0x82, 0xe4, 0x2c, 0x6e, 0xad, 0xf9, 0x38, 0xc1, 0x4d, 0xb9, 0x69, 0xe0, 0x7e, 0xfa, 0x45, - 0x18, 0xae, 0x52, 0xb7, 0xe9, 0x98, 0x1d, 0x66, 0x35, 0x08, 0x25, 0x3f, 0xb1, 0xb5, 0x59, 0x1e, - 0x36, 0x42, 0xb0, 0x26, 0xd3, 0xa8, 0xff, 0x4f, 0x0e, 0xce, 0x32, 0xde, 0x15, 0xd7, 0x35, 0x57, - 0xad, 0xb6, 0xbc, 0x6c, 0x3f, 0x0f, 0xa5, 0x3a, 0xd6, 0x27, 0x6a, 0x3a, 0xbd, 0xb5, 0x59, 0x1e, - 0xe7, 0x2d, 0x90, 0xf4, 0x50, 0xd0, 0x04, 0xfb, 0xca, 0xfc, 0x36, 0xfb, 0x4a, 0x66, 0xd2, 0x7a, - 0xba, 0xe3, 0x99, 0xd6, 0x6a, 0xdd, 0xd3, 0xbd, 0xae, 0x1b, 0x31, 0x69, 0x05, 0xa6, 0xe1, 0x22, - 0x2a, 0x62, 0xd2, 0x46, 0x0a, 0x91, 0xb7, 0x61, 0x64, 0xda, 0x32, 0x42, 0x26, 0x7c, 0x42, 0x7c, - 0x82, 0x59, 0x9a, 0x14, 0xe1, 0x49, 0x16, 0x91, 0x02, 0xea, 0xdf, 0xca, 0x81, 0xc2, 0x37, 0x81, - 0x73, 0xa6, 0xeb, 0xcd, 0xd3, 0xf6, 0x8a, 0x34, 0x3b, 0xcd, 0xf8, 0xbb, 0x4a, 0x86, 0x93, 0xd6, - 0x22, 0x34, 0x05, 0xc4, 0xae, 0xb2, 0x65, 0xba, 0x89, 0xed, 0x47, 0xac, 0x14, 0xa9, 0xc1, 0x00, - 0xe7, 0xcc, 0x6d, 0x89, 0xe1, 0xeb, 0x8a, 0xaf, 0x08, 0xf1, 0xaa, 0xb9, 0x32, 0xb4, 0x39, 0xb1, - 0xbc, 0xa1, 0x11, 0xe5, 0xd5, 0xaf, 0x16, 0x60, 0x3c, 0x5e, 0x88, 0xdc, 0x83, 0xc1, 0x5b, 0xb6, - 0x69, 0x51, 0x63, 0xd1, 0xc2, 0x16, 0xf6, 0x3e, 0x1c, 0xf1, 0x6d, 0xf1, 0x53, 0xef, 0x61, 0x99, - 0x86, 0x6c, 0xc1, 0xe2, 0x59, 0x49, 0xc0, 0x8c, 0x7c, 0x06, 0x86, 0x98, 0x0d, 0xf8, 0x10, 0x39, - 0xe7, 0xb7, 0xe5, 0xfc, 0x94, 0xe0, 0x7c, 0xda, 0xe1, 0x85, 0x92, 0xac, 0x43, 0x76, 0x4c, 0xaf, - 0x34, 0xaa, 0xbb, 0xb6, 0x25, 0x7a, 0x1e, 0xf5, 0xca, 0x41, 0x88, 0xac, 0x57, 0x9c, 0x86, 0x99, - 0xae, 0xfc, 0x63, 0xb1, 0x1b, 0xa4, 0xbd, 0x0b, 0x97, 0x55, 0xbc, 0x07, 0x24, 0x62, 0x62, 0xc1, - 0x09, 0x21, 0xd0, 0x35, 0xb3, 0x83, 0x56, 0x3f, 0xae, 0x6b, 0x63, 0xd7, 0x2f, 0x4f, 0xf8, 0x87, - 0x62, 0x13, 0xd2, 0x91, 0xda, 0xc3, 0x17, 0x27, 0xe6, 0x03, 0x72, 0xdc, 0x99, 0xa2, 0x4e, 0xc6, - 0x58, 0xc8, 0xbd, 0xdd, 0x8e, 0x90, 0xab, 0x3f, 0x92, 0x87, 0x17, 0xc2, 0x2e, 0xd2, 0xe8, 0x43, - 0x93, 0xae, 0x87, 0x1c, 0xc5, 0x1e, 0x99, 0x0d, 0x31, 0x77, 0x6a, 0x4d, 0xb7, 0x56, 0xa9, 0x41, - 0xae, 0x42, 0xbf, 0x66, 0xb7, 0xa8, 0xab, 0xe4, 0xd0, 0x3c, 0xc4, 0xe9, 0xcb, 0x61, 0x00, 0xf9, - 0x90, 0x05, 0x29, 0x88, 0x0d, 0xa5, 0x65, 0x47, 0x37, 0x3d, 0x5f, 0x93, 0x2a, 0x49, 0x4d, 0xda, - 0x41, 0x8d, 0x13, 0x9c, 0x07, 0x5f, 0x63, 0x50, 0xf0, 0x1e, 0x02, 0x64, 0xc1, 0x73, 0x92, 0x0b, - 0xaf, 0xc1, 0xb0, 0x44, 0xbc, 0xab, 0x45, 0xe4, 0xeb, 0x45, 0x79, 0x6c, 0xf9, 0xcd, 0x12, 0x63, - 0xeb, 0x1a, 0x1b, 0x13, 0xae, 0xcb, 0xac, 0x18, 0x3e, 0xa8, 0x84, 0xe6, 0x23, 0x28, 0xaa, 0xf9, - 0x08, 0x22, 0x2f, 0xc1, 0x20, 0x67, 0x11, 0xec, 0x97, 0x71, 0xaf, 0xed, 0x20, 0x2c, 0x6a, 0x0a, - 0x04, 0x84, 0xe4, 0xe7, 0x73, 0x70, 0xa9, 0xa7, 0x24, 0x50, 0xf9, 0x86, 0xaf, 0xbf, 0xbc, 0x27, - 0x31, 0x4e, 0xbe, 0xb0, 0xb5, 0x59, 0xbe, 0x2a, 0x69, 0x86, 0x23, 0xd1, 0x34, 0x9a, 0x9c, 0x48, - 0x6a, 0x57, 0xef, 0xa6, 0x30, 0x63, 0x95, 0x57, 0x3a, 0x83, 0x47, 0x55, 0x56, 0x73, 0xc3, 0x6f, - 0x64, 0x31, 0x34, 0x56, 0xc5, 0xf7, 0xde, 0xf7, 0x49, 0x52, 0xaa, 0xc9, 0xe0, 0x42, 0x9a, 0x70, - 0x8e, 0x63, 0xaa, 0xfa, 0xc6, 0xe2, 0xfd, 0x79, 0xdb, 0xf2, 0xd6, 0xfc, 0x0a, 0xfa, 0xe5, 0xb3, - 0x1e, 0xac, 0xc0, 0xd0, 0x37, 0x1a, 0xf6, 0xfd, 0x46, 0x9b, 0x51, 0xa5, 0xd4, 0x91, 0xc5, 0x89, - 0x4d, 0xec, 0x62, 0x8c, 0xfb, 0x53, 0x5e, 0x29, 0x3c, 0x89, 0xf3, 0xe7, 0x85, 0xe4, 0x04, 0x17, - 0x2b, 0xa4, 0xd6, 0x60, 0x64, 0xce, 0x6e, 0x3e, 0x08, 0xd4, 0xe5, 0x35, 0x28, 0x2d, 0xeb, 0xce, - 0x2a, 0xf5, 0x50, 0x16, 0xc3, 0xd7, 0x4f, 0x4e, 0xf0, 0xd3, 0x6d, 0x46, 0xc4, 0x11, 0x93, 0x63, - 0x62, 0xf6, 0x29, 0x79, 0xf8, 0x5b, 0x13, 0x05, 0xd4, 0x6f, 0xf7, 0xc3, 0x88, 0x38, 0x89, 0xc5, - 0xd5, 0x83, 0xbc, 0x1e, 0x9e, 0x6d, 0x8b, 0xe9, 0x32, 0x38, 0x8d, 0x0a, 0x4e, 0xd1, 0x46, 0x18, - 0xb3, 0x3f, 0xd8, 0x2c, 0xe7, 0xb6, 0x36, 0xcb, 0x7d, 0xda, 0xa0, 0xb4, 0x89, 0x0d, 0xd7, 0x37, - 0x69, 0x41, 0x97, 0xcf, 0x56, 0x63, 0x65, 0xf9, 0x7a, 0xf7, 0x36, 0x0c, 0x88, 0x36, 0x08, 0x8d, - 0x3b, 0x17, 0x9e, 0x9d, 0x44, 0x4e, 0x94, 0x63, 0xa5, 0xfd, 0x52, 0xe4, 0x4d, 0x28, 0xf1, 0xb3, - 0x04, 0x21, 0x80, 0xb3, 0xe9, 0x67, 0x2f, 0xb1, 0xe2, 0xa2, 0x0c, 0x99, 0x05, 0x08, 0xcf, 0x11, - 0x82, 0x03, 0x74, 0xc1, 0x21, 0x79, 0xc2, 0x10, 0xe3, 0x22, 0x95, 0x25, 0xaf, 0xc0, 0xc8, 0x32, - 0x75, 0xda, 0xa6, 0xa5, 0xb7, 0xea, 0xe6, 0xfb, 0xfe, 0x19, 0x3a, 0x2e, 0xf4, 0xae, 0xf9, 0xbe, - 0x3c, 0x72, 0x23, 0x74, 0xe4, 0xb3, 0x69, 0xfb, 0xf4, 0x01, 0x6c, 0xc8, 0xd3, 0xdb, 0x6e, 0x60, - 0x63, 0xed, 0x49, 0xd9, 0xb6, 0xbf, 0x03, 0xa3, 0x91, 0x2d, 0x9a, 0x38, 0x24, 0xbd, 0x94, 0x64, - 0x2d, 0xed, 0x37, 0x63, 0x6c, 0xa3, 0x1c, 0x98, 0x26, 0xd7, 0x2c, 0xd3, 0x33, 0xf5, 0xd6, 0x94, - 0xdd, 0x6e, 0xeb, 0x96, 0xa1, 0x0c, 0x85, 0x9a, 0x6c, 0x72, 0x4c, 0xa3, 0xc9, 0x51, 0xb2, 0x26, - 0x47, 0x0b, 0x91, 0xdb, 0x30, 0x2e, 0xfa, 0x50, 0xa3, 0x4d, 0xdb, 0x61, 0xb6, 0x07, 0x9e, 0x81, - 0x8a, 0x63, 0x00, 0x97, 0xe3, 0x1a, 0x8e, 0x8f, 0x94, 0x8d, 0xfb, 0x78, 0xc1, 0x5b, 0xc5, 0xc1, - 0xe1, 0xf1, 0x91, 0xf8, 0xb1, 0xb5, 0xfa, 0x37, 0x0a, 0x30, 0x2c, 0x48, 0xd9, 0xd2, 0x7d, 0xac, - 0xe0, 0xfb, 0x51, 0xf0, 0x54, 0x45, 0x2d, 0x1d, 0x94, 0xa2, 0xaa, 0x5f, 0xc8, 0x07, 0xb3, 0xd1, - 0x92, 0x63, 0x5a, 0xfb, 0x9b, 0x8d, 0x2e, 0x03, 0x4c, 0xad, 0x75, 0xad, 0x07, 0xfc, 0x7a, 0x2e, - 0x1f, 0x5e, 0xcf, 0x35, 0x4d, 0x4d, 0xc2, 0x90, 0x4b, 0x50, 0xac, 0x32, 0xfe, 0xac, 0x67, 0x46, - 0x26, 0x87, 0xbe, 0xc5, 0x39, 0xe5, 0x5e, 0xd0, 0x10, 0xcc, 0x36, 0x73, 0x93, 0x1b, 0x1e, 0xe5, - 0xe6, 0x73, 0x81, 0x6f, 0xe6, 0x56, 0x18, 0x40, 0xe3, 0x70, 0x72, 0x03, 0x4e, 0x56, 0x69, 0x4b, - 0xdf, 0x98, 0x37, 0x5b, 0x2d, 0xd3, 0xa5, 0x4d, 0xdb, 0x32, 0x5c, 0x14, 0xb2, 0xa8, 0xae, 0xed, - 0x6a, 0x49, 0x02, 0xa2, 0x42, 0x69, 0xf1, 0xfe, 0x7d, 0x97, 0x7a, 0x28, 0xbe, 0xc2, 0x24, 0xb0, - 0xc9, 0xd9, 0x46, 0x88, 0x26, 0x30, 0xea, 0xd7, 0x72, 0x6c, 0xb7, 0xe4, 0x3e, 0xf0, 0xec, 0x4e, - 0xa0, 0xe5, 0xfb, 0x12, 0xc9, 0xd5, 0xd0, 0xae, 0xc8, 0xe3, 0xd7, 0x9e, 0x10, 0x5f, 0x3b, 0x20, - 0x6c, 0x8b, 0xd0, 0xa2, 0x48, 0xfd, 0xaa, 0xc2, 0x36, 0x5f, 0xa5, 0xfe, 0x71, 0x1e, 0xce, 0x89, - 0x16, 0x4f, 0xb5, 0xcc, 0xce, 0x8a, 0xad, 0x3b, 0x86, 0x46, 0x9b, 0xd4, 0x7c, 0x48, 0x8f, 0xe6, - 0xc0, 0x8b, 0x0e, 0x9d, 0xe2, 0x3e, 0x86, 0xce, 0x75, 0xdc, 0x78, 0x32, 0xc9, 0xe0, 0x01, 0x33, - 0x37, 0x2a, 0xc6, 0xb7, 0x36, 0xcb, 0x23, 0x06, 0x07, 0xe3, 0x15, 0x83, 0x26, 0x13, 0x31, 0x25, - 0x99, 0xa3, 0xd6, 0xaa, 0xb7, 0x86, 0x4a, 0xd2, 0xcf, 0x95, 0xa4, 0x85, 0x10, 0x4d, 0x60, 0xd4, - 0xff, 0x3d, 0x0f, 0xa7, 0xe3, 0x22, 0xaf, 0x53, 0xcb, 0x38, 0x96, 0xf7, 0x07, 0x23, 0xef, 0xef, - 0x14, 0xe0, 0x09, 0x51, 0xa6, 0xbe, 0xa6, 0x3b, 0xd4, 0xa8, 0x9a, 0x0e, 0x6d, 0x7a, 0xb6, 0xb3, - 0x71, 0x84, 0x0d, 0xa8, 0x83, 0x13, 0xfb, 0x0d, 0x28, 0x89, 0xe3, 0x06, 0xbe, 0xce, 0x8c, 0x05, - 0x2d, 0x41, 0x68, 0x62, 0x85, 0xe2, 0x47, 0x15, 0xb1, 0xce, 0x2a, 0xed, 0xa4, 0xb3, 0x3e, 0x01, - 0xa3, 0x81, 0xe8, 0x71, 0xe3, 0x3b, 0x10, 0x5a, 0x5b, 0x86, 0x8f, 0xc0, 0xbd, 0xaf, 0x16, 0x25, - 0xc4, 0xda, 0x7c, 0x40, 0xad, 0x8a, 0xd6, 0xd0, 0xa8, 0xa8, 0x2d, 0x28, 0x67, 0x1a, 0x9a, 0x4c, - 0xa4, 0x6e, 0x16, 0xe1, 0x42, 0x7a, 0xb7, 0x6b, 0x54, 0x37, 0x8e, 0x7b, 0xfd, 0x7b, 0xb2, 0xd7, - 0xc9, 0xd3, 0x50, 0x5c, 0xd2, 0xbd, 0x35, 0x71, 0xdd, 0x8f, 0x77, 0xd0, 0xf7, 0xcd, 0x16, 0x6d, - 0x74, 0x74, 0x6f, 0x4d, 0x43, 0x94, 0x34, 0x67, 0x00, 0x72, 0x4c, 0x99, 0x33, 0xa4, 0xc5, 0x7e, - 0xf8, 0xa9, 0xdc, 0x95, 0x62, 0xea, 0x62, 0xff, 0xed, 0x62, 0xd6, 0xbc, 0x72, 0xcf, 0x31, 0x3d, - 0x7a, 0xac, 0x61, 0xc7, 0x1a, 0xb6, 0x4f, 0x0d, 0xfb, 0x47, 0x79, 0x18, 0x0d, 0x36, 0x4d, 0xef, - 0xd1, 0xe6, 0xe1, 0xac, 0x55, 0xe1, 0x56, 0xa6, 0xb0, 0xef, 0xad, 0xcc, 0x7e, 0x14, 0x4a, 0x0d, - 0x8e, 0x58, 0xb9, 0x69, 0x80, 0x12, 0xe3, 0x47, 0xac, 0xc1, 0xc1, 0xea, 0xd3, 0x30, 0x30, 0xaf, - 0x3f, 0x32, 0xdb, 0xdd, 0xb6, 0xb0, 0xd2, 0xd1, 0x7d, 0xad, 0xad, 0x3f, 0xd2, 0x7c, 0xb8, 0xfa, - 0xdf, 0xe6, 0x60, 0x4c, 0x08, 0x55, 0x30, 0xdf, 0x97, 0x54, 0x43, 0xe9, 0xe4, 0xf7, 0x2d, 0x9d, - 0xc2, 0xde, 0xa5, 0xa3, 0xfe, 0xe5, 0x02, 0x28, 0x33, 0x66, 0x8b, 0x2e, 0x3b, 0xba, 0xe5, 0xde, - 0xa7, 0x8e, 0xd8, 0x4e, 0x4f, 0x33, 0x56, 0xfb, 0xfa, 0x40, 0x69, 0x4a, 0xc9, 0xef, 0x69, 0x4a, - 0xf9, 0x18, 0x0c, 0x89, 0xc6, 0x04, 0xae, 0x93, 0x38, 0x6a, 0x1c, 0x1f, 0xa8, 0x85, 0x78, 0x46, - 0x5c, 0xe9, 0x74, 0x1c, 0xfb, 0x21, 0x75, 0xf8, 0xad, 0x98, 0x20, 0xd6, 0x7d, 0xa0, 0x16, 0xe2, - 0x25, 0xce, 0xd4, 0xb7, 0x17, 0x65, 0xce, 0xd4, 0xd1, 0x42, 0x3c, 0xb9, 0x02, 0x83, 0x73, 0x76, - 0x53, 0x47, 0x41, 0xf3, 0x69, 0x65, 0x64, 0x6b, 0xb3, 0x3c, 0xd8, 0x12, 0x30, 0x2d, 0xc0, 0x32, - 0xca, 0xaa, 0xbd, 0x6e, 0xb5, 0x6c, 0x9d, 0x3b, 0xdb, 0x0c, 0x72, 0x4a, 0x43, 0xc0, 0xb4, 0x00, - 0xcb, 0x28, 0x99, 0xcc, 0xd1, 0x89, 0x69, 0x30, 0xe4, 0x79, 0x5f, 0xc0, 0xb4, 0x00, 0xab, 0x7e, - 0xad, 0xc8, 0xb4, 0xd7, 0x35, 0xdf, 0x7f, 0xec, 0xd7, 0x85, 0x70, 0xc0, 0xf4, 0xef, 0x61, 0xc0, - 0x3c, 0x36, 0x07, 0x76, 0xea, 0xbf, 0x18, 0x00, 0x10, 0xd2, 0x9f, 0x3e, 0xde, 0x1c, 0xee, 0x4f, - 0x6b, 0xaa, 0x70, 0x72, 0xda, 0x5a, 0xd3, 0xad, 0x26, 0x35, 0xc2, 0x63, 0xcb, 0x12, 0x0e, 0x6d, - 0x74, 0xba, 0xa4, 0x02, 0x19, 0x9e, 0x5b, 0x6a, 0xc9, 0x02, 0xe4, 0x45, 0x18, 0xae, 0x59, 0x1e, - 0x75, 0xf4, 0xa6, 0x67, 0x3e, 0xa4, 0x62, 0x6a, 0xc0, 0x9b, 0x68, 0x33, 0x04, 0x6b, 0x32, 0x0d, - 0xb9, 0x01, 0x23, 0x4b, 0xba, 0xe3, 0x99, 0x4d, 0xb3, 0xa3, 0x5b, 0x9e, 0xab, 0x0c, 0xe2, 0x8c, - 0x86, 0x16, 0x46, 0x47, 0x82, 0x6b, 0x11, 0x2a, 0xf2, 0x59, 0x18, 0xc2, 0xad, 0x29, 0xfa, 0x87, - 0x0f, 0x6d, 0x7b, 0x51, 0xf9, 0x4c, 0xe8, 0x8e, 0xc8, 0x4f, 0x5f, 0xf1, 0xc6, 0x39, 0x7e, 0x57, - 0x19, 0x70, 0x24, 0x9f, 0x86, 0x81, 0x69, 0xcb, 0x40, 0xe6, 0xb0, 0x2d, 0x73, 0x55, 0x30, 0x3f, - 0x1b, 0x32, 0xb7, 0x3b, 0x31, 0xde, 0x3e, 0xbb, 0xf4, 0x51, 0x36, 0xfc, 0xc1, 0x8d, 0xb2, 0x91, - 0x0f, 0xe0, 0x58, 0x7c, 0xf4, 0xa0, 0x8e, 0xc5, 0xc7, 0xf6, 0x78, 0x2c, 0xae, 0xbe, 0x0f, 0xc3, - 0x93, 0x4b, 0x33, 0xc1, 0xe8, 0x3d, 0x0f, 0x85, 0x25, 0xe1, 0x19, 0x51, 0xe4, 0xf6, 0x4c, 0xc7, - 0x34, 0x34, 0x06, 0x23, 0x57, 0x61, 0x70, 0x0a, 0xdd, 0xed, 0xc4, 0x2d, 0x62, 0x91, 0xaf, 0x7f, - 0x4d, 0x84, 0xa1, 0xd7, 0xad, 0x8f, 0x26, 0x1f, 0x81, 0x81, 0x25, 0xc7, 0x5e, 0x75, 0xf4, 0xb6, - 0x58, 0x83, 0xd1, 0x35, 0xa5, 0xc3, 0x41, 0x9a, 0x8f, 0x53, 0x7f, 0x22, 0xe7, 0x9b, 0xed, 0xac, - 0x44, 0xbd, 0x8b, 0x47, 0xf3, 0x58, 0xf7, 0x20, 0x2f, 0xe1, 0x72, 0x90, 0xe6, 0xe3, 0xc8, 0x55, - 0xe8, 0x9f, 0x76, 0x1c, 0xdb, 0x91, 0x7d, 0xea, 0x29, 0x03, 0xc8, 0xd7, 0xbd, 0x48, 0x41, 0x5e, - 0x85, 0x61, 0x3e, 0xe7, 0xf0, 0x13, 0xcd, 0x42, 0xaf, 0x9b, 0x52, 0x99, 0x52, 0xfd, 0x66, 0x41, - 0xb2, 0xd9, 0xb8, 0xc4, 0x1f, 0xc3, 0x5b, 0x81, 0x97, 0xa0, 0x30, 0xb9, 0x34, 0x23, 0x26, 0xc0, - 0x53, 0x7e, 0x51, 0x49, 0x55, 0x62, 0xe5, 0x18, 0x35, 0xb9, 0x08, 0xc5, 0x25, 0xa6, 0x3e, 0x25, - 0x54, 0x8f, 0xc1, 0xad, 0xcd, 0x72, 0xb1, 0xc3, 0xf4, 0x07, 0xa1, 0x88, 0x65, 0x9b, 0x19, 0xbe, - 0x63, 0xe2, 0xd8, 0x70, 0x1f, 0x73, 0x11, 0x8a, 0x15, 0x67, 0xf5, 0xa1, 0x98, 0xb5, 0x10, 0xab, - 0x3b, 0xab, 0x0f, 0x35, 0x84, 0x92, 0x6b, 0x00, 0x1a, 0xf5, 0xba, 0x8e, 0x85, 0xcf, 0x5d, 0x86, - 0xf0, 0xfc, 0x0d, 0x67, 0x43, 0x07, 0xa1, 0x8d, 0xa6, 0x6d, 0x50, 0x4d, 0x22, 0x51, 0xff, 0x7a, - 0x78, 0xb1, 0x53, 0x35, 0xdd, 0x07, 0xc7, 0x5d, 0xb8, 0x8b, 0x2e, 0xd4, 0xc5, 0x11, 0x67, 0xb2, - 0x93, 0xca, 0xd0, 0x3f, 0xd3, 0xd2, 0x57, 0x5d, 0xec, 0x43, 0xe1, 0xbb, 0x76, 0x9f, 0x01, 0x34, - 0x0e, 0x8f, 0xf5, 0xd3, 0xe0, 0xf6, 0xfd, 0xf4, 0x95, 0xfe, 0x60, 0xb4, 0x2d, 0x50, 0x6f, 0xdd, - 0x76, 0x8e, 0xbb, 0x6a, 0xa7, 0x5d, 0x75, 0x19, 0x06, 0xea, 0x4e, 0x53, 0x3a, 0xba, 0xc0, 0xfd, - 0x80, 0xeb, 0x34, 0xf9, 0xb1, 0x85, 0x8f, 0x64, 0x74, 0x55, 0xd7, 0x43, 0xba, 0x81, 0x90, 0xce, - 0x70, 0x3d, 0x41, 0x27, 0x90, 0x82, 0x6e, 0xc9, 0x76, 0x3c, 0xd1, 0x71, 0x01, 0x5d, 0xc7, 0x76, - 0x3c, 0xcd, 0x47, 0x92, 0x8f, 0x01, 0x2c, 0x4f, 0x2d, 0xf9, 0xce, 0xfd, 0x43, 0xa1, 0xef, 0xa1, - 0xf0, 0xea, 0xd7, 0x24, 0x34, 0x59, 0x86, 0xa1, 0xc5, 0x0e, 0x75, 0xf8, 0x56, 0x88, 0x3f, 0x60, - 0xf9, 0x68, 0x4c, 0xb4, 0xa2, 0xdf, 0x27, 0xc4, 0xff, 0x01, 0x39, 0x5f, 0x5f, 0x6c, 0xff, 0xa7, - 0x16, 0x32, 0x22, 0xaf, 0x42, 0xa9, 0xc2, 0xed, 0xbc, 0x61, 0x64, 0x19, 0x88, 0x0c, 0xb7, 0xa0, - 0x1c, 0xc5, 0xf7, 0xec, 0x3a, 0xfe, 0xad, 0x09, 0x72, 0xf5, 0x2a, 0x8c, 0xc7, 0xab, 0x21, 0xc3, - 0x30, 0x30, 0xb5, 0xb8, 0xb0, 0x30, 0x3d, 0xb5, 0x3c, 0xde, 0x47, 0x06, 0xa1, 0x58, 0x9f, 0x5e, - 0xa8, 0x8e, 0xe7, 0xd4, 0x5f, 0x90, 0x66, 0x10, 0xa6, 0x5a, 0xc7, 0x57, 0xc3, 0xfb, 0xba, 0x6f, - 0x19, 0xc7, 0xfb, 0x50, 0x3c, 0x31, 0x68, 0x9b, 0x9e, 0x47, 0x0d, 0xb1, 0x4a, 0xe0, 0x7d, 0xa1, - 0xf7, 0x48, 0x4b, 0xe0, 0xc9, 0xf3, 0x30, 0x8a, 0x30, 0x71, 0x45, 0xc8, 0xf7, 0xc7, 0xa2, 0x80, - 0xf3, 0x48, 0x8b, 0x22, 0xd5, 0xdf, 0x0b, 0x6f, 0x87, 0xe7, 0xa8, 0x7e, 0x54, 0x6f, 0x14, 0x3f, - 0x24, 0xfd, 0xa5, 0xfe, 0xab, 0x22, 0x7f, 0x72, 0xc2, 0xdf, 0x27, 0x1e, 0x86, 0x28, 0xc3, 0x23, - 0xdd, 0xc2, 0x2e, 0x8e, 0x74, 0x9f, 0x87, 0xd2, 0x3c, 0xf5, 0xd6, 0x6c, 0xdf, 0xf1, 0x0b, 0x3d, - 0xf4, 0xda, 0x08, 0x91, 0x3d, 0xf4, 0x38, 0x0d, 0x79, 0x00, 0xc4, 0x7f, 0x7c, 0x18, 0x38, 0x7e, - 0xfb, 0x47, 0xc8, 0xe7, 0x12, 0xfb, 0x94, 0x3a, 0x3e, 0x51, 0x46, 0x9f, 0xfe, 0xd3, 0x81, 0x63, - 0xb9, 0xe4, 0x89, 0xf5, 0x2f, 0x37, 0xcb, 0x25, 0x4e, 0xa3, 0xa5, 0xb0, 0x25, 0xef, 0xc0, 0xd0, - 0xfc, 0x4c, 0x45, 0x3c, 0x44, 0xe4, 0x5e, 0x11, 0xe7, 0x03, 0x29, 0xfa, 0x88, 0x40, 0x24, 0xf8, - 0xbe, 0xa7, 0x7d, 0x5f, 0x4f, 0xbe, 0x43, 0x0c, 0xb9, 0x30, 0x6d, 0xe1, 0x2f, 0x85, 0xc4, 0xe9, - 0x42, 0xa0, 0x2d, 0xd1, 0xf7, 0x43, 0x71, 0x59, 0x71, 0x6c, 0x4c, 0x5b, 0x06, 0xf7, 0x31, 0xba, - 0x17, 0xe1, 0x64, 0xa5, 0xd3, 0x69, 0x99, 0xd4, 0x40, 0x7d, 0xd1, 0xba, 0x2d, 0xea, 0x0a, 0x97, - 0x1f, 0x7c, 0x7c, 0xa2, 0x73, 0x64, 0x03, 0x9f, 0xbf, 0x36, 0x9c, 0x6e, 0xd4, 0x3f, 0x33, 0x59, - 0x56, 0xfd, 0xa9, 0x3c, 0x9c, 0x9d, 0x72, 0xa8, 0xee, 0xd1, 0xf9, 0x99, 0x4a, 0xa5, 0x8b, 0x3e, - 0x72, 0xad, 0x16, 0xb5, 0x56, 0x0f, 0x67, 0x58, 0xbf, 0x01, 0x63, 0x41, 0x03, 0xea, 0x4d, 0xbb, - 0x43, 0xe5, 0x87, 0x5c, 0x4d, 0x1f, 0xd3, 0x70, 0x19, 0x4a, 0x8b, 0x91, 0x92, 0xdb, 0x70, 0x2a, - 0x80, 0x54, 0x5a, 0x2d, 0x7b, 0x5d, 0xa3, 0x5d, 0x97, 0x3b, 0xe2, 0x0e, 0x72, 0x47, 0xdc, 0x90, - 0x83, 0xce, 0xf0, 0x0d, 0x87, 0x11, 0x68, 0x69, 0xa5, 0xd4, 0xaf, 0x16, 0xe0, 0xdc, 0x5d, 0xbd, - 0x65, 0x1a, 0xa1, 0x68, 0x34, 0xea, 0x76, 0x6c, 0xcb, 0xa5, 0x47, 0x68, 0x94, 0x46, 0x86, 0x42, - 0xf1, 0x40, 0x86, 0x42, 0xb2, 0x8b, 0xfa, 0xf7, 0xdd, 0x45, 0xa5, 0x3d, 0x75, 0xd1, 0xff, 0x96, - 0x83, 0x71, 0xff, 0xa1, 0x81, 0xfc, 0x68, 0x5c, 0xf2, 0x82, 0xc7, 0x23, 0xc4, 0x98, 0xdf, 0x35, - 0xe2, 0x49, 0x1d, 0x06, 0xa6, 0x1f, 0x75, 0x4c, 0x87, 0xba, 0x3b, 0x70, 0x1a, 0xbf, 0x24, 0x8e, - 0x4b, 0x4e, 0x52, 0x5e, 0x24, 0x71, 0x52, 0xc2, 0xc1, 0xf8, 0x7c, 0x90, 0x3f, 0xb5, 0x98, 0xf4, - 0x5f, 0xc2, 0xf3, 0xe7, 0x83, 0xe2, 0x49, 0x46, 0xe4, 0x3d, 0x68, 0x48, 0x4a, 0x9e, 0x81, 0xc2, - 0xf2, 0xf2, 0x9c, 0x98, 0x49, 0x31, 0x02, 0x81, 0xe7, 0xc9, 0xef, 0x23, 0x19, 0x56, 0xfd, 0xa7, - 0x79, 0x00, 0xa6, 0x0a, 0x7c, 0xb8, 0x1e, 0x8a, 0x12, 0x4e, 0xc2, 0xa0, 0x2f, 0x70, 0xa1, 0x86, - 0xc1, 0x2b, 0x81, 0x78, 0x47, 0xc4, 0xeb, 0x0e, 0x5e, 0x84, 0x94, 0x7d, 0x47, 0x72, 0x7e, 0x0f, - 0x80, 0x3b, 0x1b, 0x74, 0x24, 0xf7, 0xdd, 0xc7, 0x3f, 0x06, 0x43, 0x62, 0xc6, 0xb3, 0x23, 0xe7, - 0xff, 0x4d, 0x1f, 0xa8, 0x85, 0xf8, 0xd8, 0xd4, 0x5a, 0xda, 0xc7, 0x42, 0xec, 0x8b, 0x97, 0xf7, - 0xca, 0xb1, 0x78, 0x0f, 0x58, 0xbc, 0x5f, 0x14, 0xe2, 0xe5, 0x2f, 0x86, 0x8e, 0xac, 0x78, 0x0f, - 0xec, 0xec, 0x5b, 0xfd, 0x47, 0x39, 0x20, 0xac, 0x59, 0x4b, 0xba, 0xeb, 0xae, 0xdb, 0x8e, 0xc1, - 0x9d, 0xd3, 0x0f, 0x45, 0x30, 0x07, 0x77, 0x5f, 0xf9, 0xcd, 0x41, 0x38, 0x15, 0x71, 0xfc, 0x3d, - 0xe2, 0x93, 0xd5, 0xd5, 0xe8, 0x68, 0xea, 0xf5, 0xea, 0xe5, 0x59, 0xf9, 0x42, 0xb4, 0x3f, 0xf2, - 0xe0, 0x4d, 0xba, 0x09, 0x7d, 0x01, 0x46, 0xc4, 0x0f, 0xb6, 0x42, 0xfb, 0x37, 0x5d, 0x38, 0x4a, - 0x5d, 0x06, 0xd0, 0x22, 0x68, 0xf2, 0x32, 0x0c, 0xb1, 0x01, 0xb3, 0x8a, 0xc1, 0x4a, 0x06, 0xc2, - 0x17, 0x25, 0x86, 0x0f, 0x94, 0xd7, 0x93, 0x80, 0x52, 0x7a, 0xb7, 0x34, 0xb8, 0x83, 0x77, 0x4b, - 0x9f, 0x83, 0xe1, 0x8a, 0x65, 0xd9, 0x1e, 0x6e, 0xd2, 0x5d, 0x71, 0x35, 0x91, 0x69, 0x95, 0x3f, - 0x83, 0x8f, 0xf1, 0x43, 0xfa, 0x54, 0xb3, 0x5c, 0x66, 0x48, 0xae, 0xfb, 0xaf, 0x62, 0xa8, 0x23, - 0xbc, 0xca, 0xf1, 0x7a, 0xc6, 0x11, 0xb0, 0xe4, 0xa3, 0x18, 0xec, 0xbc, 0xd1, 0x25, 0xc7, 0xee, - 0xd8, 0x2e, 0x35, 0xb8, 0xa0, 0x86, 0xc3, 0xd0, 0x06, 0x1d, 0x81, 0xc0, 0x77, 0x73, 0x91, 0xc0, - 0x21, 0x91, 0x22, 0xe4, 0x3e, 0x9c, 0xf6, 0x2f, 0x8a, 0x83, 0x17, 0x8a, 0xb5, 0xaa, 0xab, 0x8c, - 0xe0, 0xab, 0x24, 0x12, 0x57, 0x86, 0x5a, 0x75, 0xf2, 0x49, 0xff, 0x5a, 0xc4, 0x7f, 0xe2, 0xd8, - 0x30, 0x0d, 0xb9, 0xab, 0x53, 0xf9, 0x91, 0x1f, 0x80, 0xe1, 0x79, 0xfd, 0x51, 0xb5, 0x2b, 0xce, - 0x5e, 0x46, 0x77, 0x7e, 0xfb, 0xd2, 0xd6, 0x1f, 0x35, 0x0c, 0x51, 0x2e, 0x66, 0x53, 0xc8, 0x2c, - 0x49, 0x03, 0xce, 0x2e, 0x39, 0x76, 0xdb, 0xf6, 0xa8, 0x11, 0x7b, 0xec, 0x77, 0x22, 0x7c, 0x1d, - 0xdc, 0x11, 0x14, 0x8d, 0x1e, 0xaf, 0xfe, 0x32, 0xd8, 0x90, 0x36, 0x9c, 0xa8, 0xb8, 0x6e, 0xb7, - 0x4d, 0xc3, 0x1b, 0xaa, 0xf1, 0x6d, 0x3f, 0xe3, 0xa3, 0xc2, 0x6b, 0xf9, 0x09, 0x1d, 0x8b, 0xf2, - 0x0b, 0xaa, 0x86, 0x67, 0xca, 0x35, 0xe2, 0xb7, 0xc4, 0x79, 0xdf, 0x2a, 0x0e, 0x8e, 0x8d, 0x9f, - 0xd0, 0xce, 0x25, 0x1b, 0xb3, 0x6c, 0x7a, 0x2d, 0xaa, 0xfe, 0x95, 0x7c, 0x6c, 0x16, 0xe1, 0xf6, - 0xd5, 0xbe, 0x66, 0x11, 0x79, 0x36, 0xc8, 0xef, 0x71, 0x36, 0x78, 0x36, 0xe9, 0xf3, 0x90, 0x32, - 0xc4, 0x7f, 0x00, 0xc6, 0xfc, 0x12, 0xd8, 0xee, 0x8d, 0x60, 0x99, 0xc8, 0x16, 0xe5, 0x45, 0x21, - 0xca, 0x71, 0x34, 0x30, 0x37, 0x62, 0xf2, 0x8b, 0xf1, 0x53, 0xbf, 0x91, 0x03, 0x08, 0x15, 0x90, - 0xbc, 0x10, 0x8d, 0x18, 0x95, 0x0b, 0x2f, 0x82, 0x44, 0x34, 0x89, 0x48, 0x88, 0x28, 0x72, 0x11, - 0x8a, 0x18, 0x71, 0x24, 0x1f, 0x1e, 0x3c, 0x3f, 0x30, 0x2d, 0x43, 0x43, 0x28, 0xc3, 0x4a, 0xa1, - 0x01, 0x10, 0x8b, 0x4e, 0x0f, 0xdc, 0x6a, 0xae, 0xc2, 0x89, 0x7a, 0x77, 0xc5, 0xaf, 0x5b, 0x7a, - 0xe7, 0x88, 0x81, 0x4f, 0xdc, 0xee, 0x4a, 0xf0, 0x38, 0x38, 0x12, 0x56, 0x26, 0x5a, 0x44, 0xfd, - 0x5a, 0x2e, 0xd6, 0xbf, 0x87, 0x68, 0x14, 0xec, 0xa8, 0x4f, 0xd5, 0x3f, 0x2c, 0xc0, 0xf0, 0x92, - 0xed, 0x78, 0x22, 0x84, 0xcb, 0xd1, 0x5e, 0xa5, 0xa5, 0xbd, 0x64, 0x71, 0x17, 0x7b, 0xc9, 0x8b, - 0x50, 0x94, 0x5c, 0xb8, 0xf9, 0xbd, 0x91, 0x61, 0x38, 0x1a, 0x42, 0x3f, 0xe0, 0x27, 0x29, 0xc9, - 0x4b, 0xe2, 0x81, 0x7d, 0xbb, 0x62, 0xfc, 0x50, 0x1e, 0xe0, 0xd3, 0x2f, 0xbe, 0xf8, 0x18, 0x77, - 0xa9, 0xfa, 0x97, 0x72, 0x70, 0x42, 0x5c, 0xbd, 0x4a, 0xd1, 0xe2, 0x06, 0xfc, 0x4b, 0x73, 0x79, - 0x26, 0xe1, 0x20, 0xcd, 0xc7, 0xb1, 0x45, 0x7d, 0xfa, 0x91, 0xe9, 0xe1, 0xed, 0x93, 0x14, 0x2e, - 0x8e, 0x0a, 0x98, 0xbc, 0xa8, 0xfb, 0x74, 0xe4, 0x05, 0xff, 0x52, 0xb9, 0x10, 0x5a, 0x32, 0xac, - 0xc0, 0x74, 0xea, 0xc5, 0xb2, 0xfa, 0x2b, 0x45, 0x28, 0x4e, 0x3f, 0xa2, 0xcd, 0x23, 0xde, 0x35, - 0xd2, 0x51, 0x75, 0x71, 0x9f, 0x47, 0xd5, 0x7b, 0xf1, 0x92, 0x79, 0x3b, 0xec, 0xcf, 0x52, 0xb4, - 0xfa, 0x58, 0xcf, 0xc7, 0xab, 0xf7, 0x7b, 0xfa, 0xe8, 0x39, 0x59, 0xfd, 0x57, 0x05, 0x28, 0xd4, - 0xa7, 0x96, 0x8e, 0xf5, 0xe6, 0x50, 0xf5, 0xa6, 0xb7, 0x17, 0x82, 0x1a, 0x5c, 0x2c, 0x0e, 0x86, - 0x7e, 0xbf, 0xb1, 0x3b, 0xc4, 0xef, 0x14, 0x60, 0xac, 0x3e, 0xb3, 0xbc, 0x24, 0x9d, 0xed, 0xdf, - 0xe6, 0xbe, 0x99, 0xe8, 0x25, 0xc8, 0xbb, 0xf4, 0x62, 0xc2, 0xac, 0xba, 0x53, 0xb3, 0xbc, 0x57, - 0x6e, 0xdc, 0xd5, 0x5b, 0x5d, 0x8a, 0x87, 0x69, 0xdc, 0x93, 0xdb, 0x35, 0xdf, 0xa7, 0x5f, 0xc5, - 0xd0, 0x11, 0x3e, 0x03, 0xf2, 0x06, 0x14, 0xee, 0x08, 0x1f, 0x9b, 0x2c, 0x3e, 0x2f, 0x5d, 0xe7, - 0x7c, 0xd8, 0x24, 0x58, 0xe8, 0x9a, 0x06, 0x72, 0x60, 0xa5, 0x58, 0xe1, 0x9b, 0xc2, 0x64, 0xd8, - 0x51, 0xe1, 0x55, 0xbf, 0xf0, 0xcd, 0x5a, 0x95, 0xd4, 0x61, 0x78, 0x89, 0x3a, 0x6d, 0x13, 0x3b, - 0xca, 0x9f, 0xb3, 0x7b, 0x33, 0x61, 0x7b, 0xcf, 0xe1, 0x4e, 0x58, 0x08, 0x99, 0xc9, 0x5c, 0xc8, - 0xbb, 0x00, 0xdc, 0xaa, 0xda, 0x61, 0x04, 0xd2, 0x4b, 0xb8, 0x93, 0xe3, 0x9b, 0x85, 0x14, 0xab, - 0x5d, 0x62, 0x46, 0x1e, 0xc0, 0xf8, 0xbc, 0x6d, 0x98, 0xf7, 0x4d, 0xee, 0x4c, 0x8b, 0x15, 0x94, - 0xb6, 0x77, 0x61, 0x63, 0x9b, 0x83, 0xb6, 0x54, 0x2e, 0xad, 0x9a, 0x04, 0x63, 0xf5, 0xef, 0xf4, - 0x43, 0x91, 0x75, 0xfb, 0xf1, 0xf8, 0xdd, 0xcf, 0xf8, 0xad, 0xc0, 0xf8, 0x3d, 0xdb, 0x79, 0x60, - 0x5a, 0xab, 0xc1, 0x3b, 0x07, 0x71, 0xda, 0x80, 0xbe, 0x59, 0xeb, 0x1c, 0xd7, 0x08, 0x9e, 0x44, - 0x68, 0x09, 0xf2, 0x6d, 0x46, 0xf0, 0x6b, 0x00, 0x3c, 0x7a, 0x01, 0xd2, 0x0c, 0x86, 0xe1, 0x4e, - 0x78, 0x6c, 0x03, 0x7c, 0x3a, 0x21, 0x87, 0x3b, 0x09, 0x89, 0xc9, 0x55, 0xdf, 0xbb, 0x65, 0x08, - 0x5f, 0x52, 0xe0, 0xb1, 0x0a, 0x7a, 0xb7, 0xc8, 0x46, 0x00, 0xf7, 0x73, 0x59, 0x02, 0x90, 0x6e, - 0x0c, 0x21, 0x26, 0x88, 0xc8, 0xe4, 0x20, 0x02, 0x0c, 0xa6, 0x5c, 0x18, 0x6a, 0x12, 0x0f, 0xf2, - 0x4a, 0xcc, 0xa5, 0x81, 0x44, 0xb8, 0x65, 0x7a, 0x34, 0x84, 0x2e, 0x71, 0x23, 0xdb, 0xb9, 0xc4, - 0xa9, 0x7f, 0xb3, 0x00, 0xc3, 0x8c, 0x5b, 0xbd, 0xdb, 0x6e, 0xeb, 0xce, 0xc6, 0xb1, 0x22, 0xef, - 0x47, 0x91, 0x1b, 0x70, 0x52, 0x7e, 0x02, 0xc1, 0x4c, 0x57, 0x3f, 0x58, 0x55, 0xb0, 0x85, 0x8f, - 0x13, 0x70, 0xdb, 0x12, 0xe7, 0x7d, 0x4f, 0x80, 0xf1, 0xb4, 0xc8, 0xd5, 0x92, 0xbc, 0xd4, 0x9f, - 0xcc, 0xc1, 0x78, 0x1c, 0x1a, 0xe8, 0x7e, 0x2e, 0x55, 0xf7, 0x9f, 0x87, 0x21, 0xe1, 0x14, 0xa1, - 0x1b, 0xc2, 0x47, 0x73, 0x6c, 0x6b, 0xb3, 0x0c, 0xf8, 0x22, 0xbd, 0xe1, 0x50, 0xdd, 0xd0, 0x42, - 0x02, 0xf2, 0x32, 0x8c, 0xe0, 0x8f, 0x7b, 0x8e, 0xe9, 0x79, 0x94, 0x77, 0x46, 0x91, 0xdf, 0xf3, - 0xf0, 0x02, 0xeb, 0x1c, 0xa1, 0x45, 0xc8, 0xd4, 0xdf, 0xcd, 0xc3, 0x50, 0xbd, 0xbb, 0xe2, 0x6e, - 0xb8, 0x1e, 0x6d, 0x1f, 0x71, 0x1d, 0xf2, 0x8f, 0x15, 0x8a, 0xa9, 0xc7, 0x0a, 0xcf, 0xf8, 0x43, - 0x4b, 0xba, 0x8f, 0x08, 0x36, 0x06, 0xbe, 0x9f, 0x69, 0xa8, 0x45, 0xa5, 0xdd, 0x6b, 0x91, 0xfa, - 0xb7, 0xf3, 0x30, 0xce, 0xaf, 0xe3, 0xab, 0xa6, 0xdb, 0x3c, 0x80, 0x27, 0x42, 0x87, 0x2f, 0xd3, - 0xfd, 0xb9, 0xb0, 0xec, 0xe0, 0xe1, 0x95, 0xfa, 0xf9, 0x3c, 0x0c, 0x57, 0xba, 0xde, 0x5a, 0xc5, - 0xc3, 0xf9, 0xed, 0xb1, 0xdc, 0x23, 0xff, 0x4e, 0x0e, 0x4e, 0xb0, 0x86, 0x2c, 0xdb, 0x0f, 0xa8, - 0x75, 0x00, 0xd7, 0x19, 0x07, 0x71, 0x10, 0xe9, 0xcb, 0xb2, 0xb0, 0x3b, 0x59, 0xe2, 0x25, 0x9c, - 0x66, 0xb7, 0xe8, 0xd1, 0xfe, 0x8c, 0x03, 0xbc, 0x84, 0xf3, 0x05, 0x72, 0x00, 0x97, 0xbe, 0xdf, - 0x5b, 0x02, 0x39, 0x80, 0x13, 0xd9, 0xef, 0x0d, 0x81, 0x7c, 0x33, 0x07, 0x43, 0x93, 0xb6, 0x77, - 0xc4, 0x07, 0xbe, 0xf8, 0x8a, 0xa3, 0xad, 0xe6, 0xfe, 0x57, 0x1c, 0x6d, 0xdd, 0x54, 0x7f, 0x3a, - 0x0f, 0xa7, 0x45, 0x86, 0x03, 0x71, 0x06, 0x76, 0x3c, 0x1d, 0x8b, 0xc1, 0x96, 0x14, 0xcd, 0xf1, - 0x3c, 0x24, 0x44, 0xf3, 0x73, 0x05, 0x38, 0x8d, 0x01, 0x99, 0xd9, 0x8e, 0xea, 0x7b, 0xc0, 0x16, - 0x21, 0xcd, 0xa8, 0x6b, 0xc5, 0x7c, 0x8a, 0x6b, 0xc5, 0xbf, 0xdc, 0x2c, 0xbf, 0xb2, 0x6a, 0x7a, - 0x6b, 0xdd, 0x95, 0x89, 0xa6, 0xdd, 0xbe, 0xb6, 0xea, 0xe8, 0x0f, 0x4d, 0xee, 0x54, 0xa0, 0xb7, - 0xae, 0x85, 0x89, 0x87, 0x3a, 0xa6, 0x48, 0x23, 0x54, 0xc7, 0x9d, 0x12, 0xe3, 0xea, 0x3b, 0x65, - 0xb8, 0x00, 0xb7, 0x6c, 0xd3, 0x12, 0x9e, 0xca, 0xdc, 0xd0, 0xad, 0x6f, 0x6d, 0x96, 0xcf, 0xbc, - 0x67, 0x9b, 0x56, 0x23, 0xee, 0xae, 0xbc, 0xdb, 0xfa, 0x42, 0xd6, 0x9a, 0x54, 0x8d, 0xfa, 0xdf, - 0xe4, 0xe0, 0x7c, 0x54, 0x8b, 0xbf, 0x17, 0x6c, 0xc7, 0xbf, 0x98, 0x87, 0x33, 0x37, 0x51, 0x38, - 0x81, 0x7b, 0xd8, 0xf1, 0xbc, 0x25, 0x06, 0x67, 0x8a, 0x6c, 0x8e, 0x2d, 0xca, 0x6c, 0xd9, 0x1c, - 0x4f, 0xea, 0x42, 0x36, 0xff, 0x30, 0x07, 0xa7, 0x16, 0x6b, 0xd5, 0xa9, 0xef, 0x91, 0x11, 0x95, - 0xfc, 0x9e, 0x23, 0x6e, 0x70, 0x26, 0xbe, 0xe7, 0x88, 0x9b, 0x9e, 0x5f, 0xce, 0xc3, 0xa9, 0x7a, - 0x65, 0x7e, 0xee, 0x7b, 0x65, 0x06, 0x9f, 0x92, 0x7d, 0x99, 0xfd, 0x43, 0x30, 0x61, 0x0b, 0xc8, - 0x9f, 0x79, 0xf7, 0x7a, 0xb6, 0x8f, 0x73, 0x52, 0x28, 0x47, 0x7c, 0xea, 0x3e, 0x10, 0xa1, 0x30, - 0xcd, 0x8f, 0x50, 0x1f, 0x71, 0xcd, 0xff, 0x7b, 0x25, 0x18, 0xbe, 0xdd, 0x5d, 0xa1, 0xc2, 0xa5, - 0xeb, 0xb1, 0x3e, 0xf9, 0xbd, 0x0e, 0xc3, 0x42, 0x0c, 0x78, 0xc3, 0x21, 0x85, 0xe4, 0x14, 0x21, - 0x96, 0x78, 0xd4, 0x33, 0x99, 0x88, 0x5c, 0x84, 0xe2, 0x5d, 0xea, 0xac, 0xc8, 0xaf, 0xd5, 0x1f, - 0x52, 0x67, 0x45, 0x43, 0x28, 0x99, 0x0b, 0x1f, 0xe2, 0x54, 0x96, 0x6a, 0x98, 0x0e, 0x4a, 0x5c, - 0x1a, 0x62, 0x7e, 0xab, 0xc0, 0x9b, 0x56, 0xef, 0x98, 0x3c, 0x91, 0x94, 0x1c, 0x29, 0x23, 0x5e, - 0x92, 0x2c, 0xc0, 0x49, 0xd9, 0x5d, 0x90, 0xe7, 0x42, 0x1a, 0x4c, 0x61, 0x97, 0x96, 0x05, 0x29, - 0x59, 0x94, 0xbc, 0x0d, 0x23, 0x3e, 0x10, 0x1d, 0x1f, 0x87, 0xc2, 0x04, 0x1c, 0x01, 0xab, 0x58, - 0xbe, 0x84, 0x48, 0x01, 0x99, 0x01, 0x5e, 0x62, 0x40, 0x0a, 0x83, 0x98, 0xa3, 0x6d, 0xa4, 0x00, - 0x79, 0x19, 0x19, 0xe0, 0xe3, 0x31, 0x74, 0x98, 0x1a, 0xc6, 0xa7, 0xdc, 0x78, 0x01, 0xe4, 0x08, - 0x38, 0x7f, 0xb0, 0x1f, 0x21, 0x23, 0x8b, 0x00, 0xa1, 0x63, 0x8b, 0x08, 0x8b, 0xb2, 0x6b, 0x97, - 0x1b, 0x89, 0x85, 0x7c, 0x93, 0x37, 0xba, 0x97, 0x9b, 0x3c, 0xf5, 0xa7, 0x0a, 0x30, 0x5c, 0xe9, - 0x74, 0x82, 0xa1, 0xf0, 0x02, 0x94, 0x2a, 0x9d, 0xce, 0x1d, 0xad, 0x26, 0x27, 0x48, 0xd0, 0x3b, - 0x9d, 0x46, 0xd7, 0x31, 0x65, 0x4f, 0x73, 0x4e, 0x44, 0xa6, 0x60, 0xb4, 0xd2, 0xe9, 0x2c, 0x75, - 0x57, 0x5a, 0x66, 0x53, 0xca, 0xef, 0xc6, 0x33, 0x60, 0x76, 0x3a, 0x8d, 0x0e, 0x62, 0xe2, 0x49, - 0xfe, 0xa2, 0x65, 0xc8, 0xe7, 0x30, 0x98, 0x98, 0x48, 0x2f, 0xc6, 0x13, 0x18, 0xa9, 0x41, 0x6a, - 0x84, 0xb0, 0x6d, 0x13, 0x01, 0x11, 0x4f, 0x21, 0x71, 0xd1, 0x4f, 0xfc, 0xc1, 0x2a, 0x4a, 0xa4, - 0x11, 0x0b, 0x59, 0x92, 0x8f, 0xc3, 0x40, 0xa5, 0xd3, 0x91, 0x6e, 0xab, 0xd0, 0xb1, 0x8d, 0x95, - 0x8a, 0x67, 0x70, 0x14, 0x64, 0xe2, 0xb3, 0xc4, 0xfd, 0xb6, 0xed, 0x78, 0x38, 0xa4, 0x46, 0xc3, - 0xcf, 0xf2, 0x2f, 0xc4, 0x6d, 0x39, 0x7e, 0x8f, 0x16, 0x2d, 0x73, 0xe1, 0x4d, 0x18, 0x8b, 0xb6, - 0x78, 0x57, 0x79, 0x2c, 0xbe, 0x9b, 0x43, 0xa9, 0x1c, 0xf1, 0xe7, 0x16, 0x2f, 0x41, 0xa1, 0xd2, - 0xe9, 0x88, 0x49, 0xed, 0x54, 0x4a, 0xa7, 0xc6, 0xa3, 0x33, 0x54, 0x3a, 0x1d, 0xff, 0xd3, 0x8f, - 0xf8, 0xbb, 0xad, 0x3d, 0x7d, 0xfa, 0x37, 0xf9, 0xa7, 0x1f, 0xed, 0x37, 0x55, 0xea, 0xaf, 0x14, - 0xe0, 0x44, 0xa5, 0xd3, 0x39, 0xce, 0x7f, 0x71, 0x50, 0x31, 0x20, 0x5e, 0x04, 0x90, 0xe6, 0xd8, - 0x81, 0xe0, 0x55, 0xe9, 0xb0, 0x34, 0xbf, 0x2a, 0x39, 0x4d, 0x22, 0xf2, 0xd5, 0x6f, 0x70, 0x57, - 0xea, 0xf7, 0xf9, 0x02, 0x4e, 0x7c, 0x47, 0x3d, 0x9e, 0xdd, 0x87, 0xa5, 0xdb, 0x44, 0x1f, 0x94, - 0x76, 0xd5, 0x07, 0xbf, 0x1d, 0x19, 0x3c, 0x98, 0x4f, 0xe1, 0xb8, 0x17, 0xfa, 0xf7, 0x65, 0x5b, - 0x8f, 0xc9, 0xc2, 0x14, 0x41, 0xb6, 0xfc, 0x9c, 0x72, 0x22, 0xe4, 0x5b, 0x93, 0xa1, 0x1a, 0xa6, - 0xa1, 0xc5, 0x68, 0xfd, 0x3e, 0x1c, 0xd8, 0x55, 0x1f, 0x6e, 0xe6, 0x31, 0xac, 0x43, 0x10, 0x32, - 0x6e, 0xff, 0x5b, 0x94, 0x6b, 0x00, 0xdc, 0x7d, 0x21, 0xf0, 0xcf, 0x1f, 0xe5, 0xd1, 0xa1, 0x78, - 0xaa, 0x39, 0x11, 0x1d, 0x2a, 0x24, 0x09, 0xdc, 0x9d, 0x0a, 0xa9, 0xee, 0x4e, 0x57, 0x61, 0x50, - 0xd3, 0xd7, 0xdf, 0xe9, 0x52, 0xf1, 0x98, 0xc9, 0x8f, 0xc8, 0xaa, 0xaf, 0x37, 0x7e, 0x90, 0x01, - 0xb5, 0x00, 0x4d, 0xd4, 0x20, 0x2e, 0x88, 0xe4, 0x56, 0xc2, 0x0f, 0xda, 0x83, 0x68, 0x20, 0x7b, - 0x51, 0x74, 0xf2, 0x3a, 0x14, 0x2a, 0xf7, 0xea, 0x42, 0xb2, 0x41, 0xd7, 0x56, 0xee, 0xd5, 0x85, - 0xbc, 0x32, 0xcb, 0xde, 0xab, 0xab, 0x9f, 0xcf, 0x03, 0x49, 0x52, 0x92, 0x57, 0x60, 0x08, 0xa1, - 0xab, 0x4c, 0x67, 0xe4, 0x1c, 0xc5, 0xeb, 0x6e, 0xc3, 0x41, 0x68, 0xc4, 0x42, 0xf4, 0x49, 0xc9, - 0x6b, 0x98, 0x05, 0x5e, 0x64, 0xc9, 0x8c, 0xe4, 0x28, 0x5e, 0x77, 0xfd, 0xbc, 0xe9, 0xb1, 0x24, - 0xf0, 0x82, 0x18, 0x8d, 0xcb, 0x7b, 0xf5, 0x59, 0xdb, 0xf5, 0x84, 0xa8, 0xb9, 0x71, 0xb9, 0xee, - 0x62, 0x72, 0xec, 0x88, 0x71, 0xc9, 0xc9, 0x30, 0xc1, 0xdf, 0xbd, 0x3a, 0x7f, 0x41, 0x67, 0x68, - 0x76, 0xcb, 0xb7, 0x4a, 0x79, 0x82, 0xbf, 0x75, 0xb7, 0xc1, 0x5f, 0xdf, 0x19, 0x98, 0x7e, 0x3e, - 0x92, 0xe0, 0x2f, 0x52, 0x4a, 0xfd, 0xf1, 0x41, 0x18, 0xaf, 0xea, 0x9e, 0xbe, 0xa2, 0xbb, 0x54, - 0xda, 0x92, 0x9f, 0xf0, 0x61, 0xfe, 0xe7, 0x48, 0x72, 0x30, 0x56, 0x52, 0xbe, 0x26, 0x5e, 0x80, - 0xbc, 0x11, 0xf2, 0x0d, 0xd2, 0x2f, 0xcb, 0xf9, 0x1c, 0x57, 0x1a, 0x1d, 0x01, 0xd6, 0x12, 0x84, - 0xe4, 0x79, 0x18, 0xf6, 0x61, 0x6c, 0x17, 0x51, 0x08, 0x75, 0xc6, 0x58, 0x61, 0x9b, 0x08, 0x4d, - 0x46, 0x93, 0xd7, 0x60, 0xc4, 0xff, 0x29, 0xd9, 0xe7, 0x3c, 0x39, 0xe5, 0x4a, 0x62, 0x0b, 0x26, - 0x93, 0xca, 0x45, 0x71, 0x7e, 0xeb, 0x8f, 0x14, 0x8d, 0xe5, 0x7f, 0x8c, 0x90, 0x92, 0x1f, 0x84, - 0x31, 0xff, 0xb7, 0xd8, 0x75, 0x70, 0xef, 0xc3, 0xe7, 0x83, 0xec, 0xf6, 0x31, 0xb1, 0x4e, 0x44, - 0xc9, 0xf9, 0xfe, 0xe3, 0x09, 0x3f, 0xa5, 0xa1, 0xb1, 0x92, 0xdc, 0x7e, 0xc4, 0x2a, 0x20, 0x35, - 0x38, 0xe9, 0x43, 0x42, 0x0d, 0x1d, 0x08, 0xb7, 0x9d, 0xc6, 0x4a, 0x23, 0x55, 0x49, 0x93, 0xa5, - 0x48, 0x0b, 0x2e, 0x46, 0x80, 0x86, 0xbb, 0x66, 0xde, 0xf7, 0xc4, 0x9e, 0x51, 0x84, 0x47, 0x17, - 0x39, 0x6c, 0x03, 0xae, 0x9c, 0xc6, 0x4f, 0x46, 0x1d, 0x4d, 0x5c, 0xd7, 0x93, 0x1b, 0xa9, 0xc3, - 0x69, 0x1f, 0x7f, 0x73, 0x6a, 0x69, 0xc9, 0xb1, 0xdf, 0xa3, 0x4d, 0xaf, 0x56, 0x15, 0x7b, 0x6e, - 0x0c, 0x9b, 0x69, 0xac, 0x34, 0x56, 0x9b, 0x1d, 0xa6, 0x14, 0x0c, 0x17, 0x65, 0x9e, 0x5a, 0x98, - 0xdc, 0x85, 0x33, 0x12, 0x5c, 0xca, 0x94, 0x0f, 0xe1, 0xa1, 0x80, 0xe0, 0x9a, 0x9e, 0x2c, 0x3f, - 0xbd, 0x38, 0x79, 0x13, 0x46, 0x7d, 0x04, 0xbf, 0x8a, 0x1c, 0xc6, 0xab, 0x48, 0x1c, 0x92, 0xc6, - 0x4a, 0x23, 0xfe, 0xd0, 0x3b, 0x4a, 0x2c, 0x6b, 0xd4, 0xf2, 0x46, 0x87, 0x0a, 0xb7, 0x60, 0x5f, - 0xa3, 0xbc, 0x8d, 0x4e, 0xaa, 0x32, 0x32, 0x52, 0xf2, 0x76, 0xa8, 0x51, 0x8b, 0x8e, 0xb9, 0x6a, - 0xf2, 0xed, 0xb8, 0xff, 0xb6, 0x7b, 0xa5, 0x61, 0x23, 0x30, 0x4d, 0x3f, 0x38, 0xf9, 0x85, 0x0a, - 0x9c, 0x4a, 0xd1, 0xb1, 0x5d, 0xed, 0x18, 0xbf, 0x90, 0x0f, 0x1b, 0x71, 0xc4, 0xb7, 0x8d, 0x93, - 0x30, 0xe8, 0x7f, 0x89, 0x30, 0x1e, 0x94, 0xac, 0xa1, 0x19, 0xe7, 0xe1, 0xe3, 0x23, 0xe2, 0x38, - 0xe2, 0x5b, 0xc9, 0x83, 0x10, 0xc7, 0xb7, 0x72, 0xa1, 0x38, 0x8e, 0xf8, 0xf6, 0xf2, 0x77, 0x8a, - 0xe1, 0x9c, 0x74, 0xbc, 0xc7, 0x3c, 0x28, 0x33, 0x39, 0x74, 0xa6, 0x2d, 0xed, 0xe2, 0x0d, 0xb1, - 0xac, 0x9a, 0x03, 0x7b, 0x53, 0x4d, 0xf2, 0x26, 0x0c, 0x2f, 0xd9, 0xae, 0xb7, 0xea, 0x50, 0x77, - 0x29, 0x48, 0xef, 0x81, 0xef, 0xcf, 0x3b, 0x02, 0xdc, 0xe8, 0x44, 0x66, 0x7f, 0x99, 0x5c, 0x8a, - 0xe4, 0x36, 0xb4, 0xfb, 0x48, 0x6e, 0xea, 0x3f, 0x2e, 0x24, 0x74, 0x89, 0x9b, 0xbd, 0x47, 0x52, - 0x97, 0x0e, 0x60, 0xa2, 0x20, 0xd7, 0xc3, 0x35, 0x94, 0xef, 0x0f, 0xfa, 0xa5, 0xc8, 0xa7, 0x2b, - 0x62, 0x7b, 0x10, 0x25, 0x21, 0xdf, 0x07, 0xe7, 0x22, 0x80, 0x25, 0xdd, 0xd1, 0xdb, 0xd4, 0x0b, - 0x13, 0xb1, 0x62, 0x2c, 0x3b, 0xbf, 0x74, 0xa3, 0x13, 0xa0, 0xe5, 0xe4, 0xae, 0x19, 0x1c, 0x24, - 0xc5, 0x1c, 0xd8, 0x85, 0x97, 0xf7, 0x57, 0x0a, 0xa1, 0x99, 0x14, 0x8d, 0x49, 0xad, 0x51, 0xb7, - 0xdb, 0xf2, 0x1e, 0xdf, 0x0e, 0xde, 0x5b, 0xc6, 0x9f, 0x59, 0x38, 0x51, 0xb9, 0x7f, 0x9f, 0x36, - 0x3d, 0x3f, 0xd4, 0xbe, 0x2b, 0xa2, 0x90, 0xf2, 0x6d, 0x8b, 0x40, 0x89, 0xd0, 0xe9, 0x72, 0xbf, - 0xc6, 0x8b, 0xa9, 0xff, 0xa4, 0x08, 0x4a, 0xb0, 0x6d, 0x08, 0x5e, 0x3b, 0x1e, 0xe2, 0x12, 0xfd, - 0xa1, 0xe8, 0x15, 0x13, 0x4e, 0x86, 0xc2, 0x10, 0xcf, 0xcc, 0x94, 0x7e, 0xdc, 0x96, 0x94, 0xe3, - 0xcc, 0x42, 0x42, 0xbe, 0x13, 0xb9, 0x20, 0x76, 0x22, 0x24, 0x7c, 0x4d, 0xda, 0x70, 0x39, 0x0b, - 0x2d, 0xc9, 0x95, 0x7c, 0x31, 0x07, 0xa7, 0xfd, 0x4e, 0x59, 0x5c, 0x61, 0x26, 0xf9, 0x94, 0xdd, - 0xb5, 0x82, 0x37, 0x58, 0xaf, 0x67, 0x57, 0xc7, 0x3b, 0x69, 0x22, 0xad, 0x30, 0x6f, 0x49, 0x10, - 0x6f, 0x27, 0x50, 0x08, 0x1b, 0x69, 0x1a, 0x4d, 0x24, 0xd2, 0x52, 0xeb, 0xbd, 0x70, 0x13, 0xce, - 0x67, 0xb2, 0xdc, 0xce, 0x04, 0xee, 0x97, 0x4d, 0xe0, 0xff, 0x2e, 0x17, 0x4e, 0x44, 0x31, 0x21, - 0x91, 0x09, 0x80, 0x10, 0x24, 0x36, 0xc5, 0xf8, 0xc4, 0x2b, 0x14, 0x9a, 0x26, 0x51, 0x90, 0x45, - 0x28, 0x09, 0xb1, 0xf0, 0xa4, 0xe7, 0x1f, 0xdb, 0xa6, 0x17, 0x26, 0x64, 0x39, 0xe0, 0x86, 0x57, - 0x7c, 0xb3, 0x60, 0x73, 0xe1, 0x35, 0x18, 0xde, 0xeb, 0x77, 0x7d, 0xb1, 0x00, 0x44, 0xde, 0xc1, - 0x1e, 0xa2, 0x79, 0x7f, 0x84, 0xa7, 0xb0, 0x2b, 0x30, 0xc8, 0x3e, 0x01, 0xd3, 0x00, 0x49, 0x61, - 0xbf, 0xbb, 0x02, 0xa6, 0x05, 0xd8, 0x30, 0xe6, 0xde, 0x40, 0x7a, 0xcc, 0x3d, 0xf5, 0x27, 0x0b, - 0x70, 0x56, 0xee, 0x90, 0x2a, 0xc5, 0x4c, 0x22, 0xc7, 0x9d, 0xf2, 0x01, 0x76, 0x8a, 0x0a, 0x25, - 0xbe, 0x71, 0x11, 0x29, 0x5d, 0xf8, 0xa1, 0x12, 0x42, 0x34, 0x81, 0x51, 0xff, 0x97, 0x3c, 0x8c, - 0x06, 0xc6, 0xa1, 0xee, 0xb8, 0x8f, 0x71, 0x77, 0x7c, 0x02, 0x46, 0x31, 0x6a, 0x5a, 0x9b, 0x5a, - 0x3c, 0xb2, 0x58, 0xbf, 0x94, 0x83, 0xc9, 0x47, 0x88, 0x74, 0x7b, 0x11, 0x42, 0xa6, 0xfd, 0xdc, - 0xf2, 0x93, 0x62, 0xd9, 0x71, 0xb3, 0x8f, 0xc3, 0xd5, 0xbf, 0x5a, 0x80, 0x11, 0x5f, 0xca, 0x93, - 0xe6, 0x51, 0xbd, 0x25, 0x3a, 0x5c, 0x21, 0x5f, 0x03, 0x58, 0xb2, 0x1d, 0x4f, 0x6f, 0x2d, 0x84, - 0x9a, 0x8f, 0xc7, 0xab, 0x1d, 0x84, 0xf2, 0x32, 0x12, 0x09, 0xae, 0x5f, 0xa1, 0x59, 0xcd, 0x27, - 0x26, 0xbe, 0x7e, 0x05, 0x50, 0x4d, 0xa2, 0x50, 0x7f, 0x23, 0x0f, 0x27, 0xfc, 0x4e, 0x9a, 0x7e, - 0x44, 0x9b, 0xdd, 0xc7, 0x79, 0x6e, 0x8a, 0x4a, 0xbb, 0x7f, 0x5b, 0x69, 0xab, 0xff, 0xb7, 0x34, - 0x91, 0x4c, 0xb5, 0xec, 0xe3, 0x89, 0xe4, 0x4f, 0x42, 0xc7, 0xd5, 0x1f, 0x2e, 0xc0, 0x69, 0x5f, - 0xea, 0x33, 0x5d, 0x0b, 0x0f, 0x26, 0xa6, 0xf4, 0x56, 0xeb, 0x71, 0xde, 0x8d, 0x0f, 0xfb, 0x82, - 0x58, 0x14, 0x61, 0x48, 0x45, 0xea, 0xd3, 0xfb, 0x02, 0xdc, 0xb0, 0x4d, 0x43, 0x93, 0x89, 0xc8, - 0xdb, 0x30, 0xe2, 0xff, 0xac, 0x38, 0xab, 0xfe, 0x16, 0x1c, 0xaf, 0x19, 0x82, 0x42, 0xba, 0x13, - 0x89, 0xcd, 0x11, 0x29, 0xa0, 0x7e, 0x7e, 0x00, 0x2e, 0xdc, 0x33, 0x2d, 0xc3, 0x5e, 0x77, 0xfd, - 0xcc, 0xb9, 0x47, 0xfe, 0x98, 0xed, 0xb0, 0x33, 0xe6, 0xbe, 0x03, 0x67, 0xe2, 0x22, 0x75, 0x82, - 0x7c, 0x06, 0xa2, 0x77, 0xd6, 0x39, 0x41, 0xc3, 0xcf, 0xa1, 0x2b, 0xee, 0xea, 0xb4, 0xf4, 0x92, - 0xf1, 0x24, 0xbc, 0x03, 0x3b, 0x49, 0xc2, 0xfb, 0x1c, 0x94, 0xaa, 0x76, 0x5b, 0x37, 0xfd, 0x28, - 0x4d, 0x38, 0x8a, 0x83, 0x7a, 0x11, 0xa3, 0x09, 0x0a, 0xc6, 0x5f, 0x54, 0x8c, 0x5d, 0x36, 0x14, - 0xf2, 0xf7, 0x0b, 0x30, 0x2b, 0x4d, 0x93, 0x89, 0x88, 0x0d, 0xa3, 0xa2, 0x3a, 0x71, 0xb3, 0x06, - 0xb8, 0x79, 0x7a, 0xd9, 0x97, 0x51, 0xb6, 0x5a, 0x4d, 0x44, 0xca, 0xf1, 0x6d, 0x14, 0xcf, 0x0d, - 0x2c, 0x3e, 0x86, 0xdf, 0xb1, 0x69, 0x51, 0xfe, 0x92, 0x10, 0x70, 0x92, 0x19, 0x4e, 0x0a, 0x01, - 0x67, 0x19, 0x99, 0x88, 0x4c, 0xc3, 0x49, 0x8c, 0x3a, 0x1f, 0x6c, 0xa5, 0x98, 0x4a, 0x8c, 0xa0, - 0x51, 0x89, 0x17, 0x36, 0x3c, 0x50, 0x3d, 0xfb, 0xb8, 0x46, 0x53, 0xa0, 0xb5, 0x64, 0x09, 0x72, - 0x1e, 0x0a, 0x0b, 0x73, 0x15, 0xbc, 0xe9, 0x19, 0xe4, 0x19, 0xdf, 0xac, 0x96, 0xae, 0x31, 0xd8, - 0x85, 0x4f, 0x01, 0x49, 0x7e, 0xce, 0xae, 0x6e, 0x73, 0xfe, 0xbe, 0xb4, 0xe5, 0x3b, 0xea, 0xfe, - 0x38, 0x07, 0x31, 0x11, 0x46, 0x92, 0x2d, 0xf6, 0x7f, 0x90, 0xc9, 0x16, 0x4b, 0x07, 0x9a, 0x6c, - 0x51, 0xfd, 0xc5, 0x1c, 0x9c, 0x4c, 0x64, 0x66, 0x20, 0x2f, 0x01, 0x70, 0x88, 0x14, 0xe1, 0x15, - 0x03, 0x10, 0x85, 0xd9, 0x1a, 0xc4, 0xf2, 0x18, 0x92, 0x91, 0x6b, 0x30, 0xc8, 0x7f, 0x89, 0x18, - 0x67, 0xc9, 0x22, 0xdd, 0xae, 0x69, 0x68, 0x01, 0x51, 0x58, 0x0b, 0xde, 0x67, 0x16, 0x52, 0x8b, - 0x78, 0x1b, 0x9d, 0xa0, 0x16, 0x46, 0xa6, 0xfe, 0x78, 0x1e, 0x46, 0x82, 0x06, 0x57, 0x8c, 0xc3, - 0xd2, 0xb9, 0x92, 0x48, 0x72, 0x51, 0xd8, 0x2e, 0xc9, 0x45, 0x6c, 0xbe, 0x15, 0x59, 0x2d, 0x0e, - 0xee, 0x4d, 0xd7, 0x97, 0xf2, 0x70, 0x22, 0xa8, 0xf5, 0x10, 0xaf, 0xce, 0x3e, 0x44, 0x22, 0xf9, - 0x62, 0x0e, 0x94, 0x49, 0xb3, 0xd5, 0x32, 0xad, 0xd5, 0x9a, 0x75, 0xdf, 0x76, 0xda, 0x38, 0x21, - 0x1e, 0xde, 0x11, 0xae, 0xfa, 0x67, 0x73, 0x70, 0x52, 0x34, 0x68, 0x4a, 0x77, 0x8c, 0xc3, 0x3b, - 0x1f, 0x8b, 0xb7, 0xe4, 0xf0, 0xf4, 0x45, 0xfd, 0x7a, 0x1e, 0x60, 0xce, 0x6e, 0x3e, 0x38, 0xe2, - 0x4f, 0xc2, 0xde, 0x80, 0x12, 0x77, 0xaa, 0x17, 0x1a, 0x7b, 0x52, 0x3c, 0x7d, 0x62, 0x9f, 0xc6, - 0x11, 0x93, 0xe3, 0x62, 0x3e, 0x2e, 0x71, 0xbf, 0x7c, 0x25, 0xa7, 0x89, 0x22, 0xac, 0x52, 0x46, - 0x27, 0x16, 0x8c, 0xa0, 0x52, 0x06, 0x8b, 0x56, 0xba, 0xb5, 0x59, 0x2e, 0xb6, 0xec, 0xe6, 0x03, - 0x0d, 0xe9, 0xd5, 0x7f, 0x95, 0xe3, 0xb2, 0x3b, 0xe2, 0x0f, 0x5b, 0xfd, 0xcf, 0x2f, 0xee, 0xf2, - 0xf3, 0xff, 0x5c, 0x0e, 0x4e, 0x6b, 0xb4, 0x69, 0x3f, 0xa4, 0xce, 0xc6, 0x94, 0x6d, 0xd0, 0x9b, - 0xd4, 0xa2, 0xce, 0x61, 0x8d, 0xa8, 0xdf, 0xc4, 0xac, 0x40, 0x61, 0x63, 0xee, 0xb8, 0xd4, 0x38, - 0x3a, 0x19, 0x9b, 0xd4, 0x5f, 0x1e, 0x00, 0x25, 0xd5, 0xea, 0x3d, 0xb2, 0xe6, 0x5c, 0xe6, 0x56, - 0xa6, 0x78, 0x50, 0x5b, 0x99, 0xfe, 0xdd, 0x6d, 0x65, 0x4a, 0xbb, 0xdd, 0xca, 0x0c, 0xec, 0x64, - 0x2b, 0xd3, 0x8e, 0x6f, 0x65, 0x06, 0x71, 0x2b, 0xf3, 0x52, 0xcf, 0xad, 0xcc, 0xb4, 0x65, 0xec, - 0x71, 0x23, 0x73, 0x64, 0xb3, 0x89, 0xef, 0x65, 0x07, 0x76, 0x85, 0x4d, 0x8a, 0x4d, 0xdb, 0x31, - 0xa8, 0x21, 0x36, 0x5e, 0x78, 0xea, 0xef, 0x08, 0x98, 0x16, 0x60, 0x13, 0xa9, 0xd9, 0x47, 0x77, - 0x92, 0x9a, 0xfd, 0x00, 0xf6, 0x5f, 0x5f, 0xc8, 0xc3, 0xc9, 0x29, 0xea, 0x78, 0x3c, 0x92, 0xed, - 0x41, 0x38, 0xd4, 0x55, 0xe0, 0x84, 0xc4, 0x10, 0x2d, 0xf2, 0x7c, 0xe8, 0x24, 0xd8, 0xa4, 0x8e, - 0x17, 0xf7, 0x31, 0x8c, 0xd3, 0xb3, 0xea, 0xfd, 0xf4, 0x88, 0x62, 0xec, 0x06, 0xd5, 0xfb, 0x70, - 0x2e, 0x48, 0x53, 0xfc, 0xd2, 0x02, 0x7a, 0xc9, 0x4f, 0xa6, 0xb8, 0x07, 0x3f, 0x99, 0x5f, 0xc8, - 0xc1, 0x65, 0x8d, 0x5a, 0x74, 0x5d, 0x5f, 0x69, 0x51, 0xa9, 0x59, 0x62, 0x65, 0x60, 0xb3, 0x86, - 0xe9, 0xb6, 0x75, 0xaf, 0xb9, 0xb6, 0x2f, 0x19, 0xcd, 0xc0, 0x88, 0x3c, 0x7f, 0xed, 0x62, 0x6e, - 0x8b, 0x94, 0x53, 0x7f, 0xb9, 0x08, 0x03, 0x93, 0xb6, 0x77, 0xcb, 0xde, 0x67, 0x0a, 0xce, 0x70, - 0xca, 0xcf, 0xef, 0xe2, 0xac, 0xe7, 0xe3, 0x58, 0xb9, 0x94, 0x75, 0x03, 0x1d, 0x50, 0x57, 0xec, - 0x44, 0xf6, 0x16, 0x9f, 0x6c, 0x97, 0xc9, 0x37, 0x5f, 0x81, 0x21, 0x0c, 0x40, 0x23, 0x9d, 0xc6, - 0xa2, 0x7b, 0xb7, 0xc7, 0x80, 0xf1, 0x3a, 0x42, 0x52, 0xf2, 0x7d, 0x91, 0xd0, 0xbb, 0xa5, 0xfd, - 0x27, 0xeb, 0x94, 0xa3, 0xf0, 0xbe, 0xc4, 0x2f, 0xf2, 0xb0, 0x4d, 0x52, 0x62, 0x23, 0x3c, 0x45, - 0x89, 0x35, 0x29, 0x20, 0x3c, 0xc0, 0x44, 0x9a, 0x53, 0x30, 0x3a, 0x69, 0x7b, 0x92, 0x2b, 0xf1, - 0x50, 0xf8, 0x12, 0x95, 0x49, 0x3e, 0xdd, 0x8f, 0x38, 0x5a, 0x46, 0xfd, 0x4e, 0x11, 0x46, 0xfc, - 0x9f, 0x87, 0xa4, 0x3b, 0x2f, 0x40, 0x69, 0xd6, 0x96, 0x72, 0x97, 0xa0, 0xfb, 0xf1, 0x9a, 0xed, - 0xc6, 0xfc, 0xaa, 0x05, 0x11, 0x93, 0xfa, 0x82, 0x6d, 0xc8, 0xce, 0xf3, 0x28, 0x75, 0xcb, 0x36, - 0x12, 0x2f, 0x98, 0x03, 0x42, 0x72, 0x19, 0x8a, 0xf8, 0xee, 0x40, 0x3a, 0xc8, 0x8f, 0xbd, 0x35, - 0x40, 0xbc, 0xa4, 0x95, 0xa5, 0xdd, 0x6a, 0xe5, 0xc0, 0x5e, 0xb5, 0x72, 0xf0, 0x60, 0xb5, 0xf2, - 0x5d, 0x18, 0xc1, 0x9a, 0xfc, 0xd4, 0x90, 0xdb, 0x2f, 0xac, 0xe7, 0xc5, 0xda, 0x37, 0xca, 0xdb, - 0x2d, 0x12, 0x44, 0xe2, 0x92, 0x17, 0x61, 0x15, 0xd3, 0x5d, 0xd8, 0xc7, 0x76, 0xfa, 0x1f, 0xe7, - 0x60, 0xe0, 0x8e, 0xf5, 0xc0, 0xb2, 0xd7, 0xf7, 0xa7, 0x71, 0x2f, 0xc1, 0xb0, 0x60, 0x23, 0xad, - 0x2e, 0xf8, 0x28, 0xbd, 0xcb, 0xc1, 0x0d, 0xe4, 0xa4, 0xc9, 0x54, 0xe4, 0xcd, 0xa0, 0x10, 0x3e, - 0x2d, 0x2a, 0x84, 0xd9, 0x7f, 0xfc, 0x42, 0xcd, 0x68, 0xfa, 0x0f, 0x99, 0x9c, 0x5c, 0x84, 0x62, - 0x95, 0x35, 0x55, 0x0a, 0x03, 0xcc, 0x9a, 0xa2, 0x21, 0x54, 0xfd, 0x42, 0x11, 0xc6, 0x62, 0x07, - 0x5f, 0xcf, 0xc1, 0x90, 0x38, 0x78, 0x32, 0xfd, 0x7c, 0x24, 0xf8, 0xf4, 0x28, 0x00, 0x6a, 0x83, - 0xfc, 0xcf, 0x9a, 0x41, 0x3e, 0x09, 0x03, 0xb6, 0x8b, 0x8b, 0x22, 0x7e, 0xcb, 0x58, 0x38, 0x84, - 0x16, 0xeb, 0xac, 0xed, 0x7c, 0x70, 0x08, 0x12, 0x59, 0x23, 0x6d, 0x17, 0x3f, 0xed, 0x06, 0x0c, - 0xe9, 0xae, 0x4b, 0xbd, 0x86, 0xa7, 0xaf, 0xca, 0x29, 0x4a, 0x02, 0xa0, 0x3c, 0x3a, 0x10, 0xb8, - 0xac, 0xaf, 0x92, 0x4f, 0xc1, 0x68, 0xd3, 0xa1, 0xb8, 0x6c, 0xea, 0x2d, 0xd6, 0x4a, 0xc9, 0xac, - 0x8d, 0x20, 0xe4, 0xfb, 0x93, 0x10, 0x51, 0x33, 0xc8, 0x5d, 0x18, 0x15, 0x9f, 0xc3, 0xfd, 0xfe, - 0x71, 0xa0, 0x8d, 0x85, 0xcb, 0x18, 0x17, 0x09, 0xf7, 0xfc, 0x17, 0xcf, 0x3f, 0x64, 0x72, 0x99, - 0xaf, 0x21, 0x91, 0x92, 0x45, 0x20, 0xeb, 0x74, 0xa5, 0xa1, 0x77, 0xbd, 0x35, 0x56, 0x17, 0x8f, - 0xb0, 0x2f, 0x72, 0xad, 0xe2, 0x9b, 0x89, 0x24, 0x56, 0x7e, 0x4a, 0xb2, 0x4e, 0x57, 0x2a, 0x11, - 0x24, 0xb9, 0x07, 0x67, 0x92, 0x45, 0xd8, 0x27, 0xf3, 0xcb, 0x81, 0x67, 0xb6, 0x36, 0xcb, 0xe5, - 0x54, 0x02, 0x89, 0xed, 0xa9, 0x04, 0xdb, 0x9a, 0x71, 0xab, 0x38, 0x38, 0x30, 0x3e, 0xa8, 0x8d, - 0xb1, 0xb2, 0xbe, 0x09, 0x69, 0x1a, 0xea, 0xef, 0xe5, 0x98, 0xa9, 0xc8, 0x3e, 0x08, 0x93, 0xcd, - 0x33, 0x5d, 0x6f, 0xef, 0x52, 0xd7, 0xdb, 0x61, 0x5a, 0xd8, 0x92, 0xdb, 0x63, 0x76, 0xd5, 0x04, - 0x96, 0x4c, 0x40, 0xc9, 0x90, 0x4f, 0xcd, 0xce, 0x46, 0x3b, 0xc1, 0xaf, 0x47, 0x13, 0x54, 0xe4, - 0x0a, 0x14, 0xd9, 0x92, 0x15, 0xdf, 0x32, 0xcb, 0xd6, 0x85, 0x86, 0x14, 0xea, 0x0f, 0xe5, 0x61, - 0x44, 0xfa, 0x9a, 0xeb, 0xfb, 0xfa, 0x9c, 0xd7, 0x77, 0xd6, 0x4c, 0xdf, 0xe9, 0x05, 0xf7, 0x52, - 0x7e, 0x93, 0x6f, 0x04, 0xa2, 0xd8, 0xd1, 0x85, 0x94, 0x10, 0xcc, 0x2b, 0xe2, 0x43, 0x4b, 0x3b, - 0xdf, 0x3e, 0x32, 0xfa, 0x5b, 0xc5, 0xc1, 0xfc, 0x78, 0xe1, 0x56, 0x71, 0xb0, 0x38, 0xde, 0x8f, - 0xa1, 0xc0, 0x30, 0xfa, 0x36, 0xdf, 0x9b, 0x5b, 0xf7, 0xcd, 0xd5, 0x23, 0xfe, 0xf2, 0xe4, 0x60, - 0xc3, 0xa4, 0xc5, 0x64, 0x73, 0xc4, 0x9f, 0xa1, 0x7c, 0xa0, 0xb2, 0x39, 0x4e, 0x23, 0x2b, 0x64, - 0xf3, 0x4f, 0x72, 0xa0, 0xa4, 0xca, 0xa6, 0x72, 0x48, 0x7e, 0x10, 0x07, 0x97, 0x4c, 0xf6, 0x8f, - 0xf2, 0x70, 0xb2, 0x66, 0x79, 0x74, 0x95, 0xef, 0x18, 0x8f, 0xf8, 0x54, 0x71, 0x1b, 0x86, 0xa5, - 0x8f, 0x11, 0x7d, 0xfe, 0x44, 0xb0, 0x1f, 0x0f, 0x51, 0x19, 0x9c, 0xe4, 0xd2, 0x07, 0xf7, 0x8e, - 0x27, 0x2e, 0xe4, 0x23, 0x3e, 0xe7, 0x1c, 0x0d, 0x21, 0x1f, 0xf1, 0xc9, 0xeb, 0x43, 0x2a, 0xe4, - 0xff, 0x33, 0x07, 0xa7, 0x52, 0x2a, 0x27, 0x97, 0x61, 0xa0, 0xde, 0x5d, 0xc1, 0xc8, 0x5f, 0xb9, - 0xd0, 0x63, 0xd8, 0xed, 0xae, 0x60, 0xd0, 0x2f, 0xcd, 0x47, 0x92, 0x65, 0x7c, 0x9a, 0xbf, 0x58, - 0xab, 0x4e, 0x09, 0xa9, 0xaa, 0x52, 0x90, 0x01, 0x06, 0x4e, 0xfb, 0xb2, 0xe0, 0xf9, 0xbe, 0x6d, - 0x1a, 0xcd, 0xd8, 0xf3, 0x7d, 0x56, 0x86, 0x7c, 0x3f, 0x0c, 0x55, 0xde, 0xef, 0x3a, 0x14, 0xf9, - 0x72, 0x89, 0x3f, 0x1b, 0xf0, 0xf5, 0x11, 0x69, 0x9c, 0x79, 0x24, 0x02, 0x46, 0x11, 0xe7, 0x1d, - 0x32, 0x54, 0x7f, 0x3c, 0x07, 0x17, 0xb2, 0x5b, 0x47, 0x3e, 0x0e, 0x03, 0x6c, 0x67, 0x5e, 0xd1, - 0x16, 0xc4, 0xa7, 0xf3, 0xc4, 0xcb, 0x76, 0x8b, 0x36, 0x74, 0x47, 0x36, 0xf6, 0x7d, 0x32, 0xf2, - 0x16, 0x0c, 0xd7, 0x5c, 0xb7, 0x4b, 0x9d, 0xfa, 0x4b, 0x77, 0xb4, 0x9a, 0xd8, 0x13, 0xe2, 0x9e, - 0xc3, 0x44, 0x70, 0xc3, 0x7d, 0x29, 0x16, 0xdb, 0x4b, 0xa6, 0x57, 0x7f, 0x34, 0x07, 0x17, 0x7b, - 0x7d, 0x15, 0x79, 0x09, 0x06, 0x97, 0xa9, 0xa5, 0x5b, 0x5e, 0xad, 0x2a, 0x9a, 0x84, 0x5b, 0x2c, - 0x0f, 0x61, 0xd1, 0x9d, 0x42, 0x40, 0xc8, 0x0a, 0xf1, 0x73, 0xc5, 0xc0, 0x91, 0x81, 0x9f, 0x81, - 0x22, 0x2c, 0x56, 0xc8, 0x27, 0x54, 0x7f, 0x3f, 0x0f, 0x23, 0x4b, 0xad, 0xee, 0xaa, 0x29, 0x2d, - 0x1c, 0x7b, 0xb6, 0xb7, 0x7d, 0xeb, 0x37, 0xbf, 0x3b, 0xeb, 0x97, 0x0d, 0x37, 0x67, 0x8f, 0xc3, - 0xcd, 0x2f, 0x47, 0xde, 0x84, 0x52, 0x07, 0xbf, 0x23, 0x7e, 0x12, 0xcb, 0xbf, 0x2e, 0xeb, 0x24, - 0x96, 0x97, 0x61, 0xe3, 0xab, 0xb9, 0x8f, 0xf1, 0x15, 0x96, 0x95, 0x04, 0x1a, 0x2e, 0x12, 0xc7, - 0x02, 0x3d, 0x10, 0x81, 0x86, 0x0b, 0xc2, 0xb1, 0x40, 0xf7, 0x21, 0xd0, 0x5f, 0xce, 0xc3, 0x58, - 0xb4, 0x4a, 0xf2, 0x71, 0x18, 0xe6, 0xd5, 0xf0, 0x73, 0xa1, 0x9c, 0xe4, 0x54, 0x1c, 0x82, 0x35, - 0xe0, 0x3f, 0xc4, 0x01, 0xd7, 0x89, 0x35, 0xdd, 0x6d, 0x84, 0x27, 0x34, 0xfc, 0xfe, 0x76, 0x90, - 0x7b, 0x42, 0xc5, 0x50, 0xda, 0xd8, 0x9a, 0xee, 0x4e, 0x85, 0xbf, 0xc9, 0x34, 0x10, 0x87, 0x76, - 0x5d, 0x1a, 0x65, 0x50, 0x44, 0x06, 0x22, 0xeb, 0x7d, 0x1c, 0xab, 0x9d, 0xe4, 0x30, 0x99, 0xcd, - 0x67, 0x83, 0x66, 0xa3, 0x32, 0xf4, 0xef, 0x20, 0x25, 0xbf, 0x44, 0x9f, 0x7e, 0xcc, 0xc9, 0x09, - 0xaa, 0xba, 0xa7, 0xf3, 0x4d, 0xb9, 0xdf, 0x01, 0xea, 0x7f, 0xed, 0x41, 0xff, 0xa2, 0x45, 0x17, - 0xef, 0x93, 0x17, 0x61, 0x88, 0x29, 0xcc, 0x9c, 0xcd, 0xfa, 0x32, 0x27, 0xfc, 0x27, 0x24, 0x4d, - 0x42, 0xc4, 0x6c, 0x9f, 0x16, 0x52, 0x91, 0x1b, 0x00, 0xe1, 0x13, 0x33, 0xa1, 0x7d, 0x44, 0x2e, - 0xc3, 0x31, 0xb3, 0x7d, 0x9a, 0x44, 0xe7, 0x97, 0x12, 0x0f, 0x74, 0x0a, 0xc9, 0x52, 0x1c, 0xe3, - 0x97, 0x12, 0xe3, 0x63, 0x0e, 0x08, 0xfb, 0xb5, 0xa4, 0xbb, 0xee, 0xba, 0xed, 0x18, 0x53, 0x6b, - 0xba, 0xb5, 0x4a, 0xe3, 0xbb, 0xa7, 0x24, 0xc5, 0x6c, 0x9f, 0x96, 0x52, 0x8e, 0xbc, 0x0e, 0x23, - 0xb2, 0x43, 0x69, 0xdc, 0xe9, 0x43, 0xc6, 0xcd, 0xf6, 0x69, 0x11, 0x5a, 0xf2, 0x2a, 0x0c, 0x8b, - 0xdf, 0xb7, 0x6c, 0x71, 0xa3, 0x2c, 0x45, 0x32, 0x92, 0x50, 0xb3, 0x7d, 0x9a, 0x4c, 0x29, 0x55, - 0xba, 0xe4, 0x98, 0x96, 0x27, 0xde, 0x28, 0xc7, 0x2b, 0x45, 0x9c, 0x54, 0x29, 0xfe, 0x26, 0x6f, - 0xc1, 0x68, 0x10, 0x22, 0xea, 0x3d, 0xda, 0xf4, 0xc4, 0xe1, 0xf7, 0x99, 0x58, 0x61, 0x8e, 0x9c, - 0xed, 0xd3, 0xa2, 0xd4, 0xe4, 0x0a, 0x94, 0x34, 0xea, 0x9a, 0xef, 0xfb, 0xd7, 0xc5, 0x63, 0xd2, - 0x38, 0x37, 0xdf, 0x67, 0x52, 0x12, 0x78, 0xd6, 0x3b, 0xe1, 0xfd, 0xb4, 0x38, 0xaa, 0x26, 0xb1, - 0x5a, 0xa6, 0x2d, 0x83, 0xf5, 0x8e, 0xe4, 0x9c, 0xf0, 0xa9, 0x30, 0x70, 0x96, 0xc8, 0x1b, 0x3b, - 0x1c, 0x8f, 0x50, 0x20, 0x63, 0x67, 0xfb, 0xb4, 0x18, 0xbd, 0x24, 0xd5, 0xaa, 0xe9, 0x3e, 0x10, - 0x01, 0x4f, 0xe3, 0x52, 0x65, 0x28, 0x49, 0xaa, 0xec, 0xa7, 0x54, 0xf5, 0x02, 0xf5, 0xd6, 0x6d, - 0xe7, 0x81, 0x08, 0x6f, 0x1a, 0xaf, 0x5a, 0x60, 0xa5, 0xaa, 0x05, 0x44, 0xae, 0x9a, 0x0d, 0xb8, - 0xb1, 0xf4, 0xaa, 0x75, 0x4f, 0x97, 0xab, 0xe6, 0x27, 0x71, 0x7e, 0x27, 0xcd, 0x51, 0xfd, 0x21, - 0x55, 0x4e, 0xa4, 0x76, 0x28, 0xe2, 0xa4, 0x0e, 0xc5, 0xdf, 0xac, 0x52, 0x29, 0xa9, 0xbc, 0x32, - 0x1e, 0xad, 0x54, 0x42, 0xb1, 0x4a, 0xe5, 0xf4, 0xf3, 0x37, 0xe4, 0xcc, 0xe5, 0xca, 0xc9, 0x68, - 0x07, 0x85, 0x18, 0xd6, 0x41, 0x52, 0x86, 0xf3, 0x32, 0x66, 0x45, 0x56, 0x08, 0x92, 0x0f, 0x07, - 0x2d, 0x9c, 0x5a, 0x9a, 0xed, 0xd3, 0x30, 0x5f, 0xb2, 0xca, 0xf3, 0x6d, 0x2b, 0xa7, 0x90, 0x62, - 0xc4, 0xa7, 0x60, 0xb0, 0xd9, 0x3e, 0x8d, 0xe7, 0xe2, 0x7e, 0x51, 0xca, 0x49, 0xa8, 0x9c, 0x8e, - 0x4e, 0x11, 0x01, 0x82, 0x4d, 0x11, 0x61, 0xe6, 0xc2, 0x99, 0x64, 0xe6, 0x3d, 0xe5, 0x4c, 0x74, - 0xa9, 0x89, 0xe3, 0x67, 0xfb, 0xb4, 0x64, 0xb6, 0xbe, 0x57, 0x23, 0xc9, 0xe8, 0x94, 0xb3, 0xb1, - 0xf0, 0x61, 0x21, 0x8a, 0x89, 0x4b, 0x4e, 0x5b, 0xb7, 0x08, 0xa7, 0x78, 0x2e, 0x5b, 0x11, 0x00, - 0x4c, 0x4c, 0x56, 0xe7, 0xa2, 0x1b, 0x97, 0x14, 0x92, 0xd9, 0x3e, 0x2d, 0xad, 0x24, 0x99, 0x4a, - 0xa4, 0x84, 0x53, 0x94, 0xa8, 0x6f, 0x4c, 0x0c, 0x3d, 0xdb, 0xa7, 0x25, 0x92, 0xc8, 0xdd, 0x90, - 0x73, 0xb1, 0x29, 0xe7, 0xa3, 0x9d, 0x18, 0x62, 0x58, 0x27, 0x4a, 0x39, 0xdb, 0x6e, 0xc8, 0xf9, - 0xb9, 0x94, 0x0b, 0xc9, 0x52, 0xe1, 0xcc, 0x29, 0xe5, 0xf1, 0xd2, 0xd2, 0x53, 0x0e, 0x29, 0x4f, - 0x88, 0xc4, 0xc3, 0xa2, 0x7c, 0x1a, 0xcd, 0x6c, 0x9f, 0x96, 0x9e, 0xae, 0x48, 0x4b, 0xcf, 0xd5, - 0xa3, 0x5c, 0xec, 0xc5, 0x33, 0x68, 0x5d, 0x7a, 0x9e, 0x1f, 0xbd, 0x47, 0xe6, 0x14, 0xe5, 0x52, - 0x34, 0x00, 0x72, 0x26, 0xe1, 0x6c, 0x9f, 0xd6, 0x23, 0xff, 0xca, 0x9d, 0x8c, 0x34, 0x26, 0xca, - 0x93, 0xd1, 0xbc, 0xe3, 0xa9, 0x44, 0xb3, 0x7d, 0x5a, 0x46, 0x12, 0x94, 0x3b, 0x19, 0x59, 0x2e, - 0x94, 0x72, 0x4f, 0xb6, 0x81, 0x3c, 0x32, 0x72, 0x64, 0x2c, 0xa6, 0x26, 0x88, 0x50, 0x9e, 0x8a, - 0xaa, 0x6e, 0x0a, 0x09, 0x53, 0xdd, 0xb4, 0xd4, 0x12, 0x8b, 0xa9, 0x19, 0x0d, 0x94, 0xa7, 0x7b, - 0x30, 0x0c, 0xda, 0x98, 0x9a, 0x0b, 0x61, 0x31, 0x35, 0xa5, 0x80, 0xa2, 0x46, 0x19, 0xa6, 0x90, - 0x30, 0x86, 0x69, 0xc9, 0x08, 0x16, 0x53, 0x23, 0xcf, 0x2b, 0xcf, 0xf4, 0x60, 0x18, 0xb6, 0x30, - 0x2d, 0x66, 0xfd, 0xab, 0x91, 0xd0, 0xef, 0xca, 0xb3, 0xd1, 0x79, 0x43, 0x42, 0xb1, 0x79, 0x43, - 0x0e, 0x12, 0x3f, 0x95, 0x88, 0x4b, 0xab, 0x7c, 0x24, 0x3a, 0xcc, 0x63, 0x68, 0x36, 0xcc, 0xe3, - 0x91, 0x6c, 0xa7, 0x12, 0xf1, 0x39, 0x95, 0xcb, 0x59, 0x4c, 0x10, 0x1d, 0x65, 0xc2, 0x23, 0x7a, - 0xd6, 0x52, 0x02, 0x44, 0x2a, 0x1f, 0x8d, 0xfa, 0x75, 0x27, 0x08, 0x66, 0xfb, 0xb4, 0x94, 0xb0, - 0x92, 0x5a, 0x7a, 0x34, 0x24, 0xe5, 0x4a, 0x74, 0xd8, 0xa6, 0xd1, 0xb0, 0x61, 0x9b, 0x1a, 0x49, - 0x69, 0x2e, 0xed, 0xf1, 0x89, 0x72, 0x35, 0x6a, 0x98, 0x25, 0x29, 0x98, 0x61, 0x96, 0xf2, 0x68, - 0x45, 0x4b, 0x8f, 0xb1, 0xa3, 0x3c, 0xd7, 0xb3, 0x85, 0x48, 0x93, 0xd2, 0x42, 0x1e, 0x72, 0x26, - 0xb4, 0x9d, 0xee, 0x74, 0x5a, 0xb6, 0x6e, 0x28, 0x1f, 0x4b, 0xb5, 0x9d, 0x38, 0x52, 0xb2, 0x9d, - 0x38, 0x80, 0xad, 0xf2, 0xf2, 0x1b, 0x07, 0xe5, 0xf9, 0xe8, 0x2a, 0x2f, 0xe3, 0xd8, 0x2a, 0x1f, - 0x79, 0x0f, 0x31, 0x95, 0x78, 0x0f, 0xa0, 0xbc, 0x10, 0x55, 0x80, 0x18, 0x9a, 0x29, 0x40, 0xfc, - 0x05, 0xc1, 0xe7, 0xb2, 0x3d, 0xe8, 0x95, 0x09, 0xe4, 0xf6, 0x94, 0xcf, 0x2d, 0x8b, 0x6e, 0xb6, - 0x4f, 0xcb, 0xf6, 0xc2, 0xaf, 0xa5, 0x38, 0xc4, 0x2b, 0xd7, 0xa2, 0x0a, 0x96, 0x20, 0x60, 0x0a, - 0x96, 0x74, 0xa3, 0xaf, 0xa5, 0x78, 0xb4, 0x2b, 0x1f, 0xcf, 0x64, 0x15, 0x7c, 0x73, 0x8a, 0x1f, - 0xfc, 0x0d, 0xd9, 0x25, 0x5d, 0x79, 0x31, 0xba, 0xd8, 0x85, 0x18, 0xb6, 0xd8, 0x49, 0xae, 0xeb, - 0x37, 0x64, 0x67, 0x6c, 0xe5, 0x7a, 0xb2, 0x54, 0xb8, 0x44, 0x4a, 0x4e, 0xdb, 0x5a, 0xba, 0x0f, - 0xb3, 0xf2, 0x52, 0x54, 0xeb, 0xd2, 0x68, 0x98, 0xd6, 0xa5, 0xfa, 0x3f, 0xcf, 0x24, 0x5d, 0x91, - 0x95, 0x1b, 0xf1, 0x4d, 0x76, 0x14, 0xcf, 0x2c, 0x9f, 0x84, 0xfb, 0xf2, 0xa7, 0xe2, 0xa1, 0xfa, - 0x94, 0x97, 0x63, 0xd7, 0xbe, 0x11, 0x2c, 0xb3, 0x6f, 0x63, 0xa1, 0xfd, 0x3e, 0x15, 0x8f, 0x6e, - 0xa7, 0xbc, 0x92, 0xce, 0x21, 0xd0, 0x95, 0x78, 0x34, 0xbc, 0x4f, 0xc5, 0x03, 0xc2, 0x29, 0xaf, - 0xa6, 0x73, 0x08, 0xa4, 0x1b, 0x0f, 0x20, 0xf7, 0xa2, 0x14, 0xa2, 0x5e, 0xf9, 0x44, 0xd4, 0x74, - 0x0c, 0x10, 0xcc, 0x74, 0x0c, 0x03, 0xd9, 0xbf, 0x28, 0x85, 0x76, 0x57, 0x5e, 0x4b, 0x14, 0x09, - 0x1a, 0x2b, 0x05, 0x80, 0x7f, 0x51, 0x0a, 0x89, 0xae, 0xbc, 0x9e, 0x28, 0x12, 0xb4, 0x4e, 0x0a, - 0x9c, 0x6e, 0xf4, 0x7a, 0xbf, 0xaa, 0xbc, 0x11, 0x3d, 0x0c, 0xce, 0xa6, 0x9c, 0xed, 0xd3, 0x7a, - 0xbd, 0x83, 0xfd, 0x5c, 0xb6, 0x63, 0xb7, 0xf2, 0x66, 0x74, 0x08, 0x67, 0xd1, 0xb1, 0x21, 0x9c, - 0xe9, 0x1c, 0xfe, 0x56, 0x2c, 0x96, 0x85, 0xf2, 0x56, 0x74, 0x8a, 0x8b, 0x20, 0xd9, 0x14, 0x17, - 0x8f, 0x7c, 0x11, 0x09, 0xd2, 0xa0, 0x7c, 0x32, 0x3a, 0xc5, 0xc9, 0x38, 0x36, 0xc5, 0x45, 0x02, - 0x3a, 0x4c, 0x25, 0x62, 0x07, 0x28, 0x6f, 0x47, 0xa7, 0xb8, 0x18, 0x9a, 0x4d, 0x71, 0xf1, 0x68, - 0x03, 0x6f, 0xc5, 0x9e, 0xd0, 0x2b, 0x9f, 0x4a, 0x6f, 0x3f, 0x22, 0xe5, 0xf6, 0xf3, 0x07, 0xf7, - 0x5a, 0xfa, 0x5b, 0x70, 0xa5, 0x12, 0x1d, 0xbf, 0x69, 0x34, 0x6c, 0xfc, 0xa6, 0xbe, 0x23, 0x8f, - 0x6f, 0x1c, 0x84, 0x56, 0x4d, 0xf6, 0xd8, 0x38, 0x84, 0xa6, 0x48, 0x0a, 0x38, 0xb2, 0x47, 0xe6, - 0x1b, 0xa1, 0xa9, 0x8c, 0x3d, 0xb2, 0xbf, 0x0d, 0x8a, 0xd1, 0xb3, 0xd9, 0x35, 0xe1, 0x67, 0xac, - 0x54, 0xa3, 0xb3, 0x6b, 0x82, 0x80, 0xcd, 0xae, 0x49, 0xef, 0xe4, 0x19, 0x18, 0x17, 0x5a, 0xc4, - 0xdd, 0xa7, 0x4d, 0x6b, 0x55, 0x99, 0x8e, 0xbd, 0xb7, 0x8c, 0xe1, 0xd9, 0xec, 0x14, 0x87, 0xe1, - 0x7a, 0xcd, 0x61, 0x53, 0x2d, 0xb3, 0xb3, 0x62, 0xeb, 0x8e, 0x51, 0xa7, 0x96, 0xa1, 0xcc, 0xc4, - 0xd6, 0xeb, 0x14, 0x1a, 0x5c, 0xaf, 0x53, 0xe0, 0x18, 0x22, 0x2e, 0x06, 0xd7, 0x68, 0x93, 0x9a, - 0x0f, 0xa9, 0x72, 0x13, 0xd9, 0x96, 0xb3, 0xd8, 0x0a, 0xb2, 0xd9, 0x3e, 0x2d, 0x8b, 0x03, 0xb3, - 0xd5, 0xe7, 0x37, 0xea, 0xef, 0xcc, 0x05, 0xe1, 0x07, 0x96, 0x1c, 0xda, 0xd1, 0x1d, 0xaa, 0xcc, - 0x46, 0x6d, 0xf5, 0x54, 0x22, 0x66, 0xab, 0xa7, 0x22, 0x92, 0x6c, 0xfd, 0xb1, 0x50, 0xeb, 0xc5, - 0x36, 0x1c, 0x11, 0xe9, 0xa5, 0xd9, 0xec, 0x14, 0x45, 0x30, 0x01, 0xcd, 0xd9, 0xd6, 0x2a, 0x9e, - 0x54, 0xdc, 0x8a, 0xce, 0x4e, 0xd9, 0x94, 0x6c, 0x76, 0xca, 0xc6, 0x32, 0x55, 0x8f, 0x62, 0xf9, - 0x18, 0xbc, 0x1d, 0x55, 0xf5, 0x14, 0x12, 0xa6, 0xea, 0x29, 0xe0, 0x24, 0x43, 0x8d, 0xba, 0xd4, - 0x53, 0xe6, 0x7a, 0x31, 0x44, 0x92, 0x24, 0x43, 0x04, 0x27, 0x19, 0xce, 0x50, 0xaf, 0xb9, 0xa6, - 0xcc, 0xf7, 0x62, 0x88, 0x24, 0x49, 0x86, 0x08, 0x66, 0x9b, 0xcd, 0x28, 0x78, 0xb2, 0xdb, 0x7a, - 0xe0, 0xf7, 0xd9, 0x42, 0x74, 0xb3, 0x99, 0x49, 0xc8, 0x36, 0x9b, 0x99, 0x48, 0xf2, 0xa3, 0x3b, - 0xf6, 0x83, 0x57, 0x16, 0xb1, 0xc2, 0x89, 0xd0, 0x2e, 0xd8, 0x49, 0xa9, 0xd9, 0x3e, 0x6d, 0xa7, - 0x7e, 0xf6, 0x1f, 0x0b, 0x9c, 0x46, 0x95, 0x25, 0xac, 0xea, 0x44, 0x70, 0x56, 0xc1, 0xc1, 0xb3, - 0x7d, 0x5a, 0xe0, 0x56, 0xfa, 0x2a, 0x0c, 0xe3, 0x47, 0xd5, 0x2c, 0xd3, 0xab, 0x4e, 0x2a, 0xef, - 0x44, 0xb7, 0x4c, 0x12, 0x8a, 0x6d, 0x99, 0xa4, 0x9f, 0x6c, 0x12, 0xc7, 0x9f, 0x7c, 0x8a, 0xa9, - 0x4e, 0x2a, 0x5a, 0x74, 0x12, 0x8f, 0x20, 0xd9, 0x24, 0x1e, 0x01, 0x04, 0xf5, 0x56, 0x1d, 0xbb, - 0x53, 0x9d, 0x54, 0xea, 0x29, 0xf5, 0x72, 0x54, 0x50, 0x2f, 0xff, 0x19, 0xd4, 0x5b, 0x5f, 0xeb, - 0x7a, 0x55, 0xf6, 0x8d, 0xcb, 0x29, 0xf5, 0xfa, 0xc8, 0xa0, 0x5e, 0x1f, 0xc0, 0xa6, 0x42, 0x04, - 0x2c, 0x39, 0x36, 0x9b, 0xb4, 0x6f, 0x9b, 0xad, 0x96, 0x72, 0x27, 0x3a, 0x15, 0xc6, 0xf1, 0x6c, - 0x2a, 0x8c, 0xc3, 0x98, 0xe9, 0xc9, 0x5b, 0x45, 0x57, 0xba, 0xab, 0xca, 0xdd, 0xa8, 0xe9, 0x19, - 0x62, 0x98, 0xe9, 0x19, 0xfe, 0xc2, 0xdd, 0x05, 0xfb, 0xa5, 0xd1, 0xfb, 0x0e, 0x75, 0xd7, 0x94, - 0x7b, 0xb1, 0xdd, 0x85, 0x84, 0xc3, 0xdd, 0x85, 0xf4, 0x9b, 0xac, 0xc2, 0x13, 0x91, 0x85, 0xc6, - 0xbf, 0xb4, 0xa9, 0x53, 0xdd, 0x69, 0xae, 0x29, 0x9f, 0x46, 0x56, 0xcf, 0xa4, 0x2e, 0x55, 0x51, - 0xd2, 0xd9, 0x3e, 0xad, 0x17, 0x27, 0xdc, 0x96, 0xbf, 0x33, 0xc7, 0xe3, 0xc8, 0x6a, 0x4b, 0x53, - 0xfe, 0x26, 0xf4, 0xdd, 0xd8, 0xb6, 0x3c, 0x49, 0x82, 0xdb, 0xf2, 0x24, 0x98, 0x74, 0xe0, 0xc9, - 0xd8, 0x56, 0x6d, 0x5e, 0x6f, 0xb1, 0x7d, 0x09, 0x35, 0x96, 0xf4, 0xe6, 0x03, 0xea, 0x29, 0x9f, - 0x41, 0xde, 0x97, 0x33, 0x36, 0x7c, 0x31, 0xea, 0xd9, 0x3e, 0x6d, 0x1b, 0x7e, 0x44, 0x85, 0x62, - 0x7d, 0x66, 0x79, 0x49, 0xf9, 0xbe, 0xe8, 0xf9, 0x26, 0x83, 0xcd, 0xf6, 0x69, 0x88, 0x63, 0x56, - 0xda, 0x9d, 0xce, 0xaa, 0xa3, 0x1b, 0x94, 0x1b, 0x5a, 0x68, 0xbb, 0x09, 0x03, 0xf4, 0xfb, 0xa3, - 0x56, 0x5a, 0x16, 0x1d, 0xb3, 0xd2, 0xb2, 0x70, 0x4c, 0x51, 0x23, 0x29, 0x53, 0x94, 0xcf, 0x46, - 0x15, 0x35, 0x82, 0x64, 0x8a, 0x1a, 0x4d, 0xb0, 0xf2, 0x69, 0x38, 0x1b, 0xec, 0xe7, 0xc5, 0xfa, - 0xcb, 0x3b, 0x4d, 0xf9, 0x1c, 0xf2, 0x79, 0x32, 0x71, 0x19, 0x10, 0xa1, 0x9a, 0xed, 0xd3, 0x32, - 0xca, 0xb3, 0x15, 0x37, 0x91, 0x52, 0x4c, 0x98, 0x17, 0x3f, 0x10, 0x5d, 0x71, 0x33, 0xc8, 0xd8, - 0x8a, 0x9b, 0x81, 0x4a, 0x65, 0x2e, 0x84, 0xaa, 0x6f, 0xc3, 0x3c, 0x90, 0x69, 0x16, 0x87, 0x54, - 0xe6, 0xc2, 0x52, 0x5b, 0xd9, 0x86, 0x79, 0x60, 0xad, 0x65, 0x71, 0x20, 0x57, 0xa0, 0x54, 0xaf, - 0xcf, 0x6b, 0x5d, 0x4b, 0x69, 0xc6, 0xbc, 0x65, 0x11, 0x3a, 0xdb, 0xa7, 0x09, 0x3c, 0x33, 0x83, - 0xa6, 0x5b, 0xba, 0xeb, 0x99, 0x4d, 0x17, 0x47, 0x8c, 0x3f, 0x42, 0x8c, 0xa8, 0x19, 0x94, 0x46, - 0xc3, 0xcc, 0xa0, 0x34, 0x38, 0xb3, 0x17, 0xa7, 0x74, 0xd7, 0xd5, 0x2d, 0xc3, 0xd1, 0x27, 0x71, - 0x99, 0xa0, 0xb1, 0xd7, 0x58, 0x11, 0x2c, 0xb3, 0x17, 0xa3, 0x10, 0x3c, 0x7c, 0xf7, 0x21, 0xbe, - 0x99, 0x73, 0x3f, 0x76, 0xf8, 0x1e, 0xc3, 0xe3, 0xe1, 0x7b, 0x0c, 0x86, 0x76, 0xa7, 0x0f, 0xd3, - 0xe8, 0xaa, 0xc9, 0x44, 0xa4, 0xac, 0xc6, 0xec, 0xce, 0x38, 0x01, 0xda, 0x9d, 0x71, 0x60, 0xa4, - 0x49, 0xfe, 0x72, 0xbb, 0x96, 0xd1, 0xa4, 0x70, 0x95, 0x4d, 0x94, 0x61, 0xeb, 0x77, 0x38, 0x38, - 0xaa, 0x1b, 0x96, 0xde, 0xb6, 0xab, 0x93, 0xbe, 0xd4, 0xcd, 0xe8, 0xfa, 0x9d, 0x49, 0xc8, 0xd6, - 0xef, 0x4c, 0x24, 0x9b, 0x5d, 0xfd, 0x8d, 0xd6, 0x9a, 0xee, 0x50, 0xa3, 0x6a, 0x3a, 0x78, 0xb2, - 0xb8, 0xc1, 0xb7, 0x86, 0xef, 0x45, 0x67, 0xd7, 0x1e, 0xa4, 0x6c, 0x76, 0xed, 0x81, 0x66, 0x46, - 0x5e, 0x3a, 0x5a, 0xa3, 0xba, 0xa1, 0x3c, 0x88, 0x1a, 0x79, 0xd9, 0x94, 0xcc, 0xc8, 0xcb, 0xc6, - 0x66, 0x7f, 0xce, 0x3d, 0xc7, 0xf4, 0xa8, 0xd2, 0xda, 0xc9, 0xe7, 0x20, 0x69, 0xf6, 0xe7, 0x20, - 0x9a, 0x6d, 0x08, 0xe3, 0x1d, 0xd2, 0x8e, 0x6e, 0x08, 0x93, 0xdd, 0x10, 0x2f, 0xc1, 0x2c, 0x16, - 0xf1, 0x28, 0x4f, 0xb1, 0xa2, 0x16, 0x8b, 0x00, 0x33, 0x8b, 0x25, 0x7c, 0xb6, 0x17, 0x79, 0x8a, - 0xa5, 0xd8, 0xd1, 0x35, 0x54, 0xc6, 0xb1, 0x35, 0x34, 0xf2, 0x6c, 0xeb, 0xd5, 0xc8, 0x3b, 0x03, - 0xa5, 0x13, 0xb5, 0x3a, 0x24, 0x14, 0xb3, 0x3a, 0xe4, 0x17, 0x09, 0x53, 0x70, 0x02, 0x6f, 0xc1, - 0xb5, 0x6e, 0x70, 0x8f, 0xf3, 0x83, 0xd1, 0xcf, 0x8c, 0xa1, 0xd9, 0x67, 0xc6, 0x40, 0x11, 0x26, - 0x62, 0xda, 0x72, 0x32, 0x98, 0x84, 0xe7, 0x83, 0x31, 0x10, 0x99, 0x03, 0x52, 0xaf, 0xcc, 0xcf, - 0xd5, 0x8c, 0x25, 0xf9, 0x8a, 0xcc, 0x8d, 0x9e, 0xc0, 0x26, 0x29, 0x66, 0xfb, 0xb4, 0x94, 0x72, - 0xe4, 0x3d, 0xb8, 0x28, 0xa0, 0xe2, 0xc5, 0xf5, 0x92, 0x63, 0x3f, 0x34, 0x8d, 0x60, 0x41, 0xf0, - 0xa2, 0x7e, 0x6c, 0xbd, 0x68, 0x67, 0xfb, 0xb4, 0x9e, 0xbc, 0xb2, 0xeb, 0x12, 0xeb, 0x43, 0x77, - 0x27, 0x75, 0x05, 0x8b, 0x44, 0x4f, 0x5e, 0xd9, 0x75, 0x09, 0xb9, 0x3f, 0xdc, 0x49, 0x5d, 0x41, - 0x27, 0xf4, 0xe4, 0x45, 0x5c, 0x28, 0xf7, 0xc2, 0x57, 0x5a, 0x2d, 0x65, 0x1d, 0xab, 0xfb, 0xe8, - 0x4e, 0xaa, 0xab, 0xa0, 0xc1, 0xb9, 0x1d, 0x47, 0x36, 0x4b, 0x2f, 0x76, 0xa8, 0x55, 0x8f, 0x2c, - 0x40, 0x8f, 0xa2, 0xb3, 0x74, 0x82, 0x80, 0xcd, 0xd2, 0x09, 0x20, 0x1b, 0x50, 0xf2, 0x73, 0x15, - 0x65, 0x23, 0x3a, 0xa0, 0x64, 0x1c, 0x1b, 0x50, 0x91, 0xa7, 0x2d, 0x8b, 0x70, 0x6a, 0xf1, 0x81, - 0xa7, 0xfb, 0x16, 0xa4, 0x2b, 0xba, 0xf2, 0xfd, 0xd8, 0x25, 0x53, 0x92, 0x04, 0x2f, 0x99, 0x92, - 0x60, 0x36, 0x46, 0x18, 0xb8, 0xbe, 0x61, 0x35, 0x67, 0x74, 0xb3, 0xd5, 0x75, 0xa8, 0xf2, 0xa7, - 0xa2, 0x63, 0x24, 0x86, 0x66, 0x63, 0x24, 0x06, 0x62, 0x0b, 0x34, 0x03, 0x55, 0x5c, 0xd7, 0x5c, - 0xb5, 0xc4, 0xbe, 0xb2, 0xdb, 0xf2, 0x94, 0x7f, 0x2b, 0xba, 0x40, 0xa7, 0xd1, 0xb0, 0x05, 0x3a, - 0x0d, 0x8e, 0xa7, 0x4e, 0xac, 0x17, 0xd8, 0xe2, 0x21, 0xdf, 0x55, 0xfe, 0xdb, 0xb1, 0x53, 0xa7, - 0x14, 0x1a, 0x3c, 0x75, 0x4a, 0x81, 0xb3, 0xf5, 0x91, 0xdb, 0x64, 0x73, 0x66, 0x70, 0x57, 0xfd, - 0xef, 0x44, 0xd7, 0xc7, 0x38, 0x9e, 0xad, 0x8f, 0x71, 0x58, 0x94, 0x8f, 0xe8, 0x82, 0x7f, 0x37, - 0x8b, 0x4f, 0x20, 0xff, 0x44, 0x19, 0x72, 0x53, 0xe6, 0x23, 0x46, 0xca, 0x0f, 0xe5, 0xb2, 0x18, - 0x05, 0xc3, 0x23, 0x51, 0x28, 0xca, 0x48, 0xa3, 0x0f, 0x4d, 0xba, 0xae, 0x7c, 0x3e, 0x93, 0x11, - 0x27, 0x88, 0x32, 0xe2, 0x30, 0xf2, 0x2e, 0x9c, 0x0d, 0x61, 0xf3, 0xb4, 0xbd, 0x12, 0xcc, 0x4c, - 0x7f, 0x3a, 0x17, 0x35, 0x83, 0xd3, 0xc9, 0x98, 0x19, 0x9c, 0x8e, 0x49, 0x63, 0x2d, 0x44, 0xf7, - 0xef, 0x6d, 0xc3, 0x3a, 0x90, 0x60, 0x06, 0x83, 0x34, 0xd6, 0x42, 0x9a, 0x3f, 0xbc, 0x0d, 0xeb, - 0x40, 0xa6, 0x19, 0x0c, 0xc8, 0x8f, 0xe5, 0xe0, 0x72, 0x3a, 0xaa, 0xd2, 0x6a, 0xcd, 0xd8, 0x4e, - 0x88, 0x53, 0xfe, 0x4c, 0x2e, 0x7a, 0xd0, 0xb0, 0xb3, 0x62, 0xb3, 0x7d, 0xda, 0x0e, 0x2b, 0x20, - 0x9f, 0x84, 0xd1, 0x4a, 0xd7, 0x30, 0x3d, 0xbc, 0x78, 0x63, 0x86, 0xf3, 0x8f, 0xe4, 0x62, 0x5b, - 0x1c, 0x19, 0x8b, 0x5b, 0x1c, 0x19, 0x40, 0x6e, 0xc1, 0xc9, 0x3a, 0x6d, 0x76, 0x1d, 0xd3, 0xdb, - 0xd0, 0x68, 0xc7, 0x76, 0x3c, 0xc6, 0xe3, 0xcf, 0xe6, 0xa2, 0x93, 0x58, 0x82, 0x82, 0x4d, 0x62, - 0x09, 0x20, 0xb9, 0x9b, 0xb8, 0x95, 0x17, 0x9d, 0xf9, 0xa3, 0xb9, 0x9e, 0xd7, 0xf2, 0x41, 0x5f, - 0xa6, 0x17, 0x27, 0x4b, 0xb1, 0x5b, 0x74, 0xc1, 0xf5, 0xc7, 0x72, 0x3d, 0xae, 0xd1, 0xa5, 0x19, - 0x2e, 0x09, 0x66, 0x1c, 0x53, 0x92, 0xd0, 0x2b, 0x7f, 0x2e, 0xd7, 0xe3, 0xda, 0x3b, 0xe4, 0x98, - 0x96, 0xbf, 0xfe, 0x65, 0xee, 0x29, 0x22, 0x18, 0xfd, 0xf9, 0x5c, 0xd2, 0x55, 0x24, 0x28, 0x2f, - 0x11, 0xb2, 0x62, 0x77, 0xdc, 0x40, 0xe9, 0xbf, 0x90, 0x4b, 0xfa, 0xe6, 0x85, 0xc5, 0xc2, 0x5f, - 0x84, 0xc2, 0x85, 0xe9, 0x47, 0x1e, 0x75, 0x2c, 0xbd, 0x85, 0xdd, 0x59, 0xf7, 0x6c, 0x47, 0x5f, - 0xa5, 0xd3, 0x96, 0xbe, 0xd2, 0xa2, 0xca, 0x8f, 0xe7, 0xa2, 0x16, 0x6c, 0x36, 0x29, 0xb3, 0x60, - 0xb3, 0xb1, 0x64, 0x0d, 0x9e, 0x48, 0xc3, 0x56, 0x4d, 0x17, 0xeb, 0xf9, 0x62, 0x2e, 0x6a, 0xc2, - 0xf6, 0xa0, 0x65, 0x26, 0x6c, 0x0f, 0x34, 0xb9, 0x0e, 0x43, 0x93, 0xb6, 0x3f, 0xfd, 0xfe, 0x85, - 0x98, 0x33, 0x64, 0x80, 0x99, 0xed, 0xd3, 0x42, 0x32, 0x51, 0x46, 0x0c, 0xea, 0x2f, 0x25, 0xcb, - 0x84, 0x97, 0x4f, 0xc1, 0x0f, 0x51, 0x46, 0x88, 0xfb, 0xdf, 0x4f, 0x96, 0x09, 0xef, 0xb8, 0x82, - 0x1f, 0x6c, 0x26, 0xe1, 0x35, 0xce, 0xcf, 0x54, 0x98, 0xdd, 0x36, 0xb5, 0xa6, 0xb7, 0x5a, 0xd4, - 0x5a, 0xa5, 0xca, 0x97, 0x63, 0x33, 0x49, 0x3a, 0x19, 0x9b, 0x49, 0xd2, 0x31, 0xe4, 0xfb, 0xe1, - 0xdc, 0x5d, 0xbd, 0x65, 0x1a, 0x21, 0xce, 0x4f, 0x49, 0xae, 0xfc, 0x44, 0x2e, 0xba, 0x9b, 0xce, - 0xa0, 0x63, 0xbb, 0xe9, 0x0c, 0x14, 0x99, 0x07, 0x82, 0xcb, 0x68, 0x30, 0x5b, 0xb0, 0xf5, 0x59, - 0xf9, 0x0f, 0x72, 0x51, 0x3b, 0x35, 0x49, 0xc2, 0xec, 0xd4, 0x24, 0x94, 0x34, 0xb2, 0x53, 0x83, - 0x28, 0x3f, 0x99, 0x8b, 0x9e, 0xd6, 0x64, 0x11, 0xce, 0xf6, 0x69, 0xd9, 0xf9, 0x45, 0x6e, 0xc2, - 0x78, 0x7d, 0xa9, 0x36, 0x33, 0x33, 0x5d, 0xbf, 0x5b, 0xab, 0xe2, 0x43, 0x07, 0x43, 0xf9, 0xa9, - 0xd8, 0x8a, 0x15, 0x27, 0x60, 0x2b, 0x56, 0x1c, 0x46, 0xde, 0x80, 0x11, 0xd6, 0x7e, 0x36, 0x60, - 0xf0, 0x93, 0xbf, 0x92, 0x8b, 0x9a, 0x53, 0x32, 0x92, 0x99, 0x53, 0xf2, 0x6f, 0x52, 0x87, 0xd3, - 0x4c, 0x8a, 0x4b, 0x0e, 0xbd, 0x4f, 0x1d, 0x6a, 0x35, 0xfd, 0x31, 0xfd, 0xd3, 0xb9, 0xa8, 0x95, - 0x91, 0x46, 0xc4, 0xac, 0x8c, 0x34, 0x38, 0x79, 0x00, 0x17, 0xe3, 0x27, 0x41, 0xf2, 0xb3, 0x53, - 0xe5, 0x2f, 0xe6, 0x62, 0xc6, 0x70, 0x0f, 0x62, 0x34, 0x86, 0x7b, 0xe0, 0x89, 0x05, 0x97, 0xc4, - 0xb1, 0x8a, 0x70, 0xb8, 0x8c, 0xd7, 0xf6, 0x33, 0xbc, 0xb6, 0x8f, 0x84, 0x0e, 0x81, 0x3d, 0xa8, - 0x67, 0xfb, 0xb4, 0xde, 0xec, 0x98, 0x9e, 0x25, 0x13, 0x60, 0x28, 0x7f, 0x29, 0x97, 0xee, 0x91, - 0x12, 0x71, 0x53, 0x4e, 0xcb, 0x9c, 0xf1, 0x6e, 0x56, 0xfa, 0x06, 0xe5, 0x2f, 0xc7, 0xc6, 0x5b, - 0x3a, 0x19, 0x1b, 0x6f, 0x19, 0xf9, 0x1f, 0x6e, 0xc1, 0x49, 0xae, 0xd4, 0x4b, 0x3a, 0x0e, 0x43, - 0x6b, 0x95, 0x1a, 0xca, 0x5f, 0x89, 0xad, 0x76, 0x09, 0x0a, 0x74, 0xed, 0x89, 0x03, 0xd9, 0xd4, - 0x5d, 0xef, 0xe8, 0x96, 0x85, 0xc7, 0xac, 0xca, 0x7f, 0x18, 0x9b, 0xba, 0x43, 0x14, 0x3a, 0xee, - 0x06, 0xbf, 0x98, 0x26, 0xf4, 0x4a, 0x7d, 0xa4, 0xfc, 0x47, 0x31, 0x4d, 0xe8, 0x45, 0xcc, 0x34, - 0xa1, 0x67, 0x1e, 0xa5, 0xbb, 0x19, 0x4f, 0xc0, 0x95, 0xaf, 0xc6, 0x56, 0xe4, 0x54, 0x2a, 0xb6, - 0x22, 0xa7, 0xbf, 0x20, 0xbf, 0x9b, 0xf1, 0x7c, 0x5a, 0xf9, 0xd9, 0xde, 0x7c, 0xc3, 0x95, 0x3e, - 0xfd, 0xf5, 0xf5, 0xdd, 0x8c, 0xa7, 0xc7, 0xca, 0x5f, 0xed, 0xcd, 0x37, 0x74, 0xec, 0x4b, 0x7f, - 0xb9, 0xdc, 0xc8, 0x7e, 0xb6, 0xab, 0xfc, 0xb5, 0xf8, 0xd4, 0x95, 0x41, 0x88, 0x53, 0x57, 0xd6, - 0xdb, 0xdf, 0x15, 0x38, 0xcf, 0x35, 0xe4, 0xa6, 0xa3, 0x77, 0xd6, 0xea, 0xd4, 0xf3, 0x4c, 0x6b, - 0xd5, 0xdf, 0x89, 0xfd, 0xc7, 0xb9, 0xd8, 0xf1, 0x58, 0x16, 0x25, 0x1e, 0x8f, 0x65, 0x21, 0x99, - 0xf2, 0x26, 0x1e, 0xe8, 0x2a, 0x7f, 0x3d, 0xa6, 0xbc, 0x09, 0x0a, 0xa6, 0xbc, 0xc9, 0x77, 0xbd, - 0xb7, 0x52, 0xde, 0xa1, 0x2a, 0xff, 0x49, 0x36, 0xaf, 0xa0, 0x7d, 0x29, 0xcf, 0x57, 0x6f, 0xa5, - 0x3c, 0xb7, 0x54, 0xfe, 0xd3, 0x6c, 0x5e, 0xa1, 0x0f, 0x52, 0xf2, 0x95, 0xe6, 0xbb, 0x70, 0x96, - 0xcf, 0xe6, 0x33, 0xd4, 0xa0, 0x91, 0x0f, 0xfd, 0xb9, 0xd8, 0xd8, 0x4f, 0x27, 0xc3, 0x23, 0xf7, - 0x54, 0x4c, 0x1a, 0x6b, 0xd1, 0xd6, 0xbf, 0xb1, 0x0d, 0xeb, 0x70, 0x43, 0x90, 0x8e, 0x61, 0xeb, - 0x8d, 0xfc, 0xf8, 0x4d, 0xf9, 0xf9, 0xd8, 0x7a, 0x23, 0x23, 0xd1, 0x9d, 0x43, 0x7e, 0x29, 0xf7, - 0x46, 0xf4, 0xa1, 0x97, 0xf2, 0x37, 0x53, 0x0b, 0x07, 0x1d, 0x10, 0x7d, 0x15, 0xf6, 0x46, 0xf4, - 0x51, 0x93, 0xf2, 0x0b, 0xa9, 0x85, 0x83, 0x0f, 0x88, 0xbe, 0x80, 0x62, 0x5b, 0xa4, 0xae, 0x67, - 0x73, 0x56, 0x91, 0xe9, 0xe1, 0x6f, 0xc5, 0xb7, 0x48, 0xa9, 0x64, 0xb8, 0x45, 0x4a, 0xc5, 0xa4, - 0xb1, 0x16, 0x9f, 0xf7, 0x8b, 0xdb, 0xb0, 0x96, 0x36, 0x76, 0xa9, 0x98, 0x34, 0xd6, 0xe2, 0xe3, - 0xbf, 0xb6, 0x0d, 0x6b, 0x69, 0x63, 0x97, 0x8a, 0x61, 0xe6, 0x58, 0x88, 0xb9, 0x4b, 0x1d, 0x37, - 0x54, 0xbf, 0xff, 0x2c, 0x66, 0x8e, 0x65, 0xd0, 0x31, 0x73, 0x2c, 0x03, 0x95, 0xca, 0x5d, 0x08, - 0xe5, 0x97, 0xb6, 0xe3, 0x1e, 0xde, 0xcb, 0x64, 0xa0, 0x52, 0xb9, 0x0b, 0xb9, 0xfc, 0xed, 0xed, - 0xb8, 0x87, 0x17, 0x33, 0x19, 0x28, 0x66, 0x14, 0xd5, 0x3d, 0xdd, 0x33, 0x9b, 0xb3, 0xb6, 0xeb, - 0x49, 0x8b, 0xfc, 0x7f, 0x1e, 0x33, 0x8a, 0xd2, 0x88, 0x98, 0x51, 0x94, 0x06, 0x4f, 0x32, 0x15, - 0xd2, 0xf8, 0xe5, 0x9e, 0x4c, 0x43, 0x4b, 0x2b, 0x0d, 0x9e, 0x64, 0x2a, 0x84, 0xf0, 0x5f, 0xf4, - 0x64, 0x1a, 0x7a, 0xca, 0xa7, 0xc1, 0x99, 0x65, 0x3a, 0xe5, 0xd8, 0xeb, 0xd6, 0x2d, 0xba, 0x4e, - 0x5b, 0xe2, 0xd3, 0x7f, 0x25, 0x66, 0x99, 0xc6, 0x09, 0xf0, 0x16, 0x25, 0x06, 0x8b, 0x32, 0x12, - 0x9f, 0xfb, 0xab, 0x99, 0x8c, 0xc2, 0x63, 0xa2, 0x38, 0x2c, 0xca, 0x48, 0x7c, 0xe2, 0xaf, 0x65, - 0x32, 0x0a, 0x8f, 0x89, 0xe2, 0x30, 0x52, 0x81, 0x31, 0x7c, 0x2b, 0xa1, 0xbb, 0xbe, 0xe7, 0xe7, - 0x6f, 0xe6, 0xa2, 0xb7, 0x5e, 0x51, 0xf4, 0x6c, 0x9f, 0x16, 0x2b, 0x20, 0xb3, 0x10, 0x9f, 0xf4, - 0x8d, 0x0c, 0x16, 0xa1, 0xbf, 0x63, 0x14, 0x22, 0xb3, 0x10, 0x1f, 0xf3, 0x5f, 0x66, 0xb0, 0x08, - 0x1d, 0x1e, 0xa3, 0x10, 0xf2, 0x09, 0x18, 0xae, 0xcf, 0x2c, 0x2f, 0xf9, 0xe9, 0xf9, 0xfe, 0x4e, - 0x2e, 0xf6, 0xaa, 0x28, 0xc4, 0xe1, 0xab, 0xa2, 0xf0, 0x27, 0xf9, 0x24, 0x8c, 0x4e, 0xd9, 0x96, - 0xa7, 0x37, 0xfd, 0x0d, 0xe8, 0x6f, 0xc5, 0xce, 0x50, 0x22, 0xd8, 0xd9, 0x3e, 0x2d, 0x4a, 0x2e, - 0x95, 0x17, 0x6d, 0xff, 0xed, 0xf4, 0xf2, 0x41, 0xd3, 0xa3, 0xe4, 0x6c, 0x46, 0xbb, 0x67, 0x3b, - 0x0f, 0x5a, 0xb6, 0x6e, 0xf8, 0x11, 0x21, 0x45, 0x43, 0xfe, 0x6e, 0x6c, 0x46, 0x4b, 0x27, 0x63, - 0x33, 0x5a, 0x3a, 0x26, 0x8d, 0xb5, 0xe8, 0xa2, 0x6f, 0x6e, 0xc3, 0x3a, 0x9c, 0x87, 0xd3, 0x31, - 0x69, 0xac, 0xc5, 0xe7, 0xff, 0xbd, 0x6d, 0x58, 0x87, 0xf3, 0x70, 0x3a, 0x86, 0x50, 0xb8, 0x10, - 0xbc, 0x79, 0x0c, 0x37, 0xa1, 0x35, 0xeb, 0x21, 0xdb, 0xe8, 0x2a, 0x7f, 0x3f, 0x76, 0xbc, 0x91, - 0x4d, 0x3a, 0xdb, 0xa7, 0xf5, 0x60, 0x44, 0x96, 0x62, 0x0e, 0x87, 0x3c, 0x78, 0x9c, 0xf2, 0x0f, - 0x72, 0x3d, 0x3c, 0x0e, 0x39, 0x4d, 0xc2, 0xe3, 0x90, 0x83, 0x27, 0x07, 0xa0, 0x1f, 0x0f, 0xe5, - 0x6f, 0x95, 0x06, 0xbf, 0x9e, 0x1b, 0xff, 0xf5, 0xdc, 0xad, 0xd2, 0xe0, 0xaf, 0xe7, 0xc6, 0x7f, - 0x83, 0xfd, 0xff, 0x1b, 0xb9, 0xf1, 0xdf, 0xcc, 0x69, 0xe7, 0xc3, 0x09, 0xb6, 0xb2, 0x4a, 0x2d, - 0x6f, 0xa9, 0xa5, 0x8b, 0xe5, 0x21, 0x15, 0xc5, 0x7f, 0xa6, 0xa2, 0x44, 0x52, 0xb5, 0xaf, 0xe6, - 0x60, 0xa4, 0xee, 0x39, 0x54, 0x6f, 0x8b, 0x18, 0x85, 0x17, 0x60, 0x90, 0xbb, 0xd1, 0xfb, 0x6f, - 0xfe, 0xb5, 0xe0, 0x37, 0xb9, 0x0c, 0x63, 0x73, 0xba, 0xeb, 0x61, 0x13, 0x6b, 0x96, 0x41, 0x1f, - 0xe1, 0x13, 0xd2, 0x82, 0x16, 0x83, 0x92, 0x39, 0x4e, 0xc7, 0xcb, 0x61, 0x58, 0xda, 0xc2, 0xb6, - 0xa1, 0xf9, 0x06, 0xbf, 0xb5, 0x59, 0xee, 0xc3, 0x48, 0x7c, 0xb1, 0xb2, 0xea, 0xef, 0xe5, 0x20, - 0xe1, 0xe0, 0xbf, 0xf7, 0x58, 0x1c, 0x8b, 0x70, 0x22, 0x16, 0x0a, 0x59, 0xbc, 0x83, 0xdd, 0x61, - 0xa4, 0xe4, 0x78, 0x69, 0xf2, 0xd1, 0xe0, 0xfd, 0xe5, 0x1d, 0x6d, 0x4e, 0x84, 0x5d, 0xc4, 0x84, - 0x21, 0x5d, 0xa7, 0xa5, 0x49, 0x28, 0x11, 0x56, 0xeb, 0xbb, 0xe3, 0x61, 0x9c, 0x57, 0x72, 0x59, - 0x04, 0x06, 0xc9, 0x85, 0xc1, 0x1a, 0xbb, 0x2e, 0x75, 0xe4, 0x60, 0x8d, 0x18, 0x08, 0xe4, 0x93, - 0x30, 0x52, 0x6b, 0x77, 0xa8, 0xe3, 0xda, 0x96, 0xee, 0xd9, 0x8e, 0x88, 0xab, 0x80, 0x81, 0xfc, - 0x4c, 0x09, 0x2e, 0x07, 0x97, 0x93, 0xe9, 0xc9, 0x55, 0x3f, 0xe7, 0x61, 0x01, 0x23, 0xec, 0xe2, - 0xe3, 0xe8, 0x78, 0xc2, 0x7c, 0x4e, 0xc1, 0x48, 0xef, 0xb8, 0x3a, 0xbe, 0xd4, 0x0d, 0x48, 0xbb, - 0x0c, 0x20, 0x93, 0x22, 0x05, 0x79, 0x1e, 0x4a, 0x38, 0x32, 0x5c, 0xcc, 0x65, 0x2a, 0x42, 0x48, - 0xb6, 0x10, 0x22, 0x07, 0xec, 0xe3, 0x34, 0xe4, 0x36, 0x8c, 0x87, 0x6e, 0x1b, 0x37, 0x1d, 0xbb, - 0xdb, 0xf1, 0xb3, 0x17, 0x95, 0xb7, 0x36, 0xcb, 0x4f, 0x3c, 0x08, 0x70, 0x8d, 0x55, 0x44, 0x4a, - 0x2c, 0x12, 0x05, 0xc9, 0x2c, 0x9c, 0x08, 0x61, 0x4c, 0x44, 0x7e, 0xd6, 0x34, 0xcc, 0x58, 0x2b, - 0xf1, 0x62, 0xe2, 0x8c, 0x64, 0xac, 0x8d, 0x15, 0x23, 0x35, 0x18, 0xf0, 0xe3, 0x47, 0x0e, 0x6e, - 0xab, 0xa4, 0xa7, 0x44, 0xfc, 0xc8, 0x01, 0x39, 0x72, 0xa4, 0x5f, 0x9e, 0xcc, 0xc0, 0x98, 0x66, - 0x77, 0x3d, 0xba, 0x6c, 0x8b, 0xf3, 0x0e, 0x11, 0xa7, 0x14, 0xdb, 0xe4, 0x30, 0x4c, 0xc3, 0xb3, - 0x1b, 0x4d, 0x8e, 0x93, 0xda, 0x14, 0x2b, 0x45, 0x16, 0xe0, 0x64, 0xc2, 0xc1, 0x05, 0x1f, 0xf6, - 0x0e, 0xf1, 0x48, 0x80, 0xd2, 0xe7, 0x25, 0x99, 0x25, 0x8b, 0x92, 0x1f, 0xc9, 0x41, 0x69, 0xd9, - 0xd1, 0x4d, 0xcf, 0x15, 0x8f, 0x7c, 0xcf, 0x4c, 0xac, 0x3b, 0x7a, 0x87, 0xe9, 0xc7, 0x04, 0x86, - 0x50, 0xbe, 0xab, 0xb7, 0xba, 0xd4, 0x9d, 0xbc, 0xc7, 0xbe, 0xee, 0x7f, 0xd8, 0x2c, 0xbf, 0xb1, - 0x8a, 0xc7, 0xe8, 0x13, 0x4d, 0xbb, 0x7d, 0x6d, 0xd5, 0xd1, 0x1f, 0x9a, 0x1e, 0x6e, 0x56, 0xf4, - 0xd6, 0x35, 0x8f, 0xb6, 0xf0, 0xb4, 0xfe, 0x9a, 0xde, 0x31, 0xaf, 0x61, 0xa8, 0xfe, 0x6b, 0x01, - 0x27, 0x5e, 0x03, 0x53, 0x01, 0x0f, 0xff, 0x92, 0x55, 0x80, 0xe3, 0xc8, 0x02, 0x80, 0xf8, 0xd4, - 0x4a, 0xa7, 0x23, 0x5e, 0x0c, 0x4b, 0x67, 0xdc, 0x3e, 0x86, 0x2b, 0x76, 0x20, 0x30, 0xbd, 0x23, - 0x85, 0xa7, 0xd6, 0x24, 0x0e, 0x4c, 0x0b, 0x96, 0x45, 0x8b, 0x7c, 0x31, 0x8d, 0x86, 0x12, 0xf7, - 0x1b, 0x9b, 0x22, 0xa4, 0x78, 0x31, 0xb2, 0x02, 0x27, 0x04, 0xdf, 0x20, 0x99, 0xcd, 0x58, 0x74, - 0x56, 0x88, 0xa1, 0xb9, 0xd2, 0x06, 0x6d, 0x34, 0x04, 0x58, 0xae, 0x23, 0x56, 0x82, 0x4c, 0x86, - 0xc9, 0xb7, 0x17, 0xf4, 0x36, 0x75, 0x95, 0x13, 0xa8, 0xb1, 0x17, 0xb7, 0x36, 0xcb, 0x8a, 0x5f, - 0x1e, 0x43, 0xa9, 0xca, 0xa2, 0x8b, 0x16, 0x91, 0x79, 0x70, 0xad, 0x1f, 0x4f, 0xe1, 0x11, 0xd7, - 0xf9, 0x68, 0x11, 0x32, 0x05, 0xa3, 0xc1, 0x83, 0xa5, 0x3b, 0x77, 0x6a, 0x55, 0x7c, 0x92, 0x2c, - 0xa2, 0xe9, 0xc6, 0xd2, 0xcd, 0xc8, 0x4c, 0x22, 0x65, 0xa4, 0x28, 0x2f, 0xfc, 0x8d, 0x72, 0x2c, - 0xca, 0x4b, 0x27, 0x25, 0xca, 0xcb, 0x12, 0x79, 0x0b, 0x86, 0x2b, 0xf7, 0xea, 0x22, 0x7a, 0x8d, - 0xab, 0x9c, 0x0a, 0x73, 0x97, 0xe9, 0xeb, 0x6e, 0xc3, 0x8f, 0x74, 0x23, 0x37, 0x5d, 0xa6, 0x27, - 0xd3, 0x30, 0x16, 0x59, 0x34, 0x5d, 0xe5, 0x34, 0x72, 0xc0, 0x96, 0xeb, 0x88, 0x69, 0x38, 0x02, - 0x25, 0x0f, 0xaf, 0x68, 0x21, 0xa6, 0x35, 0x55, 0xd3, 0xc5, 0x3c, 0x50, 0x1a, 0xc5, 0x40, 0x39, - 0xf8, 0xc0, 0x79, 0x90, 0x6b, 0x8d, 0x21, 0x50, 0x0d, 0x87, 0xe3, 0xe4, 0x1e, 0x8d, 0x15, 0x23, - 0xef, 0x01, 0xc1, 0xcc, 0x51, 0xd4, 0xf0, 0xaf, 0xc0, 0x6b, 0x55, 0x57, 0x39, 0x8b, 0xa1, 0xe4, - 0x49, 0x3c, 0x30, 0x47, 0xad, 0x3a, 0x79, 0x59, 0x4c, 0x1f, 0x4f, 0xea, 0xbc, 0x54, 0xc3, 0x0f, - 0xca, 0xd1, 0x30, 0x23, 0x69, 0xb5, 0x53, 0xb8, 0x92, 0x75, 0x38, 0xb7, 0xe4, 0xd0, 0x87, 0xa6, - 0xdd, 0x75, 0xfd, 0xe5, 0xc3, 0x9f, 0xb7, 0xce, 0x6d, 0x3b, 0x6f, 0x3d, 0x2d, 0x2a, 0x3e, 0xd3, - 0x71, 0xe8, 0xc3, 0x86, 0x1f, 0x40, 0x3c, 0x12, 0xff, 0x36, 0x8b, 0x3b, 0x26, 0x07, 0x7f, 0xbf, - 0xeb, 0x50, 0x01, 0x37, 0xa9, 0xab, 0x28, 0xe1, 0x54, 0xcb, 0x63, 0x1e, 0x99, 0x01, 0x2e, 0x92, - 0x1c, 0x3c, 0x5a, 0x8c, 0x68, 0x40, 0x6e, 0x4e, 0xf9, 0xee, 0x10, 0x95, 0x26, 0x4f, 0xa1, 0xac, - 0x9c, 0x47, 0x66, 0x2a, 0x13, 0xcb, 0x6a, 0x33, 0x48, 0x26, 0xd0, 0xd0, 0x05, 0x5e, 0x16, 0x4b, - 0xb2, 0x34, 0x99, 0x83, 0xf1, 0x25, 0x07, 0x0f, 0x67, 0x6f, 0xd3, 0x8d, 0x25, 0xbb, 0x65, 0x36, - 0x37, 0xf0, 0x9d, 0xb5, 0x98, 0x2a, 0x3b, 0x1c, 0xd7, 0x78, 0x40, 0x37, 0x1a, 0x1d, 0xc4, 0xca, - 0xcb, 0x4a, 0xbc, 0xa4, 0x1c, 0xdc, 0xfb, 0x89, 0x9d, 0x05, 0xf7, 0xa6, 0x30, 0x2e, 0x9c, 0x29, - 0x1e, 0x79, 0xd4, 0x62, 0x4b, 0xbd, 0x2b, 0xde, 0x54, 0x2b, 0x31, 0xe7, 0x8b, 0x00, 0xcf, 0xa7, - 0x0e, 0x31, 0xca, 0x68, 0x00, 0x96, 0x1b, 0x16, 0x2f, 0x92, 0x8c, 0x80, 0x7d, 0x69, 0x0f, 0x11, - 0xb0, 0xff, 0x8f, 0x82, 0x3c, 0xff, 0x92, 0x8b, 0x50, 0x94, 0x12, 0x54, 0x61, 0x78, 0x5f, 0x0c, - 0xe6, 0x5f, 0x14, 0x51, 0xcb, 0x87, 0x84, 0xed, 0x12, 0xc4, 0x71, 0xc2, 0x8c, 0xa4, 0x61, 0xc8, - 0x57, 0x2d, 0x24, 0xc0, 0x6c, 0x90, 0xdd, 0x95, 0x96, 0xd9, 0xc4, 0x14, 0x0f, 0x05, 0x29, 0x70, - 0x0b, 0x42, 0x79, 0x86, 0x07, 0x89, 0x84, 0x5c, 0x87, 0x61, 0xff, 0x52, 0x20, 0x0c, 0x6f, 0x8d, - 0x91, 0xff, 0xc5, 0x6c, 0x2d, 0x12, 0x0b, 0x48, 0x44, 0xe4, 0x75, 0x80, 0x70, 0x3a, 0x10, 0x96, - 0x16, 0x2e, 0x15, 0xf2, 0xec, 0x21, 0x2f, 0x15, 0x21, 0x35, 0x9b, 0x38, 0x65, 0x75, 0xf4, 0xf3, - 0xdf, 0xe2, 0xc4, 0x19, 0xd1, 0x61, 0x59, 0x41, 0xa2, 0x45, 0xc8, 0x22, 0x9c, 0x4c, 0x68, 0xa0, - 0x08, 0x86, 0xfd, 0xf4, 0xd6, 0x66, 0xf9, 0x52, 0x8a, 0xfa, 0xca, 0x0b, 0x73, 0xa2, 0x2c, 0x79, - 0x06, 0x0a, 0x77, 0xb4, 0x9a, 0x08, 0xc8, 0xcb, 0x63, 0x39, 0x47, 0xa2, 0x75, 0x31, 0x2c, 0x79, - 0x0d, 0x80, 0x27, 0xbc, 0x59, 0xb2, 0x1d, 0x0f, 0x2d, 0x8a, 0xd1, 0xc9, 0xf3, 0x6c, 0x2c, 0xf3, - 0x84, 0x38, 0x0d, 0xb6, 0x8c, 0xc9, 0x1f, 0x1d, 0x12, 0xab, 0x7f, 0x3a, 0x9f, 0x58, 0xd6, 0x98, - 0xe0, 0x45, 0x2b, 0xa4, 0xce, 0x47, 0xc1, 0xfb, 0x4d, 0xe7, 0x82, 0x97, 0x88, 0xc8, 0x15, 0x18, - 0x5c, 0x62, 0x93, 0x4a, 0xd3, 0x6e, 0x09, 0x55, 0xc0, 0xa8, 0x6c, 0x1d, 0x01, 0xd3, 0x02, 0x2c, - 0xb9, 0x2e, 0x65, 0x7c, 0x96, 0xc2, 0xe3, 0xfb, 0x19, 0x9f, 0xe3, 0x71, 0xe2, 0x31, 0xf7, 0xf3, - 0xf5, 0x58, 0x06, 0x39, 0x51, 0x26, 0x65, 0x49, 0x0d, 0x33, 0xc6, 0x05, 0x06, 0x6d, 0xff, 0x76, - 0x06, 0xad, 0xfa, 0x5b, 0xb9, 0xe4, 0x10, 0x25, 0x37, 0x92, 0x91, 0xaa, 0x71, 0xfd, 0x0a, 0x80, - 0x72, 0xad, 0x41, 0xcc, 0xea, 0x48, 0xcc, 0xe9, 0xfc, 0x9e, 0x63, 0x4e, 0x17, 0x76, 0x19, 0x73, - 0x5a, 0xfd, 0xff, 0x8a, 0x3d, 0xdf, 0x0d, 0x1c, 0x4a, 0x6c, 0xc2, 0xd7, 0xd8, 0xa6, 0x8c, 0xd5, - 0x5e, 0x71, 0x13, 0x5b, 0x0b, 0xee, 0x16, 0xdd, 0xd0, 0xf9, 0xa8, 0x74, 0xb5, 0x28, 0x25, 0x79, - 0x1b, 0x46, 0xfc, 0x0f, 0xc0, 0x58, 0xe6, 0x52, 0x0c, 0xee, 0x60, 0x41, 0x8c, 0x45, 0xfd, 0x8e, - 0x14, 0x20, 0x2f, 0xc3, 0x10, 0x9a, 0x43, 0x1d, 0xbd, 0xe9, 0x07, 0xba, 0xe7, 0x91, 0xf1, 0x7d, - 0xa0, 0x1c, 0x7f, 0x2f, 0xa0, 0x24, 0x9f, 0x85, 0x92, 0xc8, 0xf6, 0x52, 0xc2, 0x25, 0xfa, 0xda, - 0x0e, 0x1e, 0x5a, 0x4c, 0xc8, 0x99, 0x5e, 0xf8, 0x06, 0x07, 0x01, 0x91, 0x0d, 0x0e, 0x4f, 0xf2, - 0xb2, 0x0c, 0xa7, 0x96, 0x1c, 0x6a, 0xe0, 0x93, 0x9e, 0xe9, 0x47, 0x1d, 0x47, 0xe4, 0xe1, 0xe1, - 0x13, 0x04, 0xae, 0x6f, 0x1d, 0x1f, 0xcd, 0x56, 0x5e, 0x81, 0x97, 0xa3, 0x6d, 0xa7, 0x14, 0x67, - 0x46, 0x0f, 0x6f, 0xc9, 0x6d, 0xba, 0xb1, 0x6e, 0x3b, 0x06, 0x4f, 0x55, 0x23, 0xa6, 0x7e, 0x21, - 0xe8, 0x07, 0x02, 0x25, 0x1b, 0x3d, 0xd1, 0x42, 0x17, 0x5e, 0x83, 0xe1, 0xbd, 0x66, 0x4b, 0xf9, - 0xa5, 0x7c, 0xc6, 0x0b, 0xbc, 0xc7, 0x37, 0x61, 0x65, 0x90, 0x45, 0xbd, 0x3f, 0x23, 0x8b, 0xfa, - 0x77, 0xf2, 0x19, 0xcf, 0x0b, 0x1f, 0xeb, 0x6c, 0xc7, 0x81, 0x30, 0xa2, 0xd9, 0x8e, 0xc3, 0x44, - 0xd3, 0xa6, 0xa1, 0xc9, 0x44, 0xb1, 0xbc, 0xe8, 0xa5, 0x6d, 0xf3, 0xa2, 0xff, 0x5c, 0xa1, 0xd7, - 0xf3, 0xcb, 0x63, 0xd9, 0xef, 0x46, 0xf6, 0xd7, 0x61, 0x38, 0x90, 0x6c, 0xad, 0x8a, 0xf6, 0xd2, - 0x68, 0x90, 0x9b, 0x89, 0x83, 0xb1, 0x8c, 0x44, 0x44, 0xae, 0xf2, 0xb6, 0xd6, 0xcd, 0xf7, 0x79, - 0x96, 0x90, 0x51, 0x91, 0xff, 0x41, 0xf7, 0xf4, 0x86, 0x6b, 0xbe, 0x4f, 0xb5, 0x00, 0xad, 0xfe, - 0xdd, 0x7c, 0xea, 0x1b, 0xd6, 0xe3, 0x3e, 0xda, 0x45, 0x1f, 0xa5, 0x08, 0x91, 0xbf, 0xbe, 0x3d, - 0x16, 0xe2, 0x2e, 0x84, 0xf8, 0xc7, 0xf9, 0xd4, 0xb7, 0xca, 0xc7, 0x42, 0xdc, 0xcd, 0x6c, 0xf1, - 0x3c, 0x0c, 0x69, 0xf6, 0xba, 0x3b, 0x85, 0x7b, 0x22, 0x3e, 0x57, 0xe0, 0x44, 0xed, 0xd8, 0xeb, - 0x6e, 0x03, 0x77, 0x3b, 0x5a, 0x48, 0xa0, 0x7e, 0x37, 0xdf, 0xe3, 0x35, 0xf7, 0xb1, 0xe0, 0x3f, - 0xc8, 0x25, 0xf2, 0x57, 0xf3, 0x91, 0xd7, 0xe2, 0x8f, 0xaf, 0xb0, 0xaf, 0x01, 0xd4, 0x9b, 0x6b, - 0xb4, 0xad, 0x4b, 0x99, 0xd6, 0xf0, 0xc8, 0xc2, 0x45, 0xa8, 0xc8, 0xd0, 0x1d, 0x92, 0xa8, 0x5f, - 0xcf, 0xc7, 0x9e, 0xcb, 0x1f, 0xcb, 0x6e, 0xc7, 0xb2, 0x0b, 0xb4, 0x4e, 0x44, 0x00, 0x38, 0x96, - 0xdc, 0x4e, 0x25, 0xf7, 0xa3, 0xf9, 0x58, 0xb0, 0x84, 0xc7, 0x56, 0x76, 0x6c, 0x00, 0x26, 0x83, - 0x38, 0x3c, 0xb6, 0x9a, 0xf4, 0x3c, 0x0c, 0x09, 0x39, 0x04, 0x4b, 0x05, 0x9f, 0xf7, 0x39, 0x10, - 0x0f, 0x68, 0x03, 0x02, 0xf5, 0xcf, 0xe4, 0x21, 0x1a, 0xc4, 0xe2, 0x31, 0xd5, 0xa1, 0x5f, 0xcd, - 0x47, 0xc3, 0x77, 0x3c, 0xbe, 0xfa, 0x33, 0x01, 0x50, 0xef, 0xae, 0x34, 0x45, 0xf4, 0xe7, 0x7e, - 0xe9, 0x84, 0x3f, 0x80, 0x6a, 0x12, 0x85, 0xfa, 0xaf, 0xf3, 0xa9, 0x31, 0x45, 0x1e, 0x5f, 0x01, - 0xbe, 0x84, 0xa7, 0xe2, 0x4d, 0x2b, 0x9c, 0xc8, 0xf1, 0x10, 0x92, 0x8d, 0xbf, 0x44, 0x7a, 0x4e, - 0x9f, 0x90, 0x7c, 0x22, 0xc5, 0x5c, 0xc3, 0xe4, 0x21, 0xa1, 0xb9, 0x26, 0x1f, 0xe6, 0x4b, 0x86, - 0xdb, 0xef, 0xe6, 0xb7, 0x0b, 0xc1, 0xf2, 0x38, 0xaf, 0xaa, 0x03, 0x4b, 0xfa, 0x06, 0x86, 0x0a, - 0x65, 0x3d, 0x31, 0xc2, 0x93, 0x47, 0x76, 0x38, 0x48, 0xbe, 0xb6, 0x13, 0x54, 0xea, 0x3f, 0xef, - 0x4f, 0x8f, 0xff, 0xf1, 0xf8, 0x8a, 0xf0, 0x22, 0x14, 0x97, 0x74, 0x6f, 0x4d, 0x68, 0x32, 0xde, - 0x06, 0x76, 0x74, 0x6f, 0x4d, 0x43, 0x28, 0xb9, 0x0a, 0x83, 0x9a, 0xbe, 0xce, 0xcf, 0x3c, 0x4b, - 0x61, 0x62, 0x4f, 0x47, 0x5f, 0x6f, 0xf0, 0x73, 0xcf, 0x00, 0x4d, 0xd4, 0x20, 0xb1, 0x2c, 0x3f, - 0xf9, 0xc6, 0xac, 0x86, 0x3c, 0xb1, 0x6c, 0x90, 0x4e, 0xf6, 0x22, 0x14, 0x27, 0x6d, 0x63, 0x03, - 0x6f, 0xbe, 0x46, 0x78, 0x65, 0x2b, 0xb6, 0xb1, 0xa1, 0x21, 0x94, 0xfc, 0x58, 0x0e, 0x06, 0x66, - 0xa9, 0x6e, 0xb0, 0x11, 0x32, 0xd4, 0xcb, 0x61, 0xe5, 0xd3, 0x07, 0xe3, 0xb0, 0x72, 0x72, 0x8d, - 0x57, 0x26, 0x2b, 0x8a, 0xa8, 0x9f, 0xdc, 0x84, 0xc1, 0x29, 0xdd, 0xa3, 0xab, 0xb6, 0xb3, 0x81, - 0x2e, 0x38, 0x63, 0xe1, 0x1b, 0x92, 0x88, 0xfe, 0xf8, 0x44, 0xfc, 0x66, 0xac, 0x29, 0x7e, 0x69, - 0x41, 0x61, 0x26, 0x16, 0x7e, 0x33, 0x27, 0x92, 0xa8, 0xa3, 0x58, 0xf8, 0x15, 0x9e, 0x26, 0x30, - 0xe1, 0xb1, 0xf2, 0x48, 0xfa, 0xb1, 0x32, 0x5a, 0x8f, 0xe8, 0xa6, 0x87, 0xe9, 0x5c, 0x47, 0x71, - 0xd1, 0xe7, 0xd6, 0x23, 0x42, 0x31, 0x9b, 0xab, 0x26, 0x91, 0xa8, 0xdf, 0xee, 0x87, 0xd4, 0x68, - 0x01, 0xc7, 0x4a, 0x7e, 0xac, 0xe4, 0xa1, 0x92, 0x57, 0x13, 0x4a, 0x7e, 0x21, 0x19, 0x7f, 0xe2, - 0x43, 0xaa, 0xe1, 0x5f, 0x29, 0x26, 0xa2, 0xd7, 0x3c, 0xde, 0xbb, 0xcb, 0x50, 0x7a, 0xfd, 0xdb, - 0x4a, 0x2f, 0x18, 0x10, 0xa5, 0x6d, 0x07, 0xc4, 0xc0, 0x4e, 0x07, 0xc4, 0x60, 0xe6, 0x80, 0x08, - 0x15, 0x64, 0x28, 0x53, 0x41, 0x6a, 0x62, 0xd0, 0x40, 0xef, 0x24, 0x3a, 0x17, 0xb7, 0x36, 0xcb, - 0x63, 0x6c, 0x34, 0xa5, 0x66, 0xcf, 0x41, 0x16, 0xea, 0xef, 0x15, 0x7b, 0x84, 0x9c, 0x3a, 0x14, - 0x1d, 0x79, 0x09, 0x0a, 0x95, 0x4e, 0x47, 0xe8, 0xc7, 0x29, 0x29, 0xda, 0x55, 0x46, 0x29, 0x46, - 0x4d, 0x5e, 0x87, 0x42, 0xe5, 0x5e, 0x3d, 0x9e, 0x38, 0xa7, 0x72, 0xaf, 0x2e, 0xbe, 0x24, 0xb3, - 0xec, 0xbd, 0x3a, 0x79, 0x33, 0x8c, 0x60, 0xbb, 0xd6, 0xb5, 0x1e, 0x88, 0x8d, 0xa2, 0xf0, 0xd4, - 0xf5, 0x3d, 0x79, 0x9a, 0x0c, 0xc5, 0xb6, 0x8b, 0x31, 0xda, 0x98, 0x36, 0x95, 0x76, 0xae, 0x4d, - 0x03, 0xdb, 0x6a, 0xd3, 0xe0, 0x4e, 0xb5, 0x69, 0x68, 0x07, 0xda, 0x04, 0xdb, 0x6a, 0xd3, 0xf0, - 0xfe, 0xb5, 0xa9, 0x03, 0x17, 0x92, 0x61, 0x02, 0x03, 0x8d, 0xd0, 0x80, 0x24, 0xb1, 0xc2, 0xb1, - 0x04, 0xaf, 0xfe, 0xbb, 0x1c, 0xdb, 0x58, 0x47, 0x74, 0xc3, 0x65, 0x78, 0xd9, 0xb5, 0x2d, 0x59, - 0x5a, 0xfd, 0xa5, 0x7c, 0x76, 0x74, 0xc3, 0xa3, 0x39, 0xc5, 0xfd, 0x40, 0xaa, 0x94, 0x8a, 0xb1, - 0xe7, 0x18, 0x99, 0x52, 0x8e, 0xb1, 0x4d, 0x93, 0xd9, 0xd7, 0xf2, 0x59, 0x21, 0x17, 0xf7, 0x25, - 0xb1, 0x8f, 0x24, 0x9d, 0xe1, 0xd0, 0xc5, 0xdf, 0x8d, 0x7a, 0xc1, 0xcd, 0xc0, 0x88, 0x2c, 0x44, - 0x21, 0xa5, 0x9d, 0x08, 0x38, 0x52, 0x8e, 0xbc, 0x19, 0xe4, 0x37, 0x92, 0xfc, 0x63, 0xd0, 0xd3, - 0xcd, 0x1f, 0xb3, 0x31, 0xf7, 0x18, 0x99, 0x9c, 0x3c, 0x0f, 0xa5, 0x19, 0x4c, 0x18, 0x20, 0x0f, - 0x76, 0x9e, 0x42, 0x40, 0xf6, 0x5a, 0xe1, 0x34, 0xea, 0x6f, 0xe5, 0xe0, 0xd4, 0xed, 0xee, 0x0a, - 0x15, 0x8e, 0x76, 0x41, 0x1b, 0xde, 0x03, 0x60, 0x60, 0xe1, 0x30, 0x93, 0x43, 0x87, 0x99, 0x8f, - 0xc9, 0xa1, 0x19, 0x63, 0x05, 0x26, 0x42, 0x6a, 0xee, 0x2c, 0x73, 0xc9, 0xf7, 0x39, 0x7d, 0xd0, - 0x5d, 0xa1, 0x8d, 0x84, 0xd7, 0x8c, 0xc4, 0xfd, 0xc2, 0x5b, 0xdc, 0x9b, 0x7f, 0xaf, 0x0e, 0x2a, - 0xbf, 0x98, 0xcf, 0x8c, 0x86, 0x79, 0x64, 0xd3, 0xb6, 0x7e, 0x5f, 0x6a, 0xaf, 0xc4, 0xd3, 0xb7, - 0xa6, 0x90, 0xc4, 0x38, 0xa6, 0x71, 0x49, 0x17, 0xd8, 0x11, 0x4f, 0x26, 0xfc, 0x81, 0x0a, 0xec, - 0x0f, 0x73, 0x99, 0x51, 0x4b, 0x8f, 0xaa, 0xc0, 0xd4, 0xff, 0xb5, 0xe0, 0x07, 0x4b, 0xdd, 0xd7, - 0x27, 0x3c, 0x0f, 0x43, 0x22, 0x66, 0x44, 0xd4, 0x4f, 0x58, 0x1c, 0x1b, 0xe2, 0x31, 0x74, 0x40, - 0xc0, 0x4c, 0x0a, 0xc9, 0x89, 0x59, 0xf2, 0x13, 0x96, 0x1c, 0x98, 0x35, 0x89, 0x84, 0x19, 0x0d, - 0xd3, 0x8f, 0x4c, 0x0f, 0x2d, 0x10, 0xd6, 0x97, 0x05, 0x6e, 0x34, 0xd0, 0x47, 0xa6, 0xc7, 0xed, - 0x8f, 0x00, 0xcd, 0x0c, 0x02, 0x6e, 0x8b, 0x88, 0x79, 0x0f, 0x0d, 0x02, 0x6e, 0xaa, 0x68, 0x02, - 0xc3, 0x5a, 0x2b, 0x9c, 0x6f, 0x85, 0x4b, 0x8b, 0x68, 0xad, 0x70, 0xd7, 0xc5, 0xd6, 0x06, 0x04, - 0x8c, 0xa3, 0x46, 0x57, 0x43, 0x27, 0x3e, 0xe4, 0xe8, 0x20, 0x44, 0x13, 0x18, 0x72, 0x1d, 0xc6, - 0xea, 0x9e, 0x6e, 0x19, 0xba, 0x63, 0x2c, 0x76, 0xbd, 0x4e, 0xd7, 0x93, 0x0d, 0x60, 0xd7, 0x33, - 0xec, 0xae, 0xa7, 0xc5, 0x28, 0xc8, 0xc7, 0x61, 0xd4, 0x87, 0x4c, 0x3b, 0x8e, 0xed, 0xc8, 0x56, - 0x8e, 0xeb, 0x19, 0xd4, 0x71, 0xb4, 0x28, 0x01, 0xf9, 0x04, 0x8c, 0xd6, 0xac, 0x87, 0x76, 0x93, - 0xc7, 0x4d, 0xd0, 0xe6, 0x84, 0xcd, 0x83, 0x2f, 0xc6, 0xcc, 0x00, 0xd1, 0xe8, 0x3a, 0x2d, 0x2d, - 0x4a, 0xa8, 0x6e, 0xe5, 0x93, 0x31, 0x65, 0x1f, 0xdf, 0x0d, 0xd2, 0xd5, 0xa8, 0xe3, 0x1e, 0x7a, - 0xab, 0xa2, 0xf1, 0x29, 0xfb, 0x0d, 0x73, 0x1b, 0xf4, 0x3a, 0x0c, 0xde, 0xa6, 0x1b, 0xdc, 0xc7, - 0xb4, 0x14, 0xba, 0x25, 0x3f, 0x10, 0x30, 0xf9, 0x74, 0xd7, 0xa7, 0x53, 0xbf, 0x91, 0x4f, 0x46, - 0xcb, 0x7d, 0x7c, 0x85, 0xfd, 0x71, 0x18, 0x40, 0x51, 0xd6, 0xfc, 0xeb, 0x05, 0x14, 0x20, 0x8a, - 0x3b, 0xea, 0xed, 0xec, 0x93, 0xa9, 0x3f, 0x5b, 0x8a, 0x87, 0x50, 0x7e, 0x7c, 0xa5, 0xf7, 0x06, - 0x0c, 0x4f, 0xd9, 0x96, 0x6b, 0xba, 0x1e, 0xb5, 0x9a, 0xbe, 0xc2, 0xa2, 0xe3, 0x7f, 0x33, 0x04, - 0xcb, 0x36, 0xa0, 0x44, 0xbd, 0x17, 0xe5, 0x25, 0xaf, 0xc0, 0x10, 0x8a, 0x1c, 0x6d, 0x4e, 0x3e, - 0xe1, 0xe1, 0xcd, 0xc4, 0x0a, 0x03, 0xc6, 0x2d, 0xce, 0x90, 0x94, 0xdc, 0x81, 0xc1, 0xa9, 0x35, - 0xb3, 0x65, 0x38, 0xd4, 0x42, 0xdf, 0x64, 0x29, 0x52, 0x4d, 0xb4, 0x2f, 0x27, 0xf0, 0x5f, 0xa4, - 0xe5, 0xcd, 0x69, 0x8a, 0x62, 0x91, 0xc7, 0x62, 0x02, 0x76, 0xe1, 0x27, 0xf3, 0x00, 0x61, 0x01, - 0xf2, 0x14, 0xe4, 0x83, 0x2c, 0xe4, 0xe8, 0x12, 0x13, 0xd1, 0xa0, 0x3c, 0x2e, 0x15, 0x62, 0x6c, - 0xe7, 0xb7, 0x1d, 0xdb, 0x77, 0xa0, 0xc4, 0x4f, 0xd7, 0xd0, 0x6b, 0x5d, 0x8a, 0xea, 0x9a, 0xd9, - 0xe0, 0x09, 0xa4, 0xe7, 0xb6, 0x34, 0x5a, 0x9e, 0x11, 0x0f, 0x70, 0xce, 0xec, 0x42, 0x13, 0xfa, - 0xf1, 0x2f, 0x72, 0x19, 0x8a, 0xcb, 0x7e, 0x06, 0xe3, 0x51, 0x3e, 0x4b, 0xc7, 0xe4, 0x87, 0x78, - 0xd6, 0x4d, 0x53, 0xb6, 0xe5, 0xb1, 0xaa, 0xb1, 0xd5, 0x23, 0x42, 0x2e, 0x02, 0x16, 0x91, 0x8b, - 0x80, 0xa9, 0xff, 0x20, 0x9f, 0x12, 0xdc, 0xfb, 0xf1, 0x1d, 0x26, 0xaf, 0x01, 0xe0, 0xcb, 0x73, - 0x26, 0x4f, 0xff, 0x39, 0x08, 0x8e, 0x12, 0x64, 0x84, 0x6a, 0x1b, 0xd9, 0x76, 0x84, 0xc4, 0xea, - 0xef, 0xe4, 0x12, 0x11, 0xa1, 0xf7, 0x25, 0x47, 0xd9, 0x2a, 0xcb, 0xef, 0xd1, 0x8c, 0xf5, 0xfb, - 0xa2, 0xb0, 0xbb, 0xbe, 0x88, 0x7e, 0xcb, 0x01, 0x58, 0xa6, 0x87, 0xf9, 0x2d, 0xdf, 0xce, 0xa7, - 0xc5, 0xc7, 0x3e, 0x9a, 0x2a, 0x7e, 0x23, 0x30, 0x4a, 0x8b, 0xb1, 0x8c, 0x04, 0x08, 0x8d, 0x67, - 0x59, 0x17, 0x66, 0xea, 0xe7, 0xe0, 0x44, 0x2c, 0x6a, 0xb4, 0x48, 0x78, 0x7d, 0xb9, 0x77, 0xf8, - 0xe9, 0xec, 0x98, 0x05, 0x11, 0x32, 0xf5, 0xff, 0xcf, 0xf5, 0x8e, 0x19, 0x7e, 0xe8, 0xaa, 0x93, - 0x22, 0x80, 0xc2, 0x9f, 0x8c, 0x00, 0x0e, 0x60, 0x1b, 0x7c, 0xb4, 0x05, 0xf0, 0x21, 0x99, 0x3c, - 0x3e, 0x68, 0x01, 0xfc, 0x6c, 0x6e, 0xdb, 0x90, 0xef, 0x87, 0x2d, 0x03, 0xf5, 0x7f, 0xca, 0xa5, - 0x86, 0x66, 0xdf, 0x57, 0xbb, 0xde, 0x84, 0x12, 0x77, 0xe1, 0x11, 0xad, 0x92, 0x92, 0xd9, 0x31, - 0x68, 0x46, 0x79, 0x51, 0x86, 0xcc, 0xc1, 0x00, 0x6f, 0x83, 0x21, 0x7a, 0xe3, 0xd9, 0x1e, 0xf1, - 0xe1, 0x8d, 0xac, 0xc9, 0x51, 0xa0, 0xd5, 0xdf, 0xce, 0x25, 0x22, 0xc5, 0x1f, 0xe2, 0xb7, 0x85, - 0x53, 0x75, 0x61, 0xe7, 0x53, 0xb5, 0xfa, 0xcf, 0xf2, 0xe9, 0x81, 0xea, 0x0f, 0xf1, 0x43, 0x0e, - 0xe2, 0x38, 0x6d, 0x6f, 0xeb, 0xd6, 0x32, 0x8c, 0x45, 0x65, 0x21, 0x96, 0xad, 0x27, 0xd3, 0xc3, - 0xf5, 0x67, 0xb4, 0x22, 0xc6, 0x43, 0xfd, 0x56, 0x2e, 0x19, 0x63, 0xff, 0xd0, 0xe7, 0xa7, 0xbd, - 0x69, 0x4b, 0xf4, 0x53, 0x3e, 0x24, 0x6b, 0xcd, 0x41, 0x7c, 0xca, 0x87, 0x64, 0xd5, 0xd8, 0xdb, - 0xa7, 0xfc, 0x7c, 0x3e, 0x2b, 0x45, 0xc1, 0xa1, 0x7f, 0xd0, 0x67, 0x64, 0x21, 0xf3, 0x96, 0x89, - 0x4f, 0x7b, 0x2a, 0x2b, 0x27, 0x40, 0x06, 0xcf, 0x04, 0x9f, 0xbd, 0x8d, 0xf1, 0x54, 0x61, 0x7d, - 0x48, 0x14, 0xf9, 0x68, 0x08, 0xeb, 0x43, 0x32, 0x54, 0x3e, 0x7c, 0xc2, 0xfa, 0xf5, 0xfc, 0x4e, - 0xf3, 0x62, 0x1c, 0x0b, 0x2f, 0x21, 0xbc, 0x2f, 0xe5, 0x93, 0xf9, 0x5a, 0x0e, 0x5d, 0x4c, 0x33, - 0x50, 0x12, 0x99, 0x63, 0x32, 0x85, 0xc3, 0xf1, 0x59, 0x16, 0x8d, 0xf8, 0x8e, 0x1b, 0x20, 0x2e, - 0x72, 0x76, 0x26, 0x12, 0x4e, 0xab, 0x7e, 0x37, 0x17, 0x4b, 0x6e, 0x72, 0x28, 0x47, 0x08, 0x7b, - 0x5a, 0x92, 0xc8, 0x5b, 0xfe, 0x61, 0x66, 0x31, 0x16, 0x5c, 0x3e, 0xf8, 0x9e, 0x2a, 0xf5, 0x74, - 0xb3, 0x15, 0x2f, 0x2f, 0xe2, 0x0f, 0x7c, 0x23, 0x0f, 0x27, 0x13, 0xa4, 0xe4, 0x72, 0x24, 0xe2, - 0x0f, 0x1e, 0x4b, 0xc6, 0x1c, 0xd5, 0x79, 0xec, 0x9f, 0x5d, 0x9c, 0xa4, 0x5e, 0x86, 0x62, 0x55, - 0xdf, 0xe0, 0xdf, 0xd6, 0xcf, 0x59, 0x1a, 0xfa, 0x86, 0x7c, 0xe2, 0x86, 0x78, 0xb2, 0x02, 0x67, - 0xf8, 0x7d, 0x88, 0x69, 0x5b, 0xcb, 0x66, 0x9b, 0xd6, 0xac, 0x79, 0xb3, 0xd5, 0x32, 0x5d, 0x71, - 0xa9, 0xf7, 0xfc, 0xd6, 0x66, 0xf9, 0x8a, 0x67, 0x7b, 0x7a, 0xab, 0x41, 0x7d, 0xb2, 0x86, 0x67, - 0xb6, 0x69, 0xc3, 0xb4, 0x1a, 0x6d, 0xa4, 0x94, 0x58, 0xa6, 0xb3, 0x22, 0x35, 0x9e, 0x47, 0xa0, - 0xde, 0xd4, 0x2d, 0x8b, 0x1a, 0x35, 0x6b, 0x72, 0xc3, 0xa3, 0xfc, 0x32, 0xb0, 0xc0, 0x8f, 0x04, - 0xf9, 0x3b, 0x74, 0x8e, 0x66, 0x8c, 0x57, 0x18, 0x81, 0x96, 0x52, 0x48, 0xfd, 0x8d, 0x62, 0x4a, - 0x5e, 0x9b, 0x23, 0xa4, 0x3e, 0x7e, 0x4f, 0x17, 0xb7, 0xe9, 0xe9, 0x6b, 0x30, 0x20, 0x02, 0x35, - 0x8b, 0x0b, 0x06, 0x74, 0x9c, 0x7f, 0xc8, 0x41, 0xf2, 0x0d, 0x8d, 0xa0, 0x22, 0x2d, 0xb8, 0xb0, - 0xcc, 0xba, 0x29, 0xbd, 0x33, 0x4b, 0x7b, 0xe8, 0xcc, 0x1e, 0xfc, 0xc8, 0xbb, 0x70, 0x0e, 0xb1, - 0x29, 0xdd, 0x3a, 0x80, 0x55, 0x61, 0x28, 0x2d, 0x5e, 0x55, 0x7a, 0xe7, 0x66, 0x95, 0x27, 0x9f, - 0x81, 0x91, 0x60, 0x80, 0x98, 0xd4, 0x15, 0x37, 0x17, 0x3d, 0xc6, 0x19, 0x8f, 0x53, 0xc7, 0xc0, - 0xe8, 0xae, 0x16, 0x8d, 0x75, 0x16, 0xe1, 0xa5, 0xfe, 0x8f, 0xb9, 0x5e, 0xf9, 0x75, 0x0e, 0x7d, - 0x56, 0x7e, 0x0b, 0x06, 0x0c, 0xfe, 0x51, 0x42, 0xa7, 0x7a, 0x67, 0xe0, 0xe1, 0xa4, 0x9a, 0x5f, - 0x46, 0xfd, 0xa7, 0xb9, 0x9e, 0x69, 0x7d, 0x8e, 0xfa, 0xe7, 0x7d, 0xa9, 0x90, 0xf1, 0x79, 0x62, - 0x12, 0xbd, 0x0a, 0xe3, 0x66, 0x98, 0x77, 0xa0, 0x11, 0x86, 0xba, 0xd2, 0x4e, 0x48, 0x70, 0x1c, - 0x5d, 0x37, 0x20, 0x70, 0xd8, 0x72, 0x7c, 0x6f, 0x34, 0xb7, 0xd1, 0x75, 0x4c, 0x3e, 0x2e, 0xb5, - 0xd3, 0x6e, 0xcc, 0x55, 0xcd, 0xbd, 0xe3, 0x98, 0xac, 0x02, 0xdd, 0x5b, 0xa3, 0x96, 0xde, 0x58, - 0xb7, 0x9d, 0x07, 0x18, 0x0c, 0x95, 0x0f, 0x4e, 0xed, 0x04, 0x87, 0xdf, 0xf3, 0xc1, 0xe4, 0x19, - 0x18, 0x5d, 0x6d, 0x75, 0x69, 0x10, 0x7e, 0x92, 0xdf, 0xf5, 0x69, 0x23, 0x0c, 0x18, 0xdc, 0x90, - 0x5c, 0x02, 0x40, 0x22, 0x0f, 0x93, 0x2e, 0xe1, 0xc5, 0x9e, 0x36, 0xc4, 0x20, 0xcb, 0xa2, 0xbb, - 0x2e, 0x70, 0xad, 0xe6, 0x42, 0x6a, 0xb4, 0x6c, 0x6b, 0xb5, 0xe1, 0x51, 0xa7, 0x8d, 0x0d, 0x45, - 0x67, 0x06, 0xed, 0x2c, 0x52, 0xe0, 0xd5, 0x89, 0x3b, 0x67, 0x5b, 0xab, 0xcb, 0xd4, 0x69, 0xb3, - 0xa6, 0x3e, 0x0f, 0x44, 0x34, 0xd5, 0xc1, 0x43, 0x0f, 0xfe, 0x71, 0xe8, 0xcd, 0xa0, 0x89, 0x8f, - 0xe0, 0xa7, 0x21, 0xf8, 0x61, 0x65, 0x18, 0xe6, 0x31, 0xf8, 0xb8, 0xd0, 0xd0, 0x85, 0x41, 0x03, - 0x0e, 0x42, 0x79, 0x9d, 0x05, 0xe1, 0x5d, 0xc1, 0x3d, 0xc8, 0x35, 0xf1, 0x4b, 0xfd, 0x42, 0x21, - 0x2d, 0x13, 0xd1, 0xbe, 0x14, 0x2d, 0x9c, 0x56, 0xf3, 0xbb, 0x9a, 0x56, 0x4f, 0x58, 0xdd, 0x76, - 0x43, 0xef, 0x74, 0x1a, 0xf7, 0xcd, 0x16, 0x3e, 0xe1, 0xc2, 0x85, 0x4f, 0x1b, 0xb5, 0xba, 0xed, - 0x4a, 0xa7, 0x33, 0xc3, 0x81, 0xe4, 0x39, 0x38, 0xc9, 0xe8, 0xb0, 0x93, 0x02, 0xca, 0x22, 0x52, - 0x32, 0x06, 0x18, 0xc4, 0xd6, 0xa7, 0x3d, 0x0f, 0x83, 0x82, 0x27, 0x5f, 0xab, 0xfa, 0xb5, 0x01, - 0xce, 0xcc, 0x65, 0x3d, 0x17, 0xb0, 0xe1, 0x93, 0x6b, 0xbf, 0x36, 0xe4, 0x97, 0xc7, 0x50, 0xcd, - 0x56, 0xb7, 0xcd, 0xa3, 0x6f, 0x0d, 0x20, 0x32, 0xf8, 0x4d, 0x2e, 0xc3, 0x18, 0xe3, 0x12, 0x08, - 0x8c, 0x47, 0xb7, 0xed, 0xd7, 0x62, 0x50, 0x72, 0x1d, 0x4e, 0x47, 0x20, 0xdc, 0x06, 0xe5, 0x4f, - 0x12, 0xfa, 0xb5, 0x54, 0x9c, 0xfa, 0xf5, 0x42, 0x34, 0x3f, 0xd2, 0x21, 0x74, 0xc4, 0x39, 0x18, - 0xb0, 0x9d, 0xd5, 0x46, 0xd7, 0x69, 0x89, 0xb1, 0x57, 0xb2, 0x9d, 0xd5, 0x3b, 0x4e, 0x8b, 0x9c, - 0x81, 0x12, 0xeb, 0x1d, 0xd3, 0x10, 0x43, 0xac, 0x5f, 0xef, 0x74, 0x6a, 0x06, 0xa9, 0xf0, 0x0e, - 0xc1, 0xc8, 0xa8, 0x8d, 0x26, 0x6e, 0xed, 0xb9, 0x53, 0x42, 0x3f, 0x5f, 0xf1, 0x12, 0x48, 0xec, - 0x27, 0x8c, 0x97, 0xca, 0x0f, 0x02, 0x62, 0x2c, 0x0c, 0xdc, 0x96, 0x18, 0xbc, 0x4f, 0xe2, 0x2c, - 0x04, 0x32, 0x64, 0xc1, 0x37, 0x31, 0x06, 0xa9, 0x02, 0x09, 0xa9, 0xda, 0xb6, 0x61, 0xde, 0x37, - 0x29, 0x7f, 0x41, 0xd2, 0xcf, 0x2f, 0x7e, 0x93, 0x58, 0x6d, 0xdc, 0x67, 0x32, 0x2f, 0x20, 0xe4, - 0x0d, 0xae, 0x84, 0x9c, 0x0e, 0xd7, 0x3e, 0xde, 0xb7, 0xdc, 0x4e, 0x8b, 0xa1, 0x50, 0x33, 0xb1, - 0x3c, 0x2e, 0x84, 0xea, 0x7f, 0xdf, 0x9f, 0x4c, 0x92, 0x75, 0x28, 0x76, 0xcd, 0x2c, 0x80, 0xc8, - 0x81, 0x17, 0x5e, 0xae, 0x5d, 0x90, 0x02, 0xde, 0x0b, 0x4c, 0x06, 0x0f, 0xa9, 0x2c, 0xb9, 0x0a, - 0x83, 0xfc, 0x8b, 0x6a, 0x55, 0x61, 0xef, 0xa0, 0x8b, 0x98, 0xdb, 0x31, 0xef, 0xdf, 0x47, 0x7f, - 0xb2, 0x00, 0x4d, 0x2e, 0xc3, 0x40, 0x75, 0xa1, 0x5e, 0xaf, 0x2c, 0xf8, 0x37, 0xc5, 0xf8, 0x96, - 0xc5, 0xb0, 0xdc, 0x86, 0xab, 0x5b, 0xae, 0xe6, 0x23, 0xc9, 0x33, 0x50, 0xaa, 0x2d, 0x21, 0x19, - 0x7f, 0xa1, 0x39, 0xbc, 0xb5, 0x59, 0x1e, 0x30, 0x3b, 0x9c, 0x4a, 0xa0, 0xb0, 0xde, 0xbb, 0xb5, - 0xaa, 0xe4, 0x2e, 0xc1, 0xeb, 0x7d, 0x68, 0x1a, 0x78, 0xed, 0xac, 0x05, 0x68, 0xf2, 0x32, 0x8c, - 0xd4, 0xa9, 0x63, 0xea, 0xad, 0x85, 0x2e, 0x6e, 0x15, 0xa5, 0x88, 0x8f, 0x2e, 0xc2, 0x1b, 0x16, - 0x22, 0xb4, 0x08, 0x19, 0xb9, 0x08, 0xc5, 0x59, 0xd3, 0xf2, 0x9f, 0x4b, 0xa0, 0x3f, 0xfd, 0x9a, - 0x69, 0x79, 0x1a, 0x42, 0xc9, 0x33, 0x50, 0xb8, 0xb5, 0x5c, 0x13, 0x9e, 0x60, 0xc8, 0xeb, 0x3d, - 0x2f, 0x12, 0x3d, 0xf2, 0xd6, 0x72, 0x8d, 0xbc, 0x0c, 0x43, 0x6c, 0x11, 0xa3, 0x56, 0x93, 0xba, - 0xca, 0x30, 0x7e, 0x0c, 0x0f, 0x59, 0xe8, 0x03, 0x65, 0x9f, 0x8e, 0x80, 0x92, 0xdc, 0x86, 0xf1, - 0x78, 0x6c, 0x7d, 0xf1, 0x64, 0x07, 0x2d, 0xae, 0x75, 0x81, 0x4b, 0x0b, 0x9a, 0x99, 0x28, 0x48, - 0x0c, 0x50, 0xe2, 0x30, 0xb6, 0xaf, 0x43, 0xab, 0x93, 0xc7, 0x6b, 0xbe, 0xb2, 0xb5, 0x59, 0x7e, - 0x36, 0xc1, 0xb4, 0xe1, 0x08, 0x2a, 0x89, 0x7b, 0x26, 0x27, 0xf5, 0xff, 0xca, 0xa7, 0x27, 0x5e, - 0x3b, 0x84, 0xd9, 0x69, 0x8f, 0x17, 0xdf, 0xb1, 0x31, 0x51, 0xdc, 0xc7, 0x98, 0xb8, 0x0f, 0x27, - 0x2a, 0x46, 0xdb, 0xb4, 0x2a, 0xf8, 0xd3, 0x9d, 0x9f, 0xa9, 0xe0, 0x6c, 0x27, 0xbd, 0x5e, 0x8c, - 0xa1, 0xc5, 0xf7, 0xf0, 0x50, 0xca, 0x0c, 0xd5, 0xd0, 0x39, 0xae, 0xd1, 0xbe, 0xaf, 0x37, 0x9a, - 0x3c, 0x67, 0x99, 0x16, 0x67, 0xaa, 0xfe, 0x44, 0x7e, 0x9b, 0x5c, 0x71, 0x8f, 0xa3, 0xf4, 0xd5, - 0x2f, 0xe7, 0x7b, 0xa7, 0xeb, 0x7b, 0x2c, 0x85, 0xf2, 0xc7, 0xf9, 0x94, 0xe4, 0x79, 0xfb, 0x92, - 0xc4, 0x55, 0x18, 0xe4, 0x6c, 0x02, 0xcf, 0x63, 0x9c, 0x80, 0xb9, 0xb2, 0xe2, 0xc4, 0xef, 0xa3, - 0xc9, 0x02, 0x9c, 0xae, 0xdc, 0xbf, 0x4f, 0x9b, 0x5e, 0x18, 0x54, 0x7b, 0x21, 0x8c, 0x51, 0xcb, - 0x83, 0x08, 0x0b, 0x7c, 0x18, 0x94, 0x1b, 0x63, 0xb1, 0xa4, 0x96, 0x23, 0xcb, 0x70, 0x36, 0x0e, - 0xaf, 0xf3, 0x5d, 0x4b, 0x51, 0x8a, 0x2b, 0x9c, 0xe0, 0xc8, 0xff, 0xd3, 0x32, 0xca, 0xa6, 0xb5, - 0x12, 0x57, 0x97, 0xfe, 0x5e, 0xad, 0xc4, 0xa5, 0x26, 0xb5, 0x9c, 0xfa, 0x8d, 0x82, 0x9c, 0x63, - 0xf0, 0xf1, 0xf5, 0x11, 0xbb, 0x11, 0xf1, 0x0c, 0xdf, 0xe9, 0x90, 0x79, 0x59, 0x04, 0x58, 0x31, - 0xba, 0x8e, 0xef, 0x44, 0x19, 0x04, 0x78, 0x40, 0xa0, 0xbc, 0x74, 0x06, 0x94, 0xa4, 0x06, 0xc5, - 0x8a, 0xb3, 0xca, 0x2d, 0xf2, 0xed, 0xde, 0x9c, 0xe9, 0xce, 0xaa, 0x9b, 0xfe, 0xe6, 0x8c, 0xb1, - 0x50, 0xff, 0x42, 0xbe, 0x47, 0x5a, 0xc0, 0xc7, 0x72, 0x12, 0xf9, 0x99, 0x7c, 0x56, 0x82, 0xbf, - 0xa3, 0xea, 0xed, 0xf6, 0x01, 0x0b, 0xe7, 0x68, 0xbb, 0x02, 0x1e, 0xa0, 0x70, 0xfe, 0x20, 0x9f, - 0x95, 0xad, 0xf0, 0x58, 0x38, 0x7b, 0x9b, 0x20, 0x53, 0x45, 0xfa, 0x18, 0xdb, 0xdc, 0xb2, 0x2a, - 0xf4, 0xef, 0xd1, 0xe3, 0x2b, 0x4d, 0xa4, 0xc7, 0x43, 0x78, 0x5f, 0x5a, 0xfa, 0x87, 0xf9, 0xcc, - 0xac, 0x9c, 0xc7, 0x32, 0x3d, 0x48, 0x99, 0x1e, 0x0f, 0xfd, 0x7d, 0x0d, 0xfd, 0x54, 0x99, 0x1e, - 0x8f, 0xfd, 0x7d, 0xe9, 0xe9, 0xef, 0xe7, 0xd3, 0xf3, 0xce, 0x1e, 0x82, 0x92, 0x1e, 0x84, 0x53, - 0xa6, 0xdf, 0x0d, 0xc5, 0x7d, 0x75, 0x43, 0xff, 0x3e, 0xac, 0xa8, 0xa4, 0x40, 0x0f, 0x6d, 0xd4, - 0x7f, 0xaf, 0x0a, 0xf4, 0x00, 0x86, 0xfc, 0xe3, 0x2c, 0xd0, 0x3f, 0x5f, 0x48, 0xe6, 0x5a, 0x7e, - 0x5c, 0xd7, 0x24, 0x67, 0x8f, 0x6b, 0x92, 0x5f, 0x8e, 0xbc, 0x0d, 0x27, 0x42, 0x59, 0xca, 0x81, - 0xd1, 0xf0, 0xc6, 0xab, 0xc9, 0x50, 0x8d, 0xf7, 0x18, 0x4e, 0x44, 0xf0, 0x89, 0x53, 0xab, 0xdf, - 0x2d, 0x24, 0x13, 0x56, 0x1f, 0xf7, 0xc6, 0x1e, 0x7b, 0xe3, 0x0e, 0x9c, 0x9d, 0xea, 0x3a, 0x0e, - 0xb5, 0xbc, 0xf4, 0x4e, 0xc1, 0xc3, 0xfb, 0x26, 0xa7, 0x68, 0x24, 0x3b, 0x27, 0xa3, 0x30, 0x63, - 0x2b, 0x1e, 0x64, 0xc4, 0xd9, 0x0e, 0x84, 0x6c, 0xbb, 0x9c, 0x22, 0x8d, 0x6d, 0x7a, 0x61, 0xf5, - 0x77, 0xf3, 0xc9, 0x14, 0xe3, 0xc7, 0x5d, 0xbf, 0xb7, 0xae, 0x57, 0xbf, 0x50, 0x88, 0xa7, 0x59, - 0x3f, 0x5e, 0x20, 0xf6, 0xde, 0x1d, 0xbe, 0x24, 0x71, 0xdc, 0x48, 0x5f, 0xe1, 0xc3, 0xb3, 0xbe, - 0xc2, 0xc7, 0xab, 0xbf, 0x58, 0x8c, 0xa7, 0xac, 0x3f, 0xee, 0x8e, 0xc3, 0xeb, 0x0e, 0xb2, 0x08, - 0xa7, 0xc5, 0xdc, 0xe6, 0x83, 0x30, 0x43, 0x86, 0x98, 0xbf, 0x78, 0xa2, 0x3d, 0x31, 0x2d, 0x76, - 0x5d, 0xea, 0x34, 0x3c, 0xdd, 0x7d, 0xd0, 0xc0, 0x94, 0x1a, 0x5a, 0x6a, 0x41, 0xc6, 0x50, 0xcc, - 0x6a, 0x51, 0x86, 0x83, 0x21, 0x43, 0x7f, 0x42, 0x4c, 0x30, 0x4c, 0x2b, 0xa8, 0xfe, 0x6a, 0x0e, - 0xc6, 0xe3, 0x9f, 0x43, 0x26, 0x60, 0x90, 0xfd, 0x0e, 0x22, 0x05, 0x48, 0x19, 0xc0, 0x39, 0x47, - 0xee, 0x45, 0xe0, 0xd3, 0x90, 0x57, 0x60, 0x08, 0x1d, 0x36, 0xb0, 0x40, 0x3e, 0x0c, 0xd0, 0x10, - 0x16, 0xc0, 0xb4, 0xb4, 0xbc, 0x58, 0x48, 0x4a, 0xde, 0x80, 0xe1, 0x5a, 0xe8, 0x99, 0x26, 0xee, - 0xbc, 0xd0, 0x21, 0x56, 0x2a, 0x19, 0x12, 0x68, 0x32, 0xb5, 0xfa, 0xad, 0x7c, 0xa8, 0xea, 0xc7, - 0xa6, 0xe9, 0xbe, 0x4c, 0xd3, 0xaf, 0x14, 0xe0, 0x6c, 0xdc, 0x7d, 0xe1, 0xf8, 0x20, 0x4a, 0xcc, - 0x03, 0x7f, 0x0a, 0x4e, 0xc7, 0x65, 0x53, 0x65, 0xd2, 0xe8, 0xef, 0x7d, 0x8d, 0x36, 0xb1, 0xb5, - 0x59, 0x7e, 0x2a, 0xe9, 0x39, 0xc2, 0x2a, 0x4b, 0xbd, 0x58, 0x4b, 0xad, 0x24, 0xb5, 0x67, 0x3e, - 0x24, 0x6f, 0x9a, 0x1e, 0xf3, 0x9e, 0xf9, 0x99, 0x7c, 0xb2, 0x67, 0x8e, 0x0f, 0xc5, 0xc4, 0x84, - 0xf2, 0x0f, 0x73, 0xfe, 0xfd, 0xf0, 0x9c, 0xe9, 0x7a, 0x35, 0xeb, 0xa1, 0xde, 0x32, 0x83, 0x47, - 0xd7, 0xe4, 0xa6, 0x9f, 0x2e, 0x9d, 0x21, 0xa5, 0x77, 0x1f, 0xe8, 0xc1, 0x25, 0xd2, 0xa5, 0xb7, - 0x4c, 0x57, 0xe4, 0xb6, 0x7e, 0x2a, 0x91, 0x30, 0xdd, 0x2f, 0x46, 0x2e, 0x4b, 0x77, 0xff, 0xd2, - 0x1a, 0x25, 0x3f, 0x26, 0x10, 0x77, 0xfd, 0x23, 0xf3, 0xa6, 0xeb, 0x9a, 0xd6, 0xaa, 0x9c, 0x11, - 0x16, 0x57, 0xcb, 0x36, 0x87, 0x37, 0xe2, 0x39, 0x7a, 0x23, 0x05, 0xd4, 0x7f, 0x9d, 0x83, 0x0b, - 0x8c, 0x13, 0x06, 0x32, 0x49, 0x7c, 0xd8, 0xbe, 0x3a, 0xbc, 0xdd, 0x43, 0x52, 0x42, 0x03, 0x9e, - 0x4e, 0x3e, 0x4e, 0x8a, 0x11, 0xc6, 0xb8, 0xf7, 0x90, 0xfd, 0xde, 0xde, 0xa1, 0xfe, 0x52, 0x01, - 0x46, 0xa7, 0x6c, 0xcb, 0xd3, 0x9b, 0xde, 0xf1, 0xba, 0xb0, 0x9f, 0x83, 0x5f, 0x52, 0x86, 0xfe, - 0xe9, 0xb6, 0x6e, 0xb6, 0xc4, 0xce, 0x18, 0xe3, 0x8c, 0x53, 0x06, 0xd0, 0x38, 0x9c, 0xdc, 0xc4, - 0xe8, 0x5a, 0x4c, 0xd2, 0x81, 0xff, 0xe6, 0x58, 0x18, 0x92, 0x59, 0x42, 0x89, 0xa4, 0xe4, 0x1c, - 0xc0, 0x4d, 0x2b, 0xb9, 0xa4, 0xdc, 0x67, 0xc7, 0xf3, 0xd2, 0xd1, 0xe8, 0xb3, 0xe7, 0xe6, 0xf9, - 0x9e, 0xe3, 0xb6, 0x69, 0x19, 0xe4, 0x3c, 0x9c, 0xb9, 0x53, 0x9f, 0xd6, 0x1a, 0xb7, 0x6b, 0x0b, - 0xd5, 0xc6, 0x9d, 0x85, 0xfa, 0xd2, 0xf4, 0x54, 0x6d, 0xa6, 0x36, 0x5d, 0x1d, 0xef, 0x23, 0xa7, - 0xe0, 0x44, 0x88, 0x9a, 0xbd, 0x33, 0x5f, 0x59, 0x18, 0xcf, 0x91, 0x93, 0x30, 0x1a, 0x02, 0x27, - 0x17, 0x97, 0xc7, 0xf3, 0xcf, 0x7d, 0x14, 0x86, 0xf1, 0x69, 0x04, 0xf7, 0x8b, 0x24, 0x23, 0x30, - 0xb8, 0x38, 0x59, 0x9f, 0xd6, 0xee, 0x22, 0x13, 0x80, 0x52, 0x75, 0x7a, 0x81, 0x31, 0xcc, 0x3d, - 0xf7, 0xff, 0xe6, 0x00, 0xea, 0x33, 0xcb, 0x4b, 0x82, 0x70, 0x18, 0x06, 0x6a, 0x0b, 0x77, 0x2b, - 0x73, 0x35, 0x46, 0x37, 0x08, 0xc5, 0xc5, 0xa5, 0x69, 0x56, 0xc3, 0x10, 0xf4, 0x4f, 0xcd, 0x2d, - 0xd6, 0xa7, 0xc7, 0xf3, 0x0c, 0xa8, 0x4d, 0x57, 0xaa, 0xe3, 0x05, 0x06, 0xbc, 0xa7, 0xd5, 0x96, - 0xa7, 0xc7, 0x8b, 0xec, 0xcf, 0xb9, 0xfa, 0x72, 0x65, 0x79, 0xbc, 0x9f, 0xfd, 0x39, 0x83, 0x7f, - 0x96, 0x18, 0xb3, 0xfa, 0xf4, 0x32, 0xfe, 0x18, 0x60, 0x4d, 0x98, 0xf1, 0x7f, 0x0d, 0x32, 0x14, - 0x63, 0x5d, 0xad, 0x69, 0xe3, 0x43, 0xec, 0x07, 0x63, 0xc9, 0x7e, 0x00, 0x6b, 0x9c, 0x36, 0x3d, - 0xbf, 0x78, 0x77, 0x7a, 0x7c, 0x98, 0xf1, 0x9a, 0xbf, 0xcd, 0xc0, 0x23, 0xec, 0x4f, 0x6d, 0x9e, - 0xfd, 0x39, 0xca, 0x38, 0x69, 0xd3, 0x95, 0xb9, 0xa5, 0xca, 0xf2, 0xec, 0xf8, 0x18, 0x6b, 0x0f, - 0xf2, 0x3c, 0xc1, 0x4b, 0x2e, 0x54, 0xe6, 0xa7, 0xc7, 0xc7, 0x05, 0x4d, 0x75, 0xae, 0xb6, 0x70, - 0x7b, 0xfc, 0x24, 0x36, 0xe4, 0xdd, 0x79, 0xfc, 0x41, 0x58, 0x01, 0xfc, 0xeb, 0xd4, 0x73, 0xdf, - 0x0f, 0xa5, 0xc5, 0x3a, 0x6e, 0x47, 0xce, 0xc1, 0xa9, 0xc5, 0x7a, 0x63, 0xf9, 0xdd, 0xa5, 0xe9, - 0x98, 0xbc, 0x4f, 0xc2, 0xa8, 0x8f, 0x98, 0xab, 0x2d, 0xdc, 0xf9, 0x34, 0x97, 0xb6, 0x0f, 0x9a, - 0xaf, 0x4c, 0x2d, 0xd6, 0xc7, 0xf3, 0xac, 0x57, 0x7c, 0xd0, 0xbd, 0xda, 0x42, 0x75, 0xf1, 0x5e, - 0x7d, 0xbc, 0xf0, 0xdc, 0x43, 0x18, 0xe1, 0x39, 0xde, 0x17, 0x1d, 0x73, 0xd5, 0xb4, 0xc8, 0x25, - 0x38, 0x5f, 0x9d, 0xbe, 0x5b, 0x9b, 0x9a, 0x6e, 0x2c, 0x6a, 0xb5, 0x9b, 0xb5, 0x85, 0x58, 0x4d, - 0x67, 0xe0, 0x64, 0x14, 0x5d, 0x59, 0xaa, 0x8d, 0xe7, 0xc8, 0x59, 0x20, 0x51, 0xf0, 0xad, 0xca, - 0xfc, 0xcc, 0x78, 0x9e, 0x28, 0x70, 0x3a, 0x0a, 0xaf, 0x2d, 0x2c, 0xdf, 0x59, 0x98, 0x1e, 0x2f, - 0x3c, 0xf7, 0xd7, 0x72, 0x70, 0x26, 0x35, 0x0f, 0x08, 0x51, 0xe1, 0xc9, 0xe9, 0xb9, 0x4a, 0x7d, - 0xb9, 0x36, 0x55, 0x9f, 0xae, 0x68, 0x53, 0xb3, 0x8d, 0xa9, 0xca, 0xf2, 0xf4, 0xcd, 0x45, 0xed, - 0xdd, 0xc6, 0xcd, 0xe9, 0x85, 0x69, 0xad, 0x32, 0x37, 0xde, 0x47, 0x9e, 0x81, 0x72, 0x06, 0x4d, - 0x7d, 0x7a, 0xea, 0x8e, 0x56, 0x5b, 0x7e, 0x77, 0x3c, 0x47, 0x9e, 0x86, 0x4b, 0x99, 0x44, 0xec, - 0xf7, 0x78, 0x9e, 0x3c, 0x09, 0x17, 0xb2, 0x48, 0xde, 0x99, 0x1b, 0x2f, 0x3c, 0xf7, 0xd3, 0x39, - 0x20, 0xc9, 0x44, 0x0e, 0xe4, 0x29, 0xb8, 0xc8, 0xf4, 0xa2, 0x91, 0xdd, 0xc0, 0xa7, 0xe1, 0x52, - 0x2a, 0x85, 0xd4, 0xbc, 0x32, 0x3c, 0x91, 0x41, 0x22, 0x1a, 0x77, 0x11, 0x94, 0x74, 0x02, 0x6c, - 0xda, 0xaf, 0xe4, 0xe0, 0x4c, 0xaa, 0x2b, 0x32, 0xb9, 0x02, 0xcf, 0x56, 0xaa, 0xf3, 0xac, 0x6f, - 0xa6, 0x96, 0x6b, 0x8b, 0x0b, 0xf5, 0xc6, 0xfc, 0x4c, 0xa5, 0xc1, 0xb4, 0xef, 0x4e, 0x3d, 0xd6, - 0x9b, 0x97, 0x41, 0xed, 0x41, 0x39, 0x35, 0x5b, 0x59, 0xb8, 0xc9, 0x86, 0x1f, 0x79, 0x16, 0x9e, - 0xca, 0xa4, 0x9b, 0x5e, 0xa8, 0x4c, 0xce, 0x4d, 0x57, 0xc7, 0xf3, 0xe4, 0x23, 0xf0, 0x74, 0x26, - 0x55, 0xb5, 0x56, 0xe7, 0x64, 0x85, 0xe7, 0xf4, 0xc8, 0x64, 0xc4, 0xbe, 0x72, 0x6a, 0x71, 0x61, - 0xb9, 0x32, 0xb5, 0x9c, 0xa6, 0xd9, 0xe7, 0xe1, 0x4c, 0x04, 0x3b, 0x79, 0xa7, 0x5e, 0x5b, 0x98, - 0xae, 0xd7, 0xc7, 0x73, 0x09, 0x54, 0x20, 0xda, 0xfc, 0x64, 0xf5, 0x5b, 0xff, 0xf3, 0x93, 0x7d, - 0xdf, 0xfa, 0xa3, 0x27, 0x73, 0x7f, 0xf0, 0x47, 0x4f, 0xe6, 0xfe, 0xd9, 0x1f, 0x3d, 0x99, 0xfb, - 0xcc, 0xf5, 0xdd, 0xe4, 0x00, 0xe1, 0xf3, 0xe2, 0x4a, 0x09, 0x0d, 0xf3, 0x97, 0xfe, 0x4d, 0x00, - 0x00, 0x00, 0xff, 0xff, 0x32, 0x3b, 0x34, 0xd9, 0xa5, 0x90, 0x01, 0x00, + 0x25, 0x31, 0x96, 0x4c, 0x3f, 0x28, 0xe9, 0xb3, 0x3e, 0xc9, 0x49, 0x1c, 0x7f, 0x89, 0x03, 0x3a, + 0x4a, 0xfc, 0x07, 0x5f, 0x92, 0x4f, 0x5f, 0xa2, 0x2f, 0x66, 0x1c, 0x3b, 0x9f, 0xbf, 0x3a, 0x55, + 0xdd, 0x5d, 0xfd, 0xba, 0x78, 0xae, 0xb0, 0xe0, 0xe0, 0xcf, 0x0c, 0xee, 0x39, 0xa7, 0x4e, 0x55, + 0x9f, 0x3a, 0x55, 0x75, 0xaa, 0xea, 0xd4, 0x39, 0x70, 0xd5, 0xa3, 0x2d, 0xda, 0xb1, 0x1d, 0xef, + 0x5a, 0x8b, 0xae, 0xea, 0xcd, 0x8d, 0x6b, 0xde, 0x46, 0x87, 0xba, 0xd7, 0xe8, 0x43, 0x6a, 0x79, + 0xfe, 0x7f, 0x13, 0x1d, 0xc7, 0xf6, 0x6c, 0x52, 0xe2, 0xbf, 0x2e, 0x9c, 0x5e, 0xb5, 0x57, 0x6d, + 0x04, 0x5d, 0x63, 0x7f, 0x71, 0xec, 0x85, 0x8b, 0xab, 0xb6, 0xbd, 0xda, 0xa2, 0xd7, 0xf0, 0xd7, + 0x4a, 0xf7, 0xfe, 0x35, 0xd7, 0x73, 0xba, 0x4d, 0x4f, 0x60, 0xcb, 0x71, 0xac, 0x67, 0xb6, 0xa9, + 0xeb, 0xe9, 0xed, 0x8e, 0x20, 0x78, 0x32, 0x4e, 0xb0, 0xee, 0xe8, 0x9d, 0x0e, 0x75, 0x44, 0xe5, + 0x17, 0x3e, 0x1a, 0xb4, 0x53, 0x6f, 0x36, 0xa9, 0xeb, 0xb6, 0x4c, 0xd7, 0xbb, 0xf6, 0xf0, 0x45, + 0xe9, 0x97, 0x20, 0x7c, 0x3a, 0xfd, 0x83, 0xf0, 0x5f, 0x41, 0xf2, 0x42, 0x3a, 0x89, 0x5f, 0x63, + 0xac, 0x6a, 0xf5, 0x2b, 0x79, 0x18, 0x9c, 0xa7, 0x9e, 0x6e, 0xe8, 0x9e, 0x4e, 0x2e, 0x42, 0x7f, + 0xcd, 0x32, 0xe8, 0x23, 0x25, 0xf7, 0x54, 0xee, 0x4a, 0x61, 0xb2, 0xb4, 0xb5, 0x59, 0xce, 0x53, + 0x53, 0xe3, 0x40, 0x72, 0x09, 0x8a, 0xcb, 0x1b, 0x1d, 0xaa, 0xe4, 0x9f, 0xca, 0x5d, 0x19, 0x9a, + 0x1c, 0xda, 0xda, 0x2c, 0xf7, 0xa3, 0xd0, 0x34, 0x04, 0x93, 0xa7, 0x21, 0x5f, 0xab, 0x2a, 0x05, + 0x44, 0x9e, 0xdc, 0xda, 0x2c, 0x8f, 0x76, 0x4d, 0xe3, 0x79, 0xbb, 0x6d, 0x7a, 0xb4, 0xdd, 0xf1, + 0x36, 0xb4, 0x7c, 0xad, 0x4a, 0x2e, 0x43, 0x71, 0xca, 0x36, 0xa8, 0x52, 0x44, 0x22, 0xb2, 0xb5, + 0x59, 0x1e, 0x6b, 0xda, 0x06, 0x95, 0xa8, 0x10, 0x4f, 0x3e, 0x05, 0xc5, 0x65, 0xb3, 0x4d, 0x95, + 0xfe, 0xa7, 0x72, 0x57, 0x86, 0xaf, 0x5f, 0x98, 0xe0, 0xe2, 0x9b, 0xf0, 0xc5, 0x37, 0xb1, 0xec, + 0xcb, 0x77, 0x72, 0xfc, 0xdb, 0x9b, 0xe5, 0xbe, 0xad, 0xcd, 0x72, 0x91, 0x89, 0xfc, 0xcb, 0xdf, + 0x29, 0xe7, 0x34, 0x2c, 0x49, 0xde, 0x84, 0xe1, 0xa9, 0x56, 0xd7, 0xf5, 0xa8, 0xb3, 0xa0, 0xb7, + 0xa9, 0x52, 0xc2, 0x0a, 0x2f, 0x6c, 0x6d, 0x96, 0xcf, 0x36, 0x39, 0xb8, 0x61, 0xe9, 0x6d, 0xb9, + 0x62, 0x99, 0x5c, 0xfd, 0xd5, 0x1c, 0x9c, 0xa8, 0x53, 0xd7, 0x35, 0x6d, 0x2b, 0x90, 0xcd, 0xb3, + 0x30, 0x24, 0x40, 0xb5, 0x2a, 0xca, 0x67, 0x68, 0x72, 0x60, 0x6b, 0xb3, 0x5c, 0x70, 0x4d, 0x43, + 0x0b, 0x31, 0xe4, 0xe3, 0x30, 0x70, 0xcf, 0xf4, 0xd6, 0xe6, 0x67, 0x2a, 0x42, 0x4e, 0x67, 0xb7, + 0x36, 0xcb, 0x64, 0xdd, 0xf4, 0xd6, 0x1a, 0xed, 0xfb, 0xba, 0x54, 0xa1, 0x4f, 0x46, 0xe6, 0x60, + 0x7c, 0xc9, 0x31, 0x1f, 0xea, 0x1e, 0xbd, 0x4d, 0x37, 0x96, 0xec, 0x96, 0xd9, 0xdc, 0x10, 0x52, + 0x7c, 0x6a, 0x6b, 0xb3, 0x7c, 0xb1, 0xc3, 0x71, 0x8d, 0x07, 0x74, 0xa3, 0xd1, 0x41, 0xac, 0xc4, + 0x24, 0x51, 0x52, 0xfd, 0xb5, 0x12, 0x8c, 0xdc, 0x71, 0xa9, 0x13, 0xb4, 0xfb, 0x32, 0x14, 0xd9, + 0x6f, 0xd1, 0x64, 0x94, 0x79, 0xd7, 0xa5, 0x8e, 0x2c, 0x73, 0x86, 0x27, 0x57, 0xa1, 0x7f, 0xce, + 0x5e, 0x35, 0x2d, 0xd1, 0xec, 0x53, 0x5b, 0x9b, 0xe5, 0x13, 0x2d, 0x06, 0x90, 0x28, 0x39, 0x05, + 0xf9, 0x24, 0x8c, 0xd4, 0xda, 0x4c, 0x87, 0x6c, 0x4b, 0xf7, 0x6c, 0x47, 0xb4, 0x16, 0xa5, 0x6b, + 0x4a, 0x70, 0xa9, 0x60, 0x84, 0x9e, 0xbc, 0x0e, 0x50, 0xb9, 0x57, 0xd7, 0xec, 0x16, 0xad, 0x68, + 0x0b, 0x42, 0x19, 0xb0, 0xb4, 0xbe, 0xee, 0x36, 0x1c, 0xbb, 0x45, 0x1b, 0xba, 0x23, 0x57, 0x2b, + 0x51, 0x93, 0x69, 0x18, 0xab, 0xe0, 0xa8, 0xd0, 0xe8, 0x0f, 0x74, 0xa9, 0xeb, 0xb9, 0x4a, 0xff, + 0x53, 0x85, 0x2b, 0x43, 0x93, 0x97, 0xb6, 0x36, 0xcb, 0xe7, 0xf9, 0x78, 0x69, 0x38, 0x02, 0x25, + 0xb1, 0x88, 0x15, 0x22, 0x93, 0x30, 0x5a, 0x79, 0xbf, 0xeb, 0xd0, 0x9a, 0x41, 0x2d, 0xcf, 0xf4, + 0x36, 0x84, 0x86, 0x5c, 0xdc, 0xda, 0x2c, 0x2b, 0x3a, 0x43, 0x34, 0x4c, 0x81, 0x91, 0x98, 0x44, + 0x8b, 0x90, 0x45, 0x38, 0x79, 0x73, 0x6a, 0xa9, 0x4e, 0x9d, 0x87, 0x66, 0x93, 0x56, 0x9a, 0x4d, + 0xbb, 0x6b, 0x79, 0xca, 0x00, 0xf2, 0x79, 0x7a, 0x6b, 0xb3, 0x7c, 0x69, 0xb5, 0xd9, 0x69, 0xb8, + 0x1c, 0xdb, 0xd0, 0x39, 0x5a, 0x62, 0x96, 0x2c, 0x4b, 0x3e, 0x03, 0xa3, 0xcb, 0x0e, 0xd3, 0x42, + 0xa3, 0x4a, 0x19, 0x5c, 0x19, 0x44, 0xfd, 0x3f, 0x3b, 0x21, 0x66, 0x2a, 0x0e, 0xf5, 0x7b, 0x96, + 0x37, 0xd6, 0xe3, 0x05, 0x1a, 0x06, 0xe2, 0xe4, 0xc6, 0x46, 0x58, 0x11, 0x0a, 0x0a, 0xfb, 0x78, + 0xd3, 0xa1, 0x46, 0x42, 0xdb, 0x86, 0xb0, 0xcd, 0x57, 0xb7, 0x36, 0xcb, 0xcf, 0x3a, 0x82, 0xa6, + 0xd1, 0x53, 0xed, 0x32, 0x59, 0x91, 0x69, 0x18, 0x64, 0xda, 0x74, 0xdb, 0xb4, 0x0c, 0x05, 0x9e, + 0xca, 0x5d, 0x19, 0xbb, 0x3e, 0xee, 0xb7, 0xde, 0x87, 0x4f, 0x9e, 0xdb, 0xda, 0x2c, 0x9f, 0x62, + 0x3a, 0xd8, 0x78, 0x60, 0x5a, 0xf2, 0x14, 0x11, 0x14, 0x65, 0xa3, 0x68, 0xd2, 0xf6, 0x70, 0xe8, + 0x0e, 0x87, 0xa3, 0x68, 0xc5, 0xf6, 0xe2, 0xc3, 0xd6, 0x27, 0x23, 0x53, 0x30, 0x3a, 0x69, 0x7b, + 0x35, 0xcb, 0xf5, 0x74, 0xab, 0x49, 0x6b, 0x55, 0x65, 0x04, 0xcb, 0xa1, 0x5a, 0xb0, 0x72, 0xa6, + 0xc0, 0x34, 0x22, 0x93, 0x52, 0xb4, 0x8c, 0xfa, 0xaf, 0x8a, 0x30, 0xc6, 0xfa, 0x44, 0x1a, 0x3e, + 0x15, 0x36, 0x13, 0x30, 0x08, 0xab, 0xc5, 0xed, 0xe8, 0x4d, 0x2a, 0x46, 0x12, 0x7e, 0x85, 0xe5, + 0x03, 0x25, 0x9e, 0x71, 0x7a, 0x72, 0x15, 0x06, 0x39, 0xa8, 0x56, 0x15, 0x83, 0x6b, 0x74, 0x6b, + 0xb3, 0x3c, 0xe4, 0x22, 0xac, 0x61, 0x1a, 0x5a, 0x80, 0x66, 0xda, 0xcd, 0xff, 0x9e, 0xb5, 0x5d, + 0x8f, 0x31, 0x17, 0x63, 0x0b, 0x3f, 0x43, 0x14, 0x58, 0x13, 0x28, 0x59, 0xbb, 0xa3, 0x85, 0xc8, + 0x6b, 0x00, 0x1c, 0x52, 0x31, 0x0c, 0x47, 0x0c, 0xb0, 0xf3, 0x5b, 0x9b, 0xe5, 0x33, 0x82, 0x85, + 0x6e, 0x18, 0xf2, 0xe8, 0x94, 0x88, 0x49, 0x1b, 0x46, 0xf8, 0xaf, 0x39, 0x7d, 0x85, 0xb6, 0xf8, + 0xe8, 0x1a, 0xbe, 0x7e, 0xc5, 0xef, 0xc4, 0xa8, 0x74, 0x26, 0x64, 0xd2, 0x69, 0xcb, 0x73, 0x36, + 0x26, 0xcb, 0x62, 0x42, 0x3e, 0x27, 0xaa, 0x6a, 0x21, 0x4e, 0x9e, 0x0a, 0xe4, 0x32, 0x6c, 0x9e, + 0x9e, 0xb1, 0x9d, 0x75, 0xdd, 0x31, 0xa8, 0x31, 0xb9, 0x21, 0xcf, 0xd3, 0xf7, 0x7d, 0x70, 0x63, + 0x45, 0x56, 0x3d, 0x99, 0x9c, 0x75, 0x3a, 0xe7, 0x56, 0xef, 0xae, 0xa0, 0xca, 0x0d, 0x24, 0xa4, + 0xe5, 0x76, 0x57, 0xe2, 0x6a, 0x16, 0x2d, 0xc3, 0xa6, 0x02, 0x0e, 0xb8, 0x4b, 0x1d, 0x36, 0x89, + 0xe3, 0xa8, 0x13, 0x53, 0x81, 0x60, 0xf2, 0x90, 0x63, 0x92, 0x3c, 0x44, 0x91, 0x0b, 0x6f, 0xc3, + 0xc9, 0x84, 0x28, 0xc8, 0x38, 0x14, 0x1e, 0xd0, 0x0d, 0xae, 0x2e, 0x1a, 0xfb, 0x93, 0x9c, 0x86, + 0xfe, 0x87, 0x7a, 0xab, 0x2b, 0x96, 0x50, 0x8d, 0xff, 0x78, 0x3d, 0xff, 0x89, 0x1c, 0x5b, 0x71, + 0xc8, 0x94, 0x6d, 0x59, 0xb4, 0xe9, 0xc9, 0x8b, 0xce, 0x2b, 0x30, 0x34, 0x67, 0x37, 0xf5, 0x16, + 0xf6, 0x23, 0xd7, 0x3b, 0x65, 0x6b, 0xb3, 0x7c, 0x9a, 0x75, 0xe0, 0x44, 0x8b, 0x61, 0xa4, 0x36, + 0x85, 0xa4, 0x4c, 0x01, 0x34, 0xda, 0xb6, 0x3d, 0x8a, 0x05, 0xf3, 0xa1, 0x02, 0x60, 0x41, 0x07, + 0x51, 0xb2, 0x02, 0x84, 0xc4, 0xe4, 0x1a, 0x0c, 0x2e, 0xb1, 0x75, 0xb6, 0x69, 0xb7, 0x84, 0xf2, + 0xe1, 0x52, 0x80, 0x6b, 0xaf, 0x3c, 0x56, 0x7d, 0x22, 0x75, 0x16, 0xc6, 0xa6, 0x5a, 0x26, 0xb5, + 0x3c, 0xb9, 0xd5, 0x6c, 0x24, 0x57, 0x56, 0xa9, 0xe5, 0xc9, 0xad, 0xc6, 0x31, 0xaf, 0x33, 0xa8, + 0xdc, 0xea, 0x80, 0x54, 0xfd, 0xbd, 0x02, 0x9c, 0xbf, 0xdd, 0x5d, 0xa1, 0x8e, 0x45, 0x3d, 0xea, + 0x8a, 0x05, 0x39, 0xe0, 0xba, 0x00, 0x27, 0x13, 0x48, 0xc1, 0x1d, 0x17, 0xca, 0x07, 0x01, 0xb2, + 0x21, 0xd6, 0x78, 0x79, 0xb6, 0x4d, 0x14, 0x25, 0xb3, 0x70, 0x22, 0x04, 0xb2, 0x46, 0xb8, 0x4a, + 0x1e, 0x97, 0x92, 0x27, 0xb7, 0x36, 0xcb, 0x17, 0x24, 0x6e, 0xac, 0xd9, 0xb2, 0x06, 0xc7, 0x8b, + 0x91, 0xdb, 0x30, 0x1e, 0x82, 0x6e, 0x3a, 0x76, 0xb7, 0xe3, 0x2a, 0x05, 0x64, 0x55, 0xde, 0xda, + 0x2c, 0x3f, 0x21, 0xb1, 0x5a, 0x45, 0xa4, 0xbc, 0x80, 0xc7, 0x0b, 0x92, 0x1f, 0xca, 0xc9, 0xdc, + 0xc4, 0x28, 0x2c, 0xe2, 0x28, 0x7c, 0xd5, 0x1f, 0x85, 0x99, 0x42, 0x9a, 0x88, 0x97, 0x14, 0x83, + 0x32, 0xd6, 0x8c, 0xc4, 0xa0, 0x4c, 0xd4, 0x78, 0x61, 0x0a, 0xce, 0xa4, 0xf2, 0xda, 0x95, 0x56, + 0xff, 0xcb, 0x82, 0xcc, 0x65, 0xc9, 0x36, 0x82, 0xce, 0x5c, 0x94, 0x3b, 0x73, 0xc9, 0x36, 0x70, + 0xaa, 0xcf, 0x85, 0x6b, 0xa7, 0xd4, 0xd8, 0x8e, 0x6d, 0xc4, 0x67, 0xfd, 0x64, 0x59, 0xf2, 0x79, + 0x38, 0x9b, 0x00, 0xf2, 0xe9, 0x9a, 0x6b, 0xff, 0xe5, 0xad, 0xcd, 0xb2, 0x9a, 0xc2, 0x35, 0x3e, + 0x7b, 0x67, 0x70, 0x21, 0x3a, 0x9c, 0x93, 0xa4, 0x6e, 0x5b, 0x9e, 0x6e, 0x5a, 0xc2, 0xb8, 0xe4, + 0xa3, 0xe4, 0xa3, 0x5b, 0x9b, 0xe5, 0x67, 0x64, 0x1d, 0xf4, 0x69, 0xe2, 0x8d, 0xcf, 0xe2, 0x43, + 0x0c, 0x50, 0x52, 0x50, 0xb5, 0xb6, 0xbe, 0xea, 0x5b, 0xcc, 0x57, 0xb6, 0x36, 0xcb, 0x1f, 0x49, + 0xad, 0xc3, 0x64, 0x54, 0xf2, 0x0a, 0x9d, 0xc5, 0x89, 0x68, 0x40, 0x42, 0xdc, 0x82, 0x6d, 0x50, + 0xfc, 0x86, 0x7e, 0xe4, 0xaf, 0x6e, 0x6d, 0x96, 0x9f, 0x94, 0xf8, 0x5b, 0xb6, 0x41, 0xe3, 0xcd, + 0x4f, 0x29, 0xad, 0xfe, 0x6a, 0x01, 0x9e, 0xac, 0x57, 0xe6, 0xe7, 0x6a, 0x86, 0x6f, 0xd2, 0x2c, + 0x39, 0xf6, 0x43, 0xd3, 0x90, 0x46, 0xef, 0x0a, 0x9c, 0x8b, 0xa1, 0xa6, 0xd1, 0x8a, 0x0a, 0x8c, + 0x69, 0xfc, 0x36, 0xdf, 0x5c, 0xea, 0x08, 0x9a, 0x06, 0x37, 0xb5, 0xa2, 0x8b, 0x76, 0x16, 0x23, + 0xd6, 0x47, 0x31, 0x54, 0x7d, 0xcd, 0x76, 0xbc, 0x66, 0xd7, 0x13, 0x4a, 0x80, 0x7d, 0x94, 0xa8, + 0xc3, 0x15, 0x44, 0x3d, 0xaa, 0xf0, 0xf9, 0x90, 0x1f, 0xcd, 0xc1, 0x78, 0xc5, 0xf3, 0x1c, 0x73, + 0xa5, 0xeb, 0xd1, 0x79, 0xbd, 0xd3, 0x31, 0xad, 0x55, 0x1c, 0xeb, 0xc3, 0xd7, 0xdf, 0x0c, 0xd6, + 0xc8, 0x9e, 0x92, 0x98, 0x88, 0x17, 0x97, 0x86, 0xa8, 0xee, 0xa3, 0x1a, 0x6d, 0x8e, 0x93, 0x87, + 0x68, 0xbc, 0x1c, 0x1b, 0xa2, 0xa9, 0xbc, 0x76, 0x35, 0x44, 0xbf, 0x52, 0x80, 0x8b, 0x8b, 0x0f, + 0x3c, 0x5d, 0xa3, 0xae, 0xdd, 0x75, 0x9a, 0xd4, 0xbd, 0xd3, 0x31, 0x74, 0x8f, 0x86, 0x23, 0xb5, + 0x0c, 0xfd, 0x15, 0xc3, 0xa0, 0x06, 0xb2, 0xeb, 0xe7, 0xdb, 0x3e, 0x9d, 0x01, 0x34, 0x0e, 0x27, + 0xcf, 0xc2, 0x80, 0x28, 0x83, 0xdc, 0xfb, 0x27, 0x87, 0xb7, 0x36, 0xcb, 0x03, 0x5d, 0x0e, 0xd2, + 0x7c, 0x1c, 0x23, 0xab, 0xd2, 0x16, 0x65, 0x64, 0x85, 0x90, 0xcc, 0xe0, 0x20, 0xcd, 0xc7, 0x91, + 0x77, 0x60, 0x0c, 0xd9, 0x06, 0xed, 0x11, 0x73, 0xdf, 0x69, 0x5f, 0xba, 0x72, 0x63, 0xf9, 0xd2, + 0x84, 0xad, 0x69, 0x38, 0x7e, 0x01, 0x2d, 0xc6, 0x80, 0xdc, 0x83, 0x71, 0xd1, 0x88, 0x90, 0x69, + 0x7f, 0x0f, 0xa6, 0x67, 0xb6, 0x36, 0xcb, 0x27, 0x45, 0xfb, 0x25, 0xb6, 0x09, 0x26, 0x8c, 0xb1, + 0x68, 0x76, 0xc8, 0xb8, 0xb4, 0x1d, 0x63, 0xf1, 0xc5, 0x32, 0xe3, 0x38, 0x13, 0xf5, 0x5d, 0x18, + 0x91, 0x0b, 0x92, 0xb3, 0xb8, 0xb5, 0xe6, 0xe3, 0x04, 0x37, 0xe5, 0xa6, 0x81, 0xfb, 0xe9, 0x17, + 0x61, 0xb8, 0x4a, 0xdd, 0xa6, 0x63, 0x76, 0x98, 0xd5, 0x20, 0x94, 0xfc, 0xc4, 0xd6, 0x66, 0x79, + 0xd8, 0x08, 0xc1, 0x9a, 0x4c, 0xa3, 0xfe, 0x3f, 0x39, 0x38, 0xcb, 0x78, 0x57, 0x5c, 0xd7, 0x5c, + 0xb5, 0xda, 0xf2, 0xb2, 0xfd, 0x3c, 0x94, 0xea, 0x58, 0x9f, 0xa8, 0xe9, 0xf4, 0xd6, 0x66, 0x79, + 0x9c, 0xb7, 0x40, 0xd2, 0x43, 0x41, 0x13, 0xec, 0x2b, 0xf3, 0xdb, 0xec, 0x2b, 0x99, 0x49, 0xeb, + 0xe9, 0x8e, 0x67, 0x5a, 0xab, 0x75, 0x4f, 0xf7, 0xba, 0x6e, 0xc4, 0xa4, 0x15, 0x98, 0x86, 0x8b, + 0xa8, 0x88, 0x49, 0x1b, 0x29, 0x44, 0xde, 0x86, 0x91, 0x69, 0xcb, 0x08, 0x99, 0xf0, 0x09, 0xf1, + 0x09, 0x66, 0x69, 0x52, 0x84, 0x27, 0x59, 0x44, 0x0a, 0xa8, 0x7f, 0x3b, 0x07, 0x0a, 0xdf, 0x04, + 0xce, 0x99, 0xae, 0x37, 0x4f, 0xdb, 0x2b, 0xd2, 0xec, 0x34, 0xe3, 0xef, 0x2a, 0x19, 0x4e, 0x5a, + 0x8b, 0xd0, 0x14, 0x10, 0xbb, 0xca, 0x96, 0xe9, 0x26, 0xb6, 0x1f, 0xb1, 0x52, 0xa4, 0x06, 0x03, + 0x9c, 0x33, 0xb7, 0x25, 0x86, 0xaf, 0x2b, 0xbe, 0x22, 0xc4, 0xab, 0xe6, 0xca, 0xd0, 0xe6, 0xc4, + 0xf2, 0x86, 0x46, 0x94, 0x57, 0xbf, 0x56, 0x80, 0xf1, 0x78, 0x21, 0x72, 0x0f, 0x06, 0x6f, 0xd9, + 0xa6, 0x45, 0x8d, 0x45, 0x0b, 0x5b, 0xd8, 0xfb, 0x70, 0xc4, 0xb7, 0xc5, 0x4f, 0xbd, 0x87, 0x65, + 0x1a, 0xb2, 0x05, 0x8b, 0x67, 0x25, 0x01, 0x33, 0xf2, 0x19, 0x18, 0x62, 0x36, 0xe0, 0x43, 0xe4, + 0x9c, 0xdf, 0x96, 0xf3, 0x53, 0x82, 0xf3, 0x69, 0x87, 0x17, 0x4a, 0xb2, 0x0e, 0xd9, 0x31, 0xbd, + 0xd2, 0xa8, 0xee, 0xda, 0x96, 0xe8, 0x79, 0xd4, 0x2b, 0x07, 0x21, 0xb2, 0x5e, 0x71, 0x1a, 0x66, + 0xba, 0xf2, 0x8f, 0xc5, 0x6e, 0x90, 0xf6, 0x2e, 0x5c, 0x56, 0xf1, 0x1e, 0x90, 0x88, 0x89, 0x05, + 0x27, 0x84, 0x40, 0xd7, 0xcc, 0x0e, 0x5a, 0xfd, 0xb8, 0xae, 0x8d, 0x5d, 0xbf, 0x3c, 0xe1, 0x1f, + 0x8a, 0x4d, 0x48, 0x47, 0x6a, 0x0f, 0x5f, 0x9c, 0x98, 0x0f, 0xc8, 0x71, 0x67, 0x8a, 0x3a, 0x19, + 0x63, 0x21, 0xf7, 0x76, 0x3b, 0x42, 0xae, 0xfe, 0x70, 0x1e, 0x5e, 0x08, 0xbb, 0x48, 0xa3, 0x0f, + 0x4d, 0xba, 0x1e, 0x72, 0x14, 0x7b, 0x64, 0x36, 0xc4, 0xdc, 0xa9, 0x35, 0xdd, 0x5a, 0xa5, 0x06, + 0xb9, 0x0a, 0xfd, 0x9a, 0xdd, 0xa2, 0xae, 0x92, 0x43, 0xf3, 0x10, 0xa7, 0x2f, 0x87, 0x01, 0xe4, + 0x43, 0x16, 0xa4, 0x20, 0x36, 0x94, 0x96, 0x1d, 0xdd, 0xf4, 0x7c, 0x4d, 0xaa, 0x24, 0x35, 0x69, + 0x07, 0x35, 0x4e, 0x70, 0x1e, 0x7c, 0x8d, 0x41, 0xc1, 0x7b, 0x08, 0x90, 0x05, 0xcf, 0x49, 0x2e, + 0xbc, 0x06, 0xc3, 0x12, 0xf1, 0xae, 0x16, 0x91, 0x6f, 0x14, 0xe5, 0xb1, 0xe5, 0x37, 0x4b, 0x8c, + 0xad, 0x6b, 0x6c, 0x4c, 0xb8, 0x2e, 0xb3, 0x62, 0xf8, 0xa0, 0x12, 0x9a, 0x8f, 0xa0, 0xa8, 0xe6, + 0x23, 0x88, 0xbc, 0x04, 0x83, 0x9c, 0x45, 0xb0, 0x5f, 0xc6, 0xbd, 0xb6, 0x83, 0xb0, 0xa8, 0x29, + 0x10, 0x10, 0x92, 0x9f, 0xcb, 0xc1, 0xa5, 0x9e, 0x92, 0x40, 0xe5, 0x1b, 0xbe, 0xfe, 0xf2, 0x9e, + 0xc4, 0x38, 0xf9, 0xc2, 0xd6, 0x66, 0xf9, 0xaa, 0xa4, 0x19, 0x8e, 0x44, 0xd3, 0x68, 0x72, 0x22, + 0xa9, 0x5d, 0xbd, 0x9b, 0xc2, 0x8c, 0x55, 0x5e, 0xe9, 0x0c, 0x1e, 0x55, 0x59, 0xcd, 0x0d, 0xbf, + 0x91, 0xc5, 0xd0, 0x58, 0x15, 0xdf, 0x7b, 0xdf, 0x27, 0x49, 0xa9, 0x26, 0x83, 0x0b, 0x69, 0xc2, + 0x39, 0x8e, 0xa9, 0xea, 0x1b, 0x8b, 0xf7, 0xe7, 0x6d, 0xcb, 0x5b, 0xf3, 0x2b, 0xe8, 0x97, 0xcf, + 0x7a, 0xb0, 0x02, 0x43, 0xdf, 0x68, 0xd8, 0xf7, 0x1b, 0x6d, 0x46, 0x95, 0x52, 0x47, 0x16, 0x27, + 0x36, 0xb1, 0x8b, 0x31, 0xee, 0x4f, 0x79, 0xa5, 0xf0, 0x24, 0xce, 0x9f, 0x17, 0x92, 0x13, 0x5c, + 0xac, 0x90, 0x5a, 0x83, 0x91, 0x39, 0xbb, 0xf9, 0x20, 0x50, 0x97, 0xd7, 0xa0, 0xb4, 0xac, 0x3b, + 0xab, 0xd4, 0x43, 0x59, 0x0c, 0x5f, 0x3f, 0x39, 0xc1, 0x4f, 0xb7, 0x19, 0x11, 0x47, 0x4c, 0x8e, + 0x89, 0xd9, 0xa7, 0xe4, 0xe1, 0x6f, 0x4d, 0x14, 0x50, 0xbf, 0xd3, 0x0f, 0x23, 0xe2, 0x24, 0x16, + 0x57, 0x0f, 0xf2, 0x7a, 0x78, 0xb6, 0x2d, 0xa6, 0xcb, 0xe0, 0x34, 0x2a, 0x38, 0x45, 0x1b, 0x61, + 0xcc, 0x7e, 0x7f, 0xb3, 0x9c, 0xdb, 0xda, 0x2c, 0xf7, 0x69, 0x83, 0xd2, 0x26, 0x36, 0x5c, 0xdf, + 0xa4, 0x05, 0x5d, 0x3e, 0x5b, 0x8d, 0x95, 0xe5, 0xeb, 0xdd, 0xdb, 0x30, 0x20, 0xda, 0x20, 0x34, + 0xee, 0x5c, 0x78, 0x76, 0x12, 0x39, 0x51, 0x8e, 0x95, 0xf6, 0x4b, 0x91, 0x37, 0xa1, 0xc4, 0xcf, + 0x12, 0x84, 0x00, 0xce, 0xa6, 0x9f, 0xbd, 0xc4, 0x8a, 0x8b, 0x32, 0x64, 0x16, 0x20, 0x3c, 0x47, + 0x08, 0x0e, 0xd0, 0x05, 0x87, 0xe4, 0x09, 0x43, 0x8c, 0x8b, 0x54, 0x96, 0xbc, 0x02, 0x23, 0xcb, + 0xd4, 0x69, 0x9b, 0x96, 0xde, 0xaa, 0x9b, 0xef, 0xfb, 0x67, 0xe8, 0xb8, 0xd0, 0xbb, 0xe6, 0xfb, + 0xf2, 0xc8, 0x8d, 0xd0, 0x91, 0xcf, 0xa5, 0xed, 0xd3, 0x07, 0xb0, 0x21, 0x4f, 0x6f, 0xbb, 0x81, + 0x8d, 0xb5, 0x27, 0x65, 0xdb, 0xfe, 0x0e, 0x8c, 0x46, 0xb6, 0x68, 0xe2, 0x90, 0xf4, 0x52, 0x92, + 0xb5, 0xb4, 0xdf, 0x8c, 0xb1, 0x8d, 0x72, 0x60, 0x9a, 0x5c, 0xb3, 0x4c, 0xcf, 0xd4, 0x5b, 0x53, + 0x76, 0xbb, 0xad, 0x5b, 0x86, 0x32, 0x14, 0x6a, 0xb2, 0xc9, 0x31, 0x8d, 0x26, 0x47, 0xc9, 0x9a, + 0x1c, 0x2d, 0x44, 0x6e, 0xc3, 0xb8, 0xe8, 0x43, 0x8d, 0x36, 0x6d, 0x87, 0xd9, 0x1e, 0x78, 0x06, + 0x2a, 0x8e, 0x01, 0x5c, 0x8e, 0x6b, 0x38, 0x3e, 0x52, 0x36, 0xee, 0xe3, 0x05, 0x6f, 0x15, 0x07, + 0x87, 0xc7, 0x47, 0xe2, 0xc7, 0xd6, 0xea, 0xdf, 0x2c, 0xc0, 0xb0, 0x20, 0x65, 0x4b, 0xf7, 0xb1, + 0x82, 0xef, 0x47, 0xc1, 0x53, 0x15, 0xb5, 0x74, 0x50, 0x8a, 0xaa, 0x7e, 0x31, 0x1f, 0xcc, 0x46, + 0x4b, 0x8e, 0x69, 0xed, 0x6f, 0x36, 0xba, 0x0c, 0x30, 0xb5, 0xd6, 0xb5, 0x1e, 0xf0, 0xeb, 0xb9, + 0x7c, 0x78, 0x3d, 0xd7, 0x34, 0x35, 0x09, 0x43, 0x2e, 0x41, 0xb1, 0xca, 0xf8, 0xb3, 0x9e, 0x19, + 0x99, 0x1c, 0xfa, 0x36, 0xe7, 0x94, 0x7b, 0x41, 0x43, 0x30, 0xdb, 0xcc, 0x4d, 0x6e, 0x78, 0x94, + 0x9b, 0xcf, 0x05, 0xbe, 0x99, 0x5b, 0x61, 0x00, 0x8d, 0xc3, 0xc9, 0x0d, 0x38, 0x59, 0xa5, 0x2d, + 0x7d, 0x63, 0xde, 0x6c, 0xb5, 0x4c, 0x97, 0x36, 0x6d, 0xcb, 0x70, 0x51, 0xc8, 0xa2, 0xba, 0xb6, + 0xab, 0x25, 0x09, 0x88, 0x0a, 0xa5, 0xc5, 0xfb, 0xf7, 0x5d, 0xea, 0xa1, 0xf8, 0x0a, 0x93, 0xc0, + 0x26, 0x67, 0x1b, 0x21, 0x9a, 0xc0, 0xa8, 0x5f, 0xcf, 0xb1, 0xdd, 0x92, 0xfb, 0xc0, 0xb3, 0x3b, + 0x81, 0x96, 0xef, 0x4b, 0x24, 0x57, 0x43, 0xbb, 0x22, 0x8f, 0x5f, 0x7b, 0x42, 0x7c, 0xed, 0x80, + 0xb0, 0x2d, 0x42, 0x8b, 0x22, 0xf5, 0xab, 0x0a, 0xdb, 0x7c, 0x95, 0xfa, 0x47, 0x79, 0x38, 0x27, + 0x5a, 0x3c, 0xd5, 0x32, 0x3b, 0x2b, 0xb6, 0xee, 0x18, 0x1a, 0x6d, 0x52, 0xf3, 0x21, 0x3d, 0x9a, + 0x03, 0x2f, 0x3a, 0x74, 0x8a, 0xfb, 0x18, 0x3a, 0xd7, 0x71, 0xe3, 0xc9, 0x24, 0x83, 0x07, 0xcc, + 0xdc, 0xa8, 0x18, 0xdf, 0xda, 0x2c, 0x8f, 0x18, 0x1c, 0x8c, 0x57, 0x0c, 0x9a, 0x4c, 0xc4, 0x94, + 0x64, 0x8e, 0x5a, 0xab, 0xde, 0x1a, 0x2a, 0x49, 0x3f, 0x57, 0x92, 0x16, 0x42, 0x34, 0x81, 0x51, + 0xff, 0x8f, 0x3c, 0x9c, 0x8e, 0x8b, 0xbc, 0x4e, 0x2d, 0xe3, 0x58, 0xde, 0x1f, 0x8c, 0xbc, 0xff, + 0xb8, 0x00, 0x4f, 0x88, 0x32, 0xf5, 0x35, 0xdd, 0xa1, 0x46, 0xd5, 0x74, 0x68, 0xd3, 0xb3, 0x9d, + 0x8d, 0x23, 0x6c, 0x40, 0x1d, 0x9c, 0xd8, 0x6f, 0x40, 0x49, 0x1c, 0x37, 0xf0, 0x75, 0x66, 0x2c, + 0x68, 0x09, 0x42, 0x13, 0x2b, 0x14, 0x3f, 0xaa, 0x88, 0x75, 0x56, 0x69, 0x27, 0x9d, 0xf5, 0x09, + 0x18, 0x0d, 0x44, 0x8f, 0x1b, 0xdf, 0x81, 0xd0, 0xda, 0x32, 0x7c, 0x04, 0xee, 0x7d, 0xb5, 0x28, + 0x21, 0xd6, 0xe6, 0x03, 0x6a, 0x55, 0xb4, 0x86, 0x46, 0x45, 0x6d, 0x41, 0x39, 0xd3, 0xd0, 0x64, + 0x22, 0x75, 0xb3, 0x08, 0x17, 0xd2, 0xbb, 0x5d, 0xa3, 0xba, 0x71, 0xdc, 0xeb, 0xdf, 0x93, 0xbd, + 0x4e, 0x9e, 0x86, 0xe2, 0x92, 0xee, 0xad, 0x89, 0xeb, 0x7e, 0xbc, 0x83, 0xbe, 0x6f, 0xb6, 0x68, + 0xa3, 0xa3, 0x7b, 0x6b, 0x1a, 0xa2, 0xa4, 0x39, 0x03, 0x90, 0x63, 0xca, 0x9c, 0x21, 0x2d, 0xf6, + 0xc3, 0x4f, 0xe5, 0xae, 0x14, 0x53, 0x17, 0xfb, 0xef, 0x14, 0xb3, 0xe6, 0x95, 0x7b, 0x8e, 0xe9, + 0xd1, 0x63, 0x0d, 0x3b, 0xd6, 0xb0, 0x7d, 0x6a, 0xd8, 0x3f, 0xc9, 0xc3, 0x68, 0xb0, 0x69, 0x7a, + 0x8f, 0x36, 0x0f, 0x67, 0xad, 0x0a, 0xb7, 0x32, 0x85, 0x7d, 0x6f, 0x65, 0xf6, 0xa3, 0x50, 0x6a, + 0x70, 0xc4, 0xca, 0x4d, 0x03, 0x94, 0x18, 0x3f, 0x62, 0x0d, 0x0e, 0x56, 0x9f, 0x86, 0x81, 0x79, + 0xfd, 0x91, 0xd9, 0xee, 0xb6, 0x85, 0x95, 0x8e, 0xee, 0x6b, 0x6d, 0xfd, 0x91, 0xe6, 0xc3, 0xd5, + 0xff, 0x2e, 0x07, 0x63, 0x42, 0xa8, 0x82, 0xf9, 0xbe, 0xa4, 0x1a, 0x4a, 0x27, 0xbf, 0x6f, 0xe9, + 0x14, 0xf6, 0x2e, 0x1d, 0xf5, 0xaf, 0x14, 0x40, 0x99, 0x31, 0x5b, 0x74, 0xd9, 0xd1, 0x2d, 0xf7, + 0x3e, 0x75, 0xc4, 0x76, 0x7a, 0x9a, 0xb1, 0xda, 0xd7, 0x07, 0x4a, 0x53, 0x4a, 0x7e, 0x4f, 0x53, + 0xca, 0xc7, 0x60, 0x48, 0x34, 0x26, 0x70, 0x9d, 0xc4, 0x51, 0xe3, 0xf8, 0x40, 0x2d, 0xc4, 0x33, + 0xe2, 0x4a, 0xa7, 0xe3, 0xd8, 0x0f, 0xa9, 0xc3, 0x6f, 0xc5, 0x04, 0xb1, 0xee, 0x03, 0xb5, 0x10, + 0x2f, 0x71, 0xa6, 0xbe, 0xbd, 0x28, 0x73, 0xa6, 0x8e, 0x16, 0xe2, 0xc9, 0x15, 0x18, 0x9c, 0xb3, + 0x9b, 0x3a, 0x0a, 0x9a, 0x4f, 0x2b, 0x23, 0x5b, 0x9b, 0xe5, 0xc1, 0x96, 0x80, 0x69, 0x01, 0x96, + 0x51, 0x56, 0xed, 0x75, 0xab, 0x65, 0xeb, 0xdc, 0xd9, 0x66, 0x90, 0x53, 0x1a, 0x02, 0xa6, 0x05, + 0x58, 0x46, 0xc9, 0x64, 0x8e, 0x4e, 0x4c, 0x83, 0x21, 0xcf, 0xfb, 0x02, 0xa6, 0x05, 0x58, 0xf5, + 0xeb, 0x45, 0xa6, 0xbd, 0xae, 0xf9, 0xfe, 0x63, 0xbf, 0x2e, 0x84, 0x03, 0xa6, 0x7f, 0x0f, 0x03, + 0xe6, 0xb1, 0x39, 0xb0, 0x53, 0xff, 0xd5, 0x00, 0x80, 0x90, 0xfe, 0xf4, 0xf1, 0xe6, 0x70, 0x7f, + 0x5a, 0x53, 0x85, 0x93, 0xd3, 0xd6, 0x9a, 0x6e, 0x35, 0xa9, 0x11, 0x1e, 0x5b, 0x96, 0x70, 0x68, + 0xa3, 0xd3, 0x25, 0x15, 0xc8, 0xf0, 0xdc, 0x52, 0x4b, 0x16, 0x20, 0x2f, 0xc2, 0x70, 0xcd, 0xf2, + 0xa8, 0xa3, 0x37, 0x3d, 0xf3, 0x21, 0x15, 0x53, 0x03, 0xde, 0x44, 0x9b, 0x21, 0x58, 0x93, 0x69, + 0xc8, 0x0d, 0x18, 0x59, 0xd2, 0x1d, 0xcf, 0x6c, 0x9a, 0x1d, 0xdd, 0xf2, 0x5c, 0x65, 0x10, 0x67, + 0x34, 0xb4, 0x30, 0x3a, 0x12, 0x5c, 0x8b, 0x50, 0x91, 0xcf, 0xc1, 0x10, 0x6e, 0x4d, 0xd1, 0x3f, + 0x7c, 0x68, 0xdb, 0x8b, 0xca, 0x67, 0x42, 0x77, 0x44, 0x7e, 0xfa, 0x8a, 0x37, 0xce, 0xf1, 0xbb, + 0xca, 0x80, 0x23, 0xf9, 0x34, 0x0c, 0x4c, 0x5b, 0x06, 0x32, 0x87, 0x6d, 0x99, 0xab, 0x82, 0xf9, + 0xd9, 0x90, 0xb9, 0xdd, 0x89, 0xf1, 0xf6, 0xd9, 0xa5, 0x8f, 0xb2, 0xe1, 0x0f, 0x6e, 0x94, 0x8d, + 0x7c, 0x00, 0xc7, 0xe2, 0xa3, 0x07, 0x75, 0x2c, 0x3e, 0xb6, 0xc7, 0x63, 0x71, 0xf5, 0x7d, 0x18, + 0x9e, 0x5c, 0x9a, 0x09, 0x46, 0xef, 0x79, 0x28, 0x2c, 0x09, 0xcf, 0x88, 0x22, 0xb7, 0x67, 0x3a, + 0xa6, 0xa1, 0x31, 0x18, 0xb9, 0x0a, 0x83, 0x53, 0xe8, 0x6e, 0x27, 0x6e, 0x11, 0x8b, 0x7c, 0xfd, + 0x6b, 0x22, 0x0c, 0xbd, 0x6e, 0x7d, 0x34, 0x79, 0x16, 0x06, 0x96, 0x1c, 0x7b, 0xd5, 0xd1, 0xdb, + 0x62, 0x0d, 0x46, 0xd7, 0x94, 0x0e, 0x07, 0x69, 0x3e, 0x4e, 0xfd, 0xf1, 0x9c, 0x6f, 0xb6, 0xb3, + 0x12, 0xf5, 0x2e, 0x1e, 0xcd, 0x63, 0xdd, 0x83, 0xbc, 0x84, 0xcb, 0x41, 0x9a, 0x8f, 0x23, 0x57, + 0xa1, 0x7f, 0xda, 0x71, 0x6c, 0x47, 0xf6, 0xa9, 0xa7, 0x0c, 0x20, 0x5f, 0xf7, 0x22, 0x05, 0x79, + 0x15, 0x86, 0xf9, 0x9c, 0xc3, 0x4f, 0x34, 0x0b, 0xbd, 0x6e, 0x4a, 0x65, 0x4a, 0xf5, 0x5b, 0x05, + 0xc9, 0x66, 0xe3, 0x12, 0x7f, 0x0c, 0x6f, 0x05, 0x5e, 0x82, 0xc2, 0xe4, 0xd2, 0x8c, 0x98, 0x00, + 0x4f, 0xf9, 0x45, 0x25, 0x55, 0x89, 0x95, 0x63, 0xd4, 0xe4, 0x22, 0x14, 0x97, 0x98, 0xfa, 0x94, + 0x50, 0x3d, 0x06, 0xb7, 0x36, 0xcb, 0xc5, 0x0e, 0xd3, 0x1f, 0x84, 0x22, 0x96, 0x6d, 0x66, 0xf8, + 0x8e, 0x89, 0x63, 0xc3, 0x7d, 0xcc, 0x45, 0x28, 0x56, 0x9c, 0xd5, 0x87, 0x62, 0xd6, 0x42, 0xac, + 0xee, 0xac, 0x3e, 0xd4, 0x10, 0x4a, 0xae, 0x01, 0x68, 0xd4, 0xeb, 0x3a, 0x16, 0x3e, 0x77, 0x19, + 0xc2, 0xf3, 0x37, 0x9c, 0x0d, 0x1d, 0x84, 0x36, 0x9a, 0xb6, 0x41, 0x35, 0x89, 0x44, 0xfd, 0x1b, + 0xe1, 0xc5, 0x4e, 0xd5, 0x74, 0x1f, 0x1c, 0x77, 0xe1, 0x2e, 0xba, 0x50, 0x17, 0x47, 0x9c, 0xc9, + 0x4e, 0x2a, 0x43, 0xff, 0x4c, 0x4b, 0x5f, 0x75, 0xb1, 0x0f, 0x85, 0xef, 0xda, 0x7d, 0x06, 0xd0, + 0x38, 0x3c, 0xd6, 0x4f, 0x83, 0xdb, 0xf7, 0xd3, 0x57, 0xfb, 0x83, 0xd1, 0xb6, 0x40, 0xbd, 0x75, + 0xdb, 0x39, 0xee, 0xaa, 0x9d, 0x76, 0xd5, 0x65, 0x18, 0xa8, 0x3b, 0x4d, 0xe9, 0xe8, 0x02, 0xf7, + 0x03, 0xae, 0xd3, 0xe4, 0xc7, 0x16, 0x3e, 0x92, 0xd1, 0x55, 0x5d, 0x0f, 0xe9, 0x06, 0x42, 0x3a, + 0xc3, 0xf5, 0x04, 0x9d, 0x40, 0x0a, 0xba, 0x25, 0xdb, 0xf1, 0x44, 0xc7, 0x05, 0x74, 0x1d, 0xdb, + 0xf1, 0x34, 0x1f, 0x49, 0x3e, 0x06, 0xb0, 0x3c, 0xb5, 0xe4, 0x3b, 0xf7, 0x0f, 0x85, 0xbe, 0x87, + 0xc2, 0xab, 0x5f, 0x93, 0xd0, 0x64, 0x19, 0x86, 0x16, 0x3b, 0xd4, 0xe1, 0x5b, 0x21, 0xfe, 0x80, + 0xe5, 0xa3, 0x31, 0xd1, 0x8a, 0x7e, 0x9f, 0x10, 0xff, 0x07, 0xe4, 0x7c, 0x7d, 0xb1, 0xfd, 0x9f, + 0x5a, 0xc8, 0x88, 0xbc, 0x0a, 0xa5, 0x0a, 0xb7, 0xf3, 0x86, 0x91, 0x65, 0x20, 0x32, 0xdc, 0x82, + 0x72, 0x14, 0xdf, 0xb3, 0xeb, 0xf8, 0xb7, 0x26, 0xc8, 0xd5, 0xab, 0x30, 0x1e, 0xaf, 0x86, 0x0c, + 0xc3, 0xc0, 0xd4, 0xe2, 0xc2, 0xc2, 0xf4, 0xd4, 0xf2, 0x78, 0x1f, 0x19, 0x84, 0x62, 0x7d, 0x7a, + 0xa1, 0x3a, 0x9e, 0x53, 0x7f, 0x5e, 0x9a, 0x41, 0x98, 0x6a, 0x1d, 0x5f, 0x0d, 0xef, 0xeb, 0xbe, + 0x65, 0x1c, 0xef, 0x43, 0xf1, 0xc4, 0xa0, 0x6d, 0x7a, 0x1e, 0x35, 0xc4, 0x2a, 0x81, 0xf7, 0x85, + 0xde, 0x23, 0x2d, 0x81, 0x27, 0xcf, 0xc3, 0x28, 0xc2, 0xc4, 0x15, 0x21, 0xdf, 0x1f, 0x8b, 0x02, + 0xce, 0x23, 0x2d, 0x8a, 0x54, 0x7f, 0x37, 0xbc, 0x1d, 0x9e, 0xa3, 0xfa, 0x51, 0xbd, 0x51, 0xfc, + 0x90, 0xf4, 0x97, 0xfa, 0x6f, 0x8a, 0xfc, 0xc9, 0x09, 0x7f, 0x9f, 0x78, 0x18, 0xa2, 0x0c, 0x8f, + 0x74, 0x0b, 0xbb, 0x38, 0xd2, 0x7d, 0x1e, 0x4a, 0xf3, 0xd4, 0x5b, 0xb3, 0x7d, 0xc7, 0x2f, 0xf4, + 0xd0, 0x6b, 0x23, 0x44, 0xf6, 0xd0, 0xe3, 0x34, 0xe4, 0x01, 0x10, 0xff, 0xf1, 0x61, 0xe0, 0xf8, + 0xed, 0x1f, 0x21, 0x9f, 0x4b, 0xec, 0x53, 0xea, 0xf8, 0x44, 0x19, 0x7d, 0xfa, 0x4f, 0x07, 0x8e, + 0xe5, 0x92, 0x27, 0xd6, 0xbf, 0xde, 0x2c, 0x97, 0x38, 0x8d, 0x96, 0xc2, 0x96, 0xbc, 0x03, 0x43, + 0xf3, 0x33, 0x15, 0xf1, 0x10, 0x91, 0x7b, 0x45, 0x9c, 0x0f, 0xa4, 0xe8, 0x23, 0x02, 0x91, 0xe0, + 0xfb, 0x9e, 0xf6, 0x7d, 0x3d, 0xf9, 0x0e, 0x31, 0xe4, 0xc2, 0xb4, 0x85, 0xbf, 0x14, 0x12, 0xa7, + 0x0b, 0x81, 0xb6, 0x44, 0xdf, 0x0f, 0xc5, 0x65, 0xc5, 0xb1, 0x31, 0x6d, 0x19, 0xdc, 0xc7, 0xe8, + 0x5e, 0x84, 0x93, 0x95, 0x4e, 0xa7, 0x65, 0x52, 0x03, 0xf5, 0x45, 0xeb, 0xb6, 0xa8, 0x2b, 0x5c, + 0x7e, 0xf0, 0xf1, 0x89, 0xce, 0x91, 0x0d, 0x7c, 0xfe, 0xda, 0x70, 0xba, 0x51, 0xff, 0xcc, 0x64, + 0x59, 0xf5, 0x27, 0xf3, 0x70, 0x76, 0xca, 0xa1, 0xba, 0x47, 0xe7, 0x67, 0x2a, 0x95, 0x2e, 0xfa, + 0xc8, 0xb5, 0x5a, 0xd4, 0x5a, 0x3d, 0x9c, 0x61, 0xfd, 0x06, 0x8c, 0x05, 0x0d, 0xa8, 0x37, 0xed, + 0x0e, 0x95, 0x1f, 0x72, 0x35, 0x7d, 0x4c, 0xc3, 0x65, 0x28, 0x2d, 0x46, 0x4a, 0x6e, 0xc3, 0xa9, + 0x00, 0x52, 0x69, 0xb5, 0xec, 0x75, 0x8d, 0x76, 0x5d, 0xee, 0x88, 0x3b, 0xc8, 0x1d, 0x71, 0x43, + 0x0e, 0x3a, 0xc3, 0x37, 0x1c, 0x46, 0xa0, 0xa5, 0x95, 0x52, 0xbf, 0x56, 0x80, 0x73, 0x77, 0xf5, + 0x96, 0x69, 0x84, 0xa2, 0xd1, 0xa8, 0xdb, 0xb1, 0x2d, 0x97, 0x1e, 0xa1, 0x51, 0x1a, 0x19, 0x0a, + 0xc5, 0x03, 0x19, 0x0a, 0xc9, 0x2e, 0xea, 0xdf, 0x77, 0x17, 0x95, 0xf6, 0xd4, 0x45, 0xff, 0x7b, + 0x0e, 0xc6, 0xfd, 0x87, 0x06, 0xf2, 0xa3, 0x71, 0xc9, 0x0b, 0x1e, 0x8f, 0x10, 0x63, 0x7e, 0xd7, + 0x88, 0x27, 0x75, 0x18, 0x98, 0x7e, 0xd4, 0x31, 0x1d, 0xea, 0xee, 0xc0, 0x69, 0xfc, 0x92, 0x38, + 0x2e, 0x39, 0x49, 0x79, 0x91, 0xc4, 0x49, 0x09, 0x07, 0xe3, 0xf3, 0x41, 0xfe, 0xd4, 0x62, 0xd2, + 0x7f, 0x09, 0xcf, 0x9f, 0x0f, 0x8a, 0x27, 0x19, 0x91, 0xf7, 0xa0, 0x21, 0x29, 0x79, 0x06, 0x0a, + 0xcb, 0xcb, 0x73, 0x62, 0x26, 0xc5, 0x08, 0x04, 0x9e, 0x27, 0xbf, 0x8f, 0x64, 0x58, 0xf5, 0x9f, + 0xe7, 0x01, 0x98, 0x2a, 0xf0, 0xe1, 0x7a, 0x28, 0x4a, 0x38, 0x09, 0x83, 0xbe, 0xc0, 0x85, 0x1a, + 0x06, 0xaf, 0x04, 0xe2, 0x1d, 0x11, 0xaf, 0x3b, 0x78, 0x11, 0x52, 0xf6, 0x1d, 0xc9, 0xf9, 0x3d, + 0x00, 0xee, 0x6c, 0xd0, 0x91, 0xdc, 0x77, 0x1f, 0xff, 0x18, 0x0c, 0x89, 0x19, 0xcf, 0x8e, 0x9c, + 0xff, 0x37, 0x7d, 0xa0, 0x16, 0xe2, 0x63, 0x53, 0x6b, 0x69, 0x1f, 0x0b, 0xb1, 0x2f, 0x5e, 0xde, + 0x2b, 0xc7, 0xe2, 0x3d, 0x60, 0xf1, 0x7e, 0x49, 0x88, 0x97, 0xbf, 0x18, 0x3a, 0xb2, 0xe2, 0x3d, + 0xb0, 0xb3, 0x6f, 0xf5, 0x9f, 0xe4, 0x80, 0xb0, 0x66, 0x2d, 0xe9, 0xae, 0xbb, 0x6e, 0x3b, 0x06, + 0x77, 0x4e, 0x3f, 0x14, 0xc1, 0x1c, 0xdc, 0x7d, 0xe5, 0xb7, 0x06, 0xe1, 0x54, 0xc4, 0xf1, 0xf7, + 0x88, 0x4f, 0x56, 0x57, 0xa3, 0xa3, 0xa9, 0xd7, 0xab, 0x97, 0x8f, 0xc8, 0x17, 0xa2, 0xfd, 0x91, + 0x07, 0x6f, 0xd2, 0x4d, 0xe8, 0x0b, 0x30, 0x22, 0x7e, 0xb0, 0x15, 0xda, 0xbf, 0xe9, 0xc2, 0x51, + 0xea, 0x32, 0x80, 0x16, 0x41, 0x93, 0x97, 0x61, 0x88, 0x0d, 0x98, 0x55, 0x0c, 0x56, 0x32, 0x10, + 0xbe, 0x28, 0x31, 0x7c, 0xa0, 0xbc, 0x9e, 0x04, 0x94, 0xd2, 0xbb, 0xa5, 0xc1, 0x1d, 0xbc, 0x5b, + 0xfa, 0x3c, 0x0c, 0x57, 0x2c, 0xcb, 0xf6, 0x70, 0x93, 0xee, 0x8a, 0xab, 0x89, 0x4c, 0xab, 0xfc, + 0x19, 0x7c, 0x8c, 0x1f, 0xd2, 0xa7, 0x9a, 0xe5, 0x32, 0x43, 0x72, 0xdd, 0x7f, 0x15, 0x43, 0x1d, + 0xe1, 0x55, 0x8e, 0xd7, 0x33, 0x8e, 0x80, 0x25, 0x1f, 0xc5, 0x60, 0xe7, 0x8d, 0x2e, 0x39, 0x76, + 0xc7, 0x76, 0xa9, 0xc1, 0x05, 0x35, 0x1c, 0x86, 0x36, 0xe8, 0x08, 0x04, 0xbe, 0x9b, 0x8b, 0x04, + 0x0e, 0x89, 0x14, 0x21, 0xf7, 0xe1, 0xb4, 0x7f, 0x51, 0x1c, 0xbc, 0x50, 0xac, 0x55, 0x5d, 0x65, + 0x04, 0x5f, 0x25, 0x91, 0xb8, 0x32, 0xd4, 0xaa, 0x93, 0x4f, 0xfa, 0xd7, 0x22, 0xfe, 0x13, 0xc7, + 0x86, 0x69, 0xc8, 0x5d, 0x9d, 0xca, 0x8f, 0x7c, 0x3f, 0x0c, 0xcf, 0xeb, 0x8f, 0xaa, 0x5d, 0x71, + 0xf6, 0x32, 0xba, 0xf3, 0xdb, 0x97, 0xb6, 0xfe, 0xa8, 0x61, 0x88, 0x72, 0x31, 0x9b, 0x42, 0x66, + 0x49, 0x1a, 0x70, 0x76, 0xc9, 0xb1, 0xdb, 0xb6, 0x47, 0x8d, 0xd8, 0x63, 0xbf, 0x13, 0xe1, 0xeb, + 0xe0, 0x8e, 0xa0, 0x68, 0xf4, 0x78, 0xf5, 0x97, 0xc1, 0x86, 0xb4, 0xe1, 0x44, 0xc5, 0x75, 0xbb, + 0x6d, 0x1a, 0xde, 0x50, 0x8d, 0x6f, 0xfb, 0x19, 0x1f, 0x15, 0x5e, 0xcb, 0x4f, 0xe8, 0x58, 0x94, + 0x5f, 0x50, 0x35, 0x3c, 0x53, 0xae, 0x11, 0xbf, 0x25, 0xce, 0xfb, 0x56, 0x71, 0x70, 0x6c, 0xfc, + 0x84, 0x76, 0x2e, 0xd9, 0x98, 0x65, 0xd3, 0x6b, 0x51, 0xf5, 0xaf, 0xe6, 0x63, 0xb3, 0x08, 0xb7, + 0xaf, 0xf6, 0x35, 0x8b, 0xc8, 0xb3, 0x41, 0x7e, 0x8f, 0xb3, 0xc1, 0x47, 0x92, 0x3e, 0x0f, 0x29, + 0x43, 0xfc, 0xfb, 0x61, 0xcc, 0x2f, 0x81, 0xed, 0xde, 0x08, 0x96, 0x89, 0x6c, 0x51, 0x5e, 0x14, + 0xa2, 0x1c, 0x47, 0x03, 0x73, 0x23, 0x26, 0xbf, 0x18, 0x3f, 0xf5, 0x9b, 0x39, 0x80, 0x50, 0x01, + 0xc9, 0x0b, 0xd1, 0x88, 0x51, 0xb9, 0xf0, 0x22, 0x48, 0x44, 0x93, 0x88, 0x84, 0x88, 0x22, 0x17, + 0xa1, 0x88, 0x11, 0x47, 0xf2, 0xe1, 0xc1, 0xf3, 0x03, 0xd3, 0x32, 0x34, 0x84, 0x32, 0xac, 0x14, + 0x1a, 0x00, 0xb1, 0xe8, 0xf4, 0xc0, 0xad, 0xe6, 0x2a, 0x9c, 0xa8, 0x77, 0x57, 0xfc, 0xba, 0xa5, + 0x77, 0x8e, 0x18, 0xf8, 0xc4, 0xed, 0xae, 0x04, 0x8f, 0x83, 0x23, 0x61, 0x65, 0xa2, 0x45, 0xd4, + 0xaf, 0xe7, 0x62, 0xfd, 0x7b, 0x88, 0x46, 0xc1, 0x8e, 0xfa, 0x54, 0xfd, 0x83, 0x02, 0x0c, 0x2f, + 0xd9, 0x8e, 0x27, 0x42, 0xb8, 0x1c, 0xed, 0x55, 0x5a, 0xda, 0x4b, 0x16, 0x77, 0xb1, 0x97, 0xbc, + 0x08, 0x45, 0xc9, 0x85, 0x9b, 0xdf, 0x1b, 0x19, 0x86, 0xa3, 0x21, 0xf4, 0x03, 0x7e, 0x92, 0x92, + 0xbc, 0x24, 0x1e, 0xd8, 0xb7, 0x2b, 0xc6, 0x0f, 0xe6, 0x01, 0x3e, 0xfd, 0xe2, 0x8b, 0x8f, 0x71, + 0x97, 0xaa, 0x7f, 0x39, 0x07, 0x27, 0xc4, 0xd5, 0xab, 0x14, 0x2d, 0x6e, 0xc0, 0xbf, 0x34, 0x97, + 0x67, 0x12, 0x0e, 0xd2, 0x7c, 0x1c, 0x5b, 0xd4, 0xa7, 0x1f, 0x99, 0x1e, 0xde, 0x3e, 0x49, 0xe1, + 0xe2, 0xa8, 0x80, 0xc9, 0x8b, 0xba, 0x4f, 0x47, 0x5e, 0xf0, 0x2f, 0x95, 0x0b, 0xa1, 0x25, 0xc3, + 0x0a, 0x4c, 0xa7, 0x5e, 0x2c, 0xab, 0xbf, 0x5c, 0x84, 0xe2, 0xf4, 0x23, 0xda, 0x3c, 0xe2, 0x5d, + 0x23, 0x1d, 0x55, 0x17, 0xf7, 0x79, 0x54, 0xbd, 0x17, 0x2f, 0x99, 0xb7, 0xc3, 0xfe, 0x2c, 0x45, + 0xab, 0x8f, 0xf5, 0x7c, 0xbc, 0x7a, 0xbf, 0xa7, 0x8f, 0x9e, 0x93, 0xd5, 0x3f, 0x28, 0x40, 0xa1, + 0x3e, 0xb5, 0x74, 0xac, 0x37, 0x87, 0xaa, 0x37, 0xbd, 0xbd, 0x10, 0xd4, 0xe0, 0x62, 0x71, 0x30, + 0xf4, 0xfb, 0x8d, 0xdd, 0x21, 0xfe, 0x71, 0x01, 0xc6, 0xea, 0x33, 0xcb, 0x4b, 0xd2, 0xd9, 0xfe, + 0x6d, 0xee, 0x9b, 0x89, 0x5e, 0x82, 0xbc, 0x4b, 0x2f, 0x26, 0xcc, 0xaa, 0x3b, 0x35, 0xcb, 0x7b, + 0xe5, 0xc6, 0x5d, 0xbd, 0xd5, 0xa5, 0x78, 0x98, 0xc6, 0x3d, 0xb9, 0x5d, 0xf3, 0x7d, 0xfa, 0x35, + 0x0c, 0x1d, 0xe1, 0x33, 0x20, 0x6f, 0x40, 0xe1, 0x8e, 0xf0, 0xb1, 0xc9, 0xe2, 0xf3, 0xd2, 0x75, + 0xce, 0x87, 0x4d, 0x82, 0x85, 0xae, 0x69, 0x20, 0x07, 0x56, 0x8a, 0x15, 0xbe, 0x29, 0x4c, 0x86, + 0x1d, 0x15, 0x5e, 0xf5, 0x0b, 0xdf, 0xac, 0x55, 0x49, 0x1d, 0x86, 0x97, 0xa8, 0xd3, 0x36, 0xb1, + 0xa3, 0xfc, 0x39, 0xbb, 0x37, 0x13, 0xb6, 0xf7, 0x1c, 0xee, 0x84, 0x85, 0x90, 0x99, 0xcc, 0x85, + 0xbc, 0x0b, 0xc0, 0xad, 0xaa, 0x1d, 0x46, 0x20, 0xbd, 0x84, 0x3b, 0x39, 0xbe, 0x59, 0x48, 0xb1, + 0xda, 0x25, 0x66, 0xe4, 0x01, 0x8c, 0xcf, 0xdb, 0x86, 0x79, 0xdf, 0xe4, 0xce, 0xb4, 0x58, 0x41, + 0x69, 0x7b, 0x17, 0x36, 0xb6, 0x39, 0x68, 0x4b, 0xe5, 0xd2, 0xaa, 0x49, 0x30, 0x56, 0xff, 0x6e, + 0x3f, 0x14, 0x59, 0xb7, 0x1f, 0x8f, 0xdf, 0xfd, 0x8c, 0xdf, 0x0a, 0x8c, 0xdf, 0xb3, 0x9d, 0x07, + 0xa6, 0xb5, 0x1a, 0xbc, 0x73, 0x10, 0xa7, 0x0d, 0xe8, 0x9b, 0xb5, 0xce, 0x71, 0x8d, 0xe0, 0x49, + 0x84, 0x96, 0x20, 0xdf, 0x66, 0x04, 0xbf, 0x06, 0xc0, 0xa3, 0x17, 0x20, 0xcd, 0x60, 0x18, 0xee, + 0x84, 0xc7, 0x36, 0xc0, 0xa7, 0x13, 0x72, 0xb8, 0x93, 0x90, 0x98, 0x5c, 0xf5, 0xbd, 0x5b, 0x86, + 0xf0, 0x25, 0x05, 0x1e, 0xab, 0xa0, 0x77, 0x8b, 0x6c, 0x04, 0x70, 0x3f, 0x97, 0x25, 0x00, 0xe9, + 0xc6, 0x10, 0x62, 0x82, 0x88, 0x4c, 0x0e, 0x22, 0xc0, 0x60, 0xca, 0x85, 0xa1, 0x26, 0xf1, 0x20, + 0xaf, 0xc4, 0x5c, 0x1a, 0x48, 0x84, 0x5b, 0xa6, 0x47, 0x43, 0xe8, 0x12, 0x37, 0xb2, 0x9d, 0x4b, + 0x9c, 0xfa, 0xb7, 0x0a, 0x30, 0xcc, 0xb8, 0xd5, 0xbb, 0xed, 0xb6, 0xee, 0x6c, 0x1c, 0x2b, 0xf2, + 0x7e, 0x14, 0xb9, 0x01, 0x27, 0xe5, 0x27, 0x10, 0xcc, 0x74, 0xf5, 0x83, 0x55, 0x05, 0x5b, 0xf8, + 0x38, 0x01, 0xb7, 0x2d, 0x71, 0xde, 0xf7, 0x04, 0x18, 0x4f, 0x8b, 0x5c, 0x2d, 0xc9, 0x4b, 0xfd, + 0x89, 0x1c, 0x8c, 0xc7, 0xa1, 0x81, 0xee, 0xe7, 0x52, 0x75, 0xff, 0x79, 0x18, 0x12, 0x4e, 0x11, + 0xba, 0x21, 0x7c, 0x34, 0xc7, 0xb6, 0x36, 0xcb, 0x80, 0x2f, 0xd2, 0x1b, 0x0e, 0xd5, 0x0d, 0x2d, + 0x24, 0x20, 0x2f, 0xc3, 0x08, 0xfe, 0xb8, 0xe7, 0x98, 0x9e, 0x47, 0x79, 0x67, 0x14, 0xf9, 0x3d, + 0x0f, 0x2f, 0xb0, 0xce, 0x11, 0x5a, 0x84, 0x4c, 0xfd, 0x9d, 0x3c, 0x0c, 0xd5, 0xbb, 0x2b, 0xee, + 0x86, 0xeb, 0xd1, 0xf6, 0x11, 0xd7, 0x21, 0xff, 0x58, 0xa1, 0x98, 0x7a, 0xac, 0xf0, 0x8c, 0x3f, + 0xb4, 0xa4, 0xfb, 0x88, 0x60, 0x63, 0xe0, 0xfb, 0x99, 0x86, 0x5a, 0x54, 0xda, 0xbd, 0x16, 0xa9, + 0x7f, 0x27, 0x0f, 0xe3, 0xfc, 0x3a, 0xbe, 0x6a, 0xba, 0xcd, 0x03, 0x78, 0x22, 0x74, 0xf8, 0x32, + 0xdd, 0x9f, 0x0b, 0xcb, 0x0e, 0x1e, 0x5e, 0xa9, 0x5f, 0xc8, 0xc3, 0x70, 0xa5, 0xeb, 0xad, 0x55, + 0x3c, 0x9c, 0xdf, 0x1e, 0xcb, 0x3d, 0xf2, 0x6f, 0xe7, 0xe0, 0x04, 0x6b, 0xc8, 0xb2, 0xfd, 0x80, + 0x5a, 0x07, 0x70, 0x9d, 0x71, 0x10, 0x07, 0x91, 0xbe, 0x2c, 0x0b, 0xbb, 0x93, 0x25, 0x5e, 0xc2, + 0x69, 0x76, 0x8b, 0x1e, 0xed, 0xcf, 0x38, 0xc0, 0x4b, 0x38, 0x5f, 0x20, 0x07, 0x70, 0xe9, 0xfb, + 0xbd, 0x25, 0x90, 0x03, 0x38, 0x91, 0xfd, 0xde, 0x10, 0xc8, 0xb7, 0x72, 0x30, 0x34, 0x69, 0x7b, + 0x47, 0x7c, 0xe0, 0x8b, 0xaf, 0x38, 0xda, 0x6a, 0xee, 0x7f, 0xc5, 0xd1, 0xd6, 0x4d, 0xf5, 0xa7, + 0xf2, 0x70, 0x5a, 0x64, 0x38, 0x10, 0x67, 0x60, 0xc7, 0xd3, 0xb1, 0x18, 0x6c, 0x49, 0xd1, 0x1c, + 0xcf, 0x43, 0x42, 0x34, 0x3f, 0x5b, 0x80, 0xd3, 0x18, 0x90, 0x99, 0xed, 0xa8, 0xbe, 0x07, 0x6c, + 0x11, 0xd2, 0x8c, 0xba, 0x56, 0xcc, 0xa7, 0xb8, 0x56, 0xfc, 0xeb, 0xcd, 0xf2, 0x2b, 0xab, 0xa6, + 0xb7, 0xd6, 0x5d, 0x99, 0x68, 0xda, 0xed, 0x6b, 0xab, 0x8e, 0xfe, 0xd0, 0xe4, 0x4e, 0x05, 0x7a, + 0xeb, 0x5a, 0x98, 0x78, 0xa8, 0x63, 0x8a, 0x34, 0x42, 0x75, 0xdc, 0x29, 0x31, 0xae, 0xbe, 0x53, + 0x86, 0x0b, 0x70, 0xcb, 0x36, 0x2d, 0xe1, 0xa9, 0xcc, 0x0d, 0xdd, 0xfa, 0xd6, 0x66, 0xf9, 0xcc, + 0x7b, 0xb6, 0x69, 0x35, 0xe2, 0xee, 0xca, 0xbb, 0xad, 0x2f, 0x64, 0xad, 0x49, 0xd5, 0xa8, 0xff, + 0x6d, 0x0e, 0xce, 0x47, 0xb5, 0xf8, 0x7b, 0xc1, 0x76, 0xfc, 0x4b, 0x79, 0x38, 0x73, 0x13, 0x85, + 0x13, 0xb8, 0x87, 0x1d, 0xcf, 0x5b, 0x62, 0x70, 0xa6, 0xc8, 0xe6, 0xd8, 0xa2, 0xcc, 0x96, 0xcd, + 0xf1, 0xa4, 0x2e, 0x64, 0xf3, 0x8f, 0x73, 0x70, 0x6a, 0xb1, 0x56, 0x9d, 0xfa, 0x1e, 0x19, 0x51, + 0xc9, 0xef, 0x39, 0xe2, 0x06, 0x67, 0xe2, 0x7b, 0x8e, 0xb8, 0xe9, 0xf9, 0x95, 0x3c, 0x9c, 0xaa, + 0x57, 0xe6, 0xe7, 0xbe, 0x57, 0x66, 0xf0, 0x29, 0xd9, 0x97, 0xd9, 0x3f, 0x04, 0x13, 0xb6, 0x80, + 0xfc, 0x99, 0x77, 0xaf, 0x67, 0xfb, 0x38, 0x27, 0x85, 0x72, 0xc4, 0xa7, 0xee, 0x03, 0x11, 0x0a, + 0xd3, 0xfc, 0x08, 0xf5, 0x11, 0xd7, 0xfc, 0xbf, 0x5f, 0x82, 0xe1, 0xdb, 0xdd, 0x15, 0x2a, 0x5c, + 0xba, 0x1e, 0xeb, 0x93, 0xdf, 0xeb, 0x30, 0x2c, 0xc4, 0x80, 0x37, 0x1c, 0x52, 0x48, 0x4e, 0x11, + 0x62, 0x89, 0x47, 0x3d, 0x93, 0x89, 0xc8, 0x45, 0x28, 0xde, 0xa5, 0xce, 0x8a, 0xfc, 0x5a, 0xfd, + 0x21, 0x75, 0x56, 0x34, 0x84, 0x92, 0xb9, 0xf0, 0x21, 0x4e, 0x65, 0xa9, 0x86, 0xe9, 0xa0, 0xc4, + 0xa5, 0x21, 0xe6, 0xb7, 0x0a, 0xbc, 0x69, 0xf5, 0x8e, 0xc9, 0x13, 0x49, 0xc9, 0x91, 0x32, 0xe2, + 0x25, 0xc9, 0x02, 0x9c, 0x94, 0xdd, 0x05, 0x79, 0x2e, 0xa4, 0xc1, 0x14, 0x76, 0x69, 0x59, 0x90, + 0x92, 0x45, 0xc9, 0xdb, 0x30, 0xe2, 0x03, 0xd1, 0xf1, 0x71, 0x28, 0x4c, 0xc0, 0x11, 0xb0, 0x8a, + 0xe5, 0x4b, 0x88, 0x14, 0x90, 0x19, 0xe0, 0x25, 0x06, 0xa4, 0x30, 0x88, 0x39, 0xda, 0x46, 0x0a, + 0x90, 0x97, 0x91, 0x01, 0x3e, 0x1e, 0x43, 0x87, 0xa9, 0x61, 0x7c, 0xca, 0x8d, 0x17, 0x40, 0x8e, + 0x80, 0xf3, 0x07, 0xfb, 0x11, 0x32, 0xb2, 0x08, 0x10, 0x3a, 0xb6, 0x88, 0xb0, 0x28, 0xbb, 0x76, + 0xb9, 0x91, 0x58, 0xc8, 0x37, 0x79, 0xa3, 0x7b, 0xb9, 0xc9, 0x53, 0x7f, 0xb2, 0x00, 0xc3, 0x95, + 0x4e, 0x27, 0x18, 0x0a, 0x2f, 0x40, 0xa9, 0xd2, 0xe9, 0xdc, 0xd1, 0x6a, 0x72, 0x82, 0x04, 0xbd, + 0xd3, 0x69, 0x74, 0x1d, 0x53, 0xf6, 0x34, 0xe7, 0x44, 0x64, 0x0a, 0x46, 0x2b, 0x9d, 0xce, 0x52, + 0x77, 0xa5, 0x65, 0x36, 0xa5, 0xfc, 0x6e, 0x3c, 0x03, 0x66, 0xa7, 0xd3, 0xe8, 0x20, 0x26, 0x9e, + 0xe4, 0x2f, 0x5a, 0x86, 0x7c, 0x1e, 0x83, 0x89, 0x89, 0xf4, 0x62, 0x3c, 0x81, 0x91, 0x1a, 0xa4, + 0x46, 0x08, 0xdb, 0x36, 0x11, 0x10, 0xf1, 0x14, 0x12, 0x17, 0xfd, 0xc4, 0x1f, 0xac, 0xa2, 0x44, + 0x1a, 0xb1, 0x90, 0x25, 0xf9, 0x38, 0x0c, 0x54, 0x3a, 0x1d, 0xe9, 0xb6, 0x0a, 0x1d, 0xdb, 0x58, + 0xa9, 0x78, 0x06, 0x47, 0x41, 0x26, 0x3e, 0x4b, 0xdc, 0x6f, 0xdb, 0x8e, 0x87, 0x43, 0x6a, 0x34, + 0xfc, 0x2c, 0xff, 0x42, 0xdc, 0x96, 0xe3, 0xf7, 0x68, 0xd1, 0x32, 0x17, 0xde, 0x84, 0xb1, 0x68, + 0x8b, 0x77, 0x95, 0xc7, 0xe2, 0xbb, 0x39, 0x94, 0xca, 0x11, 0x7f, 0x6e, 0xf1, 0x12, 0x14, 0x2a, + 0x9d, 0x8e, 0x98, 0xd4, 0x4e, 0xa5, 0x74, 0x6a, 0x3c, 0x3a, 0x43, 0xa5, 0xd3, 0xf1, 0x3f, 0xfd, + 0x88, 0xbf, 0xdb, 0xda, 0xd3, 0xa7, 0x7f, 0x8b, 0x7f, 0xfa, 0xd1, 0x7e, 0x53, 0xa5, 0xfe, 0x72, + 0x01, 0x4e, 0x54, 0x3a, 0x9d, 0xe3, 0xfc, 0x17, 0x07, 0x15, 0x03, 0xe2, 0x45, 0x00, 0x69, 0x8e, + 0x1d, 0x08, 0x5e, 0x95, 0x0e, 0x4b, 0xf3, 0xab, 0x92, 0xd3, 0x24, 0x22, 0x5f, 0xfd, 0x06, 0x77, + 0xa5, 0x7e, 0x5f, 0x28, 0xe0, 0xc4, 0x77, 0xd4, 0xe3, 0xd9, 0x7d, 0x58, 0xba, 0x4d, 0xf4, 0x41, + 0x69, 0x57, 0x7d, 0xf0, 0x5b, 0x91, 0xc1, 0x83, 0xf9, 0x14, 0x8e, 0x7b, 0xa1, 0x7f, 0x5f, 0xb6, + 0xf5, 0x98, 0x2c, 0x4c, 0x11, 0x64, 0xcb, 0xcf, 0x29, 0x27, 0x42, 0xbe, 0x35, 0x19, 0xaa, 0x61, + 0x1a, 0x5a, 0x8c, 0xd6, 0xef, 0xc3, 0x81, 0x5d, 0xf5, 0xe1, 0x66, 0x1e, 0xc3, 0x3a, 0x04, 0x21, + 0xe3, 0xf6, 0xbf, 0x45, 0xb9, 0x06, 0xc0, 0xdd, 0x17, 0x02, 0xff, 0xfc, 0x51, 0x1e, 0x1d, 0x8a, + 0xa7, 0x9a, 0x13, 0xd1, 0xa1, 0x42, 0x92, 0xc0, 0xdd, 0xa9, 0x90, 0xea, 0xee, 0x74, 0x15, 0x06, + 0x35, 0x7d, 0xfd, 0x9d, 0x2e, 0x15, 0x8f, 0x99, 0xfc, 0x88, 0xac, 0xfa, 0x7a, 0xe3, 0x07, 0x18, + 0x50, 0x0b, 0xd0, 0x44, 0x0d, 0xe2, 0x82, 0x48, 0x6e, 0x25, 0xfc, 0xa0, 0x3d, 0x88, 0x06, 0xb2, + 0x17, 0x45, 0x27, 0xaf, 0x43, 0xa1, 0x72, 0xaf, 0x2e, 0x24, 0x1b, 0x74, 0x6d, 0xe5, 0x5e, 0x5d, + 0xc8, 0x2b, 0xb3, 0xec, 0xbd, 0xba, 0xfa, 0x85, 0x3c, 0x90, 0x24, 0x25, 0x79, 0x05, 0x86, 0x10, + 0xba, 0xca, 0x74, 0x46, 0xce, 0x51, 0xbc, 0xee, 0x36, 0x1c, 0x84, 0x46, 0x2c, 0x44, 0x9f, 0x94, + 0xbc, 0x86, 0x59, 0xe0, 0x45, 0x96, 0xcc, 0x48, 0x8e, 0xe2, 0x75, 0xd7, 0xcf, 0x9b, 0x1e, 0x4b, + 0x02, 0x2f, 0x88, 0xd1, 0xb8, 0xbc, 0x57, 0x9f, 0xb5, 0x5d, 0x4f, 0x88, 0x9a, 0x1b, 0x97, 0xeb, + 0x2e, 0x26, 0xc7, 0x8e, 0x18, 0x97, 0x9c, 0x0c, 0x13, 0xfc, 0xdd, 0xab, 0xf3, 0x17, 0x74, 0x86, + 0x66, 0xb7, 0x7c, 0xab, 0x94, 0x27, 0xf8, 0x5b, 0x77, 0x1b, 0xfc, 0xf5, 0x9d, 0x81, 0xe9, 0xe7, + 0x23, 0x09, 0xfe, 0x22, 0xa5, 0xd4, 0x1f, 0x1b, 0x84, 0xf1, 0xaa, 0xee, 0xe9, 0x2b, 0xba, 0x4b, + 0xa5, 0x2d, 0xf9, 0x09, 0x1f, 0xe6, 0x7f, 0x8e, 0x24, 0x07, 0x63, 0x25, 0xe5, 0x6b, 0xe2, 0x05, + 0xc8, 0x1b, 0x21, 0xdf, 0x20, 0xfd, 0xb2, 0x9c, 0xcf, 0x71, 0xa5, 0xd1, 0x11, 0x60, 0x2d, 0x41, + 0x48, 0x9e, 0x87, 0x61, 0x1f, 0xc6, 0x76, 0x11, 0x85, 0x50, 0x67, 0x8c, 0x15, 0xb6, 0x89, 0xd0, + 0x64, 0x34, 0x79, 0x0d, 0x46, 0xfc, 0x9f, 0x92, 0x7d, 0xce, 0x93, 0x53, 0xae, 0x24, 0xb6, 0x60, + 0x32, 0xa9, 0x5c, 0x14, 0xe7, 0xb7, 0xfe, 0x48, 0xd1, 0x58, 0xfe, 0xc7, 0x08, 0x29, 0xf9, 0x01, + 0x18, 0xf3, 0x7f, 0x8b, 0x5d, 0x07, 0xf7, 0x3e, 0x7c, 0x3e, 0xc8, 0x6e, 0x1f, 0x13, 0xeb, 0x44, + 0x94, 0x9c, 0xef, 0x3f, 0x9e, 0xf0, 0x53, 0x1a, 0x1a, 0x2b, 0xc9, 0xed, 0x47, 0xac, 0x02, 0x52, + 0x83, 0x93, 0x3e, 0x24, 0xd4, 0xd0, 0x81, 0x70, 0xdb, 0x69, 0xac, 0x34, 0x52, 0x95, 0x34, 0x59, + 0x8a, 0xb4, 0xe0, 0x62, 0x04, 0x68, 0xb8, 0x6b, 0xe6, 0x7d, 0x4f, 0xec, 0x19, 0x45, 0x78, 0x74, + 0x91, 0xc3, 0x36, 0xe0, 0xca, 0x69, 0xfc, 0x64, 0xd4, 0xd1, 0xc4, 0x75, 0x3d, 0xb9, 0x91, 0x3a, + 0x9c, 0xf6, 0xf1, 0x37, 0xa7, 0x96, 0x96, 0x1c, 0xfb, 0x3d, 0xda, 0xf4, 0x6a, 0x55, 0xb1, 0xe7, + 0xc6, 0xb0, 0x99, 0xc6, 0x4a, 0x63, 0xb5, 0xd9, 0x61, 0x4a, 0xc1, 0x70, 0x51, 0xe6, 0xa9, 0x85, + 0xc9, 0x5d, 0x38, 0x23, 0xc1, 0xa5, 0x4c, 0xf9, 0x10, 0x1e, 0x0a, 0x08, 0xae, 0xe9, 0xc9, 0xf2, + 0xd3, 0x8b, 0x93, 0x37, 0x61, 0xd4, 0x47, 0xf0, 0xab, 0xc8, 0x61, 0xbc, 0x8a, 0xc4, 0x21, 0x69, + 0xac, 0x34, 0xe2, 0x0f, 0xbd, 0xa3, 0xc4, 0xb2, 0x46, 0x2d, 0x6f, 0x74, 0xa8, 0x70, 0x0b, 0xf6, + 0x35, 0xca, 0xdb, 0xe8, 0xa4, 0x2a, 0x23, 0x23, 0x25, 0x6f, 0x87, 0x1a, 0xb5, 0xe8, 0x98, 0xab, + 0x26, 0xdf, 0x8e, 0xfb, 0x6f, 0xbb, 0x57, 0x1a, 0x36, 0x02, 0xd3, 0xf4, 0x83, 0x93, 0x5f, 0xa8, + 0xc0, 0xa9, 0x14, 0x1d, 0xdb, 0xd5, 0x8e, 0xf1, 0x8b, 0xf9, 0xb0, 0x11, 0x47, 0x7c, 0xdb, 0x38, + 0x09, 0x83, 0xfe, 0x97, 0x08, 0xe3, 0x41, 0xc9, 0x1a, 0x9a, 0x71, 0x1e, 0x3e, 0x3e, 0x22, 0x8e, + 0x23, 0xbe, 0x95, 0x3c, 0x08, 0x71, 0x7c, 0x3b, 0x17, 0x8a, 0xe3, 0x88, 0x6f, 0x2f, 0x7f, 0xbb, + 0x18, 0xce, 0x49, 0xc7, 0x7b, 0xcc, 0x83, 0x32, 0x93, 0x43, 0x67, 0xda, 0xd2, 0x2e, 0xde, 0x10, + 0xcb, 0xaa, 0x39, 0xb0, 0x37, 0xd5, 0x24, 0x6f, 0xc2, 0xf0, 0x92, 0xed, 0x7a, 0xab, 0x0e, 0x75, + 0x97, 0x82, 0xf4, 0x1e, 0xf8, 0xfe, 0xbc, 0x23, 0xc0, 0x8d, 0x4e, 0x64, 0xf6, 0x97, 0xc9, 0xa5, + 0x48, 0x6e, 0x43, 0xbb, 0x8f, 0xe4, 0xa6, 0xfe, 0xd3, 0x42, 0x42, 0x97, 0xb8, 0xd9, 0x7b, 0x24, + 0x75, 0xe9, 0x00, 0x26, 0x0a, 0x72, 0x3d, 0x5c, 0x43, 0xf9, 0xfe, 0xa0, 0x5f, 0x8a, 0x7c, 0xba, + 0x22, 0xb6, 0x07, 0x51, 0x12, 0xf2, 0x59, 0x38, 0x17, 0x01, 0x2c, 0xe9, 0x8e, 0xde, 0xa6, 0x5e, + 0x98, 0x88, 0x15, 0x63, 0xd9, 0xf9, 0xa5, 0x1b, 0x9d, 0x00, 0x2d, 0x27, 0x77, 0xcd, 0xe0, 0x20, + 0x29, 0xe6, 0xc0, 0x2e, 0xbc, 0xbc, 0xbf, 0x5a, 0x08, 0xcd, 0xa4, 0x68, 0x4c, 0x6a, 0x8d, 0xba, + 0xdd, 0x96, 0xf7, 0xf8, 0x76, 0xf0, 0xde, 0x32, 0xfe, 0xcc, 0xc2, 0x89, 0xca, 0xfd, 0xfb, 0xb4, + 0xe9, 0xf9, 0xa1, 0xf6, 0x5d, 0x11, 0x85, 0x94, 0x6f, 0x5b, 0x04, 0x4a, 0x84, 0x4e, 0x97, 0xfb, + 0x35, 0x5e, 0x4c, 0xfd, 0x67, 0x45, 0x50, 0x82, 0x6d, 0x43, 0xf0, 0xda, 0xf1, 0x10, 0x97, 0xe8, + 0x0f, 0x45, 0xaf, 0x98, 0x70, 0x32, 0x14, 0x86, 0x78, 0x66, 0xa6, 0xf4, 0xe3, 0xb6, 0xa4, 0x1c, + 0x67, 0x16, 0x12, 0xf2, 0x9d, 0xc8, 0x05, 0xb1, 0x13, 0x21, 0xe1, 0x6b, 0xd2, 0x86, 0xcb, 0x59, + 0x68, 0x49, 0xae, 0xe4, 0x4b, 0x39, 0x38, 0xed, 0x77, 0xca, 0xe2, 0x0a, 0x33, 0xc9, 0xa7, 0xec, + 0xae, 0x15, 0xbc, 0xc1, 0x7a, 0x3d, 0xbb, 0x3a, 0xde, 0x49, 0x13, 0x69, 0x85, 0x79, 0x4b, 0x82, + 0x78, 0x3b, 0x81, 0x42, 0xd8, 0x48, 0xd3, 0x68, 0x22, 0x91, 0x96, 0x5a, 0xef, 0x85, 0x9b, 0x70, + 0x3e, 0x93, 0xe5, 0x76, 0x26, 0x70, 0xbf, 0x6c, 0x02, 0xff, 0xf7, 0xb9, 0x70, 0x22, 0x8a, 0x09, + 0x89, 0x4c, 0x00, 0x84, 0x20, 0xb1, 0x29, 0xc6, 0x27, 0x5e, 0xa1, 0xd0, 0x34, 0x89, 0x82, 0x2c, + 0x42, 0x49, 0x88, 0x85, 0x27, 0x3d, 0xff, 0xd8, 0x36, 0xbd, 0x30, 0x21, 0xcb, 0x01, 0x37, 0xbc, + 0xe2, 0x9b, 0x05, 0x9b, 0x0b, 0xaf, 0xc1, 0xf0, 0x5e, 0xbf, 0xeb, 0x4b, 0x05, 0x20, 0xf2, 0x0e, + 0xf6, 0x10, 0xcd, 0xfb, 0x23, 0x3c, 0x85, 0x5d, 0x81, 0x41, 0xf6, 0x09, 0x98, 0x06, 0x48, 0x0a, + 0xfb, 0xdd, 0x15, 0x30, 0x2d, 0xc0, 0x86, 0x31, 0xf7, 0x06, 0xd2, 0x63, 0xee, 0xa9, 0x3f, 0x51, + 0x80, 0xb3, 0x72, 0x87, 0x54, 0x29, 0x66, 0x12, 0x39, 0xee, 0x94, 0x0f, 0xb0, 0x53, 0x54, 0x28, + 0xf1, 0x8d, 0x8b, 0x48, 0xe9, 0xc2, 0x0f, 0x95, 0x10, 0xa2, 0x09, 0x8c, 0xfa, 0xbf, 0xe6, 0x61, + 0x34, 0x30, 0x0e, 0x75, 0xc7, 0x7d, 0x8c, 0xbb, 0xe3, 0x13, 0x30, 0x8a, 0x51, 0xd3, 0xda, 0xd4, + 0xe2, 0x91, 0xc5, 0xfa, 0xa5, 0x1c, 0x4c, 0x3e, 0x42, 0xa4, 0xdb, 0x8b, 0x10, 0x32, 0xed, 0xe7, + 0x96, 0x9f, 0x14, 0xcb, 0x8e, 0x9b, 0x7d, 0x1c, 0xae, 0xfe, 0xb5, 0x02, 0x8c, 0xf8, 0x52, 0x9e, + 0x34, 0x8f, 0xea, 0x2d, 0xd1, 0xe1, 0x0a, 0xf9, 0x1a, 0xc0, 0x92, 0xed, 0x78, 0x7a, 0x6b, 0x21, + 0xd4, 0x7c, 0x3c, 0x5e, 0xed, 0x20, 0x94, 0x97, 0x91, 0x48, 0x70, 0xfd, 0x0a, 0xcd, 0x6a, 0x3e, + 0x31, 0xf1, 0xf5, 0x2b, 0x80, 0x6a, 0x12, 0x85, 0xfa, 0xeb, 0x79, 0x38, 0xe1, 0x77, 0xd2, 0xf4, + 0x23, 0xda, 0xec, 0x3e, 0xce, 0x73, 0x53, 0x54, 0xda, 0xfd, 0xdb, 0x4a, 0x5b, 0xfd, 0xbf, 0xa5, + 0x89, 0x64, 0xaa, 0x65, 0x1f, 0x4f, 0x24, 0x7f, 0x12, 0x3a, 0xae, 0xfe, 0x50, 0x01, 0x4e, 0xfb, + 0x52, 0x9f, 0xe9, 0x5a, 0x78, 0x30, 0x31, 0xa5, 0xb7, 0x5a, 0x8f, 0xf3, 0x6e, 0x7c, 0xd8, 0x17, + 0xc4, 0xa2, 0x08, 0x43, 0x2a, 0x52, 0x9f, 0xde, 0x17, 0xe0, 0x86, 0x6d, 0x1a, 0x9a, 0x4c, 0x44, + 0xde, 0x86, 0x11, 0xff, 0x67, 0xc5, 0x59, 0xf5, 0xb7, 0xe0, 0x78, 0xcd, 0x10, 0x14, 0xd2, 0x9d, + 0x48, 0x6c, 0x8e, 0x48, 0x01, 0xf5, 0x0b, 0x03, 0x70, 0xe1, 0x9e, 0x69, 0x19, 0xf6, 0xba, 0xeb, + 0x67, 0xce, 0x3d, 0xf2, 0xc7, 0x6c, 0x87, 0x9d, 0x31, 0xf7, 0x1d, 0x38, 0x13, 0x17, 0xa9, 0x13, + 0xe4, 0x33, 0x10, 0xbd, 0xb3, 0xce, 0x09, 0x1a, 0x7e, 0x0e, 0x5d, 0x71, 0x57, 0xa7, 0xa5, 0x97, + 0x8c, 0x27, 0xe1, 0x1d, 0xd8, 0x49, 0x12, 0xde, 0xe7, 0xa0, 0x54, 0xb5, 0xdb, 0xba, 0xe9, 0x47, + 0x69, 0xc2, 0x51, 0x1c, 0xd4, 0x8b, 0x18, 0x4d, 0x50, 0x30, 0xfe, 0xa2, 0x62, 0xec, 0xb2, 0xa1, + 0x90, 0xbf, 0x5f, 0x80, 0x59, 0x69, 0x9a, 0x4c, 0x44, 0x6c, 0x18, 0x15, 0xd5, 0x89, 0x9b, 0x35, + 0xc0, 0xcd, 0xd3, 0xcb, 0xbe, 0x8c, 0xb2, 0xd5, 0x6a, 0x22, 0x52, 0x8e, 0x6f, 0xa3, 0x78, 0x6e, + 0x60, 0xf1, 0x31, 0xfc, 0x8e, 0x4d, 0x8b, 0xf2, 0x97, 0x84, 0x80, 0x93, 0xcc, 0x70, 0x52, 0x08, + 0x38, 0xcb, 0xc8, 0x44, 0x64, 0x1a, 0x4e, 0x62, 0xd4, 0xf9, 0x60, 0x2b, 0xc5, 0x54, 0x62, 0x04, + 0x8d, 0x4a, 0xbc, 0xb0, 0xe1, 0x81, 0xea, 0xd9, 0xc7, 0x35, 0x9a, 0x02, 0xad, 0x25, 0x4b, 0x90, + 0xf3, 0x50, 0x58, 0x98, 0xab, 0xe0, 0x4d, 0xcf, 0x20, 0xcf, 0xf8, 0x66, 0xb5, 0x74, 0x8d, 0xc1, + 0x2e, 0x7c, 0x0a, 0x48, 0xf2, 0x73, 0x76, 0x75, 0x9b, 0xf3, 0x0f, 0xa5, 0x2d, 0xdf, 0x51, 0xf7, + 0xc7, 0x39, 0x88, 0x89, 0x30, 0x92, 0x6c, 0xb1, 0xff, 0x83, 0x4c, 0xb6, 0x58, 0x3a, 0xd0, 0x64, + 0x8b, 0xea, 0x2f, 0xe4, 0xe0, 0x64, 0x22, 0x33, 0x03, 0x79, 0x09, 0x80, 0x43, 0xa4, 0x08, 0xaf, + 0x18, 0x80, 0x28, 0xcc, 0xd6, 0x20, 0x96, 0xc7, 0x90, 0x8c, 0x5c, 0x83, 0x41, 0xfe, 0x4b, 0xc4, + 0x38, 0x4b, 0x16, 0xe9, 0x76, 0x4d, 0x43, 0x0b, 0x88, 0xc2, 0x5a, 0xf0, 0x3e, 0xb3, 0x90, 0x5a, + 0xc4, 0xdb, 0xe8, 0x04, 0xb5, 0x30, 0x32, 0xf5, 0xc7, 0xf2, 0x30, 0x12, 0x34, 0xb8, 0x62, 0x1c, + 0x96, 0xce, 0x95, 0x44, 0x92, 0x8b, 0xc2, 0x76, 0x49, 0x2e, 0x62, 0xf3, 0xad, 0xc8, 0x6a, 0x71, + 0x70, 0x6f, 0xba, 0xbe, 0x9c, 0x87, 0x13, 0x41, 0xad, 0x87, 0x78, 0x75, 0xf6, 0x21, 0x12, 0xc9, + 0x97, 0x72, 0xa0, 0x4c, 0x9a, 0xad, 0x96, 0x69, 0xad, 0xd6, 0xac, 0xfb, 0xb6, 0xd3, 0xc6, 0x09, + 0xf1, 0xf0, 0x8e, 0x70, 0xd5, 0x3f, 0x97, 0x83, 0x93, 0xa2, 0x41, 0x53, 0xba, 0x63, 0x1c, 0xde, + 0xf9, 0x58, 0xbc, 0x25, 0x87, 0xa7, 0x2f, 0xea, 0x37, 0xf2, 0x00, 0x73, 0x76, 0xf3, 0xc1, 0x11, + 0x7f, 0x12, 0xf6, 0x06, 0x94, 0xb8, 0x53, 0xbd, 0xd0, 0xd8, 0x93, 0xe2, 0xe9, 0x13, 0xfb, 0x34, + 0x8e, 0x98, 0x1c, 0x17, 0xf3, 0x71, 0x89, 0xfb, 0xe5, 0x2b, 0x39, 0x4d, 0x14, 0x61, 0x95, 0x32, + 0x3a, 0xb1, 0x60, 0x04, 0x95, 0x32, 0x58, 0xb4, 0xd2, 0xad, 0xcd, 0x72, 0xb1, 0x65, 0x37, 0x1f, + 0x68, 0x48, 0xaf, 0xfe, 0x9b, 0x1c, 0x97, 0xdd, 0x11, 0x7f, 0xd8, 0xea, 0x7f, 0x7e, 0x71, 0x97, + 0x9f, 0xff, 0xe7, 0x73, 0x70, 0x5a, 0xa3, 0x4d, 0xfb, 0x21, 0x75, 0x36, 0xa6, 0x6c, 0x83, 0xde, + 0xa4, 0x16, 0x75, 0x0e, 0x6b, 0x44, 0xfd, 0x06, 0x66, 0x05, 0x0a, 0x1b, 0x73, 0xc7, 0xa5, 0xc6, + 0xd1, 0xc9, 0xd8, 0xa4, 0xfe, 0xd2, 0x00, 0x28, 0xa9, 0x56, 0xef, 0x91, 0x35, 0xe7, 0x32, 0xb7, + 0x32, 0xc5, 0x83, 0xda, 0xca, 0xf4, 0xef, 0x6e, 0x2b, 0x53, 0xda, 0xed, 0x56, 0x66, 0x60, 0x27, + 0x5b, 0x99, 0x76, 0x7c, 0x2b, 0x33, 0x88, 0x5b, 0x99, 0x97, 0x7a, 0x6e, 0x65, 0xa6, 0x2d, 0x63, + 0x8f, 0x1b, 0x99, 0x23, 0x9b, 0x4d, 0x7c, 0x2f, 0x3b, 0xb0, 0x2b, 0x6c, 0x52, 0x6c, 0xda, 0x8e, + 0x41, 0x0d, 0xb1, 0xf1, 0xc2, 0x53, 0x7f, 0x47, 0xc0, 0xb4, 0x00, 0x9b, 0x48, 0xcd, 0x3e, 0xba, + 0x93, 0xd4, 0xec, 0x07, 0xb0, 0xff, 0xfa, 0x62, 0x1e, 0x4e, 0x4e, 0x51, 0xc7, 0xe3, 0x91, 0x6c, + 0x0f, 0xc2, 0xa1, 0xae, 0x02, 0x27, 0x24, 0x86, 0x68, 0x91, 0xe7, 0x43, 0x27, 0xc1, 0x26, 0x75, + 0xbc, 0xb8, 0x8f, 0x61, 0x9c, 0x9e, 0x55, 0xef, 0xa7, 0x47, 0x14, 0x63, 0x37, 0xa8, 0xde, 0x87, + 0x73, 0x41, 0x9a, 0xe2, 0x97, 0x16, 0xd0, 0x4b, 0x7e, 0x32, 0xc5, 0x3d, 0xf8, 0xc9, 0xfc, 0x7c, + 0x0e, 0x2e, 0x6b, 0xd4, 0xa2, 0xeb, 0xfa, 0x4a, 0x8b, 0x4a, 0xcd, 0x12, 0x2b, 0x03, 0x9b, 0x35, + 0x4c, 0xb7, 0xad, 0x7b, 0xcd, 0xb5, 0x7d, 0xc9, 0x68, 0x06, 0x46, 0xe4, 0xf9, 0x6b, 0x17, 0x73, + 0x5b, 0xa4, 0x9c, 0xfa, 0x4b, 0x45, 0x18, 0x98, 0xb4, 0xbd, 0x5b, 0xf6, 0x3e, 0x53, 0x70, 0x86, + 0x53, 0x7e, 0x7e, 0x17, 0x67, 0x3d, 0x1f, 0xc7, 0xca, 0xa5, 0xac, 0x1b, 0xe8, 0x80, 0xba, 0x62, + 0x27, 0xb2, 0xb7, 0xf8, 0x64, 0xbb, 0x4c, 0xbe, 0xf9, 0x0a, 0x0c, 0x61, 0x00, 0x1a, 0xe9, 0x34, + 0x16, 0xdd, 0xbb, 0x3d, 0x06, 0x8c, 0xd7, 0x11, 0x92, 0x92, 0xcf, 0x46, 0x42, 0xef, 0x96, 0xf6, + 0x9f, 0xac, 0x53, 0x8e, 0xc2, 0xfb, 0x12, 0xbf, 0xc8, 0xc3, 0x36, 0x49, 0x89, 0x8d, 0xf0, 0x14, + 0x25, 0xd6, 0xa4, 0x80, 0xf0, 0x00, 0x13, 0x69, 0x4e, 0xc1, 0xe8, 0xa4, 0xed, 0x49, 0xae, 0xc4, + 0x43, 0xe1, 0x4b, 0x54, 0x26, 0xf9, 0x74, 0x3f, 0xe2, 0x68, 0x19, 0xf5, 0x8f, 0x8b, 0x30, 0xe2, + 0xff, 0x3c, 0x24, 0xdd, 0x79, 0x01, 0x4a, 0xb3, 0xb6, 0x94, 0xbb, 0x04, 0xdd, 0x8f, 0xd7, 0x6c, + 0x37, 0xe6, 0x57, 0x2d, 0x88, 0x98, 0xd4, 0x17, 0x6c, 0x43, 0x76, 0x9e, 0x47, 0xa9, 0x5b, 0xb6, + 0x91, 0x78, 0xc1, 0x1c, 0x10, 0x92, 0xcb, 0x50, 0xc4, 0x77, 0x07, 0xd2, 0x41, 0x7e, 0xec, 0xad, + 0x01, 0xe2, 0x25, 0xad, 0x2c, 0xed, 0x56, 0x2b, 0x07, 0xf6, 0xaa, 0x95, 0x83, 0x07, 0xab, 0x95, + 0xef, 0xc2, 0x08, 0xd6, 0xe4, 0xa7, 0x86, 0xdc, 0x7e, 0x61, 0x3d, 0x2f, 0xd6, 0xbe, 0x51, 0xde, + 0x6e, 0x91, 0x20, 0x12, 0x97, 0xbc, 0x08, 0xab, 0x98, 0xee, 0xc2, 0x3e, 0xb6, 0xd3, 0xff, 0x34, + 0x07, 0x03, 0x77, 0xac, 0x07, 0x96, 0xbd, 0xbe, 0x3f, 0x8d, 0x7b, 0x09, 0x86, 0x05, 0x1b, 0x69, + 0x75, 0xc1, 0x47, 0xe9, 0x5d, 0x0e, 0x6e, 0x20, 0x27, 0x4d, 0xa6, 0x22, 0x6f, 0x06, 0x85, 0xf0, + 0x69, 0x51, 0x21, 0xcc, 0xfe, 0xe3, 0x17, 0x6a, 0x46, 0xd3, 0x7f, 0xc8, 0xe4, 0xe4, 0x22, 0x14, + 0xab, 0xac, 0xa9, 0x52, 0x18, 0x60, 0xd6, 0x14, 0x0d, 0xa1, 0xea, 0x17, 0x8b, 0x30, 0x16, 0x3b, + 0xf8, 0x7a, 0x0e, 0x86, 0xc4, 0xc1, 0x93, 0xe9, 0xe7, 0x23, 0xc1, 0xa7, 0x47, 0x01, 0x50, 0x1b, + 0xe4, 0x7f, 0xd6, 0x0c, 0xf2, 0x49, 0x18, 0xb0, 0x5d, 0x5c, 0x14, 0xf1, 0x5b, 0xc6, 0xc2, 0x21, + 0xb4, 0x58, 0x67, 0x6d, 0xe7, 0x83, 0x43, 0x90, 0xc8, 0x1a, 0x69, 0xbb, 0xf8, 0x69, 0x37, 0x60, + 0x48, 0x77, 0x5d, 0xea, 0x35, 0x3c, 0x7d, 0x55, 0x4e, 0x51, 0x12, 0x00, 0xe5, 0xd1, 0x81, 0xc0, + 0x65, 0x7d, 0x95, 0x7c, 0x0a, 0x46, 0x9b, 0x0e, 0xc5, 0x65, 0x53, 0x6f, 0xb1, 0x56, 0x4a, 0x66, + 0x6d, 0x04, 0x21, 0xdf, 0x9f, 0x84, 0x88, 0x9a, 0x41, 0xee, 0xc2, 0xa8, 0xf8, 0x1c, 0xee, 0xf7, + 0x8f, 0x03, 0x6d, 0x2c, 0x5c, 0xc6, 0xb8, 0x48, 0xb8, 0xe7, 0xbf, 0x78, 0xfe, 0x21, 0x93, 0xcb, + 0x7c, 0x0d, 0x89, 0x94, 0x2c, 0x02, 0x59, 0xa7, 0x2b, 0x0d, 0xbd, 0xeb, 0xad, 0xb1, 0xba, 0x78, + 0x84, 0x7d, 0x91, 0x6b, 0x15, 0xdf, 0x4c, 0x24, 0xb1, 0xf2, 0x53, 0x92, 0x75, 0xba, 0x52, 0x89, + 0x20, 0xc9, 0x3d, 0x38, 0x93, 0x2c, 0xc2, 0x3e, 0x99, 0x5f, 0x0e, 0x3c, 0xb3, 0xb5, 0x59, 0x2e, + 0xa7, 0x12, 0x48, 0x6c, 0x4f, 0x25, 0xd8, 0xd6, 0x8c, 0x5b, 0xc5, 0xc1, 0x81, 0xf1, 0x41, 0x6d, + 0x8c, 0x95, 0xf5, 0x4d, 0x48, 0xd3, 0x50, 0x7f, 0x37, 0xc7, 0x4c, 0x45, 0xf6, 0x41, 0x98, 0x6c, + 0x9e, 0xe9, 0x7a, 0x7b, 0x97, 0xba, 0xde, 0x0e, 0xd3, 0xc2, 0x96, 0xdc, 0x1e, 0xb3, 0xab, 0x26, + 0xb0, 0x64, 0x02, 0x4a, 0x86, 0x7c, 0x6a, 0x76, 0x36, 0xda, 0x09, 0x7e, 0x3d, 0x9a, 0xa0, 0x22, + 0x57, 0xa0, 0xc8, 0x96, 0xac, 0xf8, 0x96, 0x59, 0xb6, 0x2e, 0x34, 0xa4, 0x50, 0x7f, 0x30, 0x0f, + 0x23, 0xd2, 0xd7, 0x5c, 0xdf, 0xd7, 0xe7, 0xbc, 0xbe, 0xb3, 0x66, 0xfa, 0x4e, 0x2f, 0xb8, 0x97, + 0xf2, 0x9b, 0x7c, 0x23, 0x10, 0xc5, 0x8e, 0x2e, 0xa4, 0x84, 0x60, 0x5e, 0x11, 0x1f, 0x5a, 0xda, + 0xf9, 0xf6, 0x91, 0xd1, 0xdf, 0x2a, 0x0e, 0xe6, 0xc7, 0x0b, 0xb7, 0x8a, 0x83, 0xc5, 0xf1, 0x7e, + 0x0c, 0x05, 0x86, 0xd1, 0xb7, 0xf9, 0xde, 0xdc, 0xba, 0x6f, 0xae, 0x1e, 0xf1, 0x97, 0x27, 0x07, + 0x1b, 0x26, 0x2d, 0x26, 0x9b, 0x23, 0xfe, 0x0c, 0xe5, 0x03, 0x95, 0xcd, 0x71, 0x1a, 0x59, 0x21, + 0x9b, 0x7f, 0x96, 0x03, 0x25, 0x55, 0x36, 0x95, 0x43, 0xf2, 0x83, 0x38, 0xb8, 0x64, 0xb2, 0x7f, + 0x98, 0x87, 0x93, 0x35, 0xcb, 0xa3, 0xab, 0x7c, 0xc7, 0x78, 0xc4, 0xa7, 0x8a, 0xdb, 0x30, 0x2c, + 0x7d, 0x8c, 0xe8, 0xf3, 0x27, 0x82, 0xfd, 0x78, 0x88, 0xca, 0xe0, 0x24, 0x97, 0x3e, 0xb8, 0x77, + 0x3c, 0x71, 0x21, 0x1f, 0xf1, 0x39, 0xe7, 0x68, 0x08, 0xf9, 0x88, 0x4f, 0x5e, 0x1f, 0x52, 0x21, + 0xff, 0xbd, 0x3c, 0x9c, 0x4a, 0xa9, 0x9c, 0x5c, 0x86, 0x81, 0x7a, 0x77, 0x05, 0x23, 0x7f, 0xe5, + 0x42, 0x8f, 0x61, 0xb7, 0xbb, 0x82, 0x41, 0xbf, 0x34, 0x1f, 0x49, 0x96, 0xf1, 0x69, 0xfe, 0x62, + 0xad, 0x3a, 0x25, 0xa4, 0xaa, 0x4a, 0x41, 0x06, 0x18, 0x38, 0xed, 0xcb, 0x82, 0xe7, 0xfb, 0xb6, + 0x69, 0x34, 0x63, 0xcf, 0xf7, 0x59, 0x19, 0xf2, 0x7d, 0x30, 0x54, 0x79, 0xbf, 0xeb, 0x50, 0xe4, + 0xcb, 0x25, 0xfe, 0x91, 0x80, 0xaf, 0x8f, 0x48, 0xe3, 0xcc, 0x23, 0x11, 0x30, 0x8a, 0x38, 0xef, + 0x90, 0x21, 0x59, 0x84, 0xd2, 0x4d, 0xd3, 0x9b, 0xed, 0xae, 0x88, 0x5e, 0x08, 0xa2, 0x83, 0x71, + 0x68, 0x1a, 0x5f, 0xdc, 0x95, 0xf3, 0x28, 0xc7, 0xf2, 0x1e, 0x88, 0x17, 0x50, 0x7f, 0x2c, 0x07, + 0x17, 0xb2, 0x3f, 0x97, 0x7c, 0x1c, 0x06, 0xd8, 0x56, 0xbf, 0xa2, 0x2d, 0x08, 0x59, 0xf2, 0x4c, + 0xce, 0x76, 0x8b, 0x36, 0x74, 0x47, 0xde, 0x3d, 0xf8, 0x64, 0xe4, 0x2d, 0x18, 0xae, 0xb9, 0x6e, + 0x97, 0x3a, 0xf5, 0x97, 0xee, 0x68, 0x35, 0xb1, 0xc9, 0xc4, 0x4d, 0x8c, 0x89, 0xe0, 0x86, 0xfb, + 0x52, 0x2c, 0x58, 0x98, 0x4c, 0xaf, 0xfe, 0x48, 0x0e, 0x2e, 0xf6, 0x12, 0x13, 0x79, 0x09, 0x06, + 0x97, 0xa9, 0xa5, 0x5b, 0x5e, 0xad, 0x2a, 0x9a, 0x84, 0x7b, 0x36, 0x0f, 0x61, 0xd1, 0xad, 0x47, + 0x40, 0xc8, 0x0a, 0xf1, 0x83, 0xca, 0xc0, 0x33, 0x82, 0x1f, 0xaa, 0x22, 0x2c, 0x56, 0xc8, 0x27, + 0x54, 0x3f, 0x0b, 0xe7, 0x33, 0xa5, 0x4a, 0x3e, 0x09, 0x23, 0x8b, 0xce, 0xaa, 0x6e, 0x99, 0xef, + 0xf3, 0x41, 0x91, 0x0b, 0xf7, 0xc5, 0xb6, 0x04, 0x97, 0xf7, 0x6a, 0x32, 0xbd, 0xfa, 0x7b, 0x79, + 0x18, 0x59, 0x6a, 0x75, 0x57, 0x4d, 0x69, 0x99, 0xdb, 0xf3, 0xee, 0xc0, 0xb7, 0xd5, 0xf3, 0xbb, + 0xb3, 0xd5, 0xd9, 0xe4, 0xe0, 0xec, 0x71, 0x72, 0xf0, 0xcb, 0x91, 0x37, 0xa1, 0xd4, 0xc1, 0xef, + 0x88, 0x9f, 0x1b, 0xf3, 0xaf, 0xcb, 0x3a, 0x37, 0xe6, 0x65, 0xd8, 0x6c, 0xd0, 0xdc, 0xc7, 0x6c, + 0x10, 0x96, 0x95, 0x04, 0x1a, 0x2e, 0x69, 0xc7, 0x02, 0x3d, 0x10, 0x81, 0x86, 0xcb, 0xd7, 0xb1, + 0x40, 0xf7, 0x21, 0xd0, 0x5f, 0xca, 0xc3, 0x58, 0xb4, 0x4a, 0xf2, 0x71, 0x18, 0xe6, 0xd5, 0xf0, + 0x53, 0xac, 0x9c, 0xe4, 0x02, 0x1d, 0x82, 0x35, 0xe0, 0x3f, 0xc4, 0x71, 0xdc, 0x89, 0x35, 0xdd, + 0x6d, 0x84, 0xe7, 0x49, 0xfc, 0xb6, 0x79, 0x90, 0xfb, 0x6d, 0xc5, 0x50, 0xda, 0xd8, 0x9a, 0xee, + 0x4e, 0x85, 0xbf, 0xc9, 0x34, 0x10, 0x87, 0x76, 0x5d, 0x1a, 0x65, 0x50, 0x44, 0x06, 0x22, 0x47, + 0x7f, 0x1c, 0xab, 0x9d, 0xe4, 0x30, 0x99, 0xcd, 0xe7, 0x82, 0x66, 0xa3, 0x32, 0xf4, 0xf7, 0x3e, + 0x93, 0x7d, 0x66, 0x6b, 0xb3, 0x7c, 0x46, 0xa2, 0x4f, 0x3f, 0x94, 0xe5, 0x04, 0x55, 0xdd, 0xd3, + 0xf9, 0x11, 0x82, 0xdf, 0x01, 0xea, 0x9f, 0xe9, 0x42, 0xff, 0xa2, 0x45, 0x17, 0xef, 0x93, 0x17, + 0x61, 0x88, 0x29, 0xcc, 0x9c, 0xcd, 0xfa, 0x32, 0x27, 0xbc, 0x3d, 0x24, 0x4d, 0x42, 0xc4, 0x6c, + 0x9f, 0x16, 0x52, 0x91, 0x1b, 0x00, 0xe1, 0x83, 0x38, 0xa1, 0x7d, 0x44, 0x2e, 0xc3, 0x31, 0xb3, + 0x7d, 0x9a, 0x44, 0xe7, 0x97, 0x12, 0xcf, 0x89, 0x0a, 0xc9, 0x52, 0x1c, 0xe3, 0x97, 0x12, 0xe3, + 0x63, 0x0e, 0x08, 0xfb, 0xb5, 0xa4, 0xbb, 0xee, 0xba, 0xed, 0x18, 0x53, 0x6b, 0xba, 0xb5, 0x4a, + 0xe3, 0x7b, 0xbd, 0x24, 0xc5, 0x6c, 0x9f, 0x96, 0x52, 0x8e, 0xbc, 0x0e, 0x23, 0xb2, 0xfb, 0x6b, + 0xdc, 0x45, 0x45, 0xc6, 0xcd, 0xf6, 0x69, 0x11, 0x5a, 0xf2, 0x2a, 0x0c, 0x8b, 0xdf, 0xb7, 0x6c, + 0x71, 0xff, 0x2d, 0xc5, 0x5d, 0x92, 0x50, 0xb3, 0x7d, 0x9a, 0x4c, 0x29, 0x55, 0xba, 0xe4, 0x98, + 0x96, 0x27, 0x5e, 0x54, 0xc7, 0x2b, 0x45, 0x9c, 0x54, 0x29, 0xfe, 0x26, 0x6f, 0xc1, 0x68, 0x10, + 0xd0, 0xea, 0x3d, 0xda, 0xf4, 0xc4, 0x51, 0xfd, 0x99, 0x58, 0x61, 0x8e, 0x9c, 0xed, 0xd3, 0xa2, + 0xd4, 0xe4, 0x0a, 0x94, 0x34, 0xea, 0x9a, 0xef, 0xfb, 0x97, 0xdb, 0x63, 0xd2, 0x38, 0x37, 0xdf, + 0x67, 0x52, 0x12, 0x78, 0xd6, 0x3b, 0xe1, 0x6d, 0xba, 0x38, 0x58, 0x27, 0xb1, 0x5a, 0xa6, 0x2d, + 0x83, 0xf5, 0x8e, 0xe4, 0x4a, 0xf1, 0xa9, 0x30, 0xcc, 0x97, 0xc8, 0x72, 0x3b, 0x1c, 0x8f, 0xa7, + 0x20, 0x63, 0x67, 0xfb, 0xb4, 0x18, 0xbd, 0x24, 0xd5, 0xaa, 0xe9, 0x3e, 0x10, 0xe1, 0x59, 0xe3, + 0x52, 0x65, 0x28, 0x49, 0xaa, 0xec, 0xa7, 0x54, 0xf5, 0x02, 0xf5, 0xd6, 0x6d, 0xe7, 0x81, 0x08, + 0xc6, 0x1a, 0xaf, 0x5a, 0x60, 0xa5, 0xaa, 0x05, 0x44, 0xae, 0x9a, 0x0d, 0xb8, 0xb1, 0xf4, 0xaa, + 0x75, 0x4f, 0x97, 0xab, 0xe6, 0xe7, 0x86, 0x7e, 0x27, 0xcd, 0x51, 0xfd, 0x21, 0x55, 0x4e, 0xa4, + 0x76, 0x28, 0xe2, 0xa4, 0x0e, 0xc5, 0xdf, 0xac, 0x52, 0x29, 0x05, 0xbe, 0x32, 0x1e, 0xad, 0x54, + 0x42, 0xb1, 0x4a, 0xe5, 0x64, 0xf9, 0x37, 0xe4, 0x3c, 0xeb, 0xca, 0xc9, 0x68, 0x07, 0x85, 0x18, + 0xd6, 0x41, 0x52, 0x3e, 0xf6, 0x32, 0xe6, 0x70, 0x56, 0x08, 0x92, 0x0f, 0x07, 0x2d, 0x9c, 0x5a, + 0x9a, 0xed, 0xd3, 0x30, 0xbb, 0xb3, 0xca, 0xb3, 0x83, 0x2b, 0xa7, 0x90, 0x62, 0xc4, 0xa7, 0x60, + 0xb0, 0xd9, 0x3e, 0x8d, 0x67, 0x0e, 0x7f, 0x51, 0xca, 0xa0, 0xa8, 0x9c, 0x8e, 0x4e, 0x11, 0x01, + 0x82, 0x4d, 0x11, 0x61, 0x9e, 0xc5, 0x99, 0x64, 0x9e, 0x40, 0xe5, 0x4c, 0x74, 0xa9, 0x89, 0xe3, + 0x67, 0xfb, 0xb4, 0x64, 0x6e, 0xc1, 0x57, 0x23, 0xa9, 0xf3, 0x94, 0xb3, 0xb1, 0x60, 0x67, 0x21, + 0x8a, 0x89, 0x4b, 0x4e, 0xb2, 0xb7, 0x08, 0xa7, 0x78, 0xe6, 0x5d, 0x11, 0xae, 0x4c, 0x4c, 0x56, + 0xe7, 0xa2, 0xdb, 0xac, 0x14, 0x92, 0xd9, 0x3e, 0x2d, 0xad, 0x24, 0x99, 0x4a, 0x24, 0xb0, 0x53, + 0x94, 0xa8, 0x27, 0x4f, 0x0c, 0x3d, 0xdb, 0xa7, 0x25, 0x52, 0xde, 0xdd, 0x90, 0x33, 0xc7, 0x29, + 0xe7, 0xa3, 0x9d, 0x18, 0x62, 0x58, 0x27, 0x4a, 0x19, 0xe6, 0x6e, 0xc8, 0xd9, 0xc4, 0x94, 0x0b, + 0xc9, 0x52, 0xe1, 0xcc, 0x29, 0x65, 0x1d, 0xd3, 0xd2, 0x13, 0x24, 0x29, 0x4f, 0x88, 0x34, 0xc9, + 0xa2, 0x7c, 0x1a, 0xcd, 0x6c, 0x9f, 0x96, 0x9e, 0x5c, 0x49, 0x4b, 0xcf, 0x2c, 0xa4, 0x5c, 0xec, + 0xc5, 0x33, 0x68, 0x5d, 0x7a, 0x56, 0x22, 0xbd, 0x47, 0x9e, 0x17, 0xe5, 0x52, 0x74, 0x43, 0x96, + 0x49, 0x38, 0xdb, 0xa7, 0xf5, 0xc8, 0x16, 0x73, 0x27, 0x23, 0xe9, 0x8a, 0xf2, 0x64, 0x34, 0x4b, + 0x7a, 0x2a, 0xd1, 0x6c, 0x9f, 0x96, 0x91, 0xb2, 0xe5, 0x4e, 0x46, 0x4e, 0x0e, 0xa5, 0xdc, 0x93, + 0x6d, 0x20, 0x8f, 0x8c, 0x8c, 0x1e, 0x8b, 0xa9, 0xe9, 0x2c, 0x94, 0xa7, 0xa2, 0xaa, 0x9b, 0x42, + 0xc2, 0x54, 0x37, 0x2d, 0x11, 0xc6, 0x62, 0x6a, 0xfe, 0x05, 0xe5, 0xe9, 0x1e, 0x0c, 0x83, 0x36, + 0xa6, 0x66, 0x6e, 0x58, 0x4c, 0x4d, 0x80, 0xa0, 0xa8, 0x51, 0x86, 0x29, 0x24, 0x8c, 0x61, 0x5a, + 0xea, 0x84, 0xc5, 0xd4, 0x38, 0xf9, 0xca, 0x33, 0x3d, 0x18, 0x86, 0x2d, 0x4c, 0x8b, 0xb0, 0xff, + 0x6a, 0x24, 0x50, 0xbd, 0xf2, 0x91, 0xe8, 0xbc, 0x21, 0xa1, 0xd8, 0xbc, 0x21, 0x87, 0xb4, 0x9f, + 0x4a, 0x44, 0xd1, 0x55, 0x9e, 0x8d, 0x0e, 0xf3, 0x18, 0x9a, 0x0d, 0xf3, 0x78, 0xdc, 0xdd, 0xa9, + 0x44, 0x34, 0x51, 0xe5, 0x72, 0x16, 0x13, 0x44, 0x47, 0x99, 0xf0, 0xf8, 0xa3, 0xb5, 0x94, 0x70, + 0x96, 0xca, 0x47, 0xa3, 0x5e, 0xe8, 0x09, 0x82, 0xd9, 0x3e, 0x2d, 0x25, 0x08, 0xa6, 0x96, 0x1e, + 0xbb, 0x49, 0xb9, 0x12, 0x1d, 0xb6, 0x69, 0x34, 0x6c, 0xd8, 0xa6, 0xc6, 0x7d, 0x9a, 0x4b, 0x7b, + 0x2a, 0xa3, 0x5c, 0x8d, 0x1a, 0x66, 0x49, 0x0a, 0x66, 0x98, 0xa5, 0x3c, 0xb1, 0xd1, 0xd2, 0x23, + 0x02, 0x29, 0xcf, 0xf5, 0x6c, 0x21, 0xd2, 0xa4, 0xb4, 0x90, 0x07, 0xc8, 0x09, 0x6d, 0xa7, 0x3b, + 0x9d, 0x96, 0xad, 0x1b, 0xca, 0xc7, 0x52, 0x6d, 0x27, 0x8e, 0x94, 0x6c, 0x27, 0x0e, 0x60, 0xab, + 0xbc, 0xfc, 0x22, 0x43, 0x79, 0x3e, 0xba, 0xca, 0xcb, 0x38, 0xb6, 0xca, 0x47, 0x5e, 0x6f, 0x4c, + 0x25, 0x5e, 0x2f, 0x28, 0x2f, 0x44, 0x15, 0x20, 0x86, 0x66, 0x0a, 0x10, 0x7f, 0xef, 0xf0, 0xf9, + 0x6c, 0x7f, 0x7f, 0x65, 0x02, 0xb9, 0x3d, 0xe5, 0x73, 0xcb, 0xa2, 0x9b, 0xed, 0xd3, 0xb2, 0xdf, + 0x0c, 0xd4, 0x52, 0xdc, 0xf7, 0x95, 0x6b, 0x51, 0x05, 0x4b, 0x10, 0x30, 0x05, 0x4b, 0x3a, 0xfd, + 0xd7, 0x52, 0xfc, 0xef, 0x95, 0x8f, 0x67, 0xb2, 0x0a, 0xbe, 0x39, 0xc5, 0x6b, 0xff, 0x86, 0xec, + 0x40, 0xaf, 0xbc, 0x18, 0x5d, 0xec, 0x42, 0x0c, 0x5b, 0xec, 0x24, 0x47, 0xfb, 0x1b, 0xb2, 0xeb, + 0xb8, 0x72, 0x3d, 0x59, 0x2a, 0x5c, 0x22, 0x25, 0x17, 0x73, 0x2d, 0xdd, 0xe3, 0x5a, 0x79, 0x29, + 0xaa, 0x75, 0x69, 0x34, 0x4c, 0xeb, 0x52, 0xbd, 0xb5, 0x67, 0x92, 0x8e, 0xd3, 0xca, 0x8d, 0xf8, + 0x26, 0x3b, 0x8a, 0x67, 0x96, 0x4f, 0xc2, 0xd9, 0xfa, 0x53, 0xf1, 0xc0, 0x82, 0xca, 0xcb, 0xb1, + 0x4b, 0xea, 0x08, 0x96, 0xd9, 0xb7, 0xb1, 0x40, 0x84, 0x9f, 0x8a, 0xc7, 0xe2, 0x53, 0x5e, 0x49, + 0xe7, 0x10, 0xe8, 0x4a, 0x3c, 0x76, 0xdf, 0xa7, 0xe2, 0xe1, 0xeb, 0x94, 0x57, 0xd3, 0x39, 0x04, + 0xd2, 0x8d, 0x87, 0xbb, 0x7b, 0x51, 0x0a, 0xa8, 0xaf, 0x7c, 0x22, 0x6a, 0x3a, 0x06, 0x08, 0x66, + 0x3a, 0x86, 0x61, 0xf7, 0x5f, 0x94, 0x02, 0xd1, 0x2b, 0xaf, 0x25, 0x8a, 0x04, 0x8d, 0x95, 0xc2, + 0xd5, 0xbf, 0x28, 0x05, 0x70, 0x57, 0x5e, 0x4f, 0x14, 0x09, 0x5a, 0x27, 0x85, 0x79, 0x37, 0x7a, + 0xbd, 0xb6, 0x55, 0xde, 0x88, 0x1e, 0x5d, 0x67, 0x53, 0xce, 0xf6, 0x69, 0xbd, 0x5e, 0xed, 0x7e, + 0x3e, 0xdb, 0x0d, 0x5d, 0x79, 0x33, 0x3a, 0x84, 0xb3, 0xe8, 0xd8, 0x10, 0xce, 0x74, 0x65, 0x7f, + 0x2b, 0x16, 0x79, 0x43, 0x79, 0x2b, 0x3a, 0xc5, 0x45, 0x90, 0x6c, 0x8a, 0x8b, 0xc7, 0xe9, 0x88, + 0x84, 0x94, 0x50, 0x3e, 0x19, 0x9d, 0xe2, 0x64, 0x1c, 0x9b, 0xe2, 0x22, 0xe1, 0x27, 0xa6, 0x12, + 0x91, 0x0e, 0x94, 0xb7, 0xa3, 0x53, 0x5c, 0x0c, 0xcd, 0xa6, 0xb8, 0x78, 0x6c, 0x84, 0xb7, 0x62, + 0x0f, 0xfe, 0x95, 0x4f, 0xa5, 0xb7, 0x1f, 0x91, 0x72, 0xfb, 0x79, 0x78, 0x00, 0x2d, 0xfd, 0xe5, + 0xba, 0x52, 0x89, 0x8e, 0xdf, 0x34, 0x1a, 0x36, 0x7e, 0x53, 0x5f, 0xbd, 0xc7, 0x37, 0x0e, 0x42, + 0xab, 0x26, 0x7b, 0x6c, 0x1c, 0x42, 0x53, 0x24, 0x05, 0x1c, 0xd9, 0x23, 0xf3, 0x8d, 0xd0, 0x54, + 0xc6, 0x1e, 0xd9, 0xdf, 0x06, 0xc5, 0xe8, 0xd9, 0xec, 0x9a, 0xf0, 0x8a, 0x56, 0xaa, 0xd1, 0xd9, + 0x35, 0x41, 0xc0, 0x66, 0xd7, 0xa4, 0x2f, 0xf5, 0x0c, 0x8c, 0x0b, 0x2d, 0xe2, 0xce, 0xde, 0xa6, + 0xb5, 0xaa, 0x4c, 0xc7, 0x5e, 0x87, 0xc6, 0xf0, 0x6c, 0x76, 0x8a, 0xc3, 0x70, 0xbd, 0xe6, 0xb0, + 0xa9, 0x96, 0xd9, 0x59, 0xb1, 0x75, 0xc7, 0xa8, 0x53, 0xcb, 0x50, 0x66, 0x62, 0xeb, 0x75, 0x0a, + 0x0d, 0xae, 0xd7, 0x29, 0x70, 0x0c, 0x68, 0x17, 0x83, 0x6b, 0xb4, 0x49, 0xcd, 0x87, 0x54, 0xb9, + 0x89, 0x6c, 0xcb, 0x59, 0x6c, 0x05, 0xd9, 0x6c, 0x9f, 0x96, 0xc5, 0x81, 0xd9, 0xea, 0xf3, 0x1b, + 0xf5, 0x77, 0xe6, 0x82, 0x60, 0x09, 0x4b, 0x0e, 0xed, 0xe8, 0x0e, 0x55, 0x66, 0xa3, 0xb6, 0x7a, + 0x2a, 0x11, 0xb3, 0xd5, 0x53, 0x11, 0x49, 0xb6, 0xfe, 0x58, 0xa8, 0xf5, 0x62, 0x1b, 0x8e, 0x88, + 0xf4, 0xd2, 0x6c, 0x76, 0x8a, 0x22, 0x98, 0x80, 0xe6, 0x6c, 0x6b, 0x15, 0x4f, 0x2a, 0x6e, 0x45, + 0x67, 0xa7, 0x6c, 0x4a, 0x36, 0x3b, 0x65, 0x63, 0x99, 0xaa, 0x47, 0xb1, 0x7c, 0x0c, 0xde, 0x8e, + 0xaa, 0x7a, 0x0a, 0x09, 0x53, 0xf5, 0x14, 0x70, 0x92, 0xa1, 0x46, 0x5d, 0xea, 0x29, 0x73, 0xbd, + 0x18, 0x22, 0x49, 0x92, 0x21, 0x82, 0x93, 0x0c, 0x67, 0xa8, 0xd7, 0x5c, 0x53, 0xe6, 0x7b, 0x31, + 0x44, 0x92, 0x24, 0x43, 0x04, 0xb3, 0xcd, 0x66, 0x14, 0x3c, 0xd9, 0x6d, 0x3d, 0xf0, 0xfb, 0x6c, + 0x21, 0xba, 0xd9, 0xcc, 0x24, 0x64, 0x9b, 0xcd, 0x4c, 0x24, 0xf9, 0x91, 0x1d, 0x7b, 0xed, 0x2b, + 0x8b, 0x58, 0xe1, 0x44, 0x68, 0x17, 0xec, 0xa4, 0xd4, 0x6c, 0x9f, 0xb6, 0xd3, 0x57, 0x01, 0x1f, + 0x0b, 0x5c, 0x5c, 0x95, 0x25, 0xac, 0xea, 0x44, 0x70, 0x56, 0xc1, 0xc1, 0xb3, 0x7d, 0x5a, 0xe0, + 0x04, 0xfb, 0x2a, 0x0c, 0xe3, 0x47, 0xd5, 0x2c, 0xd3, 0xab, 0x4e, 0x2a, 0xef, 0x44, 0xb7, 0x4c, + 0x12, 0x8a, 0x6d, 0x99, 0xa4, 0x9f, 0x6c, 0x12, 0xc7, 0x9f, 0x7c, 0x8a, 0xa9, 0x4e, 0x2a, 0x5a, + 0x74, 0x12, 0x8f, 0x20, 0xd9, 0x24, 0x1e, 0x01, 0x04, 0xf5, 0x56, 0x1d, 0xbb, 0x53, 0x9d, 0x54, + 0xea, 0x29, 0xf5, 0x72, 0x54, 0x50, 0x2f, 0xff, 0x19, 0xd4, 0x5b, 0x5f, 0xeb, 0x7a, 0x55, 0xf6, + 0x8d, 0xcb, 0x29, 0xf5, 0xfa, 0xc8, 0xa0, 0x5e, 0x1f, 0xc0, 0xa6, 0x42, 0x04, 0x2c, 0x39, 0x36, + 0x9b, 0xb4, 0x6f, 0x9b, 0xad, 0x96, 0x72, 0x27, 0x3a, 0x15, 0xc6, 0xf1, 0x6c, 0x2a, 0x8c, 0xc3, + 0x98, 0xe9, 0xc9, 0x5b, 0x45, 0x57, 0xba, 0xab, 0xca, 0xdd, 0xa8, 0xe9, 0x19, 0x62, 0x98, 0xe9, + 0x19, 0xfe, 0xc2, 0xdd, 0x05, 0xfb, 0xa5, 0xd1, 0xfb, 0x0e, 0x75, 0xd7, 0x94, 0x7b, 0xb1, 0xdd, + 0x85, 0x84, 0xc3, 0xdd, 0x85, 0xf4, 0x9b, 0xac, 0xc2, 0x13, 0x91, 0x85, 0xc6, 0xbf, 0xb4, 0xa9, + 0x53, 0xdd, 0x69, 0xae, 0x29, 0x9f, 0x46, 0x56, 0xcf, 0xa4, 0x2e, 0x55, 0x51, 0xd2, 0xd9, 0x3e, + 0xad, 0x17, 0x27, 0xdc, 0x96, 0xbf, 0x33, 0xc7, 0xa3, 0xde, 0x6a, 0x4b, 0x53, 0xfe, 0x26, 0xf4, + 0xdd, 0xd8, 0xb6, 0x3c, 0x49, 0x82, 0xdb, 0xf2, 0x24, 0x98, 0x74, 0xe0, 0xc9, 0xd8, 0x56, 0x6d, + 0x5e, 0x6f, 0xb1, 0x7d, 0x09, 0x35, 0x96, 0xf4, 0xe6, 0x03, 0xea, 0x29, 0x9f, 0x41, 0xde, 0x97, + 0x33, 0x36, 0x7c, 0x31, 0xea, 0xd9, 0x3e, 0x6d, 0x1b, 0x7e, 0x44, 0x85, 0x62, 0x7d, 0x66, 0x79, + 0x49, 0xf9, 0x6c, 0xf4, 0x7c, 0x93, 0xc1, 0x66, 0xfb, 0x34, 0xc4, 0x31, 0x2b, 0xed, 0x4e, 0x67, + 0xd5, 0xd1, 0x0d, 0xca, 0x0d, 0x2d, 0xb4, 0xdd, 0x84, 0x01, 0xfa, 0x7d, 0x51, 0x2b, 0x2d, 0x8b, + 0x8e, 0x59, 0x69, 0x59, 0x38, 0xa6, 0xa8, 0x91, 0x04, 0x2f, 0xca, 0xe7, 0xa2, 0x8a, 0x1a, 0x41, + 0x32, 0x45, 0x8d, 0xa6, 0x83, 0xf9, 0x34, 0x9c, 0x0d, 0xf6, 0xf3, 0x62, 0xfd, 0xe5, 0x9d, 0xa6, + 0x7c, 0x1e, 0xf9, 0x3c, 0x99, 0xb8, 0x0c, 0x88, 0x50, 0xcd, 0xf6, 0x69, 0x19, 0xe5, 0xd9, 0x8a, + 0x9b, 0x48, 0x80, 0x26, 0xcc, 0x8b, 0xef, 0x8f, 0xae, 0xb8, 0x19, 0x64, 0x6c, 0xc5, 0xcd, 0x40, + 0xa5, 0x32, 0x17, 0x42, 0xd5, 0xb7, 0x61, 0x1e, 0xc8, 0x34, 0x8b, 0x43, 0x2a, 0x73, 0x61, 0xa9, + 0xad, 0x6c, 0xc3, 0x3c, 0xb0, 0xd6, 0xb2, 0x38, 0x90, 0x2b, 0x50, 0xaa, 0xd7, 0xe7, 0xb5, 0xae, + 0xa5, 0x34, 0x63, 0xbe, 0xbd, 0x08, 0x9d, 0xed, 0xd3, 0x04, 0x9e, 0x99, 0x41, 0xd3, 0x2d, 0xdd, + 0xf5, 0xcc, 0xa6, 0x8b, 0x23, 0xc6, 0x1f, 0x21, 0x46, 0xd4, 0x0c, 0x4a, 0xa3, 0x61, 0x66, 0x50, + 0x1a, 0x9c, 0xd9, 0x8b, 0x53, 0xba, 0xeb, 0xea, 0x96, 0xe1, 0xe8, 0x93, 0xb8, 0x4c, 0xd0, 0xd8, + 0xdb, 0xb1, 0x08, 0x96, 0xd9, 0x8b, 0x51, 0x08, 0x1e, 0xbe, 0xfb, 0x10, 0xdf, 0xcc, 0xb9, 0x1f, + 0x3b, 0x7c, 0x8f, 0xe1, 0xf1, 0xf0, 0x3d, 0x06, 0x43, 0xbb, 0xd3, 0x87, 0x69, 0x74, 0xd5, 0x64, + 0x22, 0x52, 0x56, 0x63, 0x76, 0x67, 0x9c, 0x00, 0xed, 0xce, 0x38, 0x30, 0xd2, 0x24, 0x7f, 0xb9, + 0x5d, 0xcb, 0x68, 0x52, 0xb8, 0xca, 0x26, 0xca, 0xb0, 0xf5, 0x3b, 0x1c, 0x1c, 0xd5, 0x0d, 0x4b, + 0x6f, 0xdb, 0xd5, 0x49, 0x5f, 0xea, 0x66, 0x74, 0xfd, 0xce, 0x24, 0x64, 0xeb, 0x77, 0x26, 0x92, + 0xcd, 0xae, 0xfe, 0x46, 0x6b, 0x4d, 0x77, 0xa8, 0x51, 0x35, 0x1d, 0x3c, 0x59, 0xdc, 0xe0, 0x5b, + 0xc3, 0xf7, 0xa2, 0xb3, 0x6b, 0x0f, 0x52, 0x36, 0xbb, 0xf6, 0x40, 0x33, 0x23, 0x2f, 0x1d, 0xad, + 0x51, 0xdd, 0x50, 0x1e, 0x44, 0x8d, 0xbc, 0x6c, 0x4a, 0x66, 0xe4, 0x65, 0x63, 0xb3, 0x3f, 0xe7, + 0x9e, 0x63, 0x7a, 0x54, 0x69, 0xed, 0xe4, 0x73, 0x90, 0x34, 0xfb, 0x73, 0x10, 0xcd, 0x36, 0x84, + 0xf1, 0x0e, 0x69, 0x47, 0x37, 0x84, 0xc9, 0x6e, 0x88, 0x97, 0x60, 0x16, 0x8b, 0x78, 0x42, 0xa8, + 0x58, 0x51, 0x8b, 0x45, 0x80, 0x99, 0xc5, 0x12, 0x3e, 0x32, 0x8c, 0x3c, 0x1c, 0x53, 0xec, 0xe8, + 0x1a, 0x2a, 0xe3, 0xd8, 0x1a, 0x1a, 0x79, 0x64, 0xf6, 0x6a, 0xe4, 0x55, 0x84, 0xd2, 0x89, 0x5a, + 0x1d, 0x12, 0x8a, 0x59, 0x1d, 0xf2, 0xfb, 0x89, 0x29, 0x38, 0x81, 0xb7, 0xe0, 0x5a, 0x37, 0xb8, + 0xc7, 0xf9, 0x81, 0xe8, 0x67, 0xc6, 0xd0, 0xec, 0x33, 0x63, 0xa0, 0x08, 0x13, 0x31, 0x6d, 0x39, + 0x19, 0x4c, 0xc2, 0xf3, 0xc1, 0x18, 0x88, 0xcc, 0x01, 0xa9, 0x57, 0xe6, 0xe7, 0x6a, 0xc6, 0x92, + 0x7c, 0x45, 0xe6, 0x46, 0x4f, 0x60, 0x93, 0x14, 0xb3, 0x7d, 0x5a, 0x4a, 0x39, 0xf2, 0x1e, 0x5c, + 0x14, 0x50, 0xf1, 0x3e, 0x7c, 0xc9, 0xb1, 0x1f, 0x9a, 0x46, 0xb0, 0x20, 0x78, 0x51, 0xaf, 0xbb, + 0x5e, 0xb4, 0xb3, 0x7d, 0x5a, 0x4f, 0x5e, 0xd9, 0x75, 0x89, 0xf5, 0xa1, 0xbb, 0x93, 0xba, 0x82, + 0x45, 0xa2, 0x27, 0xaf, 0xec, 0xba, 0x84, 0xdc, 0x1f, 0xee, 0xa4, 0xae, 0xa0, 0x13, 0x7a, 0xf2, + 0x22, 0x2e, 0x94, 0x7b, 0xe1, 0x2b, 0xad, 0x96, 0xb2, 0x8e, 0xd5, 0x7d, 0x74, 0x27, 0xd5, 0x55, + 0xd0, 0xe0, 0xdc, 0x8e, 0x23, 0x9b, 0xa5, 0x17, 0x3b, 0xd4, 0xaa, 0x47, 0x16, 0xa0, 0x47, 0xd1, + 0x59, 0x3a, 0x41, 0xc0, 0x66, 0xe9, 0x04, 0x90, 0x0d, 0x28, 0xf9, 0x71, 0x8d, 0xb2, 0x11, 0x1d, + 0x50, 0x32, 0x8e, 0x0d, 0xa8, 0xc8, 0x43, 0x9c, 0x45, 0x38, 0xb5, 0xf8, 0xc0, 0xd3, 0x7d, 0x0b, + 0xd2, 0x15, 0x5d, 0xf9, 0x7e, 0xec, 0x92, 0x29, 0x49, 0x82, 0x97, 0x4c, 0x49, 0x30, 0x1b, 0x23, + 0x0c, 0x5c, 0xdf, 0xb0, 0x9a, 0x33, 0xba, 0xd9, 0xea, 0x3a, 0x54, 0xf9, 0x53, 0xd1, 0x31, 0x12, + 0x43, 0xb3, 0x31, 0x12, 0x03, 0xb1, 0x05, 0x9a, 0x81, 0x2a, 0xae, 0x6b, 0xae, 0x5a, 0x62, 0x5f, + 0xd9, 0x6d, 0x79, 0xca, 0xbf, 0x17, 0x5d, 0xa0, 0xd3, 0x68, 0xd8, 0x02, 0x9d, 0x06, 0xc7, 0x53, + 0x27, 0xd6, 0x0b, 0x6c, 0xf1, 0x90, 0xef, 0x2a, 0xff, 0xfd, 0xd8, 0xa9, 0x53, 0x0a, 0x0d, 0x9e, + 0x3a, 0xa5, 0xc0, 0xd9, 0xfa, 0xc8, 0x6d, 0xb2, 0x39, 0x33, 0xb8, 0xab, 0xfe, 0x0f, 0xa2, 0xeb, + 0x63, 0x1c, 0xcf, 0xd6, 0xc7, 0x38, 0x2c, 0xca, 0x47, 0x74, 0xc1, 0x7f, 0x98, 0xc5, 0x27, 0x90, + 0x7f, 0xa2, 0x0c, 0xb9, 0x29, 0xf3, 0x11, 0x23, 0xe5, 0x07, 0x73, 0x59, 0x8c, 0x82, 0xe1, 0x91, + 0x28, 0x14, 0x65, 0xa4, 0xd1, 0x87, 0x26, 0x5d, 0x57, 0xbe, 0x90, 0xc9, 0x88, 0x13, 0x44, 0x19, + 0x71, 0x18, 0x79, 0x17, 0xce, 0x86, 0xb0, 0x79, 0xda, 0x5e, 0x09, 0x66, 0xa6, 0x3f, 0x9d, 0x8b, + 0x9a, 0xc1, 0xe9, 0x64, 0xcc, 0x0c, 0x4e, 0xc7, 0xa4, 0xb1, 0x16, 0xa2, 0xfb, 0x33, 0xdb, 0xb0, + 0x0e, 0x24, 0x98, 0xc1, 0x20, 0x8d, 0xb5, 0x90, 0xe6, 0x0f, 0x6d, 0xc3, 0x3a, 0x90, 0x69, 0x06, + 0x03, 0xf2, 0xa3, 0x39, 0xb8, 0x9c, 0x8e, 0xaa, 0xb4, 0x5a, 0x33, 0xb6, 0x13, 0xe2, 0x94, 0x3f, + 0x9b, 0x8b, 0x1e, 0x34, 0xec, 0xac, 0xd8, 0x6c, 0x9f, 0xb6, 0xc3, 0x0a, 0xc8, 0x27, 0x61, 0xb4, + 0xd2, 0x35, 0x4c, 0x0f, 0x2f, 0xde, 0x98, 0xe1, 0xfc, 0xc3, 0xb9, 0xd8, 0x16, 0x47, 0xc6, 0xe2, + 0x16, 0x47, 0x06, 0x90, 0x5b, 0x70, 0xb2, 0x4e, 0x9b, 0x5d, 0xc7, 0xf4, 0x36, 0x34, 0xda, 0xb1, + 0x1d, 0x8f, 0xf1, 0xf8, 0x73, 0xb9, 0xe8, 0x24, 0x96, 0xa0, 0x60, 0x93, 0x58, 0x02, 0x48, 0xee, + 0x26, 0x6e, 0xe5, 0x45, 0x67, 0xfe, 0x48, 0xae, 0xe7, 0xb5, 0x7c, 0xd0, 0x97, 0xe9, 0xc5, 0xc9, + 0x52, 0xec, 0x16, 0x5d, 0x70, 0xfd, 0xd1, 0x5c, 0x8f, 0x6b, 0x74, 0x69, 0x86, 0x4b, 0x82, 0x19, + 0xc7, 0x94, 0x94, 0xf9, 0xca, 0x9f, 0xcf, 0xf5, 0xb8, 0xf6, 0x0e, 0x39, 0xa6, 0x65, 0xdb, 0x7f, + 0x99, 0x7b, 0x8a, 0x08, 0x46, 0x7f, 0x21, 0x97, 0x74, 0x15, 0x09, 0xca, 0x4b, 0x84, 0xac, 0xd8, + 0x1d, 0x37, 0x50, 0xfa, 0x2f, 0xe6, 0x92, 0xbe, 0x79, 0x61, 0xb1, 0xf0, 0x17, 0xa1, 0x70, 0x61, + 0xfa, 0x91, 0x47, 0x1d, 0x4b, 0x6f, 0x61, 0x77, 0xd6, 0x3d, 0xdb, 0xd1, 0x57, 0xe9, 0xb4, 0xa5, + 0xaf, 0xb4, 0xa8, 0xf2, 0x63, 0xb9, 0xa8, 0x05, 0x9b, 0x4d, 0xca, 0x2c, 0xd8, 0x6c, 0x2c, 0x59, + 0x83, 0x27, 0xd2, 0xb0, 0x55, 0xd3, 0xc5, 0x7a, 0xbe, 0x94, 0x8b, 0x9a, 0xb0, 0x3d, 0x68, 0x99, + 0x09, 0xdb, 0x03, 0x4d, 0xae, 0xc3, 0xd0, 0xa4, 0xed, 0x4f, 0xbf, 0x7f, 0x31, 0xe6, 0x0c, 0x19, + 0x60, 0x66, 0xfb, 0xb4, 0x90, 0x4c, 0x94, 0x11, 0x83, 0xfa, 0xcb, 0xc9, 0x32, 0xe1, 0xe5, 0x53, + 0xf0, 0x43, 0x94, 0x11, 0xe2, 0xfe, 0x8f, 0x92, 0x65, 0xc2, 0x3b, 0xae, 0xe0, 0x07, 0x9b, 0x49, + 0x78, 0x8d, 0xf3, 0x33, 0x15, 0x66, 0xb7, 0x4d, 0xad, 0xe9, 0xad, 0x16, 0xb5, 0x56, 0xa9, 0xf2, + 0x95, 0xd8, 0x4c, 0x92, 0x4e, 0xc6, 0x66, 0x92, 0x74, 0x0c, 0xf9, 0x3e, 0x38, 0x77, 0x57, 0x6f, + 0x99, 0x46, 0x88, 0xf3, 0x13, 0xa8, 0x2b, 0x3f, 0x9e, 0x8b, 0xee, 0xa6, 0x33, 0xe8, 0xd8, 0x6e, + 0x3a, 0x03, 0x45, 0xe6, 0x81, 0xe0, 0x32, 0x1a, 0xcc, 0x16, 0x6c, 0x7d, 0x56, 0xfe, 0xe3, 0x5c, + 0xd4, 0x4e, 0x4d, 0x92, 0x30, 0x3b, 0x35, 0x09, 0x25, 0x8d, 0xec, 0x44, 0x26, 0xca, 0x4f, 0xe4, + 0xa2, 0xa7, 0x35, 0x59, 0x84, 0xb3, 0x7d, 0x5a, 0x76, 0x36, 0x94, 0x9b, 0x30, 0x5e, 0x5f, 0xaa, + 0xcd, 0xcc, 0x4c, 0xd7, 0xef, 0xd6, 0xaa, 0xf8, 0x8a, 0xc2, 0x50, 0x7e, 0x32, 0xb6, 0x62, 0xc5, + 0x09, 0xd8, 0x8a, 0x15, 0x87, 0x91, 0x37, 0x60, 0x84, 0xb5, 0x9f, 0x0d, 0x18, 0xfc, 0xe4, 0xaf, + 0xe6, 0xa2, 0xe6, 0x94, 0x8c, 0x64, 0xe6, 0x94, 0xfc, 0x9b, 0xd4, 0xe1, 0x34, 0x93, 0xe2, 0x92, + 0x43, 0xef, 0x53, 0x87, 0x5a, 0x4d, 0x7f, 0x4c, 0xff, 0x54, 0x2e, 0x6a, 0x65, 0xa4, 0x11, 0x31, + 0x2b, 0x23, 0x0d, 0x4e, 0x1e, 0xc0, 0xc5, 0xf8, 0x49, 0x90, 0xfc, 0x48, 0x56, 0xf9, 0x4b, 0xb9, + 0x98, 0x31, 0xdc, 0x83, 0x18, 0x8d, 0xe1, 0x1e, 0x78, 0x62, 0xc1, 0x25, 0x71, 0xac, 0x22, 0x1c, + 0x2e, 0xe3, 0xb5, 0xfd, 0x34, 0xaf, 0xed, 0xd9, 0xd0, 0x21, 0xb0, 0x07, 0xf5, 0x6c, 0x9f, 0xd6, + 0x9b, 0x1d, 0xd3, 0xb3, 0x64, 0xba, 0x0e, 0xe5, 0x2f, 0xe7, 0xd2, 0x3d, 0x52, 0x22, 0x6e, 0xca, + 0x69, 0x79, 0x3e, 0xde, 0xcd, 0x4a, 0x36, 0xa1, 0xfc, 0x95, 0xd8, 0x78, 0x4b, 0x27, 0x63, 0xe3, + 0x2d, 0x23, 0x5b, 0xc5, 0x2d, 0x38, 0xc9, 0x95, 0x7a, 0x49, 0xc7, 0x61, 0x68, 0xad, 0x52, 0x43, + 0xf9, 0xab, 0xb1, 0xd5, 0x2e, 0x41, 0x81, 0xae, 0x3d, 0x71, 0x20, 0x9b, 0xba, 0xeb, 0x1d, 0xdd, + 0xb2, 0xf0, 0x98, 0x55, 0xf9, 0x4f, 0x62, 0x53, 0x77, 0x88, 0x42, 0xc7, 0xdd, 0xe0, 0x17, 0xd3, + 0x84, 0x5e, 0x89, 0x9a, 0x94, 0xff, 0x34, 0xa6, 0x09, 0xbd, 0x88, 0x99, 0x26, 0xf4, 0xcc, 0xfa, + 0x74, 0x37, 0xe3, 0xc1, 0xba, 0xf2, 0xb5, 0xd8, 0x8a, 0x9c, 0x4a, 0xc5, 0x56, 0xe4, 0xf4, 0xf7, + 0xee, 0x77, 0x33, 0x1e, 0x7b, 0x2b, 0x3f, 0xd3, 0x9b, 0x6f, 0xb8, 0xd2, 0xa7, 0xbf, 0x15, 0xbf, + 0x9b, 0xf1, 0x50, 0x5a, 0xf9, 0x6b, 0xbd, 0xf9, 0x86, 0x8e, 0x7d, 0xe9, 0xef, 0xac, 0x1b, 0xd9, + 0x8f, 0x8c, 0x95, 0xbf, 0x1e, 0x9f, 0xba, 0x32, 0x08, 0x71, 0xea, 0xca, 0x7a, 0xa9, 0xbc, 0x02, + 0xe7, 0xb9, 0x86, 0xdc, 0x74, 0xf4, 0xce, 0x5a, 0x9d, 0x7a, 0x9e, 0x69, 0xad, 0xfa, 0x3b, 0xb1, + 0xff, 0x2c, 0x17, 0x3b, 0x1e, 0xcb, 0xa2, 0xc4, 0xe3, 0xb1, 0x2c, 0x24, 0x53, 0xde, 0xc4, 0x73, + 0x62, 0xe5, 0x6f, 0xc4, 0x94, 0x37, 0x41, 0xc1, 0x94, 0x37, 0xf9, 0x0a, 0xf9, 0x56, 0xca, 0xab, + 0x59, 0xe5, 0x3f, 0xcf, 0xe6, 0x15, 0xb4, 0x2f, 0xe5, 0xb1, 0xed, 0xad, 0x94, 0xc7, 0xa1, 0xca, + 0x7f, 0x91, 0xcd, 0x2b, 0xf4, 0x41, 0x4a, 0xbe, 0x29, 0x7d, 0x17, 0xce, 0xf2, 0xd9, 0x7c, 0x86, + 0x1a, 0x34, 0xf2, 0xa1, 0x3f, 0x1b, 0x1b, 0xfb, 0xe9, 0x64, 0x78, 0xe4, 0x9e, 0x8a, 0x49, 0x63, + 0x2d, 0xda, 0xfa, 0x37, 0xb7, 0x61, 0x1d, 0x6e, 0x08, 0xd2, 0x31, 0x6c, 0xbd, 0x91, 0x1f, 0xbf, + 0x29, 0x3f, 0x17, 0x5b, 0x6f, 0x64, 0x24, 0xba, 0x73, 0xc8, 0x2f, 0xe5, 0xde, 0x88, 0x3e, 0xf4, + 0x52, 0xfe, 0x56, 0x6a, 0xe1, 0xa0, 0x03, 0xa2, 0xaf, 0xc2, 0xde, 0x88, 0x3e, 0x6a, 0x52, 0x7e, + 0x3e, 0xb5, 0x70, 0xf0, 0x01, 0xd1, 0x17, 0x50, 0x6c, 0x8b, 0xd4, 0xf5, 0x6c, 0xce, 0x2a, 0x32, + 0x3d, 0xfc, 0xed, 0xf8, 0x16, 0x29, 0x95, 0x0c, 0xb7, 0x48, 0xa9, 0x98, 0x34, 0xd6, 0xe2, 0xf3, + 0x7e, 0x61, 0x1b, 0xd6, 0xd2, 0xc6, 0x2e, 0x15, 0x93, 0xc6, 0x5a, 0x7c, 0xfc, 0xd7, 0xb7, 0x61, + 0x2d, 0x6d, 0xec, 0x52, 0x31, 0xcc, 0x1c, 0x0b, 0x31, 0x77, 0xa9, 0xe3, 0x86, 0xea, 0xf7, 0x5f, + 0xc6, 0xcc, 0xb1, 0x0c, 0x3a, 0x66, 0x8e, 0x65, 0xa0, 0x52, 0xb9, 0x0b, 0xa1, 0xfc, 0xe2, 0x76, + 0xdc, 0xc3, 0x7b, 0x99, 0x0c, 0x54, 0x2a, 0x77, 0x21, 0x97, 0xbf, 0xb3, 0x1d, 0xf7, 0xf0, 0x62, + 0x26, 0x03, 0xc5, 0x8c, 0xa2, 0xba, 0xa7, 0x7b, 0x66, 0x73, 0xd6, 0x76, 0x3d, 0x69, 0x91, 0xff, + 0xaf, 0x62, 0x46, 0x51, 0x1a, 0x11, 0x33, 0x8a, 0xd2, 0xe0, 0x49, 0xa6, 0x42, 0x1a, 0xbf, 0xd4, + 0x93, 0x69, 0x68, 0x69, 0xa5, 0xc1, 0x93, 0x4c, 0x85, 0x10, 0xfe, 0xeb, 0x9e, 0x4c, 0x43, 0x4f, + 0xf9, 0x34, 0x38, 0xb3, 0x4c, 0xa7, 0x1c, 0x7b, 0xdd, 0xba, 0x45, 0xd7, 0x69, 0x4b, 0x7c, 0xfa, + 0x2f, 0xc7, 0x2c, 0xd3, 0x38, 0x01, 0xde, 0xa2, 0xc4, 0x60, 0x51, 0x46, 0xe2, 0x73, 0x7f, 0x25, + 0x93, 0x51, 0x78, 0x4c, 0x14, 0x87, 0x45, 0x19, 0x89, 0x4f, 0xfc, 0xd5, 0x4c, 0x46, 0xe1, 0x31, + 0x51, 0x1c, 0x46, 0x2a, 0x30, 0x86, 0x6f, 0x25, 0x74, 0xd7, 0xf7, 0xfc, 0xfc, 0x8d, 0x5c, 0xf4, + 0xd6, 0x2b, 0x8a, 0x9e, 0xed, 0xd3, 0x62, 0x05, 0x64, 0x16, 0xe2, 0x93, 0xbe, 0x99, 0xc1, 0x22, + 0xf4, 0x77, 0x8c, 0x42, 0x64, 0x16, 0xe2, 0x63, 0xfe, 0x9b, 0x0c, 0x16, 0xa1, 0xc3, 0x63, 0x14, + 0x42, 0x3e, 0x01, 0xc3, 0xf5, 0x99, 0xe5, 0x25, 0x3f, 0x99, 0xe0, 0xdf, 0xcd, 0xc5, 0x5e, 0x15, + 0x85, 0x38, 0x7c, 0x55, 0x14, 0xfe, 0x24, 0x9f, 0x84, 0xd1, 0x29, 0xdb, 0xf2, 0xf4, 0xa6, 0xbf, + 0x01, 0xfd, 0xcd, 0xd8, 0x19, 0x4a, 0x04, 0x3b, 0xdb, 0xa7, 0x45, 0xc9, 0xa5, 0xf2, 0xa2, 0xed, + 0xbf, 0x95, 0x5e, 0x3e, 0x68, 0x7a, 0x94, 0x9c, 0xcd, 0x68, 0xf7, 0x6c, 0xe7, 0x41, 0xcb, 0xd6, + 0x0d, 0x3f, 0x7e, 0xa5, 0x68, 0xc8, 0xdf, 0x8b, 0xcd, 0x68, 0xe9, 0x64, 0x6c, 0x46, 0x4b, 0xc7, + 0xa4, 0xb1, 0x16, 0x5d, 0xf4, 0xad, 0x6d, 0x58, 0x87, 0xf3, 0x70, 0x3a, 0x26, 0x8d, 0xb5, 0xf8, + 0xfc, 0xbf, 0xbf, 0x0d, 0xeb, 0x70, 0x1e, 0x4e, 0xc7, 0x30, 0xd3, 0xfa, 0xa6, 0xe9, 0xf9, 0x0f, + 0xdb, 0xfe, 0x41, 0xcc, 0xb4, 0x0e, 0x51, 0xcc, 0xb4, 0x0e, 0x7f, 0x11, 0x0a, 0x17, 0x82, 0xa7, + 0x92, 0xe1, 0xde, 0xb5, 0x66, 0x3d, 0x64, 0xfb, 0x63, 0xe5, 0x1f, 0xc6, 0x4e, 0x45, 0xb2, 0x49, + 0x67, 0xfb, 0xb4, 0x1e, 0x8c, 0xc8, 0x52, 0xcc, 0x4f, 0x91, 0x47, 0xc8, 0x53, 0xfe, 0x51, 0xae, + 0x87, 0xa3, 0x22, 0xa7, 0x49, 0x38, 0x2a, 0x72, 0xf0, 0xe4, 0x00, 0xf4, 0xe3, 0x59, 0xfe, 0xad, + 0xd2, 0xe0, 0x37, 0x72, 0xe3, 0xbf, 0x96, 0xbb, 0x55, 0x1a, 0xfc, 0xb5, 0xdc, 0xf8, 0xaf, 0xb3, + 0xff, 0x7f, 0x3d, 0x37, 0xfe, 0x1b, 0x39, 0xed, 0x7c, 0x38, 0x2f, 0x57, 0x56, 0xa9, 0xe5, 0x2d, + 0xb5, 0x74, 0xb1, 0xaa, 0xa4, 0xa2, 0xf8, 0xcf, 0x54, 0x94, 0xc8, 0x1c, 0xf7, 0xb5, 0x1c, 0x8c, + 0xd4, 0x3d, 0x87, 0xea, 0x6d, 0x11, 0x88, 0xf1, 0x02, 0x0c, 0x72, 0xef, 0x7b, 0x3f, 0x0e, 0x81, + 0x16, 0xfc, 0x26, 0x97, 0x61, 0x6c, 0x4e, 0x77, 0x3d, 0x6c, 0x62, 0xcd, 0x32, 0xe8, 0x23, 0x7c, + 0x79, 0x5a, 0xd0, 0x62, 0x50, 0x32, 0xc7, 0xe9, 0x78, 0x39, 0x8c, 0xbd, 0x5b, 0xd8, 0x36, 0xfe, + 0xe0, 0xe0, 0xb7, 0x37, 0xcb, 0x7d, 0x18, 0x6e, 0x30, 0x56, 0x56, 0xfd, 0xdd, 0x1c, 0x24, 0xde, + 0x05, 0xec, 0x3d, 0xe0, 0xc8, 0x22, 0x9c, 0x88, 0xc5, 0x7b, 0x16, 0xcf, 0x67, 0x77, 0x18, 0x0e, + 0x3a, 0x5e, 0x9a, 0x7c, 0x34, 0x78, 0xb6, 0x79, 0x47, 0x9b, 0x13, 0xb1, 0x25, 0x31, 0x2b, 0x4a, + 0xd7, 0x69, 0x69, 0x12, 0x4a, 0xc4, 0x0e, 0xfb, 0xee, 0x78, 0x18, 0xcc, 0x96, 0x5c, 0x16, 0xd1, + 0x4f, 0x72, 0x61, 0x44, 0xca, 0xae, 0x4b, 0x1d, 0x39, 0x22, 0x25, 0x46, 0x3b, 0xf9, 0x24, 0x8c, + 0xd4, 0xda, 0x1d, 0xea, 0xb8, 0xb6, 0xa5, 0x7b, 0xb6, 0x23, 0x62, 0x3d, 0x60, 0x54, 0x06, 0x53, + 0x82, 0xcb, 0x51, 0x19, 0x64, 0x7a, 0x72, 0xd5, 0x4f, 0xec, 0x58, 0xc0, 0x30, 0xc2, 0xf8, 0xa6, + 0x1a, 0x13, 0x3b, 0x4a, 0x25, 0x38, 0x05, 0x23, 0xbd, 0xe3, 0xea, 0xf8, 0xc0, 0x37, 0x20, 0xed, + 0x32, 0x80, 0x4c, 0x8a, 0x14, 0xe4, 0x79, 0x28, 0xe1, 0xc8, 0x70, 0x31, 0x61, 0xab, 0x88, 0x93, + 0xd9, 0x42, 0x88, 0x1c, 0x91, 0x83, 0xd3, 0x90, 0xdb, 0x30, 0x1e, 0x7a, 0x7b, 0xdc, 0x74, 0xec, + 0x6e, 0xc7, 0x4f, 0xd1, 0x54, 0xde, 0xda, 0x2c, 0x3f, 0xf1, 0x20, 0xc0, 0x35, 0x56, 0x11, 0x29, + 0xb1, 0x48, 0x14, 0x24, 0xb3, 0x70, 0x22, 0x84, 0x31, 0x11, 0xf9, 0xa9, 0xe1, 0x30, 0x2d, 0xaf, + 0xc4, 0x8b, 0x89, 0x33, 0x92, 0x96, 0x37, 0x56, 0x8c, 0xd4, 0x60, 0xc0, 0x0f, 0x92, 0x39, 0xb8, + 0xad, 0x92, 0x9e, 0x12, 0x41, 0x32, 0x07, 0xe4, 0xf0, 0x98, 0x7e, 0x79, 0x32, 0x03, 0x63, 0x9a, + 0xdd, 0xf5, 0xe8, 0xb2, 0x2d, 0x8e, 0x49, 0x44, 0x30, 0x56, 0x6c, 0x93, 0xc3, 0x30, 0x0d, 0xcf, + 0x6e, 0x34, 0x39, 0x4e, 0x6a, 0x53, 0xac, 0x14, 0x59, 0x80, 0x93, 0x09, 0xbf, 0x18, 0x7c, 0x0f, + 0x3c, 0xc4, 0xc3, 0x1d, 0x4a, 0x9f, 0x97, 0x64, 0x96, 0x2c, 0x4a, 0x7e, 0x38, 0x07, 0xa5, 0x65, + 0x47, 0x37, 0x3d, 0x57, 0xbc, 0x0d, 0x3e, 0x33, 0xb1, 0xee, 0xe8, 0x1d, 0xa6, 0x1f, 0x13, 0x18, + 0x27, 0xfa, 0xae, 0xde, 0xea, 0x52, 0x77, 0xf2, 0x1e, 0xfb, 0xba, 0xff, 0x71, 0xb3, 0xfc, 0x06, + 0x8f, 0xaa, 0x32, 0xd1, 0xb4, 0xdb, 0xd7, 0x56, 0x1d, 0xfd, 0xa1, 0xe9, 0xe1, 0x1e, 0x47, 0x6f, + 0x5d, 0xf3, 0x68, 0x0b, 0x0f, 0xf9, 0xaf, 0xe9, 0x1d, 0xf3, 0x1a, 0xe6, 0x23, 0xb8, 0x16, 0x70, + 0xe2, 0x35, 0x30, 0x15, 0xf0, 0xf0, 0x2f, 0x59, 0x05, 0x38, 0x8e, 0x2c, 0x00, 0x88, 0x4f, 0xad, + 0x74, 0x3a, 0xe2, 0xa1, 0xb1, 0x74, 0x34, 0xee, 0x63, 0xb8, 0x62, 0x07, 0x02, 0xd3, 0x3b, 0x52, + 0x0c, 0x6e, 0x4d, 0xe2, 0xc0, 0xb4, 0x60, 0x59, 0xb4, 0xc8, 0x17, 0xd3, 0x68, 0x28, 0x71, 0xbf, + 0xb1, 0x29, 0x42, 0x8a, 0x17, 0x23, 0x2b, 0x70, 0x42, 0xf0, 0x0d, 0x32, 0xf6, 0x8c, 0x45, 0x67, + 0x85, 0x18, 0x9a, 0x2b, 0x6d, 0xd0, 0x46, 0x43, 0x80, 0xe5, 0x3a, 0x62, 0x25, 0xc8, 0x64, 0x98, + 0x61, 0x7c, 0x41, 0x6f, 0x53, 0x57, 0x39, 0x81, 0x1a, 0x7b, 0x71, 0x6b, 0xb3, 0xac, 0xf8, 0xe5, + 0x31, 0x5e, 0xac, 0x2c, 0xba, 0x68, 0x11, 0x99, 0x07, 0xd7, 0xfa, 0xf1, 0x14, 0x1e, 0x71, 0x9d, + 0x8f, 0x16, 0x21, 0x53, 0x30, 0x1a, 0xbc, 0x73, 0xba, 0x73, 0xa7, 0x56, 0xc5, 0x97, 0xcc, 0x22, + 0x64, 0x70, 0x2c, 0xa7, 0x8e, 0xcc, 0x24, 0x52, 0x46, 0x8a, 0x3c, 0xc3, 0x9f, 0x36, 0xc7, 0x22, + 0xcf, 0x74, 0x52, 0x22, 0xcf, 0x2c, 0x91, 0xb7, 0x60, 0xb8, 0x72, 0xaf, 0x2e, 0x22, 0xea, 0xb8, + 0xca, 0xa9, 0x30, 0x41, 0x9b, 0xbe, 0xee, 0x36, 0xfc, 0xe8, 0x3b, 0x72, 0xd3, 0x65, 0x7a, 0x32, + 0x0d, 0x63, 0x91, 0x45, 0xd3, 0x55, 0x4e, 0x23, 0x07, 0x6c, 0xb9, 0x8e, 0x98, 0x86, 0x23, 0x50, + 0xf2, 0xf0, 0x8a, 0x16, 0x62, 0x5a, 0x53, 0x35, 0x5d, 0x4c, 0x76, 0xa5, 0x51, 0x0c, 0xde, 0x83, + 0xef, 0xa2, 0x07, 0xb9, 0xd6, 0x18, 0x02, 0xd5, 0x70, 0x38, 0x4e, 0xee, 0xd1, 0x58, 0x31, 0xf2, + 0x1e, 0x10, 0x4c, 0x8f, 0x45, 0x0d, 0xff, 0xe6, 0xbc, 0x56, 0x75, 0x95, 0xb3, 0x18, 0x2f, 0x9f, + 0xc4, 0xe3, 0x79, 0xd4, 0xaa, 0x93, 0x97, 0xc5, 0xf4, 0xf1, 0xa4, 0xce, 0x4b, 0x35, 0xfc, 0x58, + 0x1e, 0x0d, 0x33, 0x92, 0x3b, 0x3c, 0x85, 0x2b, 0x59, 0x87, 0x73, 0x4b, 0x0e, 0x7d, 0x68, 0xda, + 0x5d, 0xd7, 0x5f, 0x3e, 0xfc, 0x79, 0xeb, 0xdc, 0xb6, 0xf3, 0xd6, 0xd3, 0xa2, 0xe2, 0x33, 0x1d, + 0x87, 0x3e, 0x6c, 0xf8, 0x51, 0xd2, 0x23, 0x41, 0x7e, 0xb3, 0xb8, 0x63, 0x06, 0xf4, 0xf7, 0xbb, + 0x0e, 0x15, 0x70, 0x93, 0xba, 0x8a, 0x12, 0x4e, 0xb5, 0x3c, 0xb0, 0x93, 0x19, 0xe0, 0x22, 0x19, + 0xd0, 0xa3, 0xc5, 0x88, 0x06, 0xe4, 0xe6, 0x94, 0xef, 0x45, 0x51, 0x69, 0xf2, 0x3c, 0xd1, 0xca, + 0x79, 0x64, 0xa6, 0x32, 0xb1, 0xac, 0x36, 0x83, 0x8c, 0x09, 0x0d, 0x5d, 0xe0, 0x65, 0xb1, 0x24, + 0x4b, 0x93, 0x39, 0x18, 0x5f, 0x72, 0xf0, 0x4c, 0xf7, 0x36, 0xdd, 0x58, 0xb2, 0x5b, 0x66, 0x73, + 0x03, 0x9f, 0x67, 0x8b, 0xa9, 0xb2, 0xc3, 0x71, 0x8d, 0x07, 0x74, 0xa3, 0xd1, 0x41, 0xac, 0xbc, + 0xac, 0xc4, 0x4b, 0xca, 0x11, 0xcc, 0x9f, 0xd8, 0x59, 0x04, 0x73, 0x0a, 0xe3, 0xc2, 0x07, 0xe3, + 0x91, 0x47, 0x2d, 0xb6, 0xd4, 0xbb, 0xe2, 0x29, 0xb6, 0x12, 0xf3, 0xd9, 0x08, 0xf0, 0x7c, 0xea, + 0x10, 0xa3, 0x8c, 0x06, 0x60, 0xb9, 0x61, 0xf1, 0x22, 0xc9, 0x30, 0xdf, 0x97, 0xf6, 0x10, 0xe6, + 0xfb, 0xff, 0x2c, 0xc8, 0xf3, 0x2f, 0xb9, 0x08, 0x45, 0x29, 0x0b, 0x17, 0xc6, 0x30, 0xc6, 0x8c, + 0x05, 0x45, 0x11, 0x9a, 0x7d, 0x48, 0xd8, 0x2e, 0x41, 0x6c, 0x29, 0x4c, 0xbb, 0x1a, 0xc6, 0xb5, + 0xd5, 0x42, 0x02, 0x4c, 0x79, 0xd9, 0x5d, 0x69, 0x99, 0x4d, 0xcc, 0x63, 0x51, 0x90, 0xe2, 0xbd, + 0x20, 0x94, 0xa7, 0xb1, 0x90, 0x48, 0xc8, 0x75, 0x18, 0xf6, 0xef, 0x12, 0xc2, 0x18, 0xde, 0x98, + 0xde, 0x40, 0xcc, 0xd6, 0x22, 0x7b, 0x82, 0x44, 0x44, 0x5e, 0x07, 0x08, 0xa7, 0x03, 0x61, 0x69, + 0xe1, 0x52, 0x21, 0xcf, 0x1e, 0xf2, 0x52, 0x11, 0x52, 0xb3, 0x89, 0x53, 0x56, 0x47, 0x3f, 0xc9, + 0x2f, 0x4e, 0x9c, 0x11, 0x1d, 0x96, 0x15, 0x24, 0x5a, 0x84, 0x2c, 0xc2, 0xc9, 0x84, 0x06, 0x8a, + 0x88, 0xdf, 0x4f, 0x6f, 0x6d, 0x96, 0x2f, 0xa5, 0xa8, 0xaf, 0xbc, 0x30, 0x27, 0xca, 0x92, 0x67, + 0xa0, 0x70, 0x47, 0xab, 0x89, 0xa8, 0xc3, 0x3c, 0x60, 0x75, 0x24, 0x82, 0x18, 0xc3, 0x92, 0xd7, + 0x00, 0x78, 0x56, 0x9f, 0x25, 0xdb, 0xf1, 0xd0, 0xa2, 0x18, 0x9d, 0x3c, 0xcf, 0xc6, 0x32, 0xcf, + 0xfa, 0xd3, 0x60, 0xcb, 0x98, 0xfc, 0xd1, 0x21, 0xb1, 0xfa, 0xa7, 0xf3, 0x89, 0x65, 0x8d, 0x09, + 0x5e, 0xb4, 0x42, 0xea, 0x7c, 0x14, 0xbc, 0xdf, 0x74, 0x2e, 0x78, 0x89, 0x88, 0x5c, 0x81, 0xc1, + 0x25, 0x36, 0xa9, 0x34, 0xed, 0x96, 0x50, 0x05, 0x0c, 0x3d, 0xd7, 0x11, 0x30, 0x2d, 0xc0, 0x92, + 0xeb, 0x52, 0x5a, 0x6b, 0x29, 0x07, 0x80, 0x9f, 0xd6, 0x3a, 0x1e, 0x0c, 0x1f, 0x13, 0x5c, 0x5f, + 0x8f, 0xa5, 0xc9, 0x13, 0x65, 0x52, 0x96, 0xd4, 0x30, 0x2d, 0x5e, 0x60, 0xd0, 0xf6, 0x6f, 0x67, + 0xd0, 0xaa, 0xbf, 0x99, 0x4b, 0x0e, 0x51, 0x72, 0x23, 0x19, 0x8e, 0x1b, 0xd7, 0xaf, 0x00, 0x28, + 0xd7, 0x1a, 0x04, 0xe6, 0x8e, 0x04, 0xd6, 0xce, 0xef, 0x39, 0xb0, 0x76, 0x61, 0x97, 0x81, 0xb5, + 0xd5, 0xff, 0xaf, 0xd8, 0xf3, 0xb9, 0xc1, 0xa1, 0x04, 0x60, 0x7c, 0x8d, 0x6d, 0xca, 0x58, 0xed, + 0x15, 0x37, 0xb1, 0xb5, 0xe0, 0xde, 0xd4, 0x0d, 0x9d, 0x8f, 0x4a, 0x57, 0x8b, 0x52, 0x92, 0xb7, + 0x61, 0xc4, 0xff, 0x00, 0x0c, 0xd8, 0x2e, 0x05, 0x1a, 0x0f, 0x16, 0xc4, 0x58, 0x68, 0xf3, 0x48, + 0x01, 0xf2, 0x32, 0x0c, 0xa1, 0x39, 0xd4, 0xd1, 0x9b, 0x7e, 0x34, 0x7f, 0x1e, 0xfe, 0xdf, 0x07, + 0xca, 0x41, 0x06, 0x03, 0x4a, 0xf2, 0x39, 0x28, 0x89, 0x94, 0x36, 0x25, 0x5c, 0xa2, 0xaf, 0xed, + 0xe0, 0x7d, 0xc6, 0x84, 0x9c, 0xce, 0x86, 0x6f, 0x70, 0x10, 0x10, 0xd9, 0xe0, 0xf0, 0x4c, 0x36, + 0xcb, 0x70, 0x6a, 0xc9, 0xa1, 0x06, 0xbe, 0x04, 0x9a, 0x7e, 0xd4, 0x71, 0x44, 0xb2, 0x21, 0x3e, + 0x41, 0xe0, 0xfa, 0xd6, 0xf1, 0xd1, 0x6c, 0xe5, 0x15, 0x78, 0x39, 0xa4, 0x78, 0x4a, 0x71, 0x66, + 0xf4, 0xf0, 0x96, 0xdc, 0xa6, 0x1b, 0xeb, 0xb6, 0x63, 0xf0, 0x7c, 0x3c, 0x62, 0xea, 0x17, 0x82, + 0x7e, 0x20, 0x50, 0xb2, 0xd1, 0x13, 0x2d, 0x74, 0xe1, 0x35, 0x18, 0xde, 0x6b, 0x4a, 0x98, 0x5f, + 0xcc, 0x67, 0x3c, 0xdc, 0x7b, 0x7c, 0xb3, 0x72, 0x06, 0xa9, 0xe2, 0xfb, 0x33, 0x52, 0xc5, 0xff, + 0x71, 0x3e, 0xe3, 0x55, 0xe2, 0x63, 0x9d, 0xd2, 0x39, 0x10, 0x46, 0x34, 0xa5, 0x73, 0x98, 0x4d, + 0xdb, 0x34, 0x34, 0x99, 0x28, 0x96, 0xfc, 0xbd, 0xb4, 0x6d, 0xf2, 0xf7, 0x9f, 0x2d, 0xf4, 0x7a, + 0xb5, 0x79, 0x2c, 0xfb, 0xdd, 0xc8, 0xfe, 0x3a, 0x0c, 0x07, 0x92, 0xad, 0x55, 0xd1, 0x5e, 0x1a, + 0x0d, 0x12, 0x50, 0x71, 0x30, 0x96, 0x91, 0x88, 0xc8, 0x55, 0xde, 0xd6, 0xba, 0xf9, 0x3e, 0x4f, + 0x85, 0x32, 0x2a, 0x92, 0x5c, 0xe8, 0x9e, 0xde, 0x70, 0xcd, 0xf7, 0xa9, 0x16, 0xa0, 0x31, 0xca, + 0x6d, 0xda, 0x03, 0xd6, 0xe3, 0x3e, 0xda, 0x79, 0x1f, 0xa5, 0x08, 0x91, 0x3f, 0xda, 0x3d, 0x16, + 0xe2, 0x2e, 0x84, 0xf8, 0x47, 0xf9, 0xd4, 0x27, 0xce, 0xc7, 0x42, 0xdc, 0xcd, 0x6c, 0xf1, 0x3c, + 0x0c, 0x69, 0xf6, 0xba, 0x3b, 0x85, 0x7b, 0x22, 0x3e, 0x57, 0xe0, 0x44, 0xed, 0xd8, 0xeb, 0x6e, + 0x03, 0x77, 0x3b, 0x5a, 0x48, 0xa0, 0x7e, 0x37, 0xdf, 0xe3, 0x11, 0xf8, 0xb1, 0xe0, 0x3f, 0xc8, + 0x25, 0xf2, 0x57, 0xf2, 0x91, 0x47, 0xe6, 0x8f, 0xaf, 0xb0, 0xaf, 0x01, 0xd4, 0x9b, 0x6b, 0xb4, + 0xad, 0x4b, 0xe9, 0xe4, 0xf0, 0xc8, 0xc2, 0x45, 0xa8, 0x48, 0x43, 0x1e, 0x92, 0xa8, 0xdf, 0xc8, + 0xc7, 0x5e, 0xd9, 0x1f, 0xcb, 0x6e, 0xc7, 0xb2, 0x0b, 0xb4, 0x4e, 0x04, 0x0e, 0x38, 0x96, 0xdc, + 0x4e, 0x25, 0xf7, 0x23, 0xf9, 0x58, 0x8c, 0x85, 0xc7, 0x56, 0x76, 0x6c, 0x00, 0x26, 0x63, 0x3f, + 0x3c, 0xb6, 0x9a, 0xf4, 0x3c, 0x0c, 0x09, 0x39, 0x04, 0x4b, 0x05, 0x9f, 0xf7, 0x39, 0x10, 0x0f, + 0x68, 0x03, 0x02, 0xf5, 0xcf, 0xe6, 0x21, 0x1a, 0xfb, 0xe2, 0x31, 0xd5, 0xa1, 0x5f, 0xc9, 0x47, + 0xa3, 0x7e, 0x3c, 0xbe, 0xfa, 0x33, 0x01, 0x50, 0xef, 0xae, 0x34, 0x85, 0x6f, 0x4d, 0xbf, 0x74, + 0xc2, 0x1f, 0x40, 0x35, 0x89, 0x42, 0xfd, 0xb7, 0xf9, 0xd4, 0x50, 0x24, 0x8f, 0xaf, 0x00, 0x5f, + 0xc2, 0x53, 0xf1, 0xa6, 0x15, 0x4e, 0xe4, 0x78, 0x08, 0xc9, 0xc6, 0x5f, 0x22, 0x07, 0xa9, 0x4f, + 0x48, 0x3e, 0x91, 0x62, 0xae, 0x61, 0x86, 0x94, 0xd0, 0x5c, 0x93, 0x0f, 0xf3, 0x25, 0xc3, 0xed, + 0x77, 0xf2, 0xdb, 0x45, 0x6e, 0x79, 0x9c, 0x57, 0xd5, 0x81, 0x25, 0x7d, 0x03, 0x23, 0x8c, 0xb2, + 0x9e, 0x18, 0xe1, 0x19, 0x32, 0x3b, 0x1c, 0x24, 0x5f, 0xdb, 0x09, 0x2a, 0xf5, 0x5f, 0xf6, 0xa7, + 0x87, 0x0d, 0x79, 0x7c, 0x45, 0x78, 0x11, 0x8a, 0x4b, 0xba, 0xb7, 0x26, 0x34, 0x19, 0x6f, 0x03, + 0x3b, 0xba, 0xb7, 0xa6, 0x21, 0x94, 0x5c, 0x85, 0x41, 0x4d, 0x5f, 0xe7, 0x67, 0x9e, 0xa5, 0x30, + 0x7b, 0xa9, 0xa3, 0xaf, 0x37, 0xf8, 0xb9, 0x67, 0x80, 0x26, 0x6a, 0x90, 0x3d, 0x97, 0x9f, 0x7c, + 0x63, 0xea, 0x46, 0x9e, 0x3d, 0x37, 0xc8, 0x99, 0x7b, 0x11, 0x8a, 0x93, 0xb6, 0xb1, 0x81, 0x37, + 0x5f, 0x23, 0xbc, 0xb2, 0x15, 0xdb, 0xd8, 0xd0, 0x10, 0x4a, 0x7e, 0x34, 0x07, 0x03, 0xb3, 0x54, + 0x37, 0xd8, 0x08, 0x19, 0xea, 0xe5, 0xb0, 0xf2, 0xe9, 0x83, 0x71, 0x58, 0x39, 0xb9, 0xc6, 0x2b, + 0x93, 0x15, 0x45, 0xd4, 0x4f, 0x6e, 0xc2, 0xe0, 0x94, 0xee, 0xd1, 0x55, 0xdb, 0xd9, 0x40, 0x17, + 0x9c, 0xb1, 0xf0, 0xe9, 0x49, 0x44, 0x7f, 0x7c, 0x22, 0x7e, 0x33, 0xd6, 0x14, 0xbf, 0xb4, 0xa0, + 0x30, 0x13, 0x0b, 0xbf, 0x99, 0x13, 0x99, 0xe2, 0x51, 0x2c, 0xfc, 0x0a, 0x4f, 0x13, 0x98, 0xf0, + 0x58, 0x79, 0x24, 0xfd, 0x58, 0x19, 0xad, 0x47, 0x74, 0xd3, 0xc3, 0x9c, 0xb5, 0xa3, 0xb8, 0xe8, + 0x73, 0xeb, 0x11, 0xa1, 0x98, 0xb2, 0x56, 0x93, 0x48, 0xd4, 0xef, 0xf4, 0x43, 0x6a, 0x90, 0x81, + 0x63, 0x25, 0x3f, 0x56, 0xf2, 0x50, 0xc9, 0xab, 0x09, 0x25, 0xbf, 0x90, 0x0c, 0x5b, 0xf1, 0x21, + 0xd5, 0xf0, 0xaf, 0x16, 0x13, 0x41, 0x6f, 0x1e, 0xef, 0xdd, 0x65, 0x28, 0xbd, 0xfe, 0x6d, 0xa5, + 0x17, 0x0c, 0x88, 0xd2, 0xb6, 0x03, 0x62, 0x60, 0xa7, 0x03, 0x62, 0x30, 0x73, 0x40, 0x84, 0x0a, + 0x32, 0x94, 0xa9, 0x20, 0x35, 0x31, 0x68, 0xa0, 0x77, 0xee, 0x9d, 0x8b, 0x5b, 0x9b, 0xe5, 0x31, + 0x36, 0x9a, 0x52, 0x93, 0xee, 0x20, 0x0b, 0xf5, 0x77, 0x8b, 0x3d, 0x22, 0x55, 0x1d, 0x8a, 0x8e, + 0xbc, 0x04, 0x85, 0x4a, 0xa7, 0x23, 0xf4, 0xe3, 0x94, 0x14, 0x24, 0x2b, 0xa3, 0x14, 0xa3, 0x26, + 0xaf, 0x43, 0xa1, 0x72, 0xaf, 0x1e, 0xcf, 0xb7, 0x53, 0xb9, 0x57, 0x17, 0x5f, 0x92, 0x59, 0xf6, + 0x5e, 0x9d, 0xbc, 0x19, 0x06, 0xbe, 0x5d, 0xeb, 0x5a, 0x0f, 0xc4, 0x46, 0x51, 0x78, 0xea, 0xfa, + 0x9e, 0x3c, 0x4d, 0x86, 0x62, 0xdb, 0xc5, 0x18, 0x6d, 0x4c, 0x9b, 0x4a, 0x3b, 0xd7, 0xa6, 0x81, + 0x6d, 0xb5, 0x69, 0x70, 0xa7, 0xda, 0x34, 0xb4, 0x03, 0x6d, 0x82, 0x6d, 0xb5, 0x69, 0x78, 0xff, + 0xda, 0xd4, 0x81, 0x0b, 0xc9, 0xe8, 0x82, 0x81, 0x46, 0x68, 0x40, 0x92, 0x58, 0xe1, 0x58, 0x82, + 0x57, 0xff, 0x5d, 0x8e, 0x6d, 0xac, 0x23, 0xba, 0xe1, 0x32, 0xbc, 0xec, 0xda, 0x96, 0x2c, 0xad, + 0xfe, 0x62, 0x3e, 0x3b, 0x28, 0xe2, 0xd1, 0x9c, 0xe2, 0xbe, 0x3f, 0x55, 0x4a, 0xc5, 0xd8, 0x73, + 0x8c, 0x4c, 0x29, 0xc7, 0xd8, 0xa6, 0xc9, 0xec, 0xeb, 0xf9, 0xac, 0x48, 0x8d, 0xfb, 0x92, 0xd8, + 0xb3, 0x49, 0x67, 0x38, 0x74, 0xf1, 0x77, 0xa3, 0x5e, 0x70, 0x33, 0x30, 0x22, 0x0b, 0x51, 0x48, + 0x69, 0x27, 0x02, 0x8e, 0x94, 0x23, 0x6f, 0x06, 0x69, 0x91, 0x24, 0xff, 0x18, 0xf4, 0x74, 0xf3, + 0xc7, 0x6c, 0xcc, 0x3d, 0x46, 0x26, 0x27, 0xcf, 0x43, 0x69, 0x06, 0xf3, 0x0c, 0xc8, 0x83, 0x9d, + 0x67, 0x1e, 0x90, 0xbd, 0x56, 0x38, 0x8d, 0xfa, 0x9b, 0x39, 0x38, 0x75, 0xbb, 0xbb, 0x42, 0x85, + 0xa3, 0x5d, 0xd0, 0x86, 0xf7, 0x00, 0x18, 0x58, 0x38, 0xcc, 0xe4, 0xd0, 0x61, 0xe6, 0x63, 0x72, + 0x44, 0xc7, 0x58, 0x81, 0x89, 0x90, 0x9a, 0x3b, 0xcb, 0x5c, 0xf2, 0x7d, 0x4e, 0x1f, 0x74, 0x57, + 0x68, 0x23, 0xe1, 0x35, 0x23, 0x71, 0xbf, 0xf0, 0x16, 0xf7, 0xe6, 0xdf, 0xab, 0x83, 0xca, 0x2f, + 0xe4, 0x33, 0x83, 0x68, 0x1e, 0xd9, 0xdc, 0xb4, 0x9f, 0x4d, 0xed, 0x95, 0x78, 0x8e, 0xda, 0x14, + 0x92, 0x18, 0xc7, 0x34, 0x2e, 0xe9, 0x02, 0x3b, 0xe2, 0x19, 0x93, 0x3f, 0x50, 0x81, 0xfd, 0x41, + 0x2e, 0x33, 0xd8, 0xe9, 0x51, 0x15, 0x98, 0xfa, 0xbf, 0x15, 0xfc, 0x18, 0xab, 0xfb, 0xfa, 0x84, + 0xe7, 0x61, 0x48, 0x3c, 0xbb, 0x8b, 0xfa, 0x09, 0x8b, 0x63, 0x43, 0x3c, 0x86, 0x0e, 0x08, 0x98, + 0x49, 0x21, 0x39, 0x31, 0x4b, 0x7e, 0xc2, 0x92, 0x03, 0xb3, 0x26, 0x91, 0x30, 0xa3, 0x61, 0xfa, + 0x91, 0xe9, 0xa1, 0x05, 0xc2, 0xfa, 0xb2, 0xc0, 0x8d, 0x06, 0xfa, 0xc8, 0xf4, 0xb8, 0xfd, 0x11, + 0xa0, 0x99, 0x41, 0xc0, 0x6d, 0x11, 0x31, 0xef, 0xa1, 0x41, 0xc0, 0x4d, 0x15, 0x4d, 0x60, 0x58, + 0x6b, 0x85, 0xf3, 0xad, 0x70, 0x69, 0x11, 0xad, 0x15, 0xee, 0xba, 0xd8, 0xda, 0x80, 0x80, 0x71, + 0xd4, 0xe8, 0x6a, 0xe8, 0xc4, 0x87, 0x1c, 0x1d, 0x84, 0x68, 0x02, 0x43, 0xae, 0xc3, 0x58, 0xdd, + 0xd3, 0x2d, 0x43, 0x77, 0x8c, 0xc5, 0xae, 0xd7, 0xe9, 0x7a, 0xb2, 0x01, 0xec, 0x7a, 0x86, 0xdd, + 0xf5, 0xb4, 0x18, 0x05, 0xf9, 0x38, 0x8c, 0xfa, 0x90, 0x69, 0xc7, 0xb1, 0x1d, 0xd9, 0xca, 0x71, + 0x3d, 0x83, 0x3a, 0x8e, 0x16, 0x25, 0x20, 0x9f, 0x80, 0xd1, 0x9a, 0xf5, 0xd0, 0x6e, 0xf2, 0x70, + 0x0b, 0xda, 0x9c, 0xb0, 0x79, 0xf0, 0xc5, 0x98, 0x19, 0x20, 0x1a, 0x5d, 0xa7, 0xa5, 0x45, 0x09, + 0xd5, 0xad, 0x7c, 0x32, 0x14, 0xed, 0xe3, 0xbb, 0x41, 0xba, 0x1a, 0x75, 0xdc, 0x43, 0x6f, 0x55, + 0x34, 0x3e, 0x65, 0xbf, 0x61, 0x6e, 0x83, 0x5e, 0x87, 0xc1, 0xdb, 0x74, 0x83, 0xfb, 0x98, 0x96, + 0x42, 0xb7, 0xe4, 0x07, 0x02, 0x26, 0x9f, 0xee, 0xfa, 0x74, 0xea, 0x37, 0xf3, 0xc9, 0x20, 0xbb, + 0x8f, 0xaf, 0xb0, 0x3f, 0x0e, 0x03, 0x28, 0xca, 0x9a, 0x7f, 0xbd, 0x80, 0x02, 0x44, 0x71, 0x47, + 0xbd, 0x9d, 0x7d, 0x32, 0xf5, 0x67, 0x4a, 0xf1, 0xc8, 0xcb, 0x8f, 0xaf, 0xf4, 0xde, 0x80, 0xe1, + 0x29, 0xdb, 0x72, 0x4d, 0xd7, 0xa3, 0x56, 0xd3, 0x57, 0x58, 0x74, 0xfc, 0x6f, 0x86, 0x60, 0xd9, + 0x06, 0x94, 0xa8, 0xf7, 0xa2, 0xbc, 0xe4, 0x15, 0x18, 0x42, 0x91, 0xa3, 0xcd, 0xc9, 0x27, 0x3c, + 0xbc, 0x99, 0x58, 0x61, 0xc0, 0xb8, 0xc5, 0x19, 0x92, 0x92, 0x3b, 0x30, 0x38, 0xb5, 0x66, 0xb6, + 0x0c, 0x87, 0x5a, 0xe8, 0x9b, 0x2c, 0x05, 0xb8, 0x89, 0xf6, 0xe5, 0x04, 0xfe, 0x8b, 0xb4, 0xbc, + 0x39, 0x4d, 0x51, 0x2c, 0xf2, 0x58, 0x4c, 0xc0, 0x2e, 0xfc, 0x44, 0x1e, 0x20, 0x2c, 0x40, 0x9e, + 0x82, 0x7c, 0x90, 0x19, 0x1d, 0x5d, 0x62, 0x22, 0x1a, 0x94, 0xc7, 0xa5, 0x42, 0x8c, 0xed, 0xfc, + 0xb6, 0x63, 0xfb, 0x0e, 0x94, 0xf8, 0xe9, 0x1a, 0x7a, 0xad, 0x4b, 0xc1, 0x60, 0x33, 0x1b, 0x3c, + 0x81, 0xf4, 0xdc, 0x96, 0x46, 0xcb, 0x33, 0xe2, 0x01, 0xce, 0x99, 0x5d, 0x68, 0x42, 0x3f, 0xfe, + 0x45, 0x2e, 0x43, 0x71, 0xd9, 0x4f, 0x7c, 0x3c, 0xca, 0x67, 0xe9, 0x98, 0xfc, 0x10, 0xcf, 0xba, + 0x69, 0xca, 0xb6, 0x3c, 0x56, 0x35, 0xb6, 0x7a, 0x44, 0xc8, 0x45, 0xc0, 0x22, 0x72, 0x11, 0x30, + 0xf5, 0x1f, 0xe5, 0x53, 0x62, 0x82, 0x3f, 0xbe, 0xc3, 0xe4, 0x35, 0x00, 0x7c, 0x79, 0xce, 0xe4, + 0xe9, 0x3f, 0x07, 0xc1, 0x51, 0x82, 0x8c, 0x50, 0x6d, 0x23, 0xdb, 0x8e, 0x90, 0x58, 0xfd, 0xed, + 0x5c, 0x22, 0x90, 0xf4, 0xbe, 0xe4, 0x28, 0x5b, 0x65, 0xf9, 0x3d, 0x9a, 0xb1, 0x7e, 0x5f, 0x14, + 0x76, 0xd7, 0x17, 0xd1, 0x6f, 0x39, 0x00, 0xcb, 0xf4, 0x30, 0xbf, 0xe5, 0x3b, 0xf9, 0xb4, 0xb0, + 0xda, 0x47, 0x53, 0xc5, 0x6f, 0x04, 0x46, 0x69, 0x31, 0x96, 0xc8, 0x00, 0xa1, 0xf1, 0xe4, 0xec, + 0xc2, 0x4c, 0xfd, 0x3c, 0x9c, 0x88, 0x05, 0x9b, 0x16, 0x79, 0xb2, 0x2f, 0xf7, 0x8e, 0x5a, 0x9d, + 0x1d, 0xb3, 0x20, 0x42, 0xa6, 0xfe, 0xff, 0xb9, 0xde, 0xa1, 0xc6, 0x0f, 0x5d, 0x75, 0x52, 0x04, + 0x50, 0xf8, 0x93, 0x11, 0xc0, 0x01, 0x6c, 0x83, 0x8f, 0xb6, 0x00, 0x3e, 0x24, 0x93, 0xc7, 0x07, + 0x2d, 0x80, 0x9f, 0xc9, 0x6d, 0x1b, 0x29, 0xfe, 0xb0, 0x65, 0xa0, 0xfe, 0xcf, 0xb9, 0xd4, 0x88, + 0xee, 0xfb, 0x6a, 0xd7, 0x9b, 0x50, 0xe2, 0x2e, 0x3c, 0xa2, 0x55, 0x52, 0x0e, 0x3c, 0x06, 0xcd, + 0x28, 0x2f, 0xca, 0x90, 0x39, 0x18, 0xe0, 0x6d, 0x30, 0x44, 0x6f, 0x7c, 0xa4, 0x47, 0x58, 0x79, + 0x23, 0x6b, 0x72, 0x14, 0x68, 0xf5, 0xb7, 0x72, 0x89, 0x00, 0xf3, 0x87, 0xf8, 0x6d, 0xe1, 0x54, + 0x5d, 0xd8, 0xf9, 0x54, 0xad, 0xfe, 0x8b, 0x7c, 0x7a, 0x7c, 0xfb, 0x43, 0xfc, 0x90, 0x83, 0x38, + 0x4e, 0xdb, 0xdb, 0xba, 0xb5, 0x0c, 0x63, 0x51, 0x59, 0x88, 0x65, 0xeb, 0xc9, 0xf4, 0x28, 0xff, + 0x19, 0xad, 0x88, 0xf1, 0x50, 0xbf, 0x9d, 0x4b, 0x86, 0xe6, 0x3f, 0xf4, 0xf9, 0x69, 0x6f, 0xda, + 0x12, 0xfd, 0x94, 0x0f, 0xc9, 0x5a, 0x73, 0x10, 0x9f, 0xf2, 0x21, 0x59, 0x35, 0xf6, 0xf6, 0x29, + 0x3f, 0x97, 0xcf, 0xca, 0x6c, 0x70, 0xe8, 0x1f, 0xf4, 0x19, 0x59, 0xc8, 0xbc, 0x65, 0xe2, 0xd3, + 0x9e, 0xca, 0x4a, 0x25, 0x90, 0xc1, 0x33, 0xc1, 0x67, 0x6f, 0x63, 0x3c, 0x55, 0x58, 0x1f, 0x12, + 0x45, 0x3e, 0x1a, 0xc2, 0xfa, 0x90, 0x0c, 0x95, 0x0f, 0x9f, 0xb0, 0x7e, 0x2d, 0xbf, 0xd3, 0x74, + 0x1a, 0xc7, 0xc2, 0x4b, 0x08, 0xef, 0xcb, 0xf9, 0x64, 0x9a, 0x97, 0x43, 0x17, 0xd3, 0x0c, 0x94, + 0x44, 0xc2, 0x99, 0x4c, 0xe1, 0x70, 0x7c, 0x96, 0x45, 0x23, 0xbe, 0xe3, 0x06, 0x88, 0x8b, 0x9c, + 0x9d, 0x89, 0x84, 0xd3, 0xaa, 0xdf, 0xcd, 0xc5, 0x72, 0xa2, 0x1c, 0xca, 0x11, 0xc2, 0x9e, 0x96, + 0x24, 0xf2, 0x96, 0x7f, 0x98, 0x59, 0x8c, 0xc5, 0xa4, 0x0f, 0xbe, 0xa7, 0x4a, 0x3d, 0xdd, 0x6c, + 0xc5, 0xcb, 0x8b, 0xf8, 0x03, 0xdf, 0xcc, 0xc3, 0xc9, 0x04, 0x29, 0xb9, 0x1c, 0x89, 0xf8, 0x83, + 0xc7, 0x92, 0x31, 0x47, 0x75, 0x1e, 0xfb, 0x67, 0x17, 0x27, 0xa9, 0x97, 0xa1, 0x58, 0xd5, 0x37, + 0xf8, 0xb7, 0xf5, 0x73, 0x96, 0x86, 0xbe, 0x21, 0x9f, 0xb8, 0x21, 0x9e, 0xac, 0xc0, 0x19, 0x7e, + 0x1f, 0x62, 0xda, 0xd6, 0xb2, 0xd9, 0xa6, 0x35, 0x6b, 0xde, 0x6c, 0xb5, 0x4c, 0x57, 0x5c, 0xea, + 0x3d, 0xbf, 0xb5, 0x59, 0xbe, 0xe2, 0xd9, 0x9e, 0xde, 0x6a, 0x50, 0x9f, 0xac, 0xe1, 0x99, 0x6d, + 0xda, 0x30, 0xad, 0x46, 0x1b, 0x29, 0x25, 0x96, 0xe9, 0xac, 0x48, 0x8d, 0xa7, 0x1f, 0xa8, 0x37, + 0x75, 0xcb, 0xa2, 0x46, 0xcd, 0x9a, 0xdc, 0xf0, 0x28, 0xbf, 0x0c, 0x2c, 0xf0, 0x23, 0x41, 0xfe, + 0x0e, 0x9d, 0xa3, 0x19, 0xe3, 0x15, 0x46, 0xa0, 0xa5, 0x14, 0x52, 0x7f, 0xbd, 0x98, 0x92, 0x0e, + 0xe7, 0x08, 0xa9, 0x8f, 0xdf, 0xd3, 0xc5, 0x6d, 0x7a, 0xfa, 0x1a, 0x0c, 0x88, 0xf8, 0xce, 0xe2, + 0x82, 0x01, 0x1d, 0xe7, 0x1f, 0x72, 0x90, 0x7c, 0x43, 0x23, 0xa8, 0x48, 0x0b, 0x2e, 0x2c, 0xb3, + 0x6e, 0x4a, 0xef, 0xcc, 0xd2, 0x1e, 0x3a, 0xb3, 0x07, 0x3f, 0xf2, 0x2e, 0x9c, 0x43, 0x6c, 0x4a, + 0xb7, 0x0e, 0x60, 0x55, 0x18, 0x4a, 0x8b, 0x57, 0x95, 0xde, 0xb9, 0x59, 0xe5, 0xc9, 0x67, 0x60, + 0x24, 0x18, 0x20, 0x26, 0x75, 0xc5, 0xcd, 0x45, 0x8f, 0x71, 0xc6, 0xe3, 0xd4, 0x31, 0x30, 0xba, + 0xab, 0x45, 0x63, 0x9d, 0x45, 0x78, 0xa9, 0xff, 0x53, 0xae, 0x57, 0x5a, 0x9e, 0x43, 0x9f, 0x95, + 0xdf, 0x82, 0x01, 0x83, 0x7f, 0x94, 0xd0, 0xa9, 0xde, 0x89, 0x7b, 0x38, 0xa9, 0xe6, 0x97, 0x51, + 0xff, 0x79, 0xae, 0x67, 0x36, 0xa0, 0xa3, 0xfe, 0x79, 0x5f, 0x2e, 0x64, 0x7c, 0x9e, 0x98, 0x44, + 0xaf, 0xc2, 0xb8, 0x19, 0xa6, 0x2b, 0x68, 0x84, 0xa1, 0xae, 0xb4, 0x13, 0x12, 0x1c, 0x47, 0xd7, + 0x0d, 0x08, 0x1c, 0xb6, 0x1c, 0xdf, 0x1b, 0xcd, 0x6d, 0x74, 0x1d, 0x93, 0x8f, 0x4b, 0xed, 0xb4, + 0x1b, 0x73, 0x55, 0x73, 0xef, 0x38, 0x26, 0xab, 0x40, 0xf7, 0xd6, 0xa8, 0xa5, 0x37, 0xd6, 0x6d, + 0xe7, 0x01, 0x06, 0x43, 0xe5, 0x83, 0x53, 0x3b, 0xc1, 0xe1, 0xf7, 0x7c, 0x30, 0x79, 0x06, 0x46, + 0x57, 0x5b, 0x5d, 0x1a, 0x84, 0x9f, 0xe4, 0x77, 0x7d, 0xda, 0x08, 0x03, 0x06, 0x37, 0x24, 0x97, + 0x00, 0x90, 0xc8, 0xc3, 0x5c, 0x4d, 0x78, 0xb1, 0xa7, 0x0d, 0x31, 0xc8, 0xb2, 0xe8, 0xae, 0x0b, + 0x5c, 0xab, 0xb9, 0x90, 0x1a, 0x2d, 0xdb, 0x5a, 0x6d, 0x78, 0xd4, 0x69, 0x63, 0x43, 0xd1, 0x99, + 0x41, 0x3b, 0x8b, 0x14, 0x78, 0x75, 0xe2, 0xce, 0xd9, 0xd6, 0xea, 0x32, 0x75, 0xda, 0xac, 0xa9, + 0xcf, 0x03, 0x11, 0x4d, 0x75, 0xf0, 0xd0, 0x83, 0x7f, 0x1c, 0x7a, 0x33, 0x68, 0xe2, 0x23, 0xf8, + 0x69, 0x08, 0x7e, 0x58, 0x19, 0x86, 0x79, 0x0c, 0x3e, 0x2e, 0x34, 0x74, 0x61, 0xd0, 0x80, 0x83, + 0x50, 0x5e, 0x67, 0x41, 0x78, 0x57, 0x70, 0x0f, 0x72, 0x4d, 0xfc, 0x52, 0xbf, 0x58, 0x48, 0x4b, + 0x60, 0xb4, 0x2f, 0x45, 0x0b, 0xa7, 0xd5, 0xfc, 0xae, 0xa6, 0xd5, 0x13, 0x56, 0xb7, 0xdd, 0xd0, + 0x3b, 0x9d, 0xc6, 0x7d, 0xb3, 0x85, 0x4f, 0xb8, 0x70, 0xe1, 0xd3, 0x46, 0xad, 0x6e, 0xbb, 0xd2, + 0xe9, 0xcc, 0x70, 0x20, 0x79, 0x0e, 0x4e, 0x32, 0x3a, 0xec, 0xa4, 0x80, 0xb2, 0x88, 0x94, 0x8c, + 0x01, 0x06, 0xb1, 0xf5, 0x69, 0xcf, 0xc3, 0xa0, 0xe0, 0xc9, 0xd7, 0xaa, 0x7e, 0x6d, 0x80, 0x33, + 0x73, 0x59, 0xcf, 0x05, 0x6c, 0xf8, 0xe4, 0xda, 0xaf, 0x0d, 0xf9, 0xe5, 0x31, 0x54, 0xb3, 0xd5, + 0x6d, 0xf3, 0xe8, 0x5b, 0x03, 0x88, 0x0c, 0x7e, 0x93, 0xcb, 0x30, 0xc6, 0xb8, 0x04, 0x02, 0xe3, + 0xd1, 0x6d, 0xfb, 0xb5, 0x18, 0x94, 0x5c, 0x87, 0xd3, 0x11, 0x08, 0xb7, 0x41, 0xf9, 0x93, 0x84, + 0x7e, 0x2d, 0x15, 0xa7, 0x7e, 0xa3, 0x10, 0x4d, 0xab, 0x74, 0x08, 0x1d, 0x71, 0x0e, 0x06, 0x6c, + 0x67, 0xb5, 0xd1, 0x75, 0x5a, 0x62, 0xec, 0x95, 0x6c, 0x67, 0xf5, 0x8e, 0xd3, 0x22, 0x67, 0xa0, + 0xc4, 0x7a, 0xc7, 0x34, 0xc4, 0x10, 0xeb, 0xd7, 0x3b, 0x9d, 0x9a, 0x41, 0x2a, 0xbc, 0x43, 0x30, + 0x32, 0x6a, 0xa3, 0x89, 0x5b, 0x7b, 0xee, 0x94, 0xd0, 0xcf, 0x57, 0xbc, 0x04, 0x12, 0xfb, 0x09, + 0xe3, 0xa5, 0xf2, 0x83, 0x80, 0x18, 0x0b, 0x03, 0xb7, 0x25, 0x06, 0xef, 0x93, 0x38, 0x0b, 0x81, + 0x0c, 0x59, 0xf0, 0x4d, 0x8c, 0x41, 0xaa, 0x40, 0x42, 0xaa, 0xb6, 0x6d, 0x98, 0xf7, 0x4d, 0xca, + 0x5f, 0x90, 0xf4, 0xf3, 0x8b, 0xdf, 0x24, 0x56, 0x1b, 0xf7, 0x99, 0xcc, 0x0b, 0x08, 0x79, 0x83, + 0x2b, 0x21, 0xa7, 0xc3, 0xb5, 0x8f, 0xf7, 0x2d, 0xb7, 0xd3, 0x62, 0x28, 0xd4, 0x4c, 0x2c, 0x8f, + 0x0b, 0xa1, 0xfa, 0x3f, 0xf4, 0x27, 0x73, 0x6b, 0x1d, 0x8a, 0x5d, 0x33, 0x0b, 0x20, 0x52, 0xe7, + 0x85, 0x97, 0x6b, 0x17, 0xa4, 0x38, 0xf9, 0x02, 0x93, 0xc1, 0x43, 0x2a, 0x4b, 0xae, 0xc2, 0x20, + 0xff, 0xa2, 0x5a, 0x55, 0xd8, 0x3b, 0xe8, 0x22, 0xe6, 0x76, 0xcc, 0xfb, 0xf7, 0xd1, 0x9f, 0x2c, + 0x40, 0x93, 0xcb, 0x30, 0x50, 0x5d, 0xa8, 0xd7, 0x2b, 0x0b, 0xfe, 0x4d, 0x31, 0xbe, 0x65, 0x31, + 0x2c, 0xb7, 0xe1, 0xea, 0x96, 0xab, 0xf9, 0x48, 0xf2, 0x0c, 0x94, 0x6a, 0x4b, 0x48, 0xc6, 0x5f, + 0x68, 0x0e, 0x6f, 0x6d, 0x96, 0x07, 0xcc, 0x0e, 0xa7, 0x12, 0x28, 0xac, 0xf7, 0x6e, 0xad, 0x2a, + 0xb9, 0x4b, 0xf0, 0x7a, 0x1f, 0x9a, 0x06, 0x5e, 0x3b, 0x6b, 0x01, 0x9a, 0xbc, 0x0c, 0x23, 0x75, + 0xea, 0x98, 0x7a, 0x6b, 0xa1, 0x8b, 0x5b, 0x45, 0x29, 0xe2, 0xa3, 0x8b, 0xf0, 0x86, 0x85, 0x08, + 0x2d, 0x42, 0x46, 0x2e, 0x42, 0x71, 0xd6, 0xb4, 0xfc, 0xe7, 0x12, 0xe8, 0x4f, 0xbf, 0x66, 0x5a, + 0x9e, 0x86, 0x50, 0xf2, 0x0c, 0x14, 0x6e, 0x2d, 0xd7, 0x84, 0x27, 0x18, 0xf2, 0x7a, 0xcf, 0x8b, + 0x44, 0x8f, 0xbc, 0xb5, 0x5c, 0x23, 0x2f, 0xc3, 0x10, 0x5b, 0xc4, 0xa8, 0xd5, 0xa4, 0xae, 0x32, + 0x8c, 0x1f, 0xc3, 0x43, 0x16, 0xfa, 0x40, 0xd9, 0xa7, 0x23, 0xa0, 0x24, 0xb7, 0x61, 0x3c, 0x1e, + 0x92, 0x5f, 0x3c, 0xd9, 0x41, 0x8b, 0x6b, 0x5d, 0xe0, 0xd2, 0x82, 0x66, 0x26, 0x0a, 0x12, 0x03, + 0x94, 0x38, 0x8c, 0xed, 0xeb, 0xd0, 0xea, 0xe4, 0xf1, 0x9a, 0xaf, 0x6c, 0x6d, 0x96, 0x3f, 0x92, + 0x60, 0xda, 0x70, 0x04, 0x95, 0xc4, 0x3d, 0x93, 0x93, 0xfa, 0x7f, 0xe5, 0xd3, 0xf3, 0xb5, 0x1d, + 0xc2, 0xec, 0xb4, 0xc7, 0x8b, 0xef, 0xd8, 0x98, 0x28, 0xee, 0x63, 0x4c, 0xdc, 0x87, 0x13, 0x15, + 0xa3, 0x6d, 0x5a, 0x15, 0xfc, 0xe9, 0xce, 0xcf, 0x54, 0x70, 0xb6, 0x93, 0x5e, 0x2f, 0xc6, 0xd0, + 0xe2, 0x7b, 0x78, 0x28, 0x65, 0x86, 0x6a, 0xe8, 0x1c, 0xd7, 0x68, 0xdf, 0xd7, 0x1b, 0x4d, 0x9e, + 0xea, 0x4c, 0x8b, 0x33, 0x55, 0x7f, 0x3c, 0xbf, 0x4d, 0x8a, 0xb9, 0xc7, 0x51, 0xfa, 0xea, 0x57, + 0xf2, 0xbd, 0xb3, 0xfc, 0x3d, 0x96, 0x42, 0xf9, 0xa3, 0x7c, 0x4a, 0xce, 0xbd, 0x7d, 0x49, 0xe2, + 0x2a, 0x0c, 0x72, 0x36, 0x81, 0xe7, 0x31, 0x4e, 0xc0, 0x5c, 0x59, 0x71, 0xe2, 0xf7, 0xd1, 0x64, + 0x01, 0x4e, 0x57, 0xee, 0xdf, 0xa7, 0x4d, 0x2f, 0x0c, 0xaa, 0xbd, 0x10, 0xc6, 0xa8, 0xe5, 0x41, + 0x84, 0x05, 0x3e, 0x0c, 0xca, 0x8d, 0xb1, 0x58, 0x52, 0xcb, 0x91, 0x65, 0x38, 0x1b, 0x87, 0xd7, + 0xf9, 0xae, 0xa5, 0x28, 0xc5, 0x15, 0x4e, 0x70, 0xe4, 0xff, 0x69, 0x19, 0x65, 0xd3, 0x5a, 0x89, + 0xab, 0x4b, 0x7f, 0xaf, 0x56, 0xe2, 0x52, 0x93, 0x5a, 0x4e, 0xfd, 0x66, 0x41, 0x4e, 0x4d, 0xf8, + 0xf8, 0xfa, 0x88, 0xdd, 0x88, 0x78, 0x86, 0xef, 0x74, 0xc8, 0xbc, 0x2c, 0x02, 0xac, 0x18, 0x5d, + 0xc7, 0x77, 0xa2, 0x0c, 0x02, 0x3c, 0x20, 0x50, 0x5e, 0x3a, 0x03, 0x4a, 0x52, 0x83, 0x62, 0xc5, + 0x59, 0xe5, 0x16, 0xf9, 0x76, 0x6f, 0xce, 0x74, 0x67, 0xd5, 0x4d, 0x7f, 0x73, 0xc6, 0x58, 0xa8, + 0x7f, 0x31, 0xdf, 0x23, 0x9b, 0xe0, 0x63, 0x39, 0x89, 0xfc, 0x74, 0x3e, 0x2b, 0x2f, 0xe0, 0x51, + 0xf5, 0x76, 0xfb, 0x80, 0x85, 0x73, 0xb4, 0x5d, 0x01, 0x0f, 0x50, 0x38, 0xbf, 0x9f, 0xcf, 0x4a, + 0x72, 0x78, 0x2c, 0x9c, 0xbd, 0x4d, 0x90, 0xa9, 0x22, 0x7d, 0x8c, 0x6d, 0x6e, 0x59, 0x15, 0xfa, + 0xf7, 0xe8, 0xf1, 0x95, 0x26, 0xd2, 0xe3, 0x21, 0xbc, 0x2f, 0x2d, 0xfd, 0x83, 0x7c, 0x66, 0x32, + 0xcf, 0x63, 0x99, 0x1e, 0xa4, 0x4c, 0x8f, 0x87, 0xfe, 0xbe, 0x86, 0x7e, 0xaa, 0x4c, 0x8f, 0xc7, + 0xfe, 0xbe, 0xf4, 0xf4, 0xf7, 0xf2, 0xe9, 0xe9, 0x6a, 0x0f, 0x41, 0x49, 0x0f, 0xc2, 0x29, 0xd3, + 0xef, 0x86, 0xe2, 0xbe, 0xba, 0xa1, 0x7f, 0x1f, 0x56, 0x54, 0x52, 0xa0, 0x87, 0x36, 0xea, 0xbf, + 0x57, 0x05, 0x7a, 0x00, 0x43, 0xfe, 0x71, 0x16, 0xe8, 0x5f, 0x28, 0x24, 0x53, 0x34, 0x3f, 0xae, + 0x6b, 0x92, 0xb3, 0xc7, 0x35, 0xc9, 0x2f, 0x47, 0xde, 0x86, 0x13, 0xa1, 0x2c, 0xe5, 0xc0, 0x68, + 0x78, 0xe3, 0xd5, 0x64, 0xa8, 0xc6, 0x7b, 0x0c, 0x27, 0x22, 0xf8, 0xc4, 0xa9, 0xd5, 0xef, 0x16, + 0x92, 0x79, 0xae, 0x8f, 0x7b, 0x63, 0x8f, 0xbd, 0x71, 0x07, 0xce, 0x4e, 0x75, 0x1d, 0x87, 0x5a, + 0x5e, 0x7a, 0xa7, 0xe0, 0xe1, 0x7d, 0x93, 0x53, 0x34, 0x92, 0x9d, 0x93, 0x51, 0x98, 0xb1, 0x15, + 0x0f, 0x32, 0xe2, 0x6c, 0x07, 0x42, 0xb6, 0x5d, 0x4e, 0x91, 0xc6, 0x36, 0xbd, 0xb0, 0xfa, 0x3b, + 0xf9, 0x64, 0x66, 0xf2, 0xe3, 0xae, 0xdf, 0x5b, 0xd7, 0xab, 0x5f, 0x2c, 0xc4, 0xb3, 0xb3, 0x1f, + 0x2f, 0x10, 0x7b, 0xef, 0x0e, 0x5f, 0x92, 0x38, 0x6e, 0xa4, 0xaf, 0xf0, 0xe1, 0x59, 0x5f, 0xe1, + 0xe3, 0xd5, 0x5f, 0x28, 0xc6, 0x33, 0xdd, 0x1f, 0x77, 0xc7, 0xe1, 0x75, 0x07, 0x59, 0x84, 0xd3, + 0x62, 0x6e, 0xf3, 0x41, 0x98, 0x21, 0x43, 0xcc, 0x5f, 0x3c, 0xd1, 0x9e, 0x98, 0x16, 0xbb, 0x2e, + 0x75, 0x1a, 0x9e, 0xee, 0x3e, 0x68, 0x60, 0x4a, 0x0d, 0x2d, 0xb5, 0x20, 0x63, 0x28, 0x66, 0xb5, + 0x28, 0xc3, 0xc1, 0x90, 0xa1, 0x3f, 0x21, 0x26, 0x18, 0xa6, 0x15, 0x54, 0x7f, 0x25, 0x07, 0xe3, + 0xf1, 0xcf, 0x21, 0x13, 0x30, 0xc8, 0x7e, 0x07, 0x91, 0x02, 0xa4, 0x0c, 0xe0, 0x9c, 0x23, 0xf7, + 0x22, 0xf0, 0x69, 0xc8, 0x2b, 0x30, 0x84, 0x0e, 0x1b, 0x58, 0x20, 0x1f, 0x06, 0x68, 0x08, 0x0b, + 0x60, 0x5a, 0x5a, 0x5e, 0x2c, 0x24, 0x25, 0x6f, 0xc0, 0x70, 0x2d, 0xf4, 0x4c, 0x13, 0x77, 0x5e, + 0xe8, 0x10, 0x2b, 0x95, 0x0c, 0x09, 0x34, 0x99, 0x5a, 0xfd, 0x76, 0x3e, 0x54, 0xf5, 0x63, 0xd3, + 0x74, 0x5f, 0xa6, 0xe9, 0x57, 0x0b, 0x70, 0x36, 0xee, 0xbe, 0x70, 0x7c, 0x10, 0x25, 0xe6, 0x81, + 0x3f, 0x05, 0xa7, 0xe3, 0xb2, 0xa9, 0x32, 0x69, 0xf4, 0xf7, 0xbe, 0x46, 0x9b, 0xd8, 0xda, 0x2c, + 0x3f, 0x95, 0xf4, 0x1c, 0x61, 0x95, 0xa5, 0x5e, 0xac, 0xa5, 0x56, 0x92, 0xda, 0x33, 0x1f, 0x92, + 0x37, 0x4d, 0x8f, 0x79, 0xcf, 0xfc, 0x74, 0x3e, 0xd9, 0x33, 0xc7, 0x87, 0x62, 0x62, 0x42, 0xf9, + 0xc7, 0x39, 0xff, 0x7e, 0x78, 0xce, 0x74, 0xbd, 0x9a, 0xf5, 0x50, 0x6f, 0x99, 0xc1, 0xa3, 0x6b, + 0x72, 0xd3, 0x4f, 0x97, 0xce, 0x90, 0xd2, 0xbb, 0x0f, 0xf4, 0xe0, 0x12, 0xe9, 0xd2, 0x5b, 0xa6, + 0x2b, 0x72, 0x5b, 0x3f, 0x95, 0x48, 0x98, 0xee, 0x17, 0x23, 0x97, 0xa5, 0xbb, 0x7f, 0x69, 0x8d, + 0x92, 0x1f, 0x13, 0x88, 0xbb, 0xfe, 0x91, 0x79, 0xd3, 0x75, 0x4d, 0x6b, 0x55, 0xce, 0x08, 0x8b, + 0xab, 0x65, 0x9b, 0xc3, 0x1b, 0xf1, 0x1c, 0xbd, 0x91, 0x02, 0xea, 0xbf, 0xcd, 0xc1, 0x05, 0xc6, + 0x09, 0x03, 0x99, 0x24, 0x3e, 0x6c, 0x5f, 0x1d, 0xde, 0xee, 0x21, 0x29, 0xa1, 0x01, 0x4f, 0x27, + 0x1f, 0x27, 0xc5, 0x08, 0x63, 0xdc, 0x7b, 0xc8, 0x7e, 0x6f, 0xef, 0x50, 0x7f, 0xb1, 0x00, 0xa3, + 0x53, 0xb6, 0xe5, 0xe9, 0x4d, 0xef, 0x78, 0x5d, 0xd8, 0xcf, 0xc1, 0x2f, 0x29, 0x43, 0xff, 0x74, + 0x5b, 0x37, 0x5b, 0x62, 0x67, 0x8c, 0x71, 0xc6, 0x29, 0x03, 0x68, 0x1c, 0x4e, 0x6e, 0x62, 0x74, + 0x2d, 0x26, 0xe9, 0xc0, 0x7f, 0x73, 0x2c, 0x0c, 0xc9, 0x2c, 0xa1, 0x44, 0x52, 0x72, 0x0e, 0xe0, + 0xa6, 0x95, 0x5c, 0x52, 0xee, 0xb3, 0xe3, 0x79, 0xe9, 0x88, 0xf4, 0xd9, 0x4f, 0x17, 0x01, 0x6e, + 0x9a, 0x9e, 0x08, 0x4b, 0x79, 0xc4, 0xdd, 0x9f, 0x25, 0x0f, 0xab, 0xe2, 0x9e, 0x3c, 0xac, 0xc2, + 0x60, 0x13, 0xfd, 0x7b, 0x08, 0x36, 0xf1, 0x36, 0x0c, 0x08, 0x39, 0x8a, 0xed, 0xdb, 0xb9, 0xf0, + 0x2b, 0x10, 0x9c, 0x55, 0xbd, 0x2f, 0xfd, 0x67, 0x61, 0x40, 0x64, 0x9e, 0x17, 0xdb, 0x2b, 0x74, + 0xb6, 0x16, 0x20, 0xcd, 0xff, 0x83, 0x5c, 0x04, 0x8c, 0x25, 0x2e, 0xfb, 0x42, 0xf3, 0xd8, 0xe2, + 0xec, 0x5f, 0x52, 0x83, 0x01, 0xe1, 0xaf, 0xaa, 0x00, 0x3e, 0xe4, 0x0a, 0x86, 0x4d, 0xd8, 0xcf, + 0xdc, 0x6d, 0x95, 0x1f, 0x5d, 0x0a, 0x62, 0xf9, 0x85, 0x9b, 0x00, 0xa9, 0xbf, 0x95, 0x83, 0xf1, + 0x78, 0x21, 0xf2, 0x3c, 0x94, 0xf8, 0x5f, 0x62, 0x0d, 0xc5, 0x38, 0x70, 0xbc, 0x84, 0x1c, 0x07, + 0x4e, 0x50, 0xbf, 0x0c, 0x43, 0x9a, 0xef, 0x84, 0x2c, 0xe7, 0x89, 0x0f, 0x3c, 0x93, 0x65, 0xcf, + 0xb1, 0x80, 0x92, 0x3c, 0x03, 0x85, 0xc5, 0x96, 0x9f, 0x1e, 0x1e, 0x1d, 0xba, 0xed, 0x96, 0x1c, + 0xe4, 0x8e, 0x61, 0x19, 0xd1, 0x02, 0x5d, 0x17, 0x6e, 0x86, 0x48, 0x64, 0xd1, 0x75, 0x99, 0x68, + 0x81, 0xae, 0x3f, 0x37, 0xcf, 0x37, 0xd5, 0xb7, 0x4d, 0xcb, 0x20, 0xe7, 0xe1, 0xcc, 0x9d, 0xfa, + 0xb4, 0xd6, 0xb8, 0x5d, 0x5b, 0xa8, 0x36, 0xee, 0x2c, 0xd4, 0x97, 0xa6, 0xa7, 0x6a, 0x33, 0xb5, + 0xe9, 0xea, 0x78, 0x1f, 0x39, 0x05, 0x27, 0x42, 0xd4, 0xec, 0x9d, 0xf9, 0xca, 0xc2, 0x78, 0x8e, + 0x9c, 0x84, 0xd1, 0x10, 0x38, 0xb9, 0xb8, 0x3c, 0x9e, 0x7f, 0xee, 0xa3, 0x30, 0x8c, 0x6f, 0x7f, + 0xc4, 0xe7, 0x8d, 0xc0, 0xe0, 0xe2, 0x64, 0x7d, 0x5a, 0xbb, 0x8b, 0x4c, 0x00, 0x4a, 0xd5, 0xe9, + 0x05, 0xc6, 0x30, 0xf7, 0xdc, 0xff, 0x9b, 0x03, 0xa8, 0xcf, 0x2c, 0x2f, 0x09, 0xc2, 0x61, 0x18, + 0xa8, 0x2d, 0xdc, 0xad, 0xcc, 0xd5, 0x18, 0xdd, 0x20, 0x14, 0x17, 0x97, 0xa6, 0x59, 0x0d, 0x43, + 0xd0, 0x3f, 0x35, 0xb7, 0x58, 0x9f, 0x1e, 0xcf, 0x33, 0xa0, 0x36, 0x5d, 0xa9, 0x8e, 0x17, 0x18, + 0xf0, 0x9e, 0x56, 0x5b, 0x9e, 0x1e, 0x2f, 0xb2, 0x3f, 0xe7, 0xea, 0xcb, 0x95, 0xe5, 0xf1, 0x7e, + 0xf6, 0xe7, 0x0c, 0xfe, 0x59, 0x62, 0xcc, 0xea, 0xd3, 0xcb, 0xf8, 0x63, 0x80, 0x35, 0x61, 0xc6, + 0xff, 0x35, 0xc8, 0x50, 0x8c, 0x75, 0xb5, 0xa6, 0x8d, 0x0f, 0xb1, 0x1f, 0x8c, 0x25, 0xfb, 0x01, + 0xac, 0x71, 0xda, 0xf4, 0xfc, 0xe2, 0xdd, 0xe9, 0xf1, 0x61, 0xc6, 0x6b, 0xfe, 0x36, 0x03, 0x8f, + 0xb0, 0x3f, 0xb5, 0x79, 0xf6, 0xe7, 0x28, 0xe3, 0xa4, 0x4d, 0x57, 0xe6, 0x96, 0x2a, 0xcb, 0xb3, + 0xe3, 0x63, 0xac, 0x3d, 0xc8, 0xf3, 0x04, 0x2f, 0xb9, 0x50, 0x99, 0x9f, 0x1e, 0x1f, 0x17, 0x34, + 0xd5, 0xb9, 0xda, 0xc2, 0xed, 0xf1, 0x93, 0xd8, 0x90, 0x77, 0xe7, 0xf1, 0x07, 0x61, 0x05, 0xf0, + 0xaf, 0x53, 0xcf, 0x7d, 0x1f, 0x94, 0x16, 0xeb, 0xb8, 0xdf, 0x3e, 0x07, 0xa7, 0x16, 0xeb, 0x8d, + 0xe5, 0x77, 0x97, 0xa6, 0x63, 0xf2, 0x3e, 0x09, 0xa3, 0x3e, 0x62, 0xae, 0xb6, 0x70, 0xe7, 0xd3, + 0x5c, 0xda, 0x3e, 0x68, 0xbe, 0x32, 0xb5, 0x58, 0x1f, 0xcf, 0xb3, 0x5e, 0xf1, 0x41, 0xf7, 0x6a, + 0x0b, 0xd5, 0xc5, 0x7b, 0xf5, 0xf1, 0xc2, 0x73, 0x0f, 0x61, 0xa4, 0x4a, 0xd9, 0x40, 0x58, 0x74, + 0xcc, 0x55, 0xd3, 0x22, 0x97, 0xe0, 0x7c, 0x75, 0xfa, 0x6e, 0x6d, 0x6a, 0xba, 0xb1, 0xa8, 0xd5, + 0x6e, 0xd6, 0x16, 0x62, 0x35, 0x9d, 0x81, 0x93, 0x51, 0x74, 0x65, 0xa9, 0x36, 0x9e, 0x23, 0x67, + 0x81, 0x44, 0xc1, 0xb7, 0x2a, 0xf3, 0x33, 0xe3, 0x79, 0xa2, 0xc0, 0xe9, 0x28, 0xbc, 0xb6, 0xb0, + 0x7c, 0x67, 0x61, 0x7a, 0xbc, 0xf0, 0xdc, 0x5f, 0xcf, 0xc1, 0x99, 0xd4, 0x44, 0x37, 0x44, 0x85, + 0x27, 0xa7, 0xe7, 0x2a, 0xf5, 0xe5, 0xda, 0x54, 0x7d, 0xba, 0xa2, 0x4d, 0xcd, 0x36, 0xa6, 0x2a, + 0xcb, 0xd3, 0x37, 0x17, 0xb5, 0x77, 0x1b, 0x37, 0xa7, 0x17, 0xa6, 0xb5, 0xca, 0xdc, 0x78, 0x1f, + 0x79, 0x06, 0xca, 0x19, 0x34, 0xf5, 0xe9, 0xa9, 0x3b, 0x5a, 0x6d, 0xf9, 0xdd, 0xf1, 0x1c, 0x79, + 0x1a, 0x2e, 0x65, 0x12, 0xb1, 0xdf, 0xe3, 0x79, 0xf2, 0x24, 0x5c, 0xc8, 0x22, 0x79, 0x67, 0x6e, + 0xbc, 0xf0, 0xdc, 0x4f, 0xe5, 0x80, 0x24, 0x33, 0x95, 0x90, 0xa7, 0xe0, 0x22, 0xd3, 0x8b, 0x46, + 0x76, 0x03, 0x9f, 0x86, 0x4b, 0xa9, 0x14, 0x52, 0xf3, 0xca, 0xf0, 0x44, 0x06, 0x89, 0x68, 0xdc, + 0x45, 0x50, 0xd2, 0x09, 0xb0, 0x69, 0xbf, 0x9c, 0x83, 0x33, 0xa9, 0xbe, 0xf6, 0xe4, 0x0a, 0x7c, + 0xa4, 0x52, 0x9d, 0x67, 0x7d, 0x33, 0xb5, 0x5c, 0x5b, 0x5c, 0xa8, 0x37, 0xe6, 0x67, 0x2a, 0x0d, + 0xa6, 0x7d, 0x77, 0xea, 0xb1, 0xde, 0xbc, 0x0c, 0x6a, 0x0f, 0xca, 0xa9, 0xd9, 0xca, 0xc2, 0x4d, + 0x36, 0xfc, 0xc8, 0x47, 0xe0, 0xa9, 0x4c, 0xba, 0xe9, 0x85, 0xca, 0xe4, 0xdc, 0x74, 0x75, 0x3c, + 0x4f, 0x9e, 0x85, 0xa7, 0x33, 0xa9, 0xaa, 0xb5, 0x3a, 0x27, 0x2b, 0x3c, 0xa7, 0x47, 0x56, 0x5b, + 0xf6, 0x95, 0x53, 0x8b, 0x0b, 0xcb, 0x95, 0xa9, 0xe5, 0x34, 0xcd, 0x3e, 0x0f, 0x67, 0x22, 0xd8, + 0xc9, 0x3b, 0xf5, 0xda, 0xc2, 0x74, 0xbd, 0x3e, 0x9e, 0x4b, 0xa0, 0x02, 0xd1, 0xe6, 0x27, 0xab, + 0xdf, 0xfe, 0x5f, 0x9e, 0xec, 0xfb, 0xf6, 0x1f, 0x3e, 0x99, 0xfb, 0xfd, 0x3f, 0x7c, 0x32, 0xf7, + 0x2f, 0xfe, 0xf0, 0xc9, 0xdc, 0x67, 0xae, 0xef, 0x26, 0xc9, 0x0d, 0x9f, 0xe1, 0x57, 0x4a, 0xb8, + 0xf3, 0x7c, 0xe9, 0xdf, 0x05, 0x00, 0x00, 0xff, 0xff, 0xb3, 0x01, 0x06, 0x5f, 0x6b, 0x94, 0x01, + 0x00, } func (m *Metadata) Marshal() (dAtA []byte, err error) { @@ -27124,6 +27307,18 @@ func (m *IntegrationMetadata) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.GitHub != nil { + { + size, err := m.GitHub.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } if m.AzureOIDC != nil { { size, err := m.AzureOIDC.MarshalToSizedBuffer(dAtA[:i]) @@ -27240,6 +27435,40 @@ func (m *AzureOIDCIntegrationMetadata) MarshalToSizedBuffer(dAtA []byte) (int, e return len(dAtA) - i, nil } +func (m *GitHubIntegrationMetadata) 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 *GitHubIntegrationMetadata) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GitHubIntegrationMetadata) 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.Organization) > 0 { + i -= len(m.Organization) + copy(dAtA[i:], m.Organization) + i = encodeVarintEvents(dAtA, i, uint64(len(m.Organization))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *PluginCreate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -31959,6 +32188,29 @@ func (m *OneOf_WorkloadIdentityDelete) MarshalToSizedBuffer(dAtA []byte) (int, e } return len(dAtA) - i, nil } +func (m *OneOf_GitCommand) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OneOf_GitCommand) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.GitCommand != nil { + { + size, err := m.GitCommand.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xc + i-- + dAtA[i] = 0xaa + } + return len(dAtA) - i, nil +} func (m *OneOf_UserLoginAccessListInvalid) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) @@ -32029,12 +32281,12 @@ func (m *StreamStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n668, err668 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUploadTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUploadTime):]) - if err668 != nil { - return 0, err668 + n670, err670 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUploadTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUploadTime):]) + if err670 != nil { + return 0, err670 } - i -= n668 - i = encodeVarintEvents(dAtA, i, uint64(n668)) + i -= n670 + i = encodeVarintEvents(dAtA, i, uint64(n670)) i-- dAtA[i] = 0x1a if m.LastEventIndex != 0 { @@ -32193,12 +32445,12 @@ func (m *Identity) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0xc2 } } - n672, err672 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.PreviousIdentityExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.PreviousIdentityExpires):]) - if err672 != nil { - return 0, err672 + n674, err674 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.PreviousIdentityExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.PreviousIdentityExpires):]) + if err674 != nil { + return 0, err674 } - i -= n672 - i = encodeVarintEvents(dAtA, i, uint64(n672)) + i -= n674 + i = encodeVarintEvents(dAtA, i, uint64(n674)) i-- dAtA[i] = 0x1 i-- @@ -32346,12 +32598,12 @@ func (m *Identity) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x4a } - n676, err676 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err676 != nil { - return 0, err676 + n678, err678 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err678 != nil { + return 0, err678 } - i -= n676 - i = encodeVarintEvents(dAtA, i, uint64(n676)) + i -= n678 + i = encodeVarintEvents(dAtA, i, uint64(n678)) i-- dAtA[i] = 0x42 if len(m.KubernetesUsers) > 0 { @@ -39503,6 +39755,176 @@ func (m *ContactDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *GitCommand) 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 *GitCommand) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GitCommand) 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.Actions) > 0 { + for iNdEx := len(m.Actions) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Actions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x52 + } + } + if len(m.Path) > 0 { + i -= len(m.Path) + copy(dAtA[i:], m.Path) + i = encodeVarintEvents(dAtA, i, uint64(len(m.Path))) + i-- + dAtA[i] = 0x4a + } + if len(m.Service) > 0 { + i -= len(m.Service) + copy(dAtA[i:], m.Service) + i = encodeVarintEvents(dAtA, i, uint64(len(m.Service))) + i-- + dAtA[i] = 0x42 + } + { + size, err := m.CommandMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + { + size, err := m.ServerMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + { + size, err := m.SessionMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + { + size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size, err := m.UserMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.Metadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *GitCommandAction) 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 *GitCommandAction) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GitCommandAction) 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.New) > 0 { + i -= len(m.New) + copy(dAtA[i:], m.New) + i = encodeVarintEvents(dAtA, i, uint64(len(m.New))) + i-- + dAtA[i] = 0x22 + } + if len(m.Old) > 0 { + i -= len(m.Old) + copy(dAtA[i:], m.Old) + i = encodeVarintEvents(dAtA, i, uint64(len(m.Old))) + i-- + dAtA[i] = 0x1a + } + if len(m.Reference) > 0 { + i -= len(m.Reference) + copy(dAtA[i:], m.Reference) + i = encodeVarintEvents(dAtA, i, uint64(len(m.Reference))) + i-- + dAtA[i] = 0x12 + } + if len(m.Action) > 0 { + i -= len(m.Action) + copy(dAtA[i:], m.Action) + i = encodeVarintEvents(dAtA, i, uint64(len(m.Action))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func encodeVarintEvents(dAtA []byte, offset int, v uint64) int { offset -= sovEvents(v) base := offset @@ -43270,6 +43692,10 @@ func (m *IntegrationMetadata) Size() (n int) { l = m.AzureOIDC.Size() n += 1 + l + sovEvents(uint64(l)) } + if m.GitHub != nil { + l = m.GitHub.Size() + n += 1 + l + sovEvents(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -43316,6 +43742,22 @@ func (m *AzureOIDCIntegrationMetadata) Size() (n int) { return n } +func (m *GitHubIntegrationMetadata) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Organization) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *PluginCreate) Size() (n int) { if m == nil { return 0 @@ -45727,6 +46169,18 @@ func (m *OneOf_WorkloadIdentityDelete) Size() (n int) { } return n } +func (m *OneOf_GitCommand) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.GitCommand != nil { + l = m.GitCommand.Size() + n += 2 + l + sovEvents(uint64(l)) + } + return n +} func (m *OneOf_UserLoginAccessListInvalid) Size() (n int) { if m == nil { return 0 @@ -48415,6 +48869,72 @@ func (m *ContactDelete) Size() (n int) { return n } +func (m *GitCommand) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Metadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.UserMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.ConnectionMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.SessionMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.ServerMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.CommandMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = len(m.Service) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + l = len(m.Path) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + if len(m.Actions) > 0 { + for _, e := range m.Actions { + l = e.Size() + n += 1 + l + sovEvents(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GitCommandAction) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Action) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + l = len(m.Reference) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + l = len(m.Old) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + l = len(m.New) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func sovEvents(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -79664,6 +80184,42 @@ func (m *IntegrationMetadata) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GitHub", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.GitHub == nil { + m.GitHub = &GitHubIntegrationMetadata{} + } + if err := m.GitHub.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -79916,6 +80472,89 @@ func (m *AzureOIDCIntegrationMetadata) Unmarshal(dAtA []byte) error { } return nil } +func (m *GitHubIntegrationMetadata) 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 ErrIntOverflowEvents + } + 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: GitHubIntegrationMetadata: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GitHubIntegrationMetadata: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Organization", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Organization = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + 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 *PluginCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -87256,15 +87895,50 @@ func (m *OneOf) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &UserTaskDelete{} + v := &UserTaskDelete{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Event = &OneOf_UserTaskDelete{v} + iNdEx = postIndex + case 191: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SFTPSummary", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &SFTPSummary{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Event = &OneOf_UserTaskDelete{v} + m.Event = &OneOf_SFTPSummary{v} iNdEx = postIndex - case 191: + case 192: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SFTPSummary", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ContactCreate", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -87291,15 +87965,15 @@ func (m *OneOf) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &SFTPSummary{} + v := &ContactCreate{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Event = &OneOf_SFTPSummary{v} + m.Event = &OneOf_ContactCreate{v} iNdEx = postIndex - case 192: + case 193: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ContactCreate", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ContactDelete", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -87326,15 +88000,15 @@ func (m *OneOf) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &ContactCreate{} + v := &ContactDelete{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Event = &OneOf_ContactCreate{v} + m.Event = &OneOf_ContactDelete{v} iNdEx = postIndex - case 193: + case 194: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ContactDelete", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field WorkloadIdentityCreate", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -87361,15 +88035,15 @@ func (m *OneOf) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &ContactDelete{} + v := &WorkloadIdentityCreate{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Event = &OneOf_ContactDelete{v} + m.Event = &OneOf_WorkloadIdentityCreate{v} iNdEx = postIndex - case 194: + case 195: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WorkloadIdentityCreate", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field WorkloadIdentityUpdate", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -87396,15 +88070,15 @@ func (m *OneOf) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &WorkloadIdentityCreate{} + v := &WorkloadIdentityUpdate{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Event = &OneOf_WorkloadIdentityCreate{v} + m.Event = &OneOf_WorkloadIdentityUpdate{v} iNdEx = postIndex - case 195: + case 196: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WorkloadIdentityUpdate", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field WorkloadIdentityDelete", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -87431,15 +88105,15 @@ func (m *OneOf) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &WorkloadIdentityUpdate{} + v := &WorkloadIdentityDelete{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Event = &OneOf_WorkloadIdentityUpdate{v} + m.Event = &OneOf_WorkloadIdentityDelete{v} iNdEx = postIndex - case 196: + case 197: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WorkloadIdentityDelete", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field GitCommand", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -87466,11 +88140,11 @@ func (m *OneOf) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &WorkloadIdentityDelete{} + v := &GitCommand{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Event = &OneOf_WorkloadIdentityDelete{v} + m.Event = &OneOf_GitCommand{v} iNdEx = postIndex case 198: if wireType != 2 { @@ -104699,7 +105373,223 @@ func (m *AutoUpdateConfigCreate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + 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 *AutoUpdateConfigUpdate) 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 ErrIntOverflowEvents + } + 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: AutoUpdateConfigUpdate: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AutoUpdateConfigUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -104726,7 +105616,7 @@ func (m *AutoUpdateConfigCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -104798,7 +105688,7 @@ func (m *AutoUpdateConfigCreate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -104825,7 +105715,7 @@ func (m *AutoUpdateConfigCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -104851,7 +105741,7 @@ func (m *AutoUpdateConfigCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateConfigUpdate) Unmarshal(dAtA []byte) error { +func (m *AutoUpdateConfigDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -104874,10 +105764,10 @@ func (m *AutoUpdateConfigUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AutoUpdateConfigUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: AutoUpdateConfigDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AutoUpdateConfigUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AutoUpdateConfigDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -104915,7 +105805,7 @@ func (m *AutoUpdateConfigUpdate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -104942,7 +105832,7 @@ func (m *AutoUpdateConfigUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -105014,7 +105904,7 @@ func (m *AutoUpdateConfigUpdate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -105041,7 +105931,7 @@ func (m *AutoUpdateConfigUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -105067,7 +105957,7 @@ func (m *AutoUpdateConfigUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateConfigDelete) Unmarshal(dAtA []byte) error { +func (m *AutoUpdateVersionCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -105090,10 +105980,10 @@ func (m *AutoUpdateConfigDelete) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AutoUpdateConfigDelete: wiretype end group for non-group") + return fmt.Errorf("proto: AutoUpdateVersionCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AutoUpdateConfigDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AutoUpdateVersionCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -105283,7 +106173,7 @@ func (m *AutoUpdateConfigDelete) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateVersionCreate) Unmarshal(dAtA []byte) error { +func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -105306,10 +106196,10 @@ func (m *AutoUpdateVersionCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AutoUpdateVersionCreate: wiretype end group for non-group") + return fmt.Errorf("proto: AutoUpdateVersionUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AutoUpdateVersionCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AutoUpdateVersionUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -105347,7 +106237,7 @@ func (m *AutoUpdateVersionCreate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -105374,7 +106264,7 @@ func (m *AutoUpdateVersionCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -105446,7 +106336,7 @@ func (m *AutoUpdateVersionCreate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -105473,7 +106363,7 @@ func (m *AutoUpdateVersionCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -105499,7 +106389,7 @@ func (m *AutoUpdateVersionCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { +func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -105522,10 +106412,10 @@ func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AutoUpdateVersionUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: AutoUpdateVersionDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AutoUpdateVersionUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AutoUpdateVersionDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -105563,7 +106453,7 @@ func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -105590,7 +106480,7 @@ func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -105662,7 +106552,7 @@ func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -105689,7 +106579,7 @@ func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -105715,7 +106605,7 @@ func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { +func (m *StaticHostUserCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -105738,10 +106628,10 @@ func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AutoUpdateVersionDelete: wiretype end group for non-group") + return fmt.Errorf("proto: StaticHostUserCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AutoUpdateVersionDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StaticHostUserCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -105779,7 +106669,7 @@ func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -105806,13 +106696,13 @@ func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -105839,13 +106729,13 @@ func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -105872,13 +106762,13 @@ func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -105905,7 +106795,7 @@ func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -105931,7 +106821,7 @@ func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { } return nil } -func (m *StaticHostUserCreate) Unmarshal(dAtA []byte) error { +func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -105954,10 +106844,10 @@ func (m *StaticHostUserCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StaticHostUserCreate: wiretype end group for non-group") + return fmt.Errorf("proto: StaticHostUserUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StaticHostUserCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StaticHostUserUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -106147,7 +107037,7 @@ func (m *StaticHostUserCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { +func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -106170,10 +107060,10 @@ func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StaticHostUserUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: StaticHostUserDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StaticHostUserUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StaticHostUserDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -106363,7 +107253,7 @@ func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { +func (m *CrownJewelCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -106386,10 +107276,10 @@ func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StaticHostUserDelete: wiretype end group for non-group") + return fmt.Errorf("proto: CrownJewelCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StaticHostUserDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CrownJewelCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -106460,7 +107350,7 @@ func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -106487,13 +107377,13 @@ func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -106520,13 +107410,13 @@ func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -106553,10 +107443,42 @@ func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CrownJewelQuery", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CrownJewelQuery = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -106579,7 +107501,7 @@ func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { } return nil } -func (m *CrownJewelCreate) Unmarshal(dAtA []byte) error { +func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -106602,10 +107524,10 @@ func (m *CrownJewelCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: CrownJewelCreate: wiretype end group for non-group") + return fmt.Errorf("proto: CrownJewelUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: CrownJewelCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CrownJewelUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -106775,7 +107697,7 @@ func (m *CrownJewelCreate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CrownJewelQuery", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CurrentCrownJewelQuery", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -106803,7 +107725,39 @@ func (m *CrownJewelCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.CrownJewelQuery = string(dAtA[iNdEx:postIndex]) + m.CurrentCrownJewelQuery = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UpdatedCrownJewelQuery", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UpdatedCrownJewelQuery = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -106827,7 +107781,7 @@ func (m *CrownJewelCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { +func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -106850,10 +107804,10 @@ func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: CrownJewelUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: CrownJewelDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: CrownJewelUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CrownJewelDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -107021,70 +107975,6 @@ func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentCrownJewelQuery", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - 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 ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.CurrentCrownJewelQuery = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UpdatedCrownJewelQuery", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - 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 ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.UpdatedCrownJewelQuery = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -107107,7 +107997,7 @@ func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { +func (m *UserTaskCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -107130,10 +108020,10 @@ func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: CrownJewelDelete: wiretype end group for non-group") + return fmt.Errorf("proto: UserTaskCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: CrownJewelDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: UserTaskCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -107203,6 +108093,39 @@ func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { } iNdEx = postIndex case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } @@ -107235,7 +108158,7 @@ func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 4: + case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } @@ -107268,9 +108191,9 @@ func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 5: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserTaskMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -107297,7 +108220,7 @@ func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserTaskMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -107323,7 +108246,7 @@ func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { } return nil } -func (m *UserTaskCreate) Unmarshal(dAtA []byte) error { +func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -107346,10 +108269,10 @@ func (m *UserTaskCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UserTaskCreate: wiretype end group for non-group") + return fmt.Errorf("proto: UserTaskUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UserTaskCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: UserTaskUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -107550,6 +108473,70 @@ func (m *UserTaskCreate) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentUserTaskState", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CurrentUserTaskState = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UpdatedUserTaskState", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UpdatedUserTaskState = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -107572,7 +108559,7 @@ func (m *UserTaskCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { +func (m *UserTaskMetadata) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -107595,17 +108582,17 @@ func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UserTaskUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: UserTaskMetadata: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UserTaskUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: UserTaskMetadata: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field TaskType", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -107615,30 +108602,29 @@ func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.TaskType = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field IssueType", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -107648,30 +108634,29 @@ func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.IssueType = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Integration", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -107681,28 +108666,78 @@ func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Integration = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { return err } - iNdEx = postIndex - case 4: + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + 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 *UserTaskDelete) 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 ErrIntOverflowEvents + } + 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: UserTaskDelete: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UserTaskDelete: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -107729,13 +108764,13 @@ func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 5: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -107762,13 +108797,13 @@ func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 6: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserTaskMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -107795,15 +108830,15 @@ func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserTaskMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 7: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentUserTaskState", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -107813,29 +108848,30 @@ func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.CurrentUserTaskState = string(dAtA[iNdEx:postIndex]) + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 8: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UpdatedUserTaskState", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -107845,23 +108881,24 @@ func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.UpdatedUserTaskState = string(dAtA[iNdEx:postIndex]) + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -107885,7 +108922,7 @@ func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *UserTaskMetadata) Unmarshal(dAtA []byte) error { +func (m *WorkloadIdentityCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -107908,17 +108945,17 @@ func (m *UserTaskMetadata) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UserTaskMetadata: wiretype end group for non-group") + return fmt.Errorf("proto: WorkloadIdentityCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UserTaskMetadata: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: WorkloadIdentityCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskType", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -107928,29 +108965,30 @@ func (m *UserTaskMetadata) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.TaskType = string(dAtA[iNdEx:postIndex]) + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IssueType", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -107960,29 +108998,30 @@ func (m *UserTaskMetadata) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.IssueType = string(dAtA[iNdEx:postIndex]) + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Integration", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -107992,23 +109031,93 @@ func (m *UserTaskMetadata) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.Integration = string(dAtA[iNdEx:postIndex]) + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field WorkloadIdentityData", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.WorkloadIdentityData == nil { + m.WorkloadIdentityData = &Struct{} + } + if err := m.WorkloadIdentityData.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -108032,7 +109141,7 @@ func (m *UserTaskMetadata) Unmarshal(dAtA []byte) error { } return nil } -func (m *UserTaskDelete) Unmarshal(dAtA []byte) error { +func (m *WorkloadIdentityUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -108055,10 +109164,10 @@ func (m *UserTaskDelete) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UserTaskDelete: wiretype end group for non-group") + return fmt.Errorf("proto: WorkloadIdentityUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UserTaskDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: WorkloadIdentityUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -108096,7 +109205,7 @@ func (m *UserTaskDelete) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -108123,13 +109232,13 @@ func (m *UserTaskDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -108156,13 +109265,13 @@ func (m *UserTaskDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -108189,13 +109298,13 @@ func (m *UserTaskDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field WorkloadIdentityData", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -108222,7 +109331,10 @@ func (m *UserTaskDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.WorkloadIdentityData == nil { + m.WorkloadIdentityData = &Struct{} + } + if err := m.WorkloadIdentityData.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -108248,7 +109360,7 @@ func (m *UserTaskDelete) Unmarshal(dAtA []byte) error { } return nil } -func (m *WorkloadIdentityCreate) Unmarshal(dAtA []byte) error { +func (m *WorkloadIdentityDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -108271,10 +109383,10 @@ func (m *WorkloadIdentityCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: WorkloadIdentityCreate: wiretype end group for non-group") + return fmt.Errorf("proto: WorkloadIdentityDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: WorkloadIdentityCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: WorkloadIdentityDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -108409,11 +109521,62 @@ func (m *WorkloadIdentityCreate) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 5: + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + 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 *AccessListInvalidMetadata) 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 ErrIntOverflowEvents + } + 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: AccessListInvalidMetadata: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AccessListInvalidMetadata: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WorkloadIdentityData", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AccessListName", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -108423,27 +109586,87 @@ func (m *WorkloadIdentityCreate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if m.WorkloadIdentityData == nil { - m.WorkloadIdentityData = &Struct{} + m.AccessListName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) } - if err := m.WorkloadIdentityData.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF } + m.User = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MissingRoles", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MissingRoles = append(m.MissingRoles, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex default: iNdEx = preIndex @@ -108467,7 +109690,7 @@ func (m *WorkloadIdentityCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *WorkloadIdentityUpdate) Unmarshal(dAtA []byte) error { +func (m *UserLoginAccessListInvalid) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -108490,10 +109713,10 @@ func (m *WorkloadIdentityUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: WorkloadIdentityUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: UserLoginAccessListInvalid: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: WorkloadIdentityUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: UserLoginAccessListInvalid: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -108531,7 +109754,7 @@ func (m *WorkloadIdentityUpdate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AccessListInvalidMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -108558,79 +109781,13 @@ func (m *WorkloadIdentityUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.AccessListInvalidMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WorkloadIdentityData", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -108657,10 +109814,7 @@ func (m *WorkloadIdentityUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.WorkloadIdentityData == nil { - m.WorkloadIdentityData = &Struct{} - } - if err := m.WorkloadIdentityData.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -108686,7 +109840,7 @@ func (m *WorkloadIdentityUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *WorkloadIdentityDelete) Unmarshal(dAtA []byte) error { +func (m *ContactCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -108709,10 +109863,10 @@ func (m *WorkloadIdentityDelete) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: WorkloadIdentityDelete: wiretype end group for non-group") + return fmt.Errorf("proto: ContactCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: WorkloadIdentityDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ContactCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -108847,6 +110001,90 @@ func (m *WorkloadIdentityDelete) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Email", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Email = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ContactType", wireType) + } + m.ContactType = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ContactType |= ContactType(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -108869,7 +110107,7 @@ func (m *WorkloadIdentityDelete) Unmarshal(dAtA []byte) error { } return nil } -func (m *AccessListInvalidMetadata) Unmarshal(dAtA []byte) error { +func (m *ContactDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -108892,17 +110130,17 @@ func (m *AccessListInvalidMetadata) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AccessListInvalidMetadata: wiretype end group for non-group") + return fmt.Errorf("proto: ContactDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AccessListInvalidMetadata: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ContactDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AccessListName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -108912,29 +110150,30 @@ func (m *AccessListInvalidMetadata) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.AccessListName = string(dAtA[iNdEx:postIndex]) + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -108944,29 +110183,30 @@ func (m *AccessListInvalidMetadata) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.User = string(dAtA[iNdEx:postIndex]) + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MissingRoles", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -108976,78 +110216,28 @@ func (m *AccessListInvalidMetadata) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.MissingRoles = append(m.MissingRoles, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - 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 *UserLoginAccessListInvalid) 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 ErrIntOverflowEvents - } - 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: UserLoginAccessListInvalid: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: UserLoginAccessListInvalid: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + iNdEx = postIndex + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -109074,13 +110264,13 @@ func (m *UserLoginAccessListInvalid) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 2: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AccessListInvalidMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -109107,15 +110297,15 @@ func (m *UserLoginAccessListInvalid) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.AccessListInvalidMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 3: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Email", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -109125,25 +110315,43 @@ func (m *UserLoginAccessListInvalid) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Email = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ContactType", wireType) + } + m.ContactType = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ContactType |= ContactType(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -109166,7 +110374,7 @@ func (m *UserLoginAccessListInvalid) Unmarshal(dAtA []byte) error { } return nil } -func (m *ContactCreate) Unmarshal(dAtA []byte) error { +func (m *GitCommand) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -109189,10 +110397,10 @@ func (m *ContactCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ContactCreate: wiretype end group for non-group") + return fmt.Errorf("proto: GitCommand: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ContactCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GitCommand: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -109230,7 +110438,7 @@ func (m *ContactCreate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -109257,13 +110465,13 @@ func (m *ContactCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -109290,13 +110498,13 @@ func (m *ContactCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SessionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -109323,13 +110531,13 @@ func (m *ContactCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.SessionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ServerMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -109356,15 +110564,15 @@ func (m *ContactCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ServerMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Email", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CommandMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -109374,29 +110582,30 @@ func (m *ContactCreate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.Email = string(dAtA[iNdEx:postIndex]) + if err := m.CommandMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 7: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ContactType", wireType) + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Service", wireType) } - m.ContactType = 0 + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -109406,67 +110615,29 @@ func (m *ContactCreate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.ContactType |= ContactType(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - 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 *ContactDelete) 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 ErrIntOverflowEvents + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents } - if iNdEx >= l { + if postIndex > 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: ContactDelete: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ContactDelete: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + m.Service = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 9: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -109476,28 +110647,27 @@ func (m *ContactDelete) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Path = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 10: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Actions", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -109524,15 +110694,67 @@ func (m *ContactDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Actions = append(m.Actions, &GitCommandAction{}) + if err := m.Actions[len(m.Actions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 3: + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + 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 *GitCommandAction) 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 ErrIntOverflowEvents + } + 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: GitCommandAction: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GitCommandAction: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Action", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -109542,30 +110764,29 @@ func (m *ContactDelete) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Action = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Reference", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -109575,30 +110796,29 @@ func (m *ContactDelete) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Reference = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 5: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Old", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -109608,28 +110828,27 @@ func (m *ContactDelete) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Old = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 6: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Email", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field New", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -109657,27 +110876,8 @@ func (m *ContactDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Email = string(dAtA[iNdEx:postIndex]) + m.New = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 7: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ContactType", wireType) - } - m.ContactType = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.ContactType |= ContactType(b&0x7F) << shift - if b < 0x80 { - break - } - } default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) diff --git a/api/types/events/oneof.go b/api/types/events/oneof.go index 6e72afb1cccd4..f3b66c61a3e55 100644 --- a/api/types/events/oneof.go +++ b/api/types/events/oneof.go @@ -818,6 +818,10 @@ func ToOneOf(in AuditEvent) (*OneOf, error) { out.Event = &OneOf_ContactDelete{ ContactDelete: e, } + case *GitCommand: + out.Event = &OneOf_GitCommand{ + GitCommand: e, + } default: slog.ErrorContext(context.Background(), "Attempted to convert dynamic event of unknown type into protobuf event.", "event_type", in.GetType()) unknown := &Unknown{} diff --git a/api/types/github.go b/api/types/github.go index 7c63ceb6e27e7..f4ca48a3062ac 100644 --- a/api/types/github.go +++ b/api/types/github.go @@ -338,6 +338,9 @@ func (r *GithubAuthRequest) Expiry() time.Time { // Check makes sure the request is valid func (r *GithubAuthRequest) Check() error { + authenticatedUserFlow := r.AuthenticatedUser != "" + regularLoginFlow := !r.SSOTestFlow && !authenticatedUserFlow + switch { case r.ConnectorID == "": return trace.BadParameter("missing ConnectorID") @@ -346,8 +349,10 @@ func (r *GithubAuthRequest) Check() error { // we could collapse these two checks into one, but the error message would become ambiguous. case r.SSOTestFlow && r.ConnectorSpec == nil: return trace.BadParameter("ConnectorSpec cannot be nil when SSOTestFlow is true") - case !r.SSOTestFlow && r.ConnectorSpec != nil: - return trace.BadParameter("ConnectorSpec must be nil when SSOTestFlow is false") + case authenticatedUserFlow && r.ConnectorSpec == nil: + return trace.BadParameter("ConnectorSpec cannot be nil for authenticated user") + case regularLoginFlow && r.ConnectorSpec != nil: + return trace.BadParameter("ConnectorSpec must be nil") case len(r.PublicKey) != 0 && len(r.SshPublicKey) != 0: return trace.BadParameter("illegal to set both PublicKey and SshPublicKey") case len(r.PublicKey) != 0 && len(r.TlsPublicKey) != 0: diff --git a/api/types/github_test.go b/api/types/github_test.go new file mode 100644 index 0000000000000..4aceeadc25c23 --- /dev/null +++ b/api/types/github_test.go @@ -0,0 +1,93 @@ +// Copyright 2024 Gravitational, Inc +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package types + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestGithubAuthRequestCheck(t *testing.T) { + tests := []struct { + request *GithubAuthRequest + check require.ErrorAssertionFunc + }{ + { + request: &GithubAuthRequest{ + ConnectorID: "valid", + StateToken: "state-token", + }, + check: require.NoError, + }, + { + request: &GithubAuthRequest{ + ConnectorID: "invalid-connector-spec-set-for-regular-flow", + StateToken: "state-token", + ConnectorSpec: &GithubConnectorSpecV3{}, + }, + check: require.Error, + }, + { + request: &GithubAuthRequest{ + ConnectorID: "sso-test", + StateToken: "state-token", + SSOTestFlow: true, + ConnectorSpec: &GithubConnectorSpecV3{}, + }, + check: require.NoError, + }, + { + request: &GithubAuthRequest{ + ConnectorID: "connector-spec-missing-for-sso-test", + StateToken: "state-token", + SSOTestFlow: true, + }, + check: require.Error, + }, + { + request: &GithubAuthRequest{ + ConnectorID: "authenticated-user", + StateToken: "state-token", + AuthenticatedUser: "alice", + ConnectorSpec: &GithubConnectorSpecV3{}, + }, + check: require.NoError, + }, + { + request: &GithubAuthRequest{ + ConnectorID: "connector-spec-missing-for-authenticated-user", + StateToken: "state-token", + AuthenticatedUser: "alice", + }, + check: require.Error, + }, + { + request: &GithubAuthRequest{ + ConnectorID: "both-new-and-deprecated-keys-are-set", + StateToken: "state-token", + PublicKey: []byte("deprecated"), + SshPublicKey: []byte("ssh-key"), + TlsPublicKey: []byte("tls-key"), + }, + check: require.Error, + }, + } + + for _, test := range tests { + t.Run(test.request.ConnectorID, func(t *testing.T) { + test.check(t, test.request.Check()) + }) + } +} diff --git a/api/types/integration.go b/api/types/integration.go index 8a70b6f63337d..175d6f2df4c10 100644 --- a/api/types/integration.go +++ b/api/types/integration.go @@ -22,6 +22,8 @@ import ( "net/url" "github.com/gravitational/trace" + "google.golang.org/protobuf/encoding/protojson" + "google.golang.org/protobuf/protoadapt" "github.com/gravitational/teleport/api/utils" ) @@ -32,6 +34,9 @@ const ( // IntegrationSubKindAzureOIDC is an integration with Azure that uses OpenID Connect as an Identity Provider. IntegrationSubKindAzureOIDC = "azure-oidc" + + // IntegrationSubKindGitHub is an integration with GitHub. + IntegrationSubKindGitHub = "github" ) const ( @@ -61,6 +66,18 @@ type Integration interface { // GetAzureOIDCIntegrationSpec returns the `azure-oidc` spec fields. GetAzureOIDCIntegrationSpec() *AzureOIDCIntegrationSpecV1 + + // GetGitHubIntegrationSpec returns the GitHub spec. + GetGitHubIntegrationSpec() *GitHubIntegrationSpecV1 + // SetGitHubIntegrationSpec returns the GitHub spec. + SetGitHubIntegrationSpec(*GitHubIntegrationSpecV1) + + // SetCredentials updates credentials. + SetCredentials(creds PluginCredentials) error + // GetCredentials retrieves credentials. + GetCredentials() PluginCredentials + // WithoutCredentials returns a copy without credentials. + WithoutCredentials() Integration } var _ ResourceWithLabels = (*IntegrationV1)(nil) @@ -107,6 +124,27 @@ func NewIntegrationAzureOIDC(md Metadata, spec *AzureOIDCIntegrationSpecV1) (*In return ig, nil } +// NewIntegrationGitHub returns a new `github` subkind Integration +func NewIntegrationGitHub(md Metadata, spec *GitHubIntegrationSpecV1) (*IntegrationV1, error) { + ig := &IntegrationV1{ + ResourceHeader: ResourceHeader{ + Metadata: md, + Kind: KindIntegration, + Version: V1, + SubKind: IntegrationSubKindGitHub, + }, + Spec: IntegrationSpecV1{ + SubKindSpec: &IntegrationSpecV1_GitHub{ + GitHub: spec, + }, + }, + } + if err := ig.CheckAndSetDefaults(); err != nil { + return nil, trace.Wrap(err) + } + return ig, nil +} + // String returns the integration string representation. func (ig *IntegrationV1) String() string { return fmt.Sprintf("IntegrationV1(Name=%v, SubKind=%s, Labels=%v)", @@ -168,6 +206,11 @@ func (s *IntegrationSpecV1) CheckAndSetDefaults() error { if err != nil { return trace.Wrap(err) } + case *IntegrationSpecV1_GitHub: + if err := integrationSubKind.CheckAndSetDefaults(); err != nil { + return trace.Wrap(err) + } + return nil default: return trace.BadParameter("unknown integration subkind: %T", integrationSubKind) } @@ -230,6 +273,17 @@ func (s *IntegrationSpecV1_AzureOIDC) Validate() error { return nil } +// CheckAndSetDefaults validates the configuration for GitHub integration subkind. +func (s *IntegrationSpecV1_GitHub) CheckAndSetDefaults() error { + if s == nil || s.GitHub == nil { + return trace.BadParameter("github spec must be set for GitHub integrations") + } + if err := ValidateGitHubOrganizationName(s.GitHub.Organization); err != nil { + return trace.Wrap(err, "invalid GitHub organization name") + } + return nil +} + // GetAWSOIDCIntegrationSpec returns the specific spec fields for `aws-oidc` subkind integrations. func (ig *IntegrationV1) GetAWSOIDCIntegrationSpec() *AWSOIDCIntegrationSpecV1 { return ig.Spec.GetAWSOIDC() @@ -273,6 +327,18 @@ func (ig *IntegrationV1) GetAzureOIDCIntegrationSpec() *AzureOIDCIntegrationSpec return ig.Spec.GetAzureOIDC() } +// GetGitHubIntegrationSpec returns the GitHub spec. +func (ig *IntegrationV1) GetGitHubIntegrationSpec() *GitHubIntegrationSpecV1 { + return ig.Spec.GetGitHub() +} + +// SetGitHubIntegrationSpec returns the GitHub spec. +func (ig *IntegrationV1) SetGitHubIntegrationSpec(spec *GitHubIntegrationSpecV1) { + ig.Spec.SubKindSpec = &IntegrationSpecV1_GitHub{ + GitHub: spec, + } +} + // Integrations is a list of Integration resources. type Integrations []Integration @@ -322,8 +388,10 @@ func (ig *IntegrationV1) UnmarshalJSON(data []byte) error { d := struct { ResourceHeader `json:""` Spec struct { - AWSOIDC json.RawMessage `json:"aws_oidc"` - AzureOIDC json.RawMessage `json:"azure_oidc"` + AWSOIDC json.RawMessage `json:"aws_oidc"` + AzureOIDC json.RawMessage `json:"azure_oidc"` + GitHub json.RawMessage `json:"github"` + Credentials json.RawMessage `json:"credentials"` } `json:"spec"` }{} @@ -333,6 +401,13 @@ func (ig *IntegrationV1) UnmarshalJSON(data []byte) error { } integration.ResourceHeader = d.ResourceHeader + if len(d.Spec.Credentials) != 0 { + var credentials PluginCredentialsV1 + if err := protojson.Unmarshal(d.Spec.Credentials, protoadapt.MessageV2Of(&credentials)); err != nil { + return trace.Wrap(err) + } + integration.Spec.Credentials = &credentials + } switch integration.SubKind { case IntegrationSubKindAWSOIDC: @@ -357,6 +432,17 @@ func (ig *IntegrationV1) UnmarshalJSON(data []byte) error { integration.Spec.SubKindSpec = subkindSpec + case IntegrationSubKindGitHub: + subkindSpec := &IntegrationSpecV1_GitHub{ + GitHub: &GitHubIntegrationSpecV1{}, + } + + if err := json.Unmarshal(d.Spec.GitHub, subkindSpec.GitHub); err != nil { + return trace.Wrap(err) + } + + integration.Spec.SubKindSpec = subkindSpec + default: return trace.BadParameter("invalid subkind %q", integration.ResourceHeader.SubKind) } @@ -377,26 +463,40 @@ func (ig *IntegrationV1) MarshalJSON() ([]byte, error) { d := struct { ResourceHeader `json:""` Spec struct { - AWSOIDC AWSOIDCIntegrationSpecV1 `json:"aws_oidc,omitempty"` - AzureOIDC AzureOIDCIntegrationSpecV1 `json:"azure_oidc,omitempty"` + AWSOIDC AWSOIDCIntegrationSpecV1 `json:"aws_oidc,omitempty"` + AzureOIDC AzureOIDCIntegrationSpecV1 `json:"azure_oidc,omitempty"` + GitHub GitHubIntegrationSpecV1 `json:"github,omitempty"` + Credentials json.RawMessage `json:"credentials,omitempty"` } `json:"spec"` }{} d.ResourceHeader = ig.ResourceHeader + if ig.Spec.Credentials != nil { + data, err := protojson.Marshal(protoadapt.MessageV2Of(ig.Spec.Credentials)) + if err != nil { + return nil, trace.Wrap(err) + } + d.Spec.Credentials = json.RawMessage(data) + } switch ig.SubKind { case IntegrationSubKindAWSOIDC: if ig.GetAWSOIDCIntegrationSpec() == nil { - return nil, trace.BadParameter("missing subkind data for %q subkind", ig.SubKind) + return nil, trace.BadParameter("missing spec for %q subkind", ig.SubKind) } d.Spec.AWSOIDC = *ig.GetAWSOIDCIntegrationSpec() case IntegrationSubKindAzureOIDC: if ig.GetAzureOIDCIntegrationSpec() == nil { - return nil, trace.BadParameter("missing subkind data for %q subkind", ig.SubKind) + return nil, trace.BadParameter("missing spec for %q subkind", ig.SubKind) } d.Spec.AzureOIDC = *ig.GetAzureOIDCIntegrationSpec() + case IntegrationSubKindGitHub: + if ig.GetGitHubIntegrationSpec() == nil { + return nil, trace.BadParameter("missing spec for %q subkind", ig.SubKind) + } + d.Spec.GitHub = *ig.GetGitHubIntegrationSpec() default: return nil, trace.BadParameter("invalid subkind %q", ig.SubKind) } @@ -404,3 +504,38 @@ func (ig *IntegrationV1) MarshalJSON() ([]byte, error) { out, err := json.Marshal(d) return out, trace.Wrap(err) } + +// SetCredentials updates credentials. +func (ig *IntegrationV1) SetCredentials(creds PluginCredentials) error { + if creds == nil { + ig.Spec.Credentials = nil + return nil + } + switch creds := creds.(type) { + case *PluginCredentialsV1: + ig.Spec.Credentials = creds + default: + return trace.BadParameter("unsupported plugin credential type %T", creds) + } + return nil +} + +// GetCredentials retrieves credentials. +func (ig *IntegrationV1) GetCredentials() PluginCredentials { + // This function returns an interface so return nil explicitly. + if ig.Spec.Credentials == nil { + return nil + } + return ig.Spec.Credentials +} + +// WithoutCredentials returns a copy without credentials. +func (ig *IntegrationV1) WithoutCredentials() Integration { + if ig == nil || ig.GetCredentials() == nil { + return ig + } + + clone := utils.CloneProtoMsg(ig) + clone.SetCredentials(nil) + return clone +} diff --git a/api/types/integration_github.go b/api/types/integration_github.go new file mode 100644 index 0000000000000..b14777f3356ad --- /dev/null +++ b/api/types/integration_github.go @@ -0,0 +1,32 @@ +/* +Copyright 2024 Gravitational, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package types + +import "regexp" + +// validGitHubOrganizationName filters the allowed characters in GitHub +// organization name. +// +// GitHub shows the following error when inputing an invalid org name: +// The name '_' may only contain alphanumeric characters or single hyphens, and +// cannot begin or end with a hyphen. +var validGitHubOrganizationName = regexp.MustCompile(`^[a-zA-Z0-9]([-a-zA-Z0-9]*[a-zA-Z0-9])?$`) + +// ValidateGitHubOrganizationName returns an error if a given string is not a +// valid GitHub organization name. +func ValidateGitHubOrganizationName(name string) error { + return ValidateResourceName(validGitHubOrganizationName, name) +} diff --git a/api/types/integration_github_test.go b/api/types/integration_github_test.go new file mode 100644 index 0000000000000..9aac25698e198 --- /dev/null +++ b/api/types/integration_github_test.go @@ -0,0 +1,60 @@ +/* +Copyright 2024 Gravitational, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package types + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestValidateGitHubOrganizationName(t *testing.T) { + tests := []struct { + name string + checkError require.ErrorAssertionFunc + }{ + { + name: "valid-org", + checkError: require.NoError, + }, + { + name: "a", + checkError: require.NoError, + }, + { + name: "1-valid-start-with-digit", + checkError: require.NoError, + }, + { + name: "-invalid-start-with-hyphen", + checkError: require.Error, + }, + { + name: "invalid-end-with-hyphen-", + checkError: require.Error, + }, + { + name: "invalid charactersc", + checkError: require.Error, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + test.checkError(t, ValidateGitHubOrganizationName(test.name)) + }) + } +} diff --git a/api/types/integration_test.go b/api/types/integration_test.go index 4cded6391fed7..e743b1629d239 100644 --- a/api/types/integration_test.go +++ b/api/types/integration_test.go @@ -281,6 +281,52 @@ func TestIntegrationCheckAndSetDefaults(t *testing.T) { }, expectedErrorIs: trace.IsBadParameter, }, + { + name: "github: valid", + integration: func(name string) (*IntegrationV1, error) { + return NewIntegrationGitHub( + Metadata{ + Name: name, + }, + &GitHubIntegrationSpecV1{ + Organization: "my-org", + }, + ) + }, + expectedIntegration: func(name string) *IntegrationV1 { + return &IntegrationV1{ + ResourceHeader: ResourceHeader{ + Kind: KindIntegration, + SubKind: IntegrationSubKindGitHub, + Version: V1, + Metadata: Metadata{ + Name: name, + Namespace: defaults.Namespace, + }, + }, + Spec: IntegrationSpecV1{ + SubKindSpec: &IntegrationSpecV1_GitHub{ + GitHub: &GitHubIntegrationSpecV1{ + Organization: "my-org", + }, + }, + }, + } + }, + expectedErrorIs: noErrorFunc, + }, + { + name: "github: error when invalid org is provided", + integration: func(name string) (*IntegrationV1, error) { + return NewIntegrationGitHub( + Metadata{ + Name: name, + }, + &GitHubIntegrationSpecV1{}, + ) + }, + expectedErrorIs: trace.IsBadParameter, + }, } { t.Run(tt.name, func(t *testing.T) { name := uuid.NewString() diff --git a/api/types/plugin.go b/api/types/plugin.go index ee946c9615979..fc69231cc6622 100644 --- a/api/types/plugin.go +++ b/api/types/plugin.go @@ -118,6 +118,7 @@ type Plugin interface { // PluginCredentials are the credentials embedded in Plugin type PluginCredentials interface { GetOauth2AccessToken() *PluginOAuth2AccessTokenCredentials + GetIdSecret() *PluginIdSecretCredential GetStaticCredentialsRef() *PluginStaticCredentialsRef } diff --git a/api/types/plugin_static_credentials.go b/api/types/plugin_static_credentials.go index 236f2d3c8c0e4..cf605fc6a6a2a 100644 --- a/api/types/plugin_static_credentials.go +++ b/api/types/plugin_static_credentials.go @@ -33,6 +33,9 @@ type PluginStaticCredentials interface { // GetOAuthClientSecret will return the attached client ID and client secret. IF they are not // present, the client ID and client secret will be empty. GetOAuthClientSecret() (clientID string, clientSecret string) + + // GetSSHCertAuthorities will return the attached SSH CA keys. + GetSSHCertAuthorities() []*SSHKeyPair } // NewPluginStaticCredentials creates a new PluginStaticCredentialsV1 resource. @@ -88,6 +91,15 @@ func (p *PluginStaticCredentialsV1) CheckAndSetDefaults() error { if credentials.OAuthClientSecret.ClientSecret == "" { return trace.BadParameter("client secret is empty") } + case *PluginStaticCredentialsSpecV1_SSHCertAuthorities: + if credentials.SSHCertAuthorities == nil { + return trace.BadParameter("SSH CAs are missing") + } + for _, ca := range credentials.SSHCertAuthorities.CertAuthorities { + if err := ca.CheckAndSetDefaults(); err != nil { + return trace.Wrap(err, "invalid SSH CA") + } + } default: return trace.BadParameter("credentials are not set or have an unknown type %T", credentials) } @@ -133,6 +145,15 @@ func (p *PluginStaticCredentialsV1) GetOAuthClientSecret() (clientID string, cli return credentials.OAuthClientSecret.ClientId, credentials.OAuthClientSecret.ClientSecret } +// GetSSHCertAuthorities will return the attached SSH CA keys. +func (p *PluginStaticCredentialsV1) GetSSHCertAuthorities() []*SSHKeyPair { + credentials, ok := p.Spec.Credentials.(*PluginStaticCredentialsSpecV1_SSHCertAuthorities) + if !ok { + return nil + } + return credentials.SSHCertAuthorities.CertAuthorities +} + // MatchSearch is a dummy value as credentials are not searchable. func (p *PluginStaticCredentialsV1) MatchSearch(_ []string) bool { return false diff --git a/api/types/resource.go b/api/types/resource.go index a2703e54cc619..f7465a84e8ba0 100644 --- a/api/types/resource.go +++ b/api/types/resource.go @@ -139,6 +139,20 @@ type EnrichedResource struct { RequiresRequest bool } +// EnrichedResources is a wrapper of []*EnrichedResource. +// A EnrichedResource is a [ResourceWithLabels] wrapped with additional +// user-specific information. +type EnrichedResources []*EnrichedResource + +// ToResourcesWithLabels converts to ResourcesWithLabels. +func (r EnrichedResources) ToResourcesWithLabels() ResourcesWithLabels { + ret := make(ResourcesWithLabels, 0, len(r)) + for _, resource := range r { + ret = append(ret, resource.ResourceWithLabels) + } + return ret +} + // ResourcesWithLabels is a list of labeled resources. type ResourcesWithLabels []ResourceWithLabels diff --git a/api/types/role.go b/api/types/role.go index f77a897209327..6eb242643e47f 100644 --- a/api/types/role.go +++ b/api/types/role.go @@ -293,6 +293,11 @@ type Role interface { // GetIdentityCenterAccountAssignments sets the allow or deny Account // Assignments for the role SetIdentityCenterAccountAssignments(RoleConditionType, []IdentityCenterAccountAssignment) + + // GetGitHubPermissions returns the allow or deny GitHub-related permissions. + GetGitHubPermissions(RoleConditionType) []GitHubPermission + // SetGitHubPermissions sets the allow or deny GitHub-related permissions. + SetGitHubPermissions(RoleConditionType, []GitHubPermission) } // NewRole constructs new standard V7 role. @@ -991,6 +996,23 @@ func (r *RoleV6) SetSPIFFEConditions(rct RoleConditionType, cond []*SPIFFERoleCo } } +// GetGitHubPermissions returns the allow or deny GitHubPermission. +func (r *RoleV6) GetGitHubPermissions(rct RoleConditionType) []GitHubPermission { + if rct == Allow { + return r.Spec.Allow.GitHubPermissions + } + return r.Spec.Deny.GitHubPermissions +} + +// SetGitHubPermissions sets the allow or deny GitHubPermission. +func (r *RoleV6) SetGitHubPermissions(rct RoleConditionType, perms []GitHubPermission) { + if rct == Allow { + r.Spec.Allow.GitHubPermissions = perms + } else { + r.Spec.Deny.GitHubPermissions = perms + } +} + // GetPrivateKeyPolicy returns the private key policy enforced for this role. func (r *RoleV6) GetPrivateKeyPolicy() keys.PrivateKeyPolicy { switch r.Spec.Options.RequireMFAType { @@ -1955,6 +1977,8 @@ func (r *RoleV6) GetLabelMatchers(rct RoleConditionType, kind string) (LabelMatc return LabelMatchers{cond.GroupLabels, cond.GroupLabelsExpression}, nil case KindWorkloadIdentity: return LabelMatchers{cond.WorkloadIdentityLabels, cond.WorkloadIdentityLabelsExpression}, nil + case KindGitServer: + return r.makeGitServerLabelMatchers(cond), nil } return LabelMatchers{}, trace.BadParameter("can't get label matchers for resource kind %q", kind) } @@ -2081,6 +2105,18 @@ func (r *RoleV6) SetIdentityCenterAccountAssignments(rct RoleConditionType, assi cond.AccountAssignments = assignments } +func (r *RoleV6) makeGitServerLabelMatchers(cond *RoleConditions) LabelMatchers { + var all []string + for _, perm := range cond.GitHubPermissions { + all = append(all, perm.Organizations...) + } + return LabelMatchers{ + Labels: Labels{ + GitHubOrgLabel: all, + }, + } +} + // LabelMatcherKinds is the complete list of resource kinds that support label // matchers. var LabelMatcherKinds = []string{ diff --git a/api/types/role_test.go b/api/types/role_test.go index ed2857a36fd16..080c138d126cc 100644 --- a/api/types/role_test.go +++ b/api/types/role_test.go @@ -854,3 +854,31 @@ func TestRoleFilterMatch(t *testing.T) { }) } } + +func TestRoleGitHubPermissions(t *testing.T) { + role, err := NewRole("github-my-org", RoleSpecV6{ + Allow: RoleConditions{ + GitHubPermissions: []GitHubPermission{{ + Organizations: []string{"my-org"}, + }}, + }, + Deny: RoleConditions{ + GitHubPermissions: []GitHubPermission{{ + Organizations: []string{"jedi", "night-watch"}, + }}, + }, + }) + require.NoError(t, err) + + allowMatchers, err := role.GetLabelMatchers(Allow, KindGitServer) + require.NoError(t, err) + require.Equal(t, LabelMatchers{Labels: Labels{ + GitHubOrgLabel: []string{"my-org"}, + }}, allowMatchers) + + denyMatchers, err := role.GetLabelMatchers(Deny, KindGitServer) + require.NoError(t, err) + require.Equal(t, LabelMatchers{Labels: Labels{ + GitHubOrgLabel: []string{"jedi", "night-watch"}, + }}, denyMatchers) +} diff --git a/api/types/server.go b/api/types/server.go index 47ec7c92ee1d0..ed84089ad3bfd 100644 --- a/api/types/server.go +++ b/api/types/server.go @@ -101,6 +101,9 @@ type Server interface { GetAWSInstanceID() string // GetAWSAccountID returns the AWS Account ID if this node comes from an EC2 instance. GetAWSAccountID() string + + // GetGitHub returns the GitHub server spec. + GetGitHub() *GitHubServerMetadata } // NewServer creates an instance of Server. @@ -158,6 +161,21 @@ func NewEICENode(spec ServerSpecV2, labels map[string]string) (Server, error) { return server, nil } +// NewGitHubServer creates a new Git server for GitHub. +func NewGitHubServer(githubSpec GitHubServerMetadata) (Server, error) { + server := &ServerV2{ + Kind: KindGitServer, + SubKind: SubKindGitHub, + Spec: ServerSpecV2{ + GitHub: &githubSpec, + }, + } + if err := server.CheckAndSetDefaults(); err != nil { + return nil, trace.Wrap(err) + } + return server, nil +} + // GetVersion returns resource version func (s *ServerV2) GetVersion() string { return s.Version @@ -439,6 +457,11 @@ func (s *ServerV2) IsEICE() bool { return s.GetAWSAccountID() != "" && s.GetAWSInstanceID() != "" } +// GetGitHub returns the GitHub server spec. +func (s *ServerV2) GetGitHub() *GitHubServerMetadata { + return s.Spec.GitHub +} + // openSSHNodeCheckAndSetDefaults are common validations for OpenSSH nodes. // They include SubKindOpenSSHNode and SubKindOpenSSHEICENode. func (s *ServerV2) openSSHNodeCheckAndSetDefaults() error { @@ -529,6 +552,8 @@ func (s *ServerV2) CheckAndSetDefaults() error { // if the server is a registered OpenSSH node, allow the name to be // randomly generated s.Metadata.Name = uuid.NewString() + case SubKindGitHub: + s.Metadata.Name = uuid.NewString() } } @@ -536,13 +561,32 @@ func (s *ServerV2) CheckAndSetDefaults() error { return trace.Wrap(err) } - if s.Kind == "" { + switch s.Kind { + case "": return trace.BadParameter("server Kind is empty") + case KindNode: + if err := s.nodeCheckAndSetDefaults(); err != nil { + return trace.Wrap(err) + } + case KindGitServer: + if err := s.gitServerCheckAndSetDefaults(); err != nil { + return trace.Wrap(err) + } + default: + if s.SubKind != "" { + return trace.BadParameter(`server SubKind must only be set when Kind is "node" or "git_server"`) + } } - if s.Kind != KindNode && s.SubKind != "" { - return trace.BadParameter(`server SubKind must only be set when Kind is "node"`) + + for key := range s.Spec.CmdLabels { + if !IsValidLabelKey(key) { + return trace.BadParameter("invalid label key: %q", key) + } } + return nil +} +func (s *ServerV2) nodeCheckAndSetDefaults() error { switch s.SubKind { case "", SubKindTeleportNode: // allow but do nothing @@ -557,15 +601,39 @@ func (s *ServerV2) CheckAndSetDefaults() error { } default: - return trace.BadParameter("invalid SubKind %q", s.SubKind) + return trace.BadParameter("invalid SubKind %q of Kind %q", s.SubKind, s.Kind) } + return nil +} - for key := range s.Spec.CmdLabels { - if !IsValidLabelKey(key) { - return trace.BadParameter("invalid label key: %q", key) - } +func (s *ServerV2) gitServerCheckAndSetDefaults() error { + switch s.SubKind { + case SubKindGitHub: + return trace.Wrap(s.githubCheckAndSetDefaults()) + default: + return trace.BadParameter("invalid SubKind %q of Kind %q", s.SubKind, s.Kind) + } +} + +func (s *ServerV2) githubCheckAndSetDefaults() error { + if s.Spec.GitHub == nil { + return trace.BadParameter("github must be set for Subkind %q", s.SubKind) + } + if s.Spec.GitHub.Integration == "" { + return trace.BadParameter("integration must be set for Subkind %q", s.SubKind) + } + if err := ValidateGitHubOrganizationName(s.Spec.GitHub.Organization); err != nil { + return trace.Wrap(err, "invalid GitHub organization name") } + // Set SSH host port for connection and "fake" hostname for routing. These + // values are hard-coded and cannot be customized. + s.Spec.Addr = "github.com:22" + s.Spec.Hostname = MakeGitHubOrgServerDomain(s.Spec.GitHub.Organization) + if s.Metadata.Labels == nil { + s.Metadata.Labels = make(map[string]string) + } + s.Metadata.Labels[GitHubOrgLabel] = s.Spec.GitHub.Organization return nil } @@ -773,3 +841,29 @@ func (s Servers) GetFieldVals(field string) ([]string, error) { return vals, nil } + +// MakeGitHubOrgServerDomain creates a special domain name used in server's +// host address to identify the GitHub organization. +func MakeGitHubOrgServerDomain(org string) string { + return fmt.Sprintf("%s.%s", org, GitHubOrgServerDomain) +} + +// GetGitHubOrgFromNodeAddr parses the organization from the node address. +func GetGitHubOrgFromNodeAddr(addr string) (string, bool) { + if host, _, err := net.SplitHostPort(addr); err == nil { + addr = host + } + if strings.HasSuffix(addr, "."+GitHubOrgServerDomain) { + return strings.TrimSuffix(addr, "."+GitHubOrgServerDomain), true + } + return "", false +} + +// GetOrganizationURL returns the URL to the GitHub organization. +func (m *GitHubServerMetadata) GetOrganizationURL() string { + if m == nil { + return "" + } + // Public github.com for now. + return fmt.Sprintf("%s/%s", GithubURL, m.Organization) +} diff --git a/api/types/server_test.go b/api/types/server_test.go index 191f47268ceb1..4e1476e9cbf38 100644 --- a/api/types/server_test.go +++ b/api/types/server_test.go @@ -385,7 +385,7 @@ func TestServerCheckAndSetDefaults(t *testing.T) { }, }, assertion: func(t *testing.T, s *ServerV2, err error) { - require.EqualError(t, err, `invalid SubKind "invalid-subkind"`) + require.EqualError(t, err, `invalid SubKind "invalid-subkind" of Kind "node"`) }, }, { @@ -579,6 +579,81 @@ func TestServerCheckAndSetDefaults(t *testing.T) { require.ErrorContains(t, err, `invalid account "abcd" or instance id "i-defg"`) }, }, + { + name: "git_server with invalid subkind", + server: &ServerV2{ + Kind: KindGitServer, + SubKind: "invalid-subkind", + Metadata: Metadata{ + Name: "5da56852-2adb-4540-a37c-80790203f6a9", + }, + }, + assertion: func(t *testing.T, s *ServerV2, err error) { + require.EqualError(t, err, `invalid SubKind "invalid-subkind" of Kind "git_server"`) + }, + }, + { + name: "GitHub server", + server: &ServerV2{ + Kind: KindGitServer, + SubKind: SubKindGitHub, + Metadata: Metadata{ + Name: "5da56852-2adb-4540-a37c-80790203f6a9", + }, + Spec: ServerSpecV2{ + GitHub: &GitHubServerMetadata{ + Integration: "my-org", + Organization: "my-org", + }, + }, + }, + assertion: func(t *testing.T, s *ServerV2, err error) { + t.Helper() + require.NoError(t, err) + + expectedServer := &ServerV2{ + Kind: KindGitServer, + SubKind: SubKindGitHub, + Version: V2, + Metadata: Metadata{ + Name: "5da56852-2adb-4540-a37c-80790203f6a9", + Namespace: defaults.Namespace, + Labels: map[string]string{ + GitHubOrgLabel: "my-org", + }, + }, + Spec: ServerSpecV2{ + Addr: "github.com:22", + Hostname: "my-org.teleport-github-org", + GitHub: &GitHubServerMetadata{ + Integration: "my-org", + Organization: "my-org", + }, + }, + } + assert.Equal(t, expectedServer, s) + }, + }, + { + name: "invalid GitHub server", + server: &ServerV2{ + Kind: KindGitServer, + SubKind: SubKindGitHub, + Metadata: Metadata{ + Name: "5da56852-2adb-4540-a37c-80790203f6a9", + Namespace: defaults.Namespace, + }, + Spec: ServerSpecV2{ + GitHub: &GitHubServerMetadata{ + Integration: "", + Organization: "my-org", + }, + }, + }, + assertion: func(t *testing.T, s *ServerV2, err error) { + require.EqualError(t, err, `integration must be set for Subkind "github"`) + }, + }, } for _, tt := range tests { @@ -730,3 +805,16 @@ func TestGetCloudMetadataAWS(t *testing.T) { }) } } + +func TestGitServerOrgDomain(t *testing.T) { + domain := MakeGitHubOrgServerDomain("my-org") + require.Equal(t, "my-org.teleport-github-org", domain) + + githubNodeAddr := domain + ":22" + org, ok := GetGitHubOrgFromNodeAddr(githubNodeAddr) + require.True(t, ok) + require.Equal(t, "my-org", org) + + _, ok = GetGitHubOrgFromNodeAddr("my-server.example.teleport.sh:22") + require.False(t, ok) +} diff --git a/api/types/types.pb.go b/api/types/types.pb.go index 7f1f78ac123cc..0560a58976ecb 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -1054,7 +1054,7 @@ func (x CertAuthoritySpecV2_SigningAlgType) String() string { } func (CertAuthoritySpecV2_SigningAlgType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{56, 0} + return fileDescriptor_9198ee693835762e, []int{57, 0} } // FIPSEndpointState represents an AWS FIPS endpoint state. @@ -1087,7 +1087,7 @@ func (x ClusterAuditConfigSpecV2_FIPSEndpointState) String() string { } func (ClusterAuditConfigSpecV2_FIPSEndpointState) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{79, 0} + return fileDescriptor_9198ee693835762e, []int{80, 0} } // TraceType is an identification of the checkpoint. @@ -1157,7 +1157,7 @@ func (x ConnectionDiagnosticTrace_TraceType) String() string { } func (ConnectionDiagnosticTrace_TraceType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{260, 0} + return fileDescriptor_9198ee693835762e, []int{262, 0} } // StatusType describes whether this was a success or a failure. @@ -1186,7 +1186,7 @@ func (x ConnectionDiagnosticTrace_StatusType) String() string { } func (ConnectionDiagnosticTrace_StatusType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{260, 1} + return fileDescriptor_9198ee693835762e, []int{262, 1} } // OktaAssignmentStatus represents the status of an Okta assignment. @@ -1226,7 +1226,7 @@ func (x OktaAssignmentSpecV1_OktaAssignmentStatus) String() string { } func (OktaAssignmentSpecV1_OktaAssignmentStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{341, 0} + return fileDescriptor_9198ee693835762e, []int{344, 0} } // OktaAssignmentTargetType is the type of Okta object that an assignment is targeting. @@ -1258,7 +1258,7 @@ func (x OktaAssignmentTargetV1_OktaAssignmentTargetType) String() string { } func (OktaAssignmentTargetV1_OktaAssignmentTargetType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{342, 0} + return fileDescriptor_9198ee693835762e, []int{345, 0} } type KeepAlive struct { @@ -3048,10 +3048,13 @@ type ServerSpecV2 struct { PublicAddrs []string `protobuf:"bytes,13,rep,name=public_addrs,json=publicAddrs,proto3" json:"public_addrs,omitempty"` // CloudMetadata contains info about the cloud instance the server is running // on, if any. - CloudMetadata *CloudMetadata `protobuf:"bytes,14,opt,name=CloudMetadata,proto3" json:"cloud_metadata,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + CloudMetadata *CloudMetadata `protobuf:"bytes,14,opt,name=CloudMetadata,proto3" json:"cloud_metadata,omitempty"` + // GitHub contains info about GitHub proxies where each server represents a + // GitHub organization. + GitHub *GitHubServerMetadata `protobuf:"bytes,15,opt,name=git_hub,json=gitHub,proto3" json:"github,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *ServerSpecV2) Reset() { *m = ServerSpecV2{} } @@ -3184,6 +3187,51 @@ func (m *CloudMetadata) XXX_DiscardUnknown() { var xxx_messageInfo_CloudMetadata proto.InternalMessageInfo +// GitHubServerMetadata contains info about GitHub proxies where each server +// represents a GitHub organization. +type GitHubServerMetadata struct { + // Organization specifies the name of the organization for the GitHub integration. + Organization string `protobuf:"bytes,1,opt,name=organization,proto3" json:"organization,omitempty"` + // Integration is the integration that is associated with this Server. + Integration string `protobuf:"bytes,2,opt,name=integration,proto3" json:"integration,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GitHubServerMetadata) Reset() { *m = GitHubServerMetadata{} } +func (m *GitHubServerMetadata) String() string { return proto.CompactTextString(m) } +func (*GitHubServerMetadata) ProtoMessage() {} +func (*GitHubServerMetadata) Descriptor() ([]byte, []int) { + return fileDescriptor_9198ee693835762e, []int{38} +} +func (m *GitHubServerMetadata) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GitHubServerMetadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GitHubServerMetadata.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 *GitHubServerMetadata) XXX_Merge(src proto.Message) { + xxx_messageInfo_GitHubServerMetadata.Merge(m, src) +} +func (m *GitHubServerMetadata) XXX_Size() int { + return m.Size() +} +func (m *GitHubServerMetadata) XXX_DiscardUnknown() { + xxx_messageInfo_GitHubServerMetadata.DiscardUnknown(m) +} + +var xxx_messageInfo_GitHubServerMetadata proto.InternalMessageInfo + // AppServerV3 represents a single proxied web app. type AppServerV3 struct { // Kind is the app server resource kind. Always "app_server". @@ -3204,7 +3252,7 @@ type AppServerV3 struct { func (m *AppServerV3) Reset() { *m = AppServerV3{} } func (*AppServerV3) ProtoMessage() {} func (*AppServerV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{38} + return fileDescriptor_9198ee693835762e, []int{39} } func (m *AppServerV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3256,7 +3304,7 @@ func (m *AppServerSpecV3) Reset() { *m = AppServerSpecV3{} } func (m *AppServerSpecV3) String() string { return proto.CompactTextString(m) } func (*AppServerSpecV3) ProtoMessage() {} func (*AppServerSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{39} + return fileDescriptor_9198ee693835762e, []int{40} } func (m *AppServerSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3298,7 +3346,7 @@ func (m *AppV3List) Reset() { *m = AppV3List{} } func (m *AppV3List) String() string { return proto.CompactTextString(m) } func (*AppV3List) ProtoMessage() {} func (*AppV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{40} + return fileDescriptor_9198ee693835762e, []int{41} } func (m *AppV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3348,7 +3396,7 @@ type AppV3 struct { func (m *AppV3) Reset() { *m = AppV3{} } func (*AppV3) ProtoMessage() {} func (*AppV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{41} + return fileDescriptor_9198ee693835762e, []int{42} } func (m *AppV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3400,7 +3448,7 @@ func (m *CORSPolicy) Reset() { *m = CORSPolicy{} } func (m *CORSPolicy) String() string { return proto.CompactTextString(m) } func (*CORSPolicy) ProtoMessage() {} func (*CORSPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{42} + return fileDescriptor_9198ee693835762e, []int{43} } func (m *CORSPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3448,7 +3496,7 @@ func (m *IdentityCenterPermissionSet) Reset() { *m = IdentityCenterPermi func (m *IdentityCenterPermissionSet) String() string { return proto.CompactTextString(m) } func (*IdentityCenterPermissionSet) ProtoMessage() {} func (*IdentityCenterPermissionSet) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{43} + return fileDescriptor_9198ee693835762e, []int{44} } func (m *IdentityCenterPermissionSet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3493,7 +3541,7 @@ func (m *AppIdentityCenter) Reset() { *m = AppIdentityCenter{} } func (m *AppIdentityCenter) String() string { return proto.CompactTextString(m) } func (*AppIdentityCenter) ProtoMessage() {} func (*AppIdentityCenter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{44} + return fileDescriptor_9198ee693835762e, []int{45} } func (m *AppIdentityCenter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3566,7 +3614,7 @@ func (m *AppSpecV3) Reset() { *m = AppSpecV3{} } func (m *AppSpecV3) String() string { return proto.CompactTextString(m) } func (*AppSpecV3) ProtoMessage() {} func (*AppSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{45} + return fileDescriptor_9198ee693835762e, []int{46} } func (m *AppSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3618,7 +3666,7 @@ type AppServerOrSAMLIdPServiceProviderV1 struct { func (m *AppServerOrSAMLIdPServiceProviderV1) Reset() { *m = AppServerOrSAMLIdPServiceProviderV1{} } func (*AppServerOrSAMLIdPServiceProviderV1) ProtoMessage() {} func (*AppServerOrSAMLIdPServiceProviderV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{46} + return fileDescriptor_9198ee693835762e, []int{47} } func (m *AppServerOrSAMLIdPServiceProviderV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3713,7 +3761,7 @@ func (m *Rewrite) Reset() { *m = Rewrite{} } func (m *Rewrite) String() string { return proto.CompactTextString(m) } func (*Rewrite) ProtoMessage() {} func (*Rewrite) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{47} + return fileDescriptor_9198ee693835762e, []int{48} } func (m *Rewrite) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3757,7 +3805,7 @@ func (m *Header) Reset() { *m = Header{} } func (m *Header) String() string { return proto.CompactTextString(m) } func (*Header) ProtoMessage() {} func (*Header) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{48} + return fileDescriptor_9198ee693835762e, []int{49} } func (m *Header) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3804,7 +3852,7 @@ type PortRange struct { func (m *PortRange) Reset() { *m = PortRange{} } func (*PortRange) ProtoMessage() {} func (*PortRange) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{49} + return fileDescriptor_9198ee693835762e, []int{50} } func (m *PortRange) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3851,7 +3899,7 @@ func (m *CommandLabelV2) Reset() { *m = CommandLabelV2{} } func (m *CommandLabelV2) String() string { return proto.CompactTextString(m) } func (*CommandLabelV2) ProtoMessage() {} func (*CommandLabelV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{50} + return fileDescriptor_9198ee693835762e, []int{51} } func (m *CommandLabelV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3893,7 +3941,7 @@ func (m *AppAWS) Reset() { *m = AppAWS{} } func (m *AppAWS) String() string { return proto.CompactTextString(m) } func (*AppAWS) ProtoMessage() {} func (*AppAWS) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{51} + return fileDescriptor_9198ee693835762e, []int{52} } func (m *AppAWS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3939,7 +3987,7 @@ func (m *SSHKeyPair) Reset() { *m = SSHKeyPair{} } func (m *SSHKeyPair) String() string { return proto.CompactTextString(m) } func (*SSHKeyPair) ProtoMessage() {} func (*SSHKeyPair) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{52} + return fileDescriptor_9198ee693835762e, []int{53} } func (m *SSHKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3985,7 +4033,7 @@ func (m *TLSKeyPair) Reset() { *m = TLSKeyPair{} } func (m *TLSKeyPair) String() string { return proto.CompactTextString(m) } func (*TLSKeyPair) ProtoMessage() {} func (*TLSKeyPair) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{53} + return fileDescriptor_9198ee693835762e, []int{54} } func (m *TLSKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4031,7 +4079,7 @@ func (m *JWTKeyPair) Reset() { *m = JWTKeyPair{} } func (m *JWTKeyPair) String() string { return proto.CompactTextString(m) } func (*JWTKeyPair) ProtoMessage() {} func (*JWTKeyPair) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{54} + return fileDescriptor_9198ee693835762e, []int{55} } func (m *JWTKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4080,7 +4128,7 @@ type CertAuthorityV2 struct { func (m *CertAuthorityV2) Reset() { *m = CertAuthorityV2{} } func (*CertAuthorityV2) ProtoMessage() {} func (*CertAuthorityV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{55} + return fileDescriptor_9198ee693835762e, []int{56} } func (m *CertAuthorityV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4141,7 +4189,7 @@ func (m *CertAuthoritySpecV2) Reset() { *m = CertAuthoritySpecV2{} } func (m *CertAuthoritySpecV2) String() string { return proto.CompactTextString(m) } func (*CertAuthoritySpecV2) ProtoMessage() {} func (*CertAuthoritySpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{56} + return fileDescriptor_9198ee693835762e, []int{57} } func (m *CertAuthoritySpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4187,7 +4235,7 @@ func (m *CAKeySet) Reset() { *m = CAKeySet{} } func (m *CAKeySet) String() string { return proto.CompactTextString(m) } func (*CAKeySet) ProtoMessage() {} func (*CAKeySet) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{57} + return fileDescriptor_9198ee693835762e, []int{58} } func (m *CAKeySet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4232,7 +4280,7 @@ func (m *RoleMapping) Reset() { *m = RoleMapping{} } func (m *RoleMapping) String() string { return proto.CompactTextString(m) } func (*RoleMapping) ProtoMessage() {} func (*RoleMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{58} + return fileDescriptor_9198ee693835762e, []int{59} } func (m *RoleMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4280,7 +4328,7 @@ type ProvisionTokenV1 struct { func (m *ProvisionTokenV1) Reset() { *m = ProvisionTokenV1{} } func (*ProvisionTokenV1) ProtoMessage() {} func (*ProvisionTokenV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{59} + return fileDescriptor_9198ee693835762e, []int{60} } func (m *ProvisionTokenV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4330,7 +4378,7 @@ type ProvisionTokenV2 struct { func (m *ProvisionTokenV2) Reset() { *m = ProvisionTokenV2{} } func (*ProvisionTokenV2) ProtoMessage() {} func (*ProvisionTokenV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{60} + return fileDescriptor_9198ee693835762e, []int{61} } func (m *ProvisionTokenV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4372,7 +4420,7 @@ func (m *ProvisionTokenV2List) Reset() { *m = ProvisionTokenV2List{} } func (m *ProvisionTokenV2List) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenV2List) ProtoMessage() {} func (*ProvisionTokenV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{61} + return fileDescriptor_9198ee693835762e, []int{62} } func (m *ProvisionTokenV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4424,7 +4472,7 @@ func (m *TokenRule) Reset() { *m = TokenRule{} } func (m *TokenRule) String() string { return proto.CompactTextString(m) } func (*TokenRule) ProtoMessage() {} func (*TokenRule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{62} + return fileDescriptor_9198ee693835762e, []int{63} } func (m *TokenRule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4508,7 +4556,7 @@ func (m *ProvisionTokenSpecV2) Reset() { *m = ProvisionTokenSpecV2{} } func (m *ProvisionTokenSpecV2) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2) ProtoMessage() {} func (*ProvisionTokenSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{63} + return fileDescriptor_9198ee693835762e, []int{64} } func (m *ProvisionTokenSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4560,7 +4608,7 @@ func (m *ProvisionTokenSpecV2TPM) Reset() { *m = ProvisionTokenSpecV2TPM func (m *ProvisionTokenSpecV2TPM) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2TPM) ProtoMessage() {} func (*ProvisionTokenSpecV2TPM) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{64} + return fileDescriptor_9198ee693835762e, []int{65} } func (m *ProvisionTokenSpecV2TPM) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4616,7 +4664,7 @@ func (m *ProvisionTokenSpecV2TPM_Rule) Reset() { *m = ProvisionTokenSpec func (m *ProvisionTokenSpecV2TPM_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2TPM_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2TPM_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{64, 0} + return fileDescriptor_9198ee693835762e, []int{65, 0} } func (m *ProvisionTokenSpecV2TPM_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4685,7 +4733,7 @@ func (m *ProvisionTokenSpecV2GitHub) Reset() { *m = ProvisionTokenSpecV2 func (m *ProvisionTokenSpecV2GitHub) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2GitHub) ProtoMessage() {} func (*ProvisionTokenSpecV2GitHub) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{65} + return fileDescriptor_9198ee693835762e, []int{66} } func (m *ProvisionTokenSpecV2GitHub) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4747,7 +4795,7 @@ func (m *ProvisionTokenSpecV2GitHub_Rule) Reset() { *m = ProvisionTokenS func (m *ProvisionTokenSpecV2GitHub_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2GitHub_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2GitHub_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{65, 0} + return fileDescriptor_9198ee693835762e, []int{66, 0} } func (m *ProvisionTokenSpecV2GitHub_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4795,7 +4843,7 @@ func (m *ProvisionTokenSpecV2GitLab) Reset() { *m = ProvisionTokenSpecV2 func (m *ProvisionTokenSpecV2GitLab) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2GitLab) ProtoMessage() {} func (*ProvisionTokenSpecV2GitLab) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{66} + return fileDescriptor_9198ee693835762e, []int{67} } func (m *ProvisionTokenSpecV2GitLab) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4897,7 +4945,7 @@ func (m *ProvisionTokenSpecV2GitLab_Rule) Reset() { *m = ProvisionTokenS func (m *ProvisionTokenSpecV2GitLab_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2GitLab_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2GitLab_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{66, 0} + return fileDescriptor_9198ee693835762e, []int{67, 0} } func (m *ProvisionTokenSpecV2GitLab_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4942,7 +4990,7 @@ func (m *ProvisionTokenSpecV2CircleCI) Reset() { *m = ProvisionTokenSpec func (m *ProvisionTokenSpecV2CircleCI) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2CircleCI) ProtoMessage() {} func (*ProvisionTokenSpecV2CircleCI) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{67} + return fileDescriptor_9198ee693835762e, []int{68} } func (m *ProvisionTokenSpecV2CircleCI) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4983,7 +5031,7 @@ func (m *ProvisionTokenSpecV2CircleCI_Rule) Reset() { *m = ProvisionToke func (m *ProvisionTokenSpecV2CircleCI_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2CircleCI_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2CircleCI_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{67, 0} + return fileDescriptor_9198ee693835762e, []int{68, 0} } func (m *ProvisionTokenSpecV2CircleCI_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5030,7 +5078,7 @@ func (m *ProvisionTokenSpecV2Spacelift) Reset() { *m = ProvisionTokenSpe func (m *ProvisionTokenSpecV2Spacelift) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2Spacelift) ProtoMessage() {} func (*ProvisionTokenSpecV2Spacelift) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{68} + return fileDescriptor_9198ee693835762e, []int{69} } func (m *ProvisionTokenSpecV2Spacelift) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5081,7 +5129,7 @@ func (m *ProvisionTokenSpecV2Spacelift_Rule) Reset() { *m = ProvisionTok func (m *ProvisionTokenSpecV2Spacelift_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2Spacelift_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2Spacelift_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{68, 0} + return fileDescriptor_9198ee693835762e, []int{69, 0} } func (m *ProvisionTokenSpecV2Spacelift_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5133,7 +5181,7 @@ func (m *ProvisionTokenSpecV2Kubernetes) Reset() { *m = ProvisionTokenSp func (m *ProvisionTokenSpecV2Kubernetes) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2Kubernetes) ProtoMessage() {} func (*ProvisionTokenSpecV2Kubernetes) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{69} + return fileDescriptor_9198ee693835762e, []int{70} } func (m *ProvisionTokenSpecV2Kubernetes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5180,7 +5228,7 @@ func (m *ProvisionTokenSpecV2Kubernetes_StaticJWKSConfig) String() string { } func (*ProvisionTokenSpecV2Kubernetes_StaticJWKSConfig) ProtoMessage() {} func (*ProvisionTokenSpecV2Kubernetes_StaticJWKSConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{69, 0} + return fileDescriptor_9198ee693835762e, []int{70, 0} } func (m *ProvisionTokenSpecV2Kubernetes_StaticJWKSConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5224,7 +5272,7 @@ func (m *ProvisionTokenSpecV2Kubernetes_Rule) Reset() { *m = ProvisionTo func (m *ProvisionTokenSpecV2Kubernetes_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2Kubernetes_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2Kubernetes_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{69, 1} + return fileDescriptor_9198ee693835762e, []int{70, 1} } func (m *ProvisionTokenSpecV2Kubernetes_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5268,7 +5316,7 @@ func (m *ProvisionTokenSpecV2Azure) Reset() { *m = ProvisionTokenSpecV2A func (m *ProvisionTokenSpecV2Azure) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2Azure) ProtoMessage() {} func (*ProvisionTokenSpecV2Azure) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{70} + return fileDescriptor_9198ee693835762e, []int{71} } func (m *ProvisionTokenSpecV2Azure) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5314,7 +5362,7 @@ func (m *ProvisionTokenSpecV2Azure_Rule) Reset() { *m = ProvisionTokenSp func (m *ProvisionTokenSpecV2Azure_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2Azure_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2Azure_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{70, 0} + return fileDescriptor_9198ee693835762e, []int{71, 0} } func (m *ProvisionTokenSpecV2Azure_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5358,7 +5406,7 @@ func (m *ProvisionTokenSpecV2GCP) Reset() { *m = ProvisionTokenSpecV2GCP func (m *ProvisionTokenSpecV2GCP) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2GCP) ProtoMessage() {} func (*ProvisionTokenSpecV2GCP) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{71} + return fileDescriptor_9198ee693835762e, []int{72} } func (m *ProvisionTokenSpecV2GCP) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5407,7 +5455,7 @@ func (m *ProvisionTokenSpecV2GCP_Rule) Reset() { *m = ProvisionTokenSpec func (m *ProvisionTokenSpecV2GCP_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2GCP_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2GCP_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{71, 0} + return fileDescriptor_9198ee693835762e, []int{72, 0} } func (m *ProvisionTokenSpecV2GCP_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5464,7 +5512,7 @@ func (m *ProvisionTokenSpecV2TerraformCloud) Reset() { *m = ProvisionTok func (m *ProvisionTokenSpecV2TerraformCloud) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2TerraformCloud) ProtoMessage() {} func (*ProvisionTokenSpecV2TerraformCloud) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{72} + return fileDescriptor_9198ee693835762e, []int{73} } func (m *ProvisionTokenSpecV2TerraformCloud) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5529,7 +5577,7 @@ func (m *ProvisionTokenSpecV2TerraformCloud_Rule) Reset() { func (m *ProvisionTokenSpecV2TerraformCloud_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2TerraformCloud_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2TerraformCloud_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{72, 0} + return fileDescriptor_9198ee693835762e, []int{73, 0} } func (m *ProvisionTokenSpecV2TerraformCloud_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5581,7 +5629,7 @@ func (m *ProvisionTokenSpecV2Bitbucket) Reset() { *m = ProvisionTokenSpe func (m *ProvisionTokenSpecV2Bitbucket) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2Bitbucket) ProtoMessage() {} func (*ProvisionTokenSpecV2Bitbucket) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{73} + return fileDescriptor_9198ee693835762e, []int{74} } func (m *ProvisionTokenSpecV2Bitbucket) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5639,7 +5687,7 @@ func (m *ProvisionTokenSpecV2Bitbucket_Rule) Reset() { *m = ProvisionTok func (m *ProvisionTokenSpecV2Bitbucket_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2Bitbucket_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2Bitbucket_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{73, 0} + return fileDescriptor_9198ee693835762e, []int{74, 0} } func (m *ProvisionTokenSpecV2Bitbucket_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5688,7 +5736,7 @@ type StaticTokensV2 struct { func (m *StaticTokensV2) Reset() { *m = StaticTokensV2{} } func (*StaticTokensV2) ProtoMessage() {} func (*StaticTokensV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{74} + return fileDescriptor_9198ee693835762e, []int{75} } func (m *StaticTokensV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5731,7 +5779,7 @@ func (m *StaticTokensSpecV2) Reset() { *m = StaticTokensSpecV2{} } func (m *StaticTokensSpecV2) String() string { return proto.CompactTextString(m) } func (*StaticTokensSpecV2) ProtoMessage() {} func (*StaticTokensSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{75} + return fileDescriptor_9198ee693835762e, []int{76} } func (m *StaticTokensSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5780,7 +5828,7 @@ type ClusterNameV2 struct { func (m *ClusterNameV2) Reset() { *m = ClusterNameV2{} } func (*ClusterNameV2) ProtoMessage() {} func (*ClusterNameV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{76} + return fileDescriptor_9198ee693835762e, []int{77} } func (m *ClusterNameV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5826,7 +5874,7 @@ func (m *ClusterNameSpecV2) Reset() { *m = ClusterNameSpecV2{} } func (m *ClusterNameSpecV2) String() string { return proto.CompactTextString(m) } func (*ClusterNameSpecV2) ProtoMessage() {} func (*ClusterNameSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{77} + return fileDescriptor_9198ee693835762e, []int{78} } func (m *ClusterNameSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5876,7 +5924,7 @@ func (m *ClusterAuditConfigV2) Reset() { *m = ClusterAuditConfigV2{} } func (m *ClusterAuditConfigV2) String() string { return proto.CompactTextString(m) } func (*ClusterAuditConfigV2) ProtoMessage() {} func (*ClusterAuditConfigV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{78} + return fileDescriptor_9198ee693835762e, []int{79} } func (m *ClusterAuditConfigV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5946,7 +5994,7 @@ func (m *ClusterAuditConfigSpecV2) Reset() { *m = ClusterAuditConfigSpec func (m *ClusterAuditConfigSpecV2) String() string { return proto.CompactTextString(m) } func (*ClusterAuditConfigSpecV2) ProtoMessage() {} func (*ClusterAuditConfigSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{79} + return fileDescriptor_9198ee693835762e, []int{80} } func (m *ClusterAuditConfigSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5997,7 +6045,7 @@ func (m *ClusterNetworkingConfigV2) Reset() { *m = ClusterNetworkingConf func (m *ClusterNetworkingConfigV2) String() string { return proto.CompactTextString(m) } func (*ClusterNetworkingConfigV2) ProtoMessage() {} func (*ClusterNetworkingConfigV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{80} + return fileDescriptor_9198ee693835762e, []int{81} } func (m *ClusterNetworkingConfigV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6076,7 +6124,7 @@ func (m *ClusterNetworkingConfigSpecV2) Reset() { *m = ClusterNetworking func (m *ClusterNetworkingConfigSpecV2) String() string { return proto.CompactTextString(m) } func (*ClusterNetworkingConfigSpecV2) ProtoMessage() {} func (*ClusterNetworkingConfigSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{81} + return fileDescriptor_9198ee693835762e, []int{82} } func (m *ClusterNetworkingConfigSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6121,7 +6169,7 @@ func (m *TunnelStrategyV1) Reset() { *m = TunnelStrategyV1{} } func (m *TunnelStrategyV1) String() string { return proto.CompactTextString(m) } func (*TunnelStrategyV1) ProtoMessage() {} func (*TunnelStrategyV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{82} + return fileDescriptor_9198ee693835762e, []int{83} } func (m *TunnelStrategyV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6206,7 +6254,7 @@ func (m *AgentMeshTunnelStrategy) Reset() { *m = AgentMeshTunnelStrategy func (m *AgentMeshTunnelStrategy) String() string { return proto.CompactTextString(m) } func (*AgentMeshTunnelStrategy) ProtoMessage() {} func (*AgentMeshTunnelStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{83} + return fileDescriptor_9198ee693835762e, []int{84} } func (m *AgentMeshTunnelStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6247,7 +6295,7 @@ func (m *ProxyPeeringTunnelStrategy) Reset() { *m = ProxyPeeringTunnelSt func (m *ProxyPeeringTunnelStrategy) String() string { return proto.CompactTextString(m) } func (*ProxyPeeringTunnelStrategy) ProtoMessage() {} func (*ProxyPeeringTunnelStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{84} + return fileDescriptor_9198ee693835762e, []int{85} } func (m *ProxyPeeringTunnelStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6298,7 +6346,7 @@ func (m *SessionRecordingConfigV2) Reset() { *m = SessionRecordingConfig func (m *SessionRecordingConfigV2) String() string { return proto.CompactTextString(m) } func (*SessionRecordingConfigV2) ProtoMessage() {} func (*SessionRecordingConfigV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{85} + return fileDescriptor_9198ee693835762e, []int{86} } func (m *SessionRecordingConfigV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6344,7 +6392,7 @@ func (m *SessionRecordingConfigSpecV2) Reset() { *m = SessionRecordingCo func (m *SessionRecordingConfigSpecV2) String() string { return proto.CompactTextString(m) } func (*SessionRecordingConfigSpecV2) ProtoMessage() {} func (*SessionRecordingConfigSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{86} + return fileDescriptor_9198ee693835762e, []int{87} } func (m *SessionRecordingConfigSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6394,7 +6442,7 @@ type AuthPreferenceV2 struct { func (m *AuthPreferenceV2) Reset() { *m = AuthPreferenceV2{} } func (*AuthPreferenceV2) ProtoMessage() {} func (*AuthPreferenceV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{87} + return fileDescriptor_9198ee693835762e, []int{88} } func (m *AuthPreferenceV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6490,7 +6538,7 @@ func (m *AuthPreferenceSpecV2) Reset() { *m = AuthPreferenceSpecV2{} } func (m *AuthPreferenceSpecV2) String() string { return proto.CompactTextString(m) } func (*AuthPreferenceSpecV2) ProtoMessage() {} func (*AuthPreferenceSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{88} + return fileDescriptor_9198ee693835762e, []int{89} } func (m *AuthPreferenceSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6541,7 +6589,7 @@ func (m *U2F) Reset() { *m = U2F{} } func (m *U2F) String() string { return proto.CompactTextString(m) } func (*U2F) ProtoMessage() {} func (*U2F) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{89} + return fileDescriptor_9198ee693835762e, []int{90} } func (m *U2F) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6609,7 +6657,7 @@ func (m *Webauthn) Reset() { *m = Webauthn{} } func (m *Webauthn) String() string { return proto.CompactTextString(m) } func (*Webauthn) ProtoMessage() {} func (*Webauthn) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{90} + return fileDescriptor_9198ee693835762e, []int{91} } func (m *Webauthn) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6680,7 +6728,7 @@ func (m *DeviceTrust) Reset() { *m = DeviceTrust{} } func (m *DeviceTrust) String() string { return proto.CompactTextString(m) } func (*DeviceTrust) ProtoMessage() {} func (*DeviceTrust) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{91} + return fileDescriptor_9198ee693835762e, []int{92} } func (m *DeviceTrust) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6727,7 +6775,7 @@ func (m *HardwareKey) Reset() { *m = HardwareKey{} } func (m *HardwareKey) String() string { return proto.CompactTextString(m) } func (*HardwareKey) ProtoMessage() {} func (*HardwareKey) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{92} + return fileDescriptor_9198ee693835762e, []int{93} } func (m *HardwareKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6774,7 +6822,7 @@ func (m *HardwareKeySerialNumberValidation) Reset() { *m = HardwareKeySe func (m *HardwareKeySerialNumberValidation) String() string { return proto.CompactTextString(m) } func (*HardwareKeySerialNumberValidation) ProtoMessage() {} func (*HardwareKeySerialNumberValidation) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{93} + return fileDescriptor_9198ee693835762e, []int{94} } func (m *HardwareKeySerialNumberValidation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6824,7 +6872,7 @@ func (m *Namespace) Reset() { *m = Namespace{} } func (m *Namespace) String() string { return proto.CompactTextString(m) } func (*Namespace) ProtoMessage() {} func (*Namespace) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{94} + return fileDescriptor_9198ee693835762e, []int{95} } func (m *Namespace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6864,7 +6912,7 @@ func (m *NamespaceSpec) Reset() { *m = NamespaceSpec{} } func (m *NamespaceSpec) String() string { return proto.CompactTextString(m) } func (*NamespaceSpec) ProtoMessage() {} func (*NamespaceSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{95} + return fileDescriptor_9198ee693835762e, []int{96} } func (m *NamespaceSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6912,7 +6960,7 @@ type UserTokenV3 struct { func (m *UserTokenV3) Reset() { *m = UserTokenV3{} } func (*UserTokenV3) ProtoMessage() {} func (*UserTokenV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{96} + return fileDescriptor_9198ee693835762e, []int{97} } func (m *UserTokenV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6959,7 +7007,7 @@ func (m *UserTokenSpecV3) Reset() { *m = UserTokenSpecV3{} } func (m *UserTokenSpecV3) String() string { return proto.CompactTextString(m) } func (*UserTokenSpecV3) ProtoMessage() {} func (*UserTokenSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{97} + return fileDescriptor_9198ee693835762e, []int{98} } func (m *UserTokenSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7007,7 +7055,7 @@ type UserTokenSecretsV3 struct { func (m *UserTokenSecretsV3) Reset() { *m = UserTokenSecretsV3{} } func (*UserTokenSecretsV3) ProtoMessage() {} func (*UserTokenSecretsV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{98} + return fileDescriptor_9198ee693835762e, []int{99} } func (m *UserTokenSecretsV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7052,7 +7100,7 @@ func (m *UserTokenSecretsSpecV3) Reset() { *m = UserTokenSecretsSpecV3{} func (m *UserTokenSecretsSpecV3) String() string { return proto.CompactTextString(m) } func (*UserTokenSecretsSpecV3) ProtoMessage() {} func (*UserTokenSecretsSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{99} + return fileDescriptor_9198ee693835762e, []int{100} } func (m *UserTokenSecretsSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7101,7 +7149,7 @@ type AccessRequestV3 struct { func (m *AccessRequestV3) Reset() { *m = AccessRequestV3{} } func (*AccessRequestV3) ProtoMessage() {} func (*AccessRequestV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{100} + return fileDescriptor_9198ee693835762e, []int{101} } func (m *AccessRequestV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7153,7 +7201,7 @@ func (m *AccessReviewThreshold) Reset() { *m = AccessReviewThreshold{} } func (m *AccessReviewThreshold) String() string { return proto.CompactTextString(m) } func (*AccessReviewThreshold) ProtoMessage() {} func (*AccessReviewThreshold) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{101} + return fileDescriptor_9198ee693835762e, []int{102} } func (m *AccessReviewThreshold) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7198,7 +7246,7 @@ func (m *PromotedAccessList) Reset() { *m = PromotedAccessList{} } func (m *PromotedAccessList) String() string { return proto.CompactTextString(m) } func (*PromotedAccessList) ProtoMessage() {} func (*PromotedAccessList) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{102} + return fileDescriptor_9198ee693835762e, []int{103} } func (m *PromotedAccessList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7259,7 +7307,7 @@ func (m *AccessReview) Reset() { *m = AccessReview{} } func (m *AccessReview) String() string { return proto.CompactTextString(m) } func (*AccessReview) ProtoMessage() {} func (*AccessReview) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{103} + return fileDescriptor_9198ee693835762e, []int{104} } func (m *AccessReview) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7304,7 +7352,7 @@ func (m *AccessReviewSubmission) Reset() { *m = AccessReviewSubmission{} func (m *AccessReviewSubmission) String() string { return proto.CompactTextString(m) } func (*AccessReviewSubmission) ProtoMessage() {} func (*AccessReviewSubmission) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{104} + return fileDescriptor_9198ee693835762e, []int{105} } func (m *AccessReviewSubmission) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7347,7 +7395,7 @@ func (m *ThresholdIndexSet) Reset() { *m = ThresholdIndexSet{} } func (m *ThresholdIndexSet) String() string { return proto.CompactTextString(m) } func (*ThresholdIndexSet) ProtoMessage() {} func (*ThresholdIndexSet) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{105} + return fileDescriptor_9198ee693835762e, []int{106} } func (m *ThresholdIndexSet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7390,7 +7438,7 @@ func (m *ThresholdIndexSets) Reset() { *m = ThresholdIndexSets{} } func (m *ThresholdIndexSets) String() string { return proto.CompactTextString(m) } func (*ThresholdIndexSets) ProtoMessage() {} func (*ThresholdIndexSets) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{106} + return fileDescriptor_9198ee693835762e, []int{107} } func (m *ThresholdIndexSets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7495,7 +7543,7 @@ func (m *AccessRequestSpecV3) Reset() { *m = AccessRequestSpecV3{} } func (m *AccessRequestSpecV3) String() string { return proto.CompactTextString(m) } func (*AccessRequestSpecV3) ProtoMessage() {} func (*AccessRequestSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{107} + return fileDescriptor_9198ee693835762e, []int{108} } func (m *AccessRequestSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7552,7 +7600,7 @@ func (m *AccessRequestFilter) Reset() { *m = AccessRequestFilter{} } func (m *AccessRequestFilter) String() string { return proto.CompactTextString(m) } func (*AccessRequestFilter) ProtoMessage() {} func (*AccessRequestFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{108} + return fileDescriptor_9198ee693835762e, []int{109} } func (m *AccessRequestFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7608,7 +7656,7 @@ func (m *AccessCapabilities) Reset() { *m = AccessCapabilities{} } func (m *AccessCapabilities) String() string { return proto.CompactTextString(m) } func (*AccessCapabilities) ProtoMessage() {} func (*AccessCapabilities) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{109} + return fileDescriptor_9198ee693835762e, []int{110} } func (m *AccessCapabilities) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7666,7 +7714,7 @@ func (m *AccessCapabilitiesRequest) Reset() { *m = AccessCapabilitiesReq func (m *AccessCapabilitiesRequest) String() string { return proto.CompactTextString(m) } func (*AccessCapabilitiesRequest) ProtoMessage() {} func (*AccessCapabilitiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{110} + return fileDescriptor_9198ee693835762e, []int{111} } func (m *AccessCapabilitiesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7710,7 +7758,7 @@ func (m *RequestKubernetesResource) Reset() { *m = RequestKubernetesReso func (m *RequestKubernetesResource) String() string { return proto.CompactTextString(m) } func (*RequestKubernetesResource) ProtoMessage() {} func (*RequestKubernetesResource) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{111} + return fileDescriptor_9198ee693835762e, []int{112} } func (m *RequestKubernetesResource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7762,7 +7810,7 @@ func (m *ResourceID) Reset() { *m = ResourceID{} } func (m *ResourceID) String() string { return proto.CompactTextString(m) } func (*ResourceID) ProtoMessage() {} func (*ResourceID) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{112} + return fileDescriptor_9198ee693835762e, []int{113} } func (m *ResourceID) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7811,7 +7859,7 @@ type PluginDataV3 struct { func (m *PluginDataV3) Reset() { *m = PluginDataV3{} } func (*PluginDataV3) ProtoMessage() {} func (*PluginDataV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{113} + return fileDescriptor_9198ee693835762e, []int{114} } func (m *PluginDataV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7854,7 +7902,7 @@ func (m *PluginDataEntry) Reset() { *m = PluginDataEntry{} } func (m *PluginDataEntry) String() string { return proto.CompactTextString(m) } func (*PluginDataEntry) ProtoMessage() {} func (*PluginDataEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{114} + return fileDescriptor_9198ee693835762e, []int{115} } func (m *PluginDataEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7896,7 +7944,7 @@ func (m *PluginDataSpecV3) Reset() { *m = PluginDataSpecV3{} } func (m *PluginDataSpecV3) String() string { return proto.CompactTextString(m) } func (*PluginDataSpecV3) ProtoMessage() {} func (*PluginDataSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{115} + return fileDescriptor_9198ee693835762e, []int{116} } func (m *PluginDataSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7943,7 +7991,7 @@ func (m *PluginDataFilter) Reset() { *m = PluginDataFilter{} } func (m *PluginDataFilter) String() string { return proto.CompactTextString(m) } func (*PluginDataFilter) ProtoMessage() {} func (*PluginDataFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{116} + return fileDescriptor_9198ee693835762e, []int{117} } func (m *PluginDataFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7994,7 +8042,7 @@ func (m *PluginDataUpdateParams) Reset() { *m = PluginDataUpdateParams{} func (m *PluginDataUpdateParams) String() string { return proto.CompactTextString(m) } func (*PluginDataUpdateParams) ProtoMessage() {} func (*PluginDataUpdateParams) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{117} + return fileDescriptor_9198ee693835762e, []int{118} } func (m *PluginDataUpdateParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8038,7 +8086,7 @@ func (m *RoleFilter) Reset() { *m = RoleFilter{} } func (m *RoleFilter) String() string { return proto.CompactTextString(m) } func (*RoleFilter) ProtoMessage() {} func (*RoleFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{118} + return fileDescriptor_9198ee693835762e, []int{119} } func (m *RoleFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8088,7 +8136,7 @@ type RoleV6 struct { func (m *RoleV6) Reset() { *m = RoleV6{} } func (*RoleV6) ProtoMessage() {} func (*RoleV6) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{119} + return fileDescriptor_9198ee693835762e, []int{120} } func (m *RoleV6) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8135,7 +8183,7 @@ func (m *RoleSpecV6) Reset() { *m = RoleSpecV6{} } func (m *RoleSpecV6) String() string { return proto.CompactTextString(m) } func (*RoleSpecV6) ProtoMessage() {} func (*RoleSpecV6) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{120} + return fileDescriptor_9198ee693835762e, []int{121} } func (m *RoleSpecV6) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8176,7 +8224,7 @@ func (m *SSHLocalPortForwarding) Reset() { *m = SSHLocalPortForwarding{} func (m *SSHLocalPortForwarding) String() string { return proto.CompactTextString(m) } func (*SSHLocalPortForwarding) ProtoMessage() {} func (*SSHLocalPortForwarding) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{121} + return fileDescriptor_9198ee693835762e, []int{122} } func (m *SSHLocalPortForwarding) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8217,7 +8265,7 @@ func (m *SSHRemotePortForwarding) Reset() { *m = SSHRemotePortForwarding func (m *SSHRemotePortForwarding) String() string { return proto.CompactTextString(m) } func (*SSHRemotePortForwarding) ProtoMessage() {} func (*SSHRemotePortForwarding) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{122} + return fileDescriptor_9198ee693835762e, []int{123} } func (m *SSHRemotePortForwarding) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8261,7 +8309,7 @@ func (m *SSHPortForwarding) Reset() { *m = SSHPortForwarding{} } func (m *SSHPortForwarding) String() string { return proto.CompactTextString(m) } func (*SSHPortForwarding) ProtoMessage() {} func (*SSHPortForwarding) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{123} + return fileDescriptor_9198ee693835762e, []int{124} } func (m *SSHPortForwarding) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8393,7 +8441,7 @@ func (m *RoleOptions) Reset() { *m = RoleOptions{} } func (m *RoleOptions) String() string { return proto.CompactTextString(m) } func (*RoleOptions) ProtoMessage() {} func (*RoleOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{124} + return fileDescriptor_9198ee693835762e, []int{125} } func (m *RoleOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8439,7 +8487,7 @@ func (m *RecordSession) Reset() { *m = RecordSession{} } func (m *RecordSession) String() string { return proto.CompactTextString(m) } func (*RecordSession) ProtoMessage() {} func (*RecordSession) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{125} + return fileDescriptor_9198ee693835762e, []int{126} } func (m *RecordSession) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8491,7 +8539,7 @@ func (m *CertExtension) Reset() { *m = CertExtension{} } func (m *CertExtension) String() string { return proto.CompactTextString(m) } func (*CertExtension) ProtoMessage() {} func (*CertExtension) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{126} + return fileDescriptor_9198ee693835762e, []int{127} } func (m *CertExtension) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8618,6 +8666,8 @@ type RoleConditions struct { // AccountAssignments holds the list of account assignments affected by this // condition. AccountAssignments []IdentityCenterAccountAssignment `protobuf:"bytes,42,rep,name=AccountAssignments,proto3" json:"account_assignments,omitempty"` + // GitHubPermissions defines GitHub integration related permissions. + GitHubPermissions []GitHubPermission `protobuf:"bytes,43,rep,name=git_hub_permissions,json=gitHubPermissions,proto3" json:"github_permissions,omitempty"` // WorkloadIdentityLabels controls whether or not specific WorkloadIdentity // resources can be invoked. Further authorization controls exist on the // WorkloadIdentity resource itself. @@ -8634,7 +8684,7 @@ func (m *RoleConditions) Reset() { *m = RoleConditions{} } func (m *RoleConditions) String() string { return proto.CompactTextString(m) } func (*RoleConditions) ProtoMessage() {} func (*RoleConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{127} + return fileDescriptor_9198ee693835762e, []int{128} } func (m *RoleConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8677,7 +8727,7 @@ func (m *IdentityCenterAccountAssignment) Reset() { *m = IdentityCenterA func (m *IdentityCenterAccountAssignment) String() string { return proto.CompactTextString(m) } func (*IdentityCenterAccountAssignment) ProtoMessage() {} func (*IdentityCenterAccountAssignment) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{128} + return fileDescriptor_9198ee693835762e, []int{129} } func (m *IdentityCenterAccountAssignment) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8706,6 +8756,47 @@ func (m *IdentityCenterAccountAssignment) XXX_DiscardUnknown() { var xxx_messageInfo_IdentityCenterAccountAssignment proto.InternalMessageInfo +// GitHubPermission defines GitHub integration related permissions. +type GitHubPermission struct { + Organizations []string `protobuf:"bytes,1,rep,name=organizations,proto3" json:"orgs,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GitHubPermission) Reset() { *m = GitHubPermission{} } +func (m *GitHubPermission) String() string { return proto.CompactTextString(m) } +func (*GitHubPermission) ProtoMessage() {} +func (*GitHubPermission) Descriptor() ([]byte, []int) { + return fileDescriptor_9198ee693835762e, []int{130} +} +func (m *GitHubPermission) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GitHubPermission) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GitHubPermission.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 *GitHubPermission) XXX_Merge(src proto.Message) { + xxx_messageInfo_GitHubPermission.Merge(m, src) +} +func (m *GitHubPermission) XXX_Size() int { + return m.Size() +} +func (m *GitHubPermission) XXX_DiscardUnknown() { + xxx_messageInfo_GitHubPermission.DiscardUnknown(m) +} + +var xxx_messageInfo_GitHubPermission proto.InternalMessageInfo + // SPIFFERoleCondition sets out which SPIFFE identities this role is allowed or // denied to generate. The Path matcher is required, and is evaluated first. If, // the Path does not match then the other matcher fields are not evaluated. @@ -8753,7 +8844,7 @@ func (m *SPIFFERoleCondition) Reset() { *m = SPIFFERoleCondition{} } func (m *SPIFFERoleCondition) String() string { return proto.CompactTextString(m) } func (*SPIFFERoleCondition) ProtoMessage() {} func (*SPIFFERoleCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{129} + return fileDescriptor_9198ee693835762e, []int{131} } func (m *SPIFFERoleCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8797,7 +8888,7 @@ func (m *DatabasePermission) Reset() { *m = DatabasePermission{} } func (m *DatabasePermission) String() string { return proto.CompactTextString(m) } func (*DatabasePermission) ProtoMessage() {} func (*DatabasePermission) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{130} + return fileDescriptor_9198ee693835762e, []int{132} } func (m *DatabasePermission) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8847,7 +8938,7 @@ func (m *KubernetesResource) Reset() { *m = KubernetesResource{} } func (m *KubernetesResource) String() string { return proto.CompactTextString(m) } func (*KubernetesResource) ProtoMessage() {} func (*KubernetesResource) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{131} + return fileDescriptor_9198ee693835762e, []int{133} } func (m *KubernetesResource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8900,7 +8991,7 @@ func (m *SessionRequirePolicy) Reset() { *m = SessionRequirePolicy{} } func (m *SessionRequirePolicy) String() string { return proto.CompactTextString(m) } func (*SessionRequirePolicy) ProtoMessage() {} func (*SessionRequirePolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{132} + return fileDescriptor_9198ee693835762e, []int{134} } func (m *SessionRequirePolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8948,7 +9039,7 @@ func (m *SessionJoinPolicy) Reset() { *m = SessionJoinPolicy{} } func (m *SessionJoinPolicy) String() string { return proto.CompactTextString(m) } func (*SessionJoinPolicy) ProtoMessage() {} func (*SessionJoinPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{133} + return fileDescriptor_9198ee693835762e, []int{135} } func (m *SessionJoinPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9024,7 +9115,7 @@ func (m *AccessRequestConditions) Reset() { *m = AccessRequestConditions func (m *AccessRequestConditions) String() string { return proto.CompactTextString(m) } func (*AccessRequestConditions) ProtoMessage() {} func (*AccessRequestConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{134} + return fileDescriptor_9198ee693835762e, []int{136} } func (m *AccessRequestConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9070,7 +9161,7 @@ func (m *AccessRequestConditionsReason) Reset() { *m = AccessRequestCond func (m *AccessRequestConditionsReason) String() string { return proto.CompactTextString(m) } func (*AccessRequestConditionsReason) ProtoMessage() {} func (*AccessRequestConditionsReason) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{135} + return fileDescriptor_9198ee693835762e, []int{137} } func (m *AccessRequestConditionsReason) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9123,7 +9214,7 @@ func (m *AccessReviewConditions) Reset() { *m = AccessReviewConditions{} func (m *AccessReviewConditions) String() string { return proto.CompactTextString(m) } func (*AccessReviewConditions) ProtoMessage() {} func (*AccessReviewConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{136} + return fileDescriptor_9198ee693835762e, []int{138} } func (m *AccessReviewConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9165,7 +9256,7 @@ func (m *AccessRequestAllowedPromotion) Reset() { *m = AccessRequestAllo func (m *AccessRequestAllowedPromotion) String() string { return proto.CompactTextString(m) } func (*AccessRequestAllowedPromotion) ProtoMessage() {} func (*AccessRequestAllowedPromotion) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{137} + return fileDescriptor_9198ee693835762e, []int{139} } func (m *AccessRequestAllowedPromotion) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9208,7 +9299,7 @@ func (m *AccessRequestAllowedPromotions) Reset() { *m = AccessRequestAll func (m *AccessRequestAllowedPromotions) String() string { return proto.CompactTextString(m) } func (*AccessRequestAllowedPromotions) ProtoMessage() {} func (*AccessRequestAllowedPromotions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{138} + return fileDescriptor_9198ee693835762e, []int{140} } func (m *AccessRequestAllowedPromotions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9254,7 +9345,7 @@ func (m *ClaimMapping) Reset() { *m = ClaimMapping{} } func (m *ClaimMapping) String() string { return proto.CompactTextString(m) } func (*ClaimMapping) ProtoMessage() {} func (*ClaimMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{139} + return fileDescriptor_9198ee693835762e, []int{141} } func (m *ClaimMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9300,7 +9391,7 @@ func (m *TraitMapping) Reset() { *m = TraitMapping{} } func (m *TraitMapping) String() string { return proto.CompactTextString(m) } func (*TraitMapping) ProtoMessage() {} func (*TraitMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{140} + return fileDescriptor_9198ee693835762e, []int{142} } func (m *TraitMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9349,7 +9440,7 @@ func (m *Rule) Reset() { *m = Rule{} } func (m *Rule) String() string { return proto.CompactTextString(m) } func (*Rule) ProtoMessage() {} func (*Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{141} + return fileDescriptor_9198ee693835762e, []int{143} } func (m *Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9397,7 +9488,7 @@ func (m *ImpersonateConditions) Reset() { *m = ImpersonateConditions{} } func (m *ImpersonateConditions) String() string { return proto.CompactTextString(m) } func (*ImpersonateConditions) ProtoMessage() {} func (*ImpersonateConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{142} + return fileDescriptor_9198ee693835762e, []int{144} } func (m *ImpersonateConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9439,7 +9530,7 @@ func (m *BoolValue) Reset() { *m = BoolValue{} } func (m *BoolValue) String() string { return proto.CompactTextString(m) } func (*BoolValue) ProtoMessage() {} func (*BoolValue) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{143} + return fileDescriptor_9198ee693835762e, []int{145} } func (m *BoolValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9481,7 +9572,7 @@ func (m *UserFilter) Reset() { *m = UserFilter{} } func (m *UserFilter) String() string { return proto.CompactTextString(m) } func (*UserFilter) ProtoMessage() {} func (*UserFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{144} + return fileDescriptor_9198ee693835762e, []int{146} } func (m *UserFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9532,7 +9623,7 @@ type UserV2 struct { func (m *UserV2) Reset() { *m = UserV2{} } func (*UserV2) ProtoMessage() {} func (*UserV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{145} + return fileDescriptor_9198ee693835762e, []int{147} } func (m *UserV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9581,7 +9672,7 @@ func (m *UserStatusV2) Reset() { *m = UserStatusV2{} } func (m *UserStatusV2) String() string { return proto.CompactTextString(m) } func (*UserStatusV2) ProtoMessage() {} func (*UserStatusV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{146} + return fileDescriptor_9198ee693835762e, []int{148} } func (m *UserStatusV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9655,7 +9746,7 @@ func (m *UserSpecV2) Reset() { *m = UserSpecV2{} } func (m *UserSpecV2) String() string { return proto.CompactTextString(m) } func (*UserSpecV2) ProtoMessage() {} func (*UserSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{147} + return fileDescriptor_9198ee693835762e, []int{149} } func (m *UserSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9693,7 +9784,10 @@ type ExternalIdentity struct { // Username is username supplied by external identity provider Username string `protobuf:"bytes,2,opt,name=Username,proto3" json:"username,omitempty"` // SAMLSingleLogoutURL is the SAML Single log-out URL to initiate SAML SLO (single log-out), if applicable. - SAMLSingleLogoutURL string `protobuf:"bytes,3,opt,name=SAMLSingleLogoutURL,proto3" json:"samlSingleLogoutUrl,omitempty"` + SAMLSingleLogoutURL string `protobuf:"bytes,3,opt,name=SAMLSingleLogoutURL,proto3" json:"samlSingleLogoutUrl,omitempty"` + // UserID is the ID of the identity. Some connectors like GitHub have an + // unique ID apart from the username. + UserID string `protobuf:"bytes,4,opt,name=UserID,proto3" json:"user_id,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -9702,7 +9796,7 @@ type ExternalIdentity struct { func (m *ExternalIdentity) Reset() { *m = ExternalIdentity{} } func (*ExternalIdentity) ProtoMessage() {} func (*ExternalIdentity) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{148} + return fileDescriptor_9198ee693835762e, []int{150} } func (m *ExternalIdentity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9750,7 +9844,7 @@ func (m *LoginStatus) Reset() { *m = LoginStatus{} } func (m *LoginStatus) String() string { return proto.CompactTextString(m) } func (*LoginStatus) ProtoMessage() {} func (*LoginStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{149} + return fileDescriptor_9198ee693835762e, []int{151} } func (m *LoginStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9795,7 +9889,7 @@ type CreatedBy struct { func (m *CreatedBy) Reset() { *m = CreatedBy{} } func (*CreatedBy) ProtoMessage() {} func (*CreatedBy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{150} + return fileDescriptor_9198ee693835762e, []int{152} } func (m *CreatedBy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9844,7 +9938,7 @@ func (m *LocalAuthSecrets) Reset() { *m = LocalAuthSecrets{} } func (m *LocalAuthSecrets) String() string { return proto.CompactTextString(m) } func (*LocalAuthSecrets) ProtoMessage() {} func (*LocalAuthSecrets) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{151} + return fileDescriptor_9198ee693835762e, []int{153} } func (m *LocalAuthSecrets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9901,7 +9995,7 @@ func (m *MFADevice) Reset() { *m = MFADevice{} } func (m *MFADevice) String() string { return proto.CompactTextString(m) } func (*MFADevice) ProtoMessage() {} func (*MFADevice) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{152} + return fileDescriptor_9198ee693835762e, []int{154} } func (m *MFADevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10011,7 +10105,7 @@ func (m *TOTPDevice) Reset() { *m = TOTPDevice{} } func (m *TOTPDevice) String() string { return proto.CompactTextString(m) } func (*TOTPDevice) ProtoMessage() {} func (*TOTPDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{153} + return fileDescriptor_9198ee693835762e, []int{155} } func (m *TOTPDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10057,7 +10151,7 @@ func (m *U2FDevice) Reset() { *m = U2FDevice{} } func (m *U2FDevice) String() string { return proto.CompactTextString(m) } func (*U2FDevice) ProtoMessage() {} func (*U2FDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{154} + return fileDescriptor_9198ee693835762e, []int{156} } func (m *U2FDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10139,7 +10233,7 @@ func (m *WebauthnDevice) Reset() { *m = WebauthnDevice{} } func (m *WebauthnDevice) String() string { return proto.CompactTextString(m) } func (*WebauthnDevice) ProtoMessage() {} func (*WebauthnDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{155} + return fileDescriptor_9198ee693835762e, []int{157} } func (m *WebauthnDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10185,7 +10279,7 @@ func (m *SSOMFADevice) Reset() { *m = SSOMFADevice{} } func (m *SSOMFADevice) String() string { return proto.CompactTextString(m) } func (*SSOMFADevice) ProtoMessage() {} func (*SSOMFADevice) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{156} + return fileDescriptor_9198ee693835762e, []int{158} } func (m *SSOMFADevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10228,7 +10322,7 @@ func (m *WebauthnLocalAuth) Reset() { *m = WebauthnLocalAuth{} } func (m *WebauthnLocalAuth) String() string { return proto.CompactTextString(m) } func (*WebauthnLocalAuth) ProtoMessage() {} func (*WebauthnLocalAuth) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{157} + return fileDescriptor_9198ee693835762e, []int{159} } func (m *WebauthnLocalAuth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10274,7 +10368,7 @@ func (m *ConnectorRef) Reset() { *m = ConnectorRef{} } func (m *ConnectorRef) String() string { return proto.CompactTextString(m) } func (*ConnectorRef) ProtoMessage() {} func (*ConnectorRef) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{158} + return fileDescriptor_9198ee693835762e, []int{160} } func (m *ConnectorRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10316,7 +10410,7 @@ func (m *UserRef) Reset() { *m = UserRef{} } func (m *UserRef) String() string { return proto.CompactTextString(m) } func (*UserRef) ProtoMessage() {} func (*UserRef) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{159} + return fileDescriptor_9198ee693835762e, []int{161} } func (m *UserRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10366,7 +10460,7 @@ func (m *ReverseTunnelV2) Reset() { *m = ReverseTunnelV2{} } func (m *ReverseTunnelV2) String() string { return proto.CompactTextString(m) } func (*ReverseTunnelV2) ProtoMessage() {} func (*ReverseTunnelV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{160} + return fileDescriptor_9198ee693835762e, []int{162} } func (m *ReverseTunnelV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10413,7 +10507,7 @@ func (m *ReverseTunnelSpecV2) Reset() { *m = ReverseTunnelSpecV2{} } func (m *ReverseTunnelSpecV2) String() string { return proto.CompactTextString(m) } func (*ReverseTunnelSpecV2) ProtoMessage() {} func (*ReverseTunnelSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{161} + return fileDescriptor_9198ee693835762e, []int{163} } func (m *ReverseTunnelSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10462,7 +10556,7 @@ type TunnelConnectionV2 struct { func (m *TunnelConnectionV2) Reset() { *m = TunnelConnectionV2{} } func (*TunnelConnectionV2) ProtoMessage() {} func (*TunnelConnectionV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{162} + return fileDescriptor_9198ee693835762e, []int{164} } func (m *TunnelConnectionV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10510,7 +10604,7 @@ func (m *TunnelConnectionSpecV2) Reset() { *m = TunnelConnectionSpecV2{} func (m *TunnelConnectionSpecV2) String() string { return proto.CompactTextString(m) } func (*TunnelConnectionSpecV2) ProtoMessage() {} func (*TunnelConnectionSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{163} + return fileDescriptor_9198ee693835762e, []int{165} } func (m *TunnelConnectionSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10558,7 +10652,7 @@ func (m *SemaphoreFilter) Reset() { *m = SemaphoreFilter{} } func (m *SemaphoreFilter) String() string { return proto.CompactTextString(m) } func (*SemaphoreFilter) ProtoMessage() {} func (*SemaphoreFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{164} + return fileDescriptor_9198ee693835762e, []int{166} } func (m *SemaphoreFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10609,7 +10703,7 @@ func (m *AcquireSemaphoreRequest) Reset() { *m = AcquireSemaphoreRequest func (m *AcquireSemaphoreRequest) String() string { return proto.CompactTextString(m) } func (*AcquireSemaphoreRequest) ProtoMessage() {} func (*AcquireSemaphoreRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{165} + return fileDescriptor_9198ee693835762e, []int{167} } func (m *AcquireSemaphoreRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10657,7 +10751,7 @@ func (m *SemaphoreLease) Reset() { *m = SemaphoreLease{} } func (m *SemaphoreLease) String() string { return proto.CompactTextString(m) } func (*SemaphoreLease) ProtoMessage() {} func (*SemaphoreLease) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{166} + return fileDescriptor_9198ee693835762e, []int{168} } func (m *SemaphoreLease) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10703,7 +10797,7 @@ func (m *SemaphoreLeaseRef) Reset() { *m = SemaphoreLeaseRef{} } func (m *SemaphoreLeaseRef) String() string { return proto.CompactTextString(m) } func (*SemaphoreLeaseRef) ProtoMessage() {} func (*SemaphoreLeaseRef) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{167} + return fileDescriptor_9198ee693835762e, []int{169} } func (m *SemaphoreLeaseRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10752,7 +10846,7 @@ type SemaphoreV3 struct { func (m *SemaphoreV3) Reset() { *m = SemaphoreV3{} } func (*SemaphoreV3) ProtoMessage() {} func (*SemaphoreV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{168} + return fileDescriptor_9198ee693835762e, []int{170} } func (m *SemaphoreV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10794,7 +10888,7 @@ func (m *SemaphoreSpecV3) Reset() { *m = SemaphoreSpecV3{} } func (m *SemaphoreSpecV3) String() string { return proto.CompactTextString(m) } func (*SemaphoreSpecV3) ProtoMessage() {} func (*SemaphoreSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{169} + return fileDescriptor_9198ee693835762e, []int{171} } func (m *SemaphoreSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10843,7 +10937,7 @@ type WebSessionV2 struct { func (m *WebSessionV2) Reset() { *m = WebSessionV2{} } func (*WebSessionV2) ProtoMessage() {} func (*WebSessionV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{170} + return fileDescriptor_9198ee693835762e, []int{172} } func (m *WebSessionV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10928,7 +11022,7 @@ func (m *WebSessionSpecV2) Reset() { *m = WebSessionSpecV2{} } func (m *WebSessionSpecV2) String() string { return proto.CompactTextString(m) } func (*WebSessionSpecV2) ProtoMessage() {} func (*WebSessionSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{171} + return fileDescriptor_9198ee693835762e, []int{173} } func (m *WebSessionSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10973,7 +11067,7 @@ func (m *DeviceWebToken) Reset() { *m = DeviceWebToken{} } func (m *DeviceWebToken) String() string { return proto.CompactTextString(m) } func (*DeviceWebToken) ProtoMessage() {} func (*DeviceWebToken) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{172} + return fileDescriptor_9198ee693835762e, []int{174} } func (m *DeviceWebToken) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11015,7 +11109,7 @@ func (m *WebSessionFilter) Reset() { *m = WebSessionFilter{} } func (m *WebSessionFilter) String() string { return proto.CompactTextString(m) } func (*WebSessionFilter) ProtoMessage() {} func (*WebSessionFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{173} + return fileDescriptor_9198ee693835762e, []int{175} } func (m *WebSessionFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11086,7 +11180,7 @@ func (m *SAMLSessionData) Reset() { *m = SAMLSessionData{} } func (m *SAMLSessionData) String() string { return proto.CompactTextString(m) } func (*SAMLSessionData) ProtoMessage() {} func (*SAMLSessionData) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{174} + return fileDescriptor_9198ee693835762e, []int{176} } func (m *SAMLSessionData) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11135,7 +11229,7 @@ func (m *SAMLAttribute) Reset() { *m = SAMLAttribute{} } func (m *SAMLAttribute) String() string { return proto.CompactTextString(m) } func (*SAMLAttribute) ProtoMessage() {} func (*SAMLAttribute) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{175} + return fileDescriptor_9198ee693835762e, []int{177} } func (m *SAMLAttribute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11182,7 +11276,7 @@ func (m *SAMLAttributeValue) Reset() { *m = SAMLAttributeValue{} } func (m *SAMLAttributeValue) String() string { return proto.CompactTextString(m) } func (*SAMLAttributeValue) ProtoMessage() {} func (*SAMLAttributeValue) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{176} + return fileDescriptor_9198ee693835762e, []int{178} } func (m *SAMLAttributeValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11233,7 +11327,7 @@ func (m *SAMLNameID) Reset() { *m = SAMLNameID{} } func (m *SAMLNameID) String() string { return proto.CompactTextString(m) } func (*SAMLNameID) ProtoMessage() {} func (*SAMLNameID) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{177} + return fileDescriptor_9198ee693835762e, []int{179} } func (m *SAMLNameID) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11282,7 +11376,7 @@ type RemoteClusterV3 struct { func (m *RemoteClusterV3) Reset() { *m = RemoteClusterV3{} } func (*RemoteClusterV3) ProtoMessage() {} func (*RemoteClusterV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{178} + return fileDescriptor_9198ee693835762e, []int{180} } func (m *RemoteClusterV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11326,7 +11420,7 @@ func (m *RemoteClusterStatusV3) Reset() { *m = RemoteClusterStatusV3{} } func (m *RemoteClusterStatusV3) String() string { return proto.CompactTextString(m) } func (*RemoteClusterStatusV3) ProtoMessage() {} func (*RemoteClusterStatusV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{179} + return fileDescriptor_9198ee693835762e, []int{181} } func (m *RemoteClusterStatusV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11376,7 +11470,7 @@ func (m *KubernetesCluster) Reset() { *m = KubernetesCluster{} } func (m *KubernetesCluster) String() string { return proto.CompactTextString(m) } func (*KubernetesCluster) ProtoMessage() {} func (*KubernetesCluster) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{180} + return fileDescriptor_9198ee693835762e, []int{182} } func (m *KubernetesCluster) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11425,7 +11519,7 @@ type KubernetesClusterV3 struct { func (m *KubernetesClusterV3) Reset() { *m = KubernetesClusterV3{} } func (*KubernetesClusterV3) ProtoMessage() {} func (*KubernetesClusterV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{181} + return fileDescriptor_9198ee693835762e, []int{183} } func (m *KubernetesClusterV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11476,7 +11570,7 @@ func (m *KubernetesClusterSpecV3) Reset() { *m = KubernetesClusterSpecV3 func (m *KubernetesClusterSpecV3) String() string { return proto.CompactTextString(m) } func (*KubernetesClusterSpecV3) ProtoMessage() {} func (*KubernetesClusterSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{182} + return fileDescriptor_9198ee693835762e, []int{184} } func (m *KubernetesClusterSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11524,7 +11618,7 @@ func (m *KubeAzure) Reset() { *m = KubeAzure{} } func (m *KubeAzure) String() string { return proto.CompactTextString(m) } func (*KubeAzure) ProtoMessage() {} func (*KubeAzure) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{183} + return fileDescriptor_9198ee693835762e, []int{185} } func (m *KubeAzure) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11570,7 +11664,7 @@ func (m *KubeAWS) Reset() { *m = KubeAWS{} } func (m *KubeAWS) String() string { return proto.CompactTextString(m) } func (*KubeAWS) ProtoMessage() {} func (*KubeAWS) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{184} + return fileDescriptor_9198ee693835762e, []int{186} } func (m *KubeAWS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11616,7 +11710,7 @@ func (m *KubeGCP) Reset() { *m = KubeGCP{} } func (m *KubeGCP) String() string { return proto.CompactTextString(m) } func (*KubeGCP) ProtoMessage() {} func (*KubeGCP) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{185} + return fileDescriptor_9198ee693835762e, []int{187} } func (m *KubeGCP) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11658,7 +11752,7 @@ func (m *KubernetesClusterV3List) Reset() { *m = KubernetesClusterV3List func (m *KubernetesClusterV3List) String() string { return proto.CompactTextString(m) } func (*KubernetesClusterV3List) ProtoMessage() {} func (*KubernetesClusterV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{186} + return fileDescriptor_9198ee693835762e, []int{188} } func (m *KubernetesClusterV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11707,7 +11801,7 @@ type KubernetesServerV3 struct { func (m *KubernetesServerV3) Reset() { *m = KubernetesServerV3{} } func (*KubernetesServerV3) ProtoMessage() {} func (*KubernetesServerV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{187} + return fileDescriptor_9198ee693835762e, []int{189} } func (m *KubernetesServerV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11759,7 +11853,7 @@ func (m *KubernetesServerSpecV3) Reset() { *m = KubernetesServerSpecV3{} func (m *KubernetesServerSpecV3) String() string { return proto.CompactTextString(m) } func (*KubernetesServerSpecV3) ProtoMessage() {} func (*KubernetesServerSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{188} + return fileDescriptor_9198ee693835762e, []int{190} } func (m *KubernetesServerSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11811,7 +11905,7 @@ type WebTokenV3 struct { func (m *WebTokenV3) Reset() { *m = WebTokenV3{} } func (*WebTokenV3) ProtoMessage() {} func (*WebTokenV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{189} + return fileDescriptor_9198ee693835762e, []int{191} } func (m *WebTokenV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11855,7 +11949,7 @@ func (m *WebTokenSpecV3) Reset() { *m = WebTokenSpecV3{} } func (m *WebTokenSpecV3) String() string { return proto.CompactTextString(m) } func (*WebTokenSpecV3) ProtoMessage() {} func (*WebTokenSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{190} + return fileDescriptor_9198ee693835762e, []int{192} } func (m *WebTokenSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11899,7 +11993,7 @@ func (m *GetWebSessionRequest) Reset() { *m = GetWebSessionRequest{} } func (m *GetWebSessionRequest) String() string { return proto.CompactTextString(m) } func (*GetWebSessionRequest) ProtoMessage() {} func (*GetWebSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{191} + return fileDescriptor_9198ee693835762e, []int{193} } func (m *GetWebSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11943,7 +12037,7 @@ func (m *DeleteWebSessionRequest) Reset() { *m = DeleteWebSessionRequest func (m *DeleteWebSessionRequest) String() string { return proto.CompactTextString(m) } func (*DeleteWebSessionRequest) ProtoMessage() {} func (*DeleteWebSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{192} + return fileDescriptor_9198ee693835762e, []int{194} } func (m *DeleteWebSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11987,7 +12081,7 @@ func (m *GetWebTokenRequest) Reset() { *m = GetWebTokenRequest{} } func (m *GetWebTokenRequest) String() string { return proto.CompactTextString(m) } func (*GetWebTokenRequest) ProtoMessage() {} func (*GetWebTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{193} + return fileDescriptor_9198ee693835762e, []int{195} } func (m *GetWebTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12031,7 +12125,7 @@ func (m *DeleteWebTokenRequest) Reset() { *m = DeleteWebTokenRequest{} } func (m *DeleteWebTokenRequest) String() string { return proto.CompactTextString(m) } func (*DeleteWebTokenRequest) ProtoMessage() {} func (*DeleteWebTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{194} + return fileDescriptor_9198ee693835762e, []int{196} } func (m *DeleteWebTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12073,7 +12167,7 @@ func (m *ResourceRequest) Reset() { *m = ResourceRequest{} } func (m *ResourceRequest) String() string { return proto.CompactTextString(m) } func (*ResourceRequest) ProtoMessage() {} func (*ResourceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{195} + return fileDescriptor_9198ee693835762e, []int{197} } func (m *ResourceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12117,7 +12211,7 @@ func (m *ResourceWithSecretsRequest) Reset() { *m = ResourceWithSecretsR func (m *ResourceWithSecretsRequest) String() string { return proto.CompactTextString(m) } func (*ResourceWithSecretsRequest) ProtoMessage() {} func (*ResourceWithSecretsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{196} + return fileDescriptor_9198ee693835762e, []int{198} } func (m *ResourceWithSecretsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12159,7 +12253,7 @@ func (m *ResourcesWithSecretsRequest) Reset() { *m = ResourcesWithSecret func (m *ResourcesWithSecretsRequest) String() string { return proto.CompactTextString(m) } func (*ResourcesWithSecretsRequest) ProtoMessage() {} func (*ResourcesWithSecretsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{197} + return fileDescriptor_9198ee693835762e, []int{199} } func (m *ResourcesWithSecretsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12203,7 +12297,7 @@ func (m *ResourceInNamespaceRequest) Reset() { *m = ResourceInNamespaceR func (m *ResourceInNamespaceRequest) String() string { return proto.CompactTextString(m) } func (*ResourceInNamespaceRequest) ProtoMessage() {} func (*ResourceInNamespaceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{198} + return fileDescriptor_9198ee693835762e, []int{200} } func (m *ResourceInNamespaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12245,7 +12339,7 @@ func (m *ResourcesInNamespaceRequest) Reset() { *m = ResourcesInNamespac func (m *ResourcesInNamespaceRequest) String() string { return proto.CompactTextString(m) } func (*ResourcesInNamespaceRequest) ProtoMessage() {} func (*ResourcesInNamespaceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{199} + return fileDescriptor_9198ee693835762e, []int{201} } func (m *ResourcesInNamespaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12296,7 +12390,7 @@ func (m *OIDCConnectorV3) Reset() { *m = OIDCConnectorV3{} } func (m *OIDCConnectorV3) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorV3) ProtoMessage() {} func (*OIDCConnectorV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{200} + return fileDescriptor_9198ee693835762e, []int{202} } func (m *OIDCConnectorV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12338,7 +12432,7 @@ func (m *OIDCConnectorV3List) Reset() { *m = OIDCConnectorV3List{} } func (m *OIDCConnectorV3List) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorV3List) ProtoMessage() {} func (*OIDCConnectorV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{201} + return fileDescriptor_9198ee693835762e, []int{203} } func (m *OIDCConnectorV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12426,7 +12520,7 @@ func (m *OIDCConnectorSpecV3) Reset() { *m = OIDCConnectorSpecV3{} } func (m *OIDCConnectorSpecV3) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorSpecV3) ProtoMessage() {} func (*OIDCConnectorSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{202} + return fileDescriptor_9198ee693835762e, []int{204} } func (m *OIDCConnectorSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12468,7 +12562,7 @@ func (m *MaxAge) Reset() { *m = MaxAge{} } func (m *MaxAge) String() string { return proto.CompactTextString(m) } func (*MaxAge) ProtoMessage() {} func (*MaxAge) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{203} + return fileDescriptor_9198ee693835762e, []int{205} } func (m *MaxAge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12513,7 +12607,7 @@ func (m *SSOClientRedirectSettings) Reset() { *m = SSOClientRedirectSett func (m *SSOClientRedirectSettings) String() string { return proto.CompactTextString(m) } func (*SSOClientRedirectSettings) ProtoMessage() {} func (*SSOClientRedirectSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{204} + return fileDescriptor_9198ee693835762e, []int{206} } func (m *SSOClientRedirectSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12570,7 +12664,7 @@ func (m *OIDCConnectorMFASettings) Reset() { *m = OIDCConnectorMFASettin func (m *OIDCConnectorMFASettings) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorMFASettings) ProtoMessage() {} func (*OIDCConnectorMFASettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{205} + return fileDescriptor_9198ee693835762e, []int{207} } func (m *OIDCConnectorMFASettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12672,7 +12766,7 @@ func (m *OIDCAuthRequest) Reset() { *m = OIDCAuthRequest{} } func (m *OIDCAuthRequest) String() string { return proto.CompactTextString(m) } func (*OIDCAuthRequest) ProtoMessage() {} func (*OIDCAuthRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{206} + return fileDescriptor_9198ee693835762e, []int{208} } func (m *OIDCAuthRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12723,7 +12817,7 @@ func (m *SAMLConnectorV2) Reset() { *m = SAMLConnectorV2{} } func (m *SAMLConnectorV2) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorV2) ProtoMessage() {} func (*SAMLConnectorV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{207} + return fileDescriptor_9198ee693835762e, []int{209} } func (m *SAMLConnectorV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12765,7 +12859,7 @@ func (m *SAMLConnectorV2List) Reset() { *m = SAMLConnectorV2List{} } func (m *SAMLConnectorV2List) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorV2List) ProtoMessage() {} func (*SAMLConnectorV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{208} + return fileDescriptor_9198ee693835762e, []int{210} } func (m *SAMLConnectorV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12847,7 +12941,7 @@ func (m *SAMLConnectorSpecV2) Reset() { *m = SAMLConnectorSpecV2{} } func (m *SAMLConnectorSpecV2) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorSpecV2) ProtoMessage() {} func (*SAMLConnectorSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{209} + return fileDescriptor_9198ee693835762e, []int{211} } func (m *SAMLConnectorSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12906,7 +13000,7 @@ func (m *SAMLConnectorMFASettings) Reset() { *m = SAMLConnectorMFASettin func (m *SAMLConnectorMFASettings) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorMFASettings) ProtoMessage() {} func (*SAMLConnectorMFASettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{210} + return fileDescriptor_9198ee693835762e, []int{212} } func (m *SAMLConnectorMFASettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13002,7 +13096,7 @@ func (m *SAMLAuthRequest) Reset() { *m = SAMLAuthRequest{} } func (m *SAMLAuthRequest) String() string { return proto.CompactTextString(m) } func (*SAMLAuthRequest) ProtoMessage() {} func (*SAMLAuthRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{211} + return fileDescriptor_9198ee693835762e, []int{213} } func (m *SAMLAuthRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13048,7 +13142,7 @@ func (m *AttributeMapping) Reset() { *m = AttributeMapping{} } func (m *AttributeMapping) String() string { return proto.CompactTextString(m) } func (*AttributeMapping) ProtoMessage() {} func (*AttributeMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{212} + return fileDescriptor_9198ee693835762e, []int{214} } func (m *AttributeMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13093,7 +13187,7 @@ func (m *AsymmetricKeyPair) Reset() { *m = AsymmetricKeyPair{} } func (m *AsymmetricKeyPair) String() string { return proto.CompactTextString(m) } func (*AsymmetricKeyPair) ProtoMessage() {} func (*AsymmetricKeyPair) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{213} + return fileDescriptor_9198ee693835762e, []int{215} } func (m *AsymmetricKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13144,7 +13238,7 @@ func (m *GithubConnectorV3) Reset() { *m = GithubConnectorV3{} } func (m *GithubConnectorV3) String() string { return proto.CompactTextString(m) } func (*GithubConnectorV3) ProtoMessage() {} func (*GithubConnectorV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{214} + return fileDescriptor_9198ee693835762e, []int{216} } func (m *GithubConnectorV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13186,7 +13280,7 @@ func (m *GithubConnectorV3List) Reset() { *m = GithubConnectorV3List{} } func (m *GithubConnectorV3List) String() string { return proto.CompactTextString(m) } func (*GithubConnectorV3List) ProtoMessage() {} func (*GithubConnectorV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{215} + return fileDescriptor_9198ee693835762e, []int{217} } func (m *GithubConnectorV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13249,7 +13343,7 @@ func (m *GithubConnectorSpecV3) Reset() { *m = GithubConnectorSpecV3{} } func (m *GithubConnectorSpecV3) String() string { return proto.CompactTextString(m) } func (*GithubConnectorSpecV3) ProtoMessage() {} func (*GithubConnectorSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{216} + return fileDescriptor_9198ee693835762e, []int{218} } func (m *GithubConnectorSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13312,7 +13406,7 @@ type GithubAuthRequest struct { KubernetesCluster string `protobuf:"bytes,13,opt,name=KubernetesCluster,proto3" json:"kubernetes_cluster,omitempty"` // SSOTestFlow indicates if the request is part of the test flow. SSOTestFlow bool `protobuf:"varint,14,opt,name=SSOTestFlow,proto3" json:"sso_test_flow"` - // ConnectorSpec is embedded connector spec for use in test flow. + // ConnectorSpec is embedded connector spec for use in test flow or authenticated user flow. ConnectorSpec *GithubConnectorSpecV3 `protobuf:"bytes,15,opt,name=ConnectorSpec,proto3" json:"connector_spec,omitempty"` // AttestationStatement is an attestation statement for the given public key. // @@ -13333,16 +13427,20 @@ type GithubAuthRequest struct { SshAttestationStatement *v1.AttestationStatement `protobuf:"bytes,21,opt,name=ssh_attestation_statement,json=sshAttestationStatement,proto3" json:"ssh_attestation_statement,omitempty"` // TlsAttestationStatement is an attestation statement for the given TLS public key. TlsAttestationStatement *v1.AttestationStatement `protobuf:"bytes,22,opt,name=tls_attestation_statement,json=tlsAttestationStatement,proto3" json:"tls_attestation_statement,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + // AuthenticatedUser is the username of an authenticated Teleport user. This + // OAuth flow is used to retrieve GitHub identity info which will be added to + // the existing user. + AuthenticatedUser string `protobuf:"bytes,23,opt,name=authenticated_user,json=authenticatedUser,proto3" json:"authenticated_user,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *GithubAuthRequest) Reset() { *m = GithubAuthRequest{} } func (m *GithubAuthRequest) String() string { return proto.CompactTextString(m) } func (*GithubAuthRequest) ProtoMessage() {} func (*GithubAuthRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{217} + return fileDescriptor_9198ee693835762e, []int{219} } func (m *GithubAuthRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13386,7 +13484,7 @@ func (m *SSOWarnings) Reset() { *m = SSOWarnings{} } func (m *SSOWarnings) String() string { return proto.CompactTextString(m) } func (*SSOWarnings) ProtoMessage() {} func (*SSOWarnings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{218} + return fileDescriptor_9198ee693835762e, []int{220} } func (m *SSOWarnings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13442,7 +13540,7 @@ func (m *CreateUserParams) Reset() { *m = CreateUserParams{} } func (m *CreateUserParams) String() string { return proto.CompactTextString(m) } func (*CreateUserParams) ProtoMessage() {} func (*CreateUserParams) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{219} + return fileDescriptor_9198ee693835762e, []int{221} } func (m *CreateUserParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13527,7 +13625,7 @@ func (m *SSODiagnosticInfo) Reset() { *m = SSODiagnosticInfo{} } func (m *SSODiagnosticInfo) String() string { return proto.CompactTextString(m) } func (*SSODiagnosticInfo) ProtoMessage() {} func (*SSODiagnosticInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{220} + return fileDescriptor_9198ee693835762e, []int{222} } func (m *SSODiagnosticInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13571,7 +13669,7 @@ func (m *GithubTokenInfo) Reset() { *m = GithubTokenInfo{} } func (m *GithubTokenInfo) String() string { return proto.CompactTextString(m) } func (*GithubTokenInfo) ProtoMessage() {} func (*GithubTokenInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{221} + return fileDescriptor_9198ee693835762e, []int{223} } func (m *GithubTokenInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13607,7 +13705,12 @@ type GithubClaims struct { // OrganizationToTeams is the user's organization and team membership OrganizationToTeams github_com_gravitational_teleport_api_types_wrappers.Traits `protobuf:"bytes,2,opt,name=OrganizationToTeams,proto3,customtype=github.com/gravitational/teleport/api/types/wrappers.Traits" json:"organization_to_teams"` // Teams is the users team membership - Teams []string `protobuf:"bytes,3,rep,name=Teams,proto3" json:"teams"` + Teams []string `protobuf:"bytes,3,rep,name=Teams,proto3" json:"teams"` + // UserID is a global unique integer that is assigned to each GitHub user. The + // user ID is immutable (unlike the GitHub username) and can be found in APIs + // like get user. + // https://docs.github.com/en/rest/users/users + UserID string `protobuf:"bytes,4,opt,name=UserID,proto3" json:"user_id,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -13617,7 +13720,7 @@ func (m *GithubClaims) Reset() { *m = GithubClaims{} } func (m *GithubClaims) String() string { return proto.CompactTextString(m) } func (*GithubClaims) ProtoMessage() {} func (*GithubClaims) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{222} + return fileDescriptor_9198ee693835762e, []int{224} } func (m *GithubClaims) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13669,7 +13772,7 @@ func (m *TeamMapping) Reset() { *m = TeamMapping{} } func (m *TeamMapping) String() string { return proto.CompactTextString(m) } func (*TeamMapping) ProtoMessage() {} func (*TeamMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{223} + return fileDescriptor_9198ee693835762e, []int{225} } func (m *TeamMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13715,7 +13818,7 @@ func (m *TeamRolesMapping) Reset() { *m = TeamRolesMapping{} } func (m *TeamRolesMapping) String() string { return proto.CompactTextString(m) } func (*TeamRolesMapping) ProtoMessage() {} func (*TeamRolesMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{224} + return fileDescriptor_9198ee693835762e, []int{226} } func (m *TeamRolesMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13765,7 +13868,7 @@ type TrustedClusterV2 struct { func (m *TrustedClusterV2) Reset() { *m = TrustedClusterV2{} } func (*TrustedClusterV2) ProtoMessage() {} func (*TrustedClusterV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{225} + return fileDescriptor_9198ee693835762e, []int{227} } func (m *TrustedClusterV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13807,7 +13910,7 @@ func (m *TrustedClusterV2List) Reset() { *m = TrustedClusterV2List{} } func (m *TrustedClusterV2List) String() string { return proto.CompactTextString(m) } func (*TrustedClusterV2List) ProtoMessage() {} func (*TrustedClusterV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{226} + return fileDescriptor_9198ee693835762e, []int{228} } func (m *TrustedClusterV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13863,7 +13966,7 @@ func (m *TrustedClusterSpecV2) Reset() { *m = TrustedClusterSpecV2{} } func (m *TrustedClusterSpecV2) String() string { return proto.CompactTextString(m) } func (*TrustedClusterSpecV2) ProtoMessage() {} func (*TrustedClusterSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{227} + return fileDescriptor_9198ee693835762e, []int{229} } func (m *TrustedClusterSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13917,7 +14020,7 @@ func (m *LockV2) Reset() { *m = LockV2{} } func (m *LockV2) String() string { return proto.CompactTextString(m) } func (*LockV2) ProtoMessage() {} func (*LockV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{228} + return fileDescriptor_9198ee693835762e, []int{230} } func (m *LockV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13967,7 +14070,7 @@ func (m *LockSpecV2) Reset() { *m = LockSpecV2{} } func (m *LockSpecV2) String() string { return proto.CompactTextString(m) } func (*LockSpecV2) ProtoMessage() {} func (*LockSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{229} + return fileDescriptor_9198ee693835762e, []int{231} } func (m *LockSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14028,7 +14131,7 @@ type LockTarget struct { func (m *LockTarget) Reset() { *m = LockTarget{} } func (*LockTarget) ProtoMessage() {} func (*LockTarget) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{230} + return fileDescriptor_9198ee693835762e, []int{232} } func (m *LockTarget) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14072,7 +14175,7 @@ func (m *AddressCondition) Reset() { *m = AddressCondition{} } func (m *AddressCondition) String() string { return proto.CompactTextString(m) } func (*AddressCondition) ProtoMessage() {} func (*AddressCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{231} + return fileDescriptor_9198ee693835762e, []int{233} } func (m *AddressCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14115,7 +14218,7 @@ func (m *NetworkRestrictionsSpecV4) Reset() { *m = NetworkRestrictionsSp func (m *NetworkRestrictionsSpecV4) String() string { return proto.CompactTextString(m) } func (*NetworkRestrictionsSpecV4) ProtoMessage() {} func (*NetworkRestrictionsSpecV4) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{232} + return fileDescriptor_9198ee693835762e, []int{234} } func (m *NetworkRestrictionsSpecV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14168,7 +14271,7 @@ func (m *NetworkRestrictionsV4) Reset() { *m = NetworkRestrictionsV4{} } func (m *NetworkRestrictionsV4) String() string { return proto.CompactTextString(m) } func (*NetworkRestrictionsV4) ProtoMessage() {} func (*NetworkRestrictionsV4) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{233} + return fileDescriptor_9198ee693835762e, []int{235} } func (m *NetworkRestrictionsV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14212,7 +14315,7 @@ func (m *WindowsDesktopServiceV3) Reset() { *m = WindowsDesktopServiceV3 func (m *WindowsDesktopServiceV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopServiceV3) ProtoMessage() {} func (*WindowsDesktopServiceV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{234} + return fileDescriptor_9198ee693835762e, []int{236} } func (m *WindowsDesktopServiceV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14260,7 +14363,7 @@ func (m *WindowsDesktopServiceSpecV3) Reset() { *m = WindowsDesktopServi func (m *WindowsDesktopServiceSpecV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopServiceSpecV3) ProtoMessage() {} func (*WindowsDesktopServiceSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{235} + return fileDescriptor_9198ee693835762e, []int{237} } func (m *WindowsDesktopServiceSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14304,7 +14407,7 @@ func (m *WindowsDesktopFilter) Reset() { *m = WindowsDesktopFilter{} } func (m *WindowsDesktopFilter) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopFilter) ProtoMessage() {} func (*WindowsDesktopFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{236} + return fileDescriptor_9198ee693835762e, []int{238} } func (m *WindowsDesktopFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14348,7 +14451,7 @@ func (m *WindowsDesktopV3) Reset() { *m = WindowsDesktopV3{} } func (m *WindowsDesktopV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopV3) ProtoMessage() {} func (*WindowsDesktopV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{237} + return fileDescriptor_9198ee693835762e, []int{239} } func (m *WindowsDesktopV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14401,7 +14504,7 @@ func (m *WindowsDesktopSpecV3) Reset() { *m = WindowsDesktopSpecV3{} } func (m *WindowsDesktopSpecV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopSpecV3) ProtoMessage() {} func (*WindowsDesktopSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{238} + return fileDescriptor_9198ee693835762e, []int{240} } func (m *WindowsDesktopSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14445,7 +14548,7 @@ func (m *DynamicWindowsDesktopV1) Reset() { *m = DynamicWindowsDesktopV1 func (m *DynamicWindowsDesktopV1) String() string { return proto.CompactTextString(m) } func (*DynamicWindowsDesktopV1) ProtoMessage() {} func (*DynamicWindowsDesktopV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{239} + return fileDescriptor_9198ee693835762e, []int{241} } func (m *DynamicWindowsDesktopV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14496,7 +14599,7 @@ func (m *DynamicWindowsDesktopSpecV1) Reset() { *m = DynamicWindowsDeskt func (m *DynamicWindowsDesktopSpecV1) String() string { return proto.CompactTextString(m) } func (*DynamicWindowsDesktopSpecV1) ProtoMessage() {} func (*DynamicWindowsDesktopSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{240} + return fileDescriptor_9198ee693835762e, []int{242} } func (m *DynamicWindowsDesktopSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14537,7 +14640,7 @@ func (m *Resolution) Reset() { *m = Resolution{} } func (m *Resolution) String() string { return proto.CompactTextString(m) } func (*Resolution) ProtoMessage() {} func (*Resolution) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{241} + return fileDescriptor_9198ee693835762e, []int{243} } func (m *Resolution) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14620,7 +14723,7 @@ func (m *RegisterUsingTokenRequest) Reset() { *m = RegisterUsingTokenReq func (m *RegisterUsingTokenRequest) String() string { return proto.CompactTextString(m) } func (*RegisterUsingTokenRequest) ProtoMessage() {} func (*RegisterUsingTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{242} + return fileDescriptor_9198ee693835762e, []int{244} } func (m *RegisterUsingTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14674,7 +14777,7 @@ func (m *RecoveryCodesV1) Reset() { *m = RecoveryCodesV1{} } func (m *RecoveryCodesV1) String() string { return proto.CompactTextString(m) } func (*RecoveryCodesV1) ProtoMessage() {} func (*RecoveryCodesV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{243} + return fileDescriptor_9198ee693835762e, []int{245} } func (m *RecoveryCodesV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14719,7 +14822,7 @@ func (m *RecoveryCodesSpecV1) Reset() { *m = RecoveryCodesSpecV1{} } func (m *RecoveryCodesSpecV1) String() string { return proto.CompactTextString(m) } func (*RecoveryCodesSpecV1) ProtoMessage() {} func (*RecoveryCodesSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{244} + return fileDescriptor_9198ee693835762e, []int{246} } func (m *RecoveryCodesSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14763,7 +14866,7 @@ func (m *RecoveryCode) Reset() { *m = RecoveryCode{} } func (m *RecoveryCode) String() string { return proto.CompactTextString(m) } func (*RecoveryCode) ProtoMessage() {} func (*RecoveryCode) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{245} + return fileDescriptor_9198ee693835762e, []int{247} } func (m *RecoveryCode) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14803,7 +14906,7 @@ func (m *NullableSessionState) Reset() { *m = NullableSessionState{} } func (m *NullableSessionState) String() string { return proto.CompactTextString(m) } func (*NullableSessionState) ProtoMessage() {} func (*NullableSessionState) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{246} + return fileDescriptor_9198ee693835762e, []int{248} } func (m *NullableSessionState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14849,7 +14952,7 @@ func (m *SessionTrackerFilter) Reset() { *m = SessionTrackerFilter{} } func (m *SessionTrackerFilter) String() string { return proto.CompactTextString(m) } func (*SessionTrackerFilter) ProtoMessage() {} func (*SessionTrackerFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{247} + return fileDescriptor_9198ee693835762e, []int{249} } func (m *SessionTrackerFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14893,7 +14996,7 @@ func (m *SessionTrackerV1) Reset() { *m = SessionTrackerV1{} } func (m *SessionTrackerV1) String() string { return proto.CompactTextString(m) } func (*SessionTrackerV1) ProtoMessage() {} func (*SessionTrackerV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{248} + return fileDescriptor_9198ee693835762e, []int{250} } func (m *SessionTrackerV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14991,7 +15094,7 @@ func (m *SessionTrackerSpecV1) Reset() { *m = SessionTrackerSpecV1{} } func (m *SessionTrackerSpecV1) String() string { return proto.CompactTextString(m) } func (*SessionTrackerSpecV1) ProtoMessage() {} func (*SessionTrackerSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{249} + return fileDescriptor_9198ee693835762e, []int{251} } func (m *SessionTrackerSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15038,7 +15141,7 @@ func (m *SessionTrackerPolicySet) Reset() { *m = SessionTrackerPolicySet func (m *SessionTrackerPolicySet) String() string { return proto.CompactTextString(m) } func (*SessionTrackerPolicySet) ProtoMessage() {} func (*SessionTrackerPolicySet) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{250} + return fileDescriptor_9198ee693835762e, []int{252} } func (m *SessionTrackerPolicySet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15086,7 +15189,7 @@ func (m *Participant) Reset() { *m = Participant{} } func (m *Participant) String() string { return proto.CompactTextString(m) } func (*Participant) ProtoMessage() {} func (*Participant) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{251} + return fileDescriptor_9198ee693835762e, []int{253} } func (m *Participant) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15130,7 +15233,7 @@ func (m *UIConfigV1) Reset() { *m = UIConfigV1{} } func (m *UIConfigV1) String() string { return proto.CompactTextString(m) } func (*UIConfigV1) ProtoMessage() {} func (*UIConfigV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{252} + return fileDescriptor_9198ee693835762e, []int{254} } func (m *UIConfigV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15176,7 +15279,7 @@ func (m *UIConfigSpecV1) Reset() { *m = UIConfigSpecV1{} } func (m *UIConfigSpecV1) String() string { return proto.CompactTextString(m) } func (*UIConfigSpecV1) ProtoMessage() {} func (*UIConfigSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{253} + return fileDescriptor_9198ee693835762e, []int{255} } func (m *UIConfigSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15227,7 +15330,7 @@ func (m *InstallerV1) Reset() { *m = InstallerV1{} } func (m *InstallerV1) String() string { return proto.CompactTextString(m) } func (*InstallerV1) ProtoMessage() {} func (*InstallerV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{254} + return fileDescriptor_9198ee693835762e, []int{256} } func (m *InstallerV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15269,7 +15372,7 @@ func (m *InstallerSpecV1) Reset() { *m = InstallerSpecV1{} } func (m *InstallerSpecV1) String() string { return proto.CompactTextString(m) } func (*InstallerSpecV1) ProtoMessage() {} func (*InstallerSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{255} + return fileDescriptor_9198ee693835762e, []int{257} } func (m *InstallerSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15311,7 +15414,7 @@ func (m *InstallerV1List) Reset() { *m = InstallerV1List{} } func (m *InstallerV1List) String() string { return proto.CompactTextString(m) } func (*InstallerV1List) ProtoMessage() {} func (*InstallerV1List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{256} + return fileDescriptor_9198ee693835762e, []int{258} } func (m *InstallerV1List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15355,7 +15458,7 @@ func (m *SortBy) Reset() { *m = SortBy{} } func (m *SortBy) String() string { return proto.CompactTextString(m) } func (*SortBy) ProtoMessage() {} func (*SortBy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{257} + return fileDescriptor_9198ee693835762e, []int{259} } func (m *SortBy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15401,7 +15504,7 @@ func (m *ConnectionDiagnosticV1) Reset() { *m = ConnectionDiagnosticV1{} func (m *ConnectionDiagnosticV1) String() string { return proto.CompactTextString(m) } func (*ConnectionDiagnosticV1) ProtoMessage() {} func (*ConnectionDiagnosticV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{258} + return fileDescriptor_9198ee693835762e, []int{260} } func (m *ConnectionDiagnosticV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15451,7 +15554,7 @@ func (m *ConnectionDiagnosticSpecV1) Reset() { *m = ConnectionDiagnostic func (m *ConnectionDiagnosticSpecV1) String() string { return proto.CompactTextString(m) } func (*ConnectionDiagnosticSpecV1) ProtoMessage() {} func (*ConnectionDiagnosticSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{259} + return fileDescriptor_9198ee693835762e, []int{261} } func (m *ConnectionDiagnosticSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15497,7 +15600,7 @@ func (m *ConnectionDiagnosticTrace) Reset() { *m = ConnectionDiagnosticT func (m *ConnectionDiagnosticTrace) String() string { return proto.CompactTextString(m) } func (*ConnectionDiagnosticTrace) ProtoMessage() {} func (*ConnectionDiagnosticTrace) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{260} + return fileDescriptor_9198ee693835762e, []int{262} } func (m *ConnectionDiagnosticTrace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15540,7 +15643,7 @@ func (m *DatabaseServiceV1) Reset() { *m = DatabaseServiceV1{} } func (m *DatabaseServiceV1) String() string { return proto.CompactTextString(m) } func (*DatabaseServiceV1) ProtoMessage() {} func (*DatabaseServiceV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{261} + return fileDescriptor_9198ee693835762e, []int{263} } func (m *DatabaseServiceV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15584,7 +15687,7 @@ func (m *DatabaseServiceSpecV1) Reset() { *m = DatabaseServiceSpecV1{} } func (m *DatabaseServiceSpecV1) String() string { return proto.CompactTextString(m) } func (*DatabaseServiceSpecV1) ProtoMessage() {} func (*DatabaseServiceSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{262} + return fileDescriptor_9198ee693835762e, []int{264} } func (m *DatabaseServiceSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15626,7 +15729,7 @@ func (m *DatabaseResourceMatcher) Reset() { *m = DatabaseResourceMatcher func (m *DatabaseResourceMatcher) String() string { return proto.CompactTextString(m) } func (*DatabaseResourceMatcher) ProtoMessage() {} func (*DatabaseResourceMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{263} + return fileDescriptor_9198ee693835762e, []int{265} } func (m *DatabaseResourceMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15670,7 +15773,7 @@ func (m *ResourceMatcherAWS) Reset() { *m = ResourceMatcherAWS{} } func (m *ResourceMatcherAWS) String() string { return proto.CompactTextString(m) } func (*ResourceMatcherAWS) ProtoMessage() {} func (*ResourceMatcherAWS) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{264} + return fileDescriptor_9198ee693835762e, []int{266} } func (m *ResourceMatcherAWS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15712,7 +15815,7 @@ func (m *ClusterAlert) Reset() { *m = ClusterAlert{} } func (m *ClusterAlert) String() string { return proto.CompactTextString(m) } func (*ClusterAlert) ProtoMessage() {} func (*ClusterAlert) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{265} + return fileDescriptor_9198ee693835762e, []int{267} } func (m *ClusterAlert) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15758,7 +15861,7 @@ func (m *ClusterAlertSpec) Reset() { *m = ClusterAlertSpec{} } func (m *ClusterAlertSpec) String() string { return proto.CompactTextString(m) } func (*ClusterAlertSpec) ProtoMessage() {} func (*ClusterAlertSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{266} + return fileDescriptor_9198ee693835762e, []int{268} } func (m *ClusterAlertSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15811,7 +15914,7 @@ func (m *GetClusterAlertsRequest) Reset() { *m = GetClusterAlertsRequest func (m *GetClusterAlertsRequest) String() string { return proto.CompactTextString(m) } func (*GetClusterAlertsRequest) ProtoMessage() {} func (*GetClusterAlertsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{267} + return fileDescriptor_9198ee693835762e, []int{269} } func (m *GetClusterAlertsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15861,7 +15964,7 @@ func (m *AlertAcknowledgement) Reset() { *m = AlertAcknowledgement{} } func (m *AlertAcknowledgement) String() string { return proto.CompactTextString(m) } func (*AlertAcknowledgement) ProtoMessage() {} func (*AlertAcknowledgement) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{268} + return fileDescriptor_9198ee693835762e, []int{270} } func (m *AlertAcknowledgement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15913,7 +16016,7 @@ func (m *Release) Reset() { *m = Release{} } func (m *Release) String() string { return proto.CompactTextString(m) } func (*Release) ProtoMessage() {} func (*Release) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{269} + return fileDescriptor_9198ee693835762e, []int{271} } func (m *Release) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15971,7 +16074,7 @@ func (m *Asset) Reset() { *m = Asset{} } func (m *Asset) String() string { return proto.CompactTextString(m) } func (*Asset) ProtoMessage() {} func (*Asset) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{270} + return fileDescriptor_9198ee693835762e, []int{272} } func (m *Asset) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16024,7 +16127,7 @@ func (m *PluginV1) Reset() { *m = PluginV1{} } func (m *PluginV1) String() string { return proto.CompactTextString(m) } func (*PluginV1) ProtoMessage() {} func (*PluginV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{271} + return fileDescriptor_9198ee693835762e, []int{273} } func (m *PluginV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16091,7 +16194,7 @@ func (m *PluginSpecV1) Reset() { *m = PluginSpecV1{} } func (m *PluginSpecV1) String() string { return proto.CompactTextString(m) } func (*PluginSpecV1) ProtoMessage() {} func (*PluginSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{272} + return fileDescriptor_9198ee693835762e, []int{274} } func (m *PluginSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16357,7 +16460,7 @@ func (m *PluginSlackAccessSettings) Reset() { *m = PluginSlackAccessSett func (m *PluginSlackAccessSettings) String() string { return proto.CompactTextString(m) } func (*PluginSlackAccessSettings) ProtoMessage() {} func (*PluginSlackAccessSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{273} + return fileDescriptor_9198ee693835762e, []int{275} } func (m *PluginSlackAccessSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16398,7 +16501,7 @@ func (m *PluginGitlabSettings) Reset() { *m = PluginGitlabSettings{} } func (m *PluginGitlabSettings) String() string { return proto.CompactTextString(m) } func (*PluginGitlabSettings) ProtoMessage() {} func (*PluginGitlabSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{274} + return fileDescriptor_9198ee693835762e, []int{276} } func (m *PluginGitlabSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16445,7 +16548,7 @@ func (m *PluginOpsgenieAccessSettings) Reset() { *m = PluginOpsgenieAcce func (m *PluginOpsgenieAccessSettings) String() string { return proto.CompactTextString(m) } func (*PluginOpsgenieAccessSettings) ProtoMessage() {} func (*PluginOpsgenieAccessSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{275} + return fileDescriptor_9198ee693835762e, []int{277} } func (m *PluginOpsgenieAccessSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16493,7 +16596,7 @@ func (m *PluginServiceNowSettings) Reset() { *m = PluginServiceNowSettin func (m *PluginServiceNowSettings) String() string { return proto.CompactTextString(m) } func (*PluginServiceNowSettings) ProtoMessage() {} func (*PluginServiceNowSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{276} + return fileDescriptor_9198ee693835762e, []int{278} } func (m *PluginServiceNowSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16539,7 +16642,7 @@ func (m *PluginPagerDutySettings) Reset() { *m = PluginPagerDutySettings func (m *PluginPagerDutySettings) String() string { return proto.CompactTextString(m) } func (*PluginPagerDutySettings) ProtoMessage() {} func (*PluginPagerDutySettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{277} + return fileDescriptor_9198ee693835762e, []int{279} } func (m *PluginPagerDutySettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16585,7 +16688,7 @@ func (m *PluginJiraSettings) Reset() { *m = PluginJiraSettings{} } func (m *PluginJiraSettings) String() string { return proto.CompactTextString(m) } func (*PluginJiraSettings) ProtoMessage() {} func (*PluginJiraSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{278} + return fileDescriptor_9198ee693835762e, []int{280} } func (m *PluginJiraSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16625,7 +16728,7 @@ func (m *PluginOpenAISettings) Reset() { *m = PluginOpenAISettings{} } func (m *PluginOpenAISettings) String() string { return proto.CompactTextString(m) } func (*PluginOpenAISettings) ProtoMessage() {} func (*PluginOpenAISettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{279} + return fileDescriptor_9198ee693835762e, []int{281} } func (m *PluginOpenAISettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16676,7 +16779,7 @@ func (m *PluginMattermostSettings) Reset() { *m = PluginMattermostSettin func (m *PluginMattermostSettings) String() string { return proto.CompactTextString(m) } func (*PluginMattermostSettings) ProtoMessage() {} func (*PluginMattermostSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{280} + return fileDescriptor_9198ee693835762e, []int{282} } func (m *PluginMattermostSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16718,7 +16821,7 @@ func (m *PluginJamfSettings) Reset() { *m = PluginJamfSettings{} } func (m *PluginJamfSettings) String() string { return proto.CompactTextString(m) } func (*PluginJamfSettings) ProtoMessage() {} func (*PluginJamfSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{281} + return fileDescriptor_9198ee693835762e, []int{283} } func (m *PluginJamfSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16770,7 +16873,7 @@ func (m *PluginOktaSettings) Reset() { *m = PluginOktaSettings{} } func (m *PluginOktaSettings) String() string { return proto.CompactTextString(m) } func (*PluginOktaSettings) ProtoMessage() {} func (*PluginOktaSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{282} + return fileDescriptor_9198ee693835762e, []int{284} } func (m *PluginOktaSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16817,7 +16920,7 @@ func (m *PluginOktaCredentialsInfo) Reset() { *m = PluginOktaCredentials func (m *PluginOktaCredentialsInfo) String() string { return proto.CompactTextString(m) } func (*PluginOktaCredentialsInfo) ProtoMessage() {} func (*PluginOktaCredentialsInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{283} + return fileDescriptor_9198ee693835762e, []int{285} } func (m *PluginOktaCredentialsInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16901,7 +17004,7 @@ func (m *PluginOktaSyncSettings) Reset() { *m = PluginOktaSyncSettings{} func (m *PluginOktaSyncSettings) String() string { return proto.CompactTextString(m) } func (*PluginOktaSyncSettings) ProtoMessage() {} func (*PluginOktaSyncSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{284} + return fileDescriptor_9198ee693835762e, []int{286} } func (m *PluginOktaSyncSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16942,7 +17045,7 @@ func (m *DiscordChannels) Reset() { *m = DiscordChannels{} } func (m *DiscordChannels) String() string { return proto.CompactTextString(m) } func (*DiscordChannels) ProtoMessage() {} func (*DiscordChannels) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{285} + return fileDescriptor_9198ee693835762e, []int{287} } func (m *DiscordChannels) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16986,7 +17089,7 @@ func (m *PluginDiscordSettings) Reset() { *m = PluginDiscordSettings{} } func (m *PluginDiscordSettings) String() string { return proto.CompactTextString(m) } func (*PluginDiscordSettings) ProtoMessage() {} func (*PluginDiscordSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{286} + return fileDescriptor_9198ee693835762e, []int{288} } func (m *PluginDiscordSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17031,7 +17134,7 @@ func (m *PluginEntraIDSettings) Reset() { *m = PluginEntraIDSettings{} } func (m *PluginEntraIDSettings) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDSettings) ProtoMessage() {} func (*PluginEntraIDSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{287} + return fileDescriptor_9198ee693835762e, []int{289} } func (m *PluginEntraIDSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17085,7 +17188,7 @@ func (m *PluginEntraIDSyncSettings) Reset() { *m = PluginEntraIDSyncSett func (m *PluginEntraIDSyncSettings) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDSyncSettings) ProtoMessage() {} func (*PluginEntraIDSyncSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{288} + return fileDescriptor_9198ee693835762e, []int{290} } func (m *PluginEntraIDSyncSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17130,7 +17233,7 @@ func (m *PluginEntraIDAccessGraphSettings) Reset() { *m = PluginEntraIDA func (m *PluginEntraIDAccessGraphSettings) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDAccessGraphSettings) ProtoMessage() {} func (*PluginEntraIDAccessGraphSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{289} + return fileDescriptor_9198ee693835762e, []int{291} } func (m *PluginEntraIDAccessGraphSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17176,7 +17279,7 @@ func (m *PluginEntraIDAppSSOSettings) Reset() { *m = PluginEntraIDAppSSO func (m *PluginEntraIDAppSSOSettings) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDAppSSOSettings) ProtoMessage() {} func (*PluginEntraIDAppSSOSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{290} + return fileDescriptor_9198ee693835762e, []int{292} } func (m *PluginEntraIDAppSSOSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17222,7 +17325,7 @@ func (m *PluginSCIMSettings) Reset() { *m = PluginSCIMSettings{} } func (m *PluginSCIMSettings) String() string { return proto.CompactTextString(m) } func (*PluginSCIMSettings) ProtoMessage() {} func (*PluginSCIMSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{291} + return fileDescriptor_9198ee693835762e, []int{293} } func (m *PluginSCIMSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17266,7 +17369,7 @@ func (m *PluginDatadogAccessSettings) Reset() { *m = PluginDatadogAccess func (m *PluginDatadogAccessSettings) String() string { return proto.CompactTextString(m) } func (*PluginDatadogAccessSettings) ProtoMessage() {} func (*PluginDatadogAccessSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{292} + return fileDescriptor_9198ee693835762e, []int{294} } func (m *PluginDatadogAccessSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17321,7 +17424,7 @@ func (m *PluginAWSICSettings) Reset() { *m = PluginAWSICSettings{} } func (m *PluginAWSICSettings) String() string { return proto.CompactTextString(m) } func (*PluginAWSICSettings) ProtoMessage() {} func (*PluginAWSICSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{293} + return fileDescriptor_9198ee693835762e, []int{295} } func (m *PluginAWSICSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17368,7 +17471,7 @@ func (m *AWSICProvisioningSpec) Reset() { *m = AWSICProvisioningSpec{} } func (m *AWSICProvisioningSpec) String() string { return proto.CompactTextString(m) } func (*AWSICProvisioningSpec) ProtoMessage() {} func (*AWSICProvisioningSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{294} + return fileDescriptor_9198ee693835762e, []int{296} } func (m *AWSICProvisioningSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17410,7 +17513,7 @@ func (m *PluginAWSICStatusV1) Reset() { *m = PluginAWSICStatusV1{} } func (m *PluginAWSICStatusV1) String() string { return proto.CompactTextString(m) } func (*PluginAWSICStatusV1) ProtoMessage() {} func (*PluginAWSICStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{295} + return fileDescriptor_9198ee693835762e, []int{297} } func (m *PluginAWSICStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17455,7 +17558,7 @@ func (m *AWSICGroupImportStatus) Reset() { *m = AWSICGroupImportStatus{} func (m *AWSICGroupImportStatus) String() string { return proto.CompactTextString(m) } func (*AWSICGroupImportStatus) ProtoMessage() {} func (*AWSICGroupImportStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{296} + return fileDescriptor_9198ee693835762e, []int{298} } func (m *AWSICGroupImportStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17506,7 +17609,7 @@ func (m *PluginEmailSettings) Reset() { *m = PluginEmailSettings{} } func (m *PluginEmailSettings) String() string { return proto.CompactTextString(m) } func (*PluginEmailSettings) ProtoMessage() {} func (*PluginEmailSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{297} + return fileDescriptor_9198ee693835762e, []int{299} } func (m *PluginEmailSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17594,7 +17697,7 @@ func (m *MailgunSpec) Reset() { *m = MailgunSpec{} } func (m *MailgunSpec) String() string { return proto.CompactTextString(m) } func (*MailgunSpec) ProtoMessage() {} func (*MailgunSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{298} + return fileDescriptor_9198ee693835762e, []int{300} } func (m *MailgunSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17641,7 +17744,7 @@ func (m *SMTPSpec) Reset() { *m = SMTPSpec{} } func (m *SMTPSpec) String() string { return proto.CompactTextString(m) } func (*SMTPSpec) ProtoMessage() {} func (*SMTPSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{299} + return fileDescriptor_9198ee693835762e, []int{301} } func (m *SMTPSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17691,7 +17794,7 @@ func (m *PluginMSTeamsSettings) Reset() { *m = PluginMSTeamsSettings{} } func (m *PluginMSTeamsSettings) String() string { return proto.CompactTextString(m) } func (*PluginMSTeamsSettings) ProtoMessage() {} func (*PluginMSTeamsSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{300} + return fileDescriptor_9198ee693835762e, []int{302} } func (m *PluginMSTeamsSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17736,7 +17839,7 @@ func (m *PluginBootstrapCredentialsV1) Reset() { *m = PluginBootstrapCre func (m *PluginBootstrapCredentialsV1) String() string { return proto.CompactTextString(m) } func (*PluginBootstrapCredentialsV1) ProtoMessage() {} func (*PluginBootstrapCredentialsV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{301} + return fileDescriptor_9198ee693835762e, []int{303} } func (m *PluginBootstrapCredentialsV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17836,7 +17939,7 @@ func (m *PluginIdSecretCredential) Reset() { *m = PluginIdSecretCredenti func (m *PluginIdSecretCredential) String() string { return proto.CompactTextString(m) } func (*PluginIdSecretCredential) ProtoMessage() {} func (*PluginIdSecretCredential) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{302} + return fileDescriptor_9198ee693835762e, []int{304} } func (m *PluginIdSecretCredential) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17879,7 +17982,7 @@ func (m *PluginOAuth2AuthorizationCodeCredentials) Reset() { func (m *PluginOAuth2AuthorizationCodeCredentials) String() string { return proto.CompactTextString(m) } func (*PluginOAuth2AuthorizationCodeCredentials) ProtoMessage() {} func (*PluginOAuth2AuthorizationCodeCredentials) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{303} + return fileDescriptor_9198ee693835762e, []int{305} } func (m *PluginOAuth2AuthorizationCodeCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17938,7 +18041,7 @@ func (m *PluginStatusV1) Reset() { *m = PluginStatusV1{} } func (m *PluginStatusV1) String() string { return proto.CompactTextString(m) } func (*PluginStatusV1) ProtoMessage() {} func (*PluginStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{304} + return fileDescriptor_9198ee693835762e, []int{306} } func (m *PluginStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18053,7 +18156,7 @@ func (m *PluginGitlabStatusV1) Reset() { *m = PluginGitlabStatusV1{} } func (m *PluginGitlabStatusV1) String() string { return proto.CompactTextString(m) } func (*PluginGitlabStatusV1) ProtoMessage() {} func (*PluginGitlabStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{305} + return fileDescriptor_9198ee693835762e, []int{307} } func (m *PluginGitlabStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18097,7 +18200,7 @@ func (m *PluginEntraIDStatusV1) Reset() { *m = PluginEntraIDStatusV1{} } func (m *PluginEntraIDStatusV1) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDStatusV1) ProtoMessage() {} func (*PluginEntraIDStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{306} + return fileDescriptor_9198ee693835762e, []int{308} } func (m *PluginEntraIDStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18151,7 +18254,7 @@ func (m *PluginOktaStatusV1) Reset() { *m = PluginOktaStatusV1{} } func (m *PluginOktaStatusV1) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusV1) ProtoMessage() {} func (*PluginOktaStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{307} + return fileDescriptor_9198ee693835762e, []int{309} } func (m *PluginOktaStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18199,7 +18302,7 @@ func (m *PluginOktaStatusDetailsSSO) Reset() { *m = PluginOktaStatusDeta func (m *PluginOktaStatusDetailsSSO) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsSSO) ProtoMessage() {} func (*PluginOktaStatusDetailsSSO) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{308} + return fileDescriptor_9198ee693835762e, []int{310} } func (m *PluginOktaStatusDetailsSSO) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18256,7 +18359,7 @@ func (m *PluginOktaStatusDetailsAppGroupSync) Reset() { *m = PluginOktaS func (m *PluginOktaStatusDetailsAppGroupSync) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsAppGroupSync) ProtoMessage() {} func (*PluginOktaStatusDetailsAppGroupSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{309} + return fileDescriptor_9198ee693835762e, []int{311} } func (m *PluginOktaStatusDetailsAppGroupSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18310,7 +18413,7 @@ func (m *PluginOktaStatusDetailsUsersSync) Reset() { *m = PluginOktaStat func (m *PluginOktaStatusDetailsUsersSync) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsUsersSync) ProtoMessage() {} func (*PluginOktaStatusDetailsUsersSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{310} + return fileDescriptor_9198ee693835762e, []int{312} } func (m *PluginOktaStatusDetailsUsersSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18353,7 +18456,7 @@ func (m *PluginOktaStatusDetailsSCIM) Reset() { *m = PluginOktaStatusDet func (m *PluginOktaStatusDetailsSCIM) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsSCIM) ProtoMessage() {} func (*PluginOktaStatusDetailsSCIM) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{311} + return fileDescriptor_9198ee693835762e, []int{313} } func (m *PluginOktaStatusDetailsSCIM) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18415,7 +18518,7 @@ func (m *PluginOktaStatusDetailsAccessListsSync) Reset() { func (m *PluginOktaStatusDetailsAccessListsSync) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsAccessListsSync) ProtoMessage() {} func (*PluginOktaStatusDetailsAccessListsSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{312} + return fileDescriptor_9198ee693835762e, []int{314} } func (m *PluginOktaStatusDetailsAccessListsSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18463,7 +18566,7 @@ func (m *PluginCredentialsV1) Reset() { *m = PluginCredentialsV1{} } func (m *PluginCredentialsV1) String() string { return proto.CompactTextString(m) } func (*PluginCredentialsV1) ProtoMessage() {} func (*PluginCredentialsV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{313} + return fileDescriptor_9198ee693835762e, []int{315} } func (m *PluginCredentialsV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18574,7 +18677,7 @@ func (m *PluginOAuth2AccessTokenCredentials) Reset() { *m = PluginOAuth2 func (m *PluginOAuth2AccessTokenCredentials) String() string { return proto.CompactTextString(m) } func (*PluginOAuth2AccessTokenCredentials) ProtoMessage() {} func (*PluginOAuth2AccessTokenCredentials) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{314} + return fileDescriptor_9198ee693835762e, []int{316} } func (m *PluginOAuth2AccessTokenCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18615,7 +18718,7 @@ func (m *PluginBearerTokenCredentials) Reset() { *m = PluginBearerTokenC func (m *PluginBearerTokenCredentials) String() string { return proto.CompactTextString(m) } func (*PluginBearerTokenCredentials) ProtoMessage() {} func (*PluginBearerTokenCredentials) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{315} + return fileDescriptor_9198ee693835762e, []int{317} } func (m *PluginBearerTokenCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18657,7 +18760,7 @@ func (m *PluginStaticCredentialsRef) Reset() { *m = PluginStaticCredenti func (m *PluginStaticCredentialsRef) String() string { return proto.CompactTextString(m) } func (*PluginStaticCredentialsRef) ProtoMessage() {} func (*PluginStaticCredentialsRef) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{316} + return fileDescriptor_9198ee693835762e, []int{318} } func (m *PluginStaticCredentialsRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18699,7 +18802,7 @@ func (m *PluginListV1) Reset() { *m = PluginListV1{} } func (m *PluginListV1) String() string { return proto.CompactTextString(m) } func (*PluginListV1) ProtoMessage() {} func (*PluginListV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{317} + return fileDescriptor_9198ee693835762e, []int{319} } func (m *PluginListV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18742,7 +18845,7 @@ type PluginStaticCredentialsV1 struct { func (m *PluginStaticCredentialsV1) Reset() { *m = PluginStaticCredentialsV1{} } func (*PluginStaticCredentialsV1) ProtoMessage() {} func (*PluginStaticCredentialsV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{318} + return fileDescriptor_9198ee693835762e, []int{320} } func (m *PluginStaticCredentialsV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18778,6 +18881,7 @@ type PluginStaticCredentialsSpecV1 struct { // *PluginStaticCredentialsSpecV1_APIToken // *PluginStaticCredentialsSpecV1_BasicAuth // *PluginStaticCredentialsSpecV1_OAuthClientSecret + // *PluginStaticCredentialsSpecV1_SSHCertAuthorities Credentials isPluginStaticCredentialsSpecV1_Credentials `protobuf_oneof:"credentials"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -18788,7 +18892,7 @@ func (m *PluginStaticCredentialsSpecV1) Reset() { *m = PluginStaticCrede func (m *PluginStaticCredentialsSpecV1) String() string { return proto.CompactTextString(m) } func (*PluginStaticCredentialsSpecV1) ProtoMessage() {} func (*PluginStaticCredentialsSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{319} + return fileDescriptor_9198ee693835762e, []int{321} } func (m *PluginStaticCredentialsSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18832,11 +18936,16 @@ type PluginStaticCredentialsSpecV1_BasicAuth struct { type PluginStaticCredentialsSpecV1_OAuthClientSecret struct { OAuthClientSecret *PluginStaticCredentialsOAuthClientSecret `protobuf:"bytes,3,opt,name=OAuthClientSecret,proto3,oneof" json:"OAuthClientSecret,omitempty"` } +type PluginStaticCredentialsSpecV1_SSHCertAuthorities struct { + SSHCertAuthorities *PluginStaticCredentialsSSHCertAuthorities `protobuf:"bytes,4,opt,name=SSHCertAuthorities,proto3,oneof" json:"SSHCertAuthorities,omitempty"` +} func (*PluginStaticCredentialsSpecV1_APIToken) isPluginStaticCredentialsSpecV1_Credentials() {} func (*PluginStaticCredentialsSpecV1_BasicAuth) isPluginStaticCredentialsSpecV1_Credentials() {} func (*PluginStaticCredentialsSpecV1_OAuthClientSecret) isPluginStaticCredentialsSpecV1_Credentials() { } +func (*PluginStaticCredentialsSpecV1_SSHCertAuthorities) isPluginStaticCredentialsSpecV1_Credentials() { +} func (m *PluginStaticCredentialsSpecV1) GetCredentials() isPluginStaticCredentialsSpecV1_Credentials { if m != nil { @@ -18866,12 +18975,20 @@ func (m *PluginStaticCredentialsSpecV1) GetOAuthClientSecret() *PluginStaticCred return nil } +func (m *PluginStaticCredentialsSpecV1) GetSSHCertAuthorities() *PluginStaticCredentialsSSHCertAuthorities { + if x, ok := m.GetCredentials().(*PluginStaticCredentialsSpecV1_SSHCertAuthorities); ok { + return x.SSHCertAuthorities + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*PluginStaticCredentialsSpecV1) XXX_OneofWrappers() []interface{} { return []interface{}{ (*PluginStaticCredentialsSpecV1_APIToken)(nil), (*PluginStaticCredentialsSpecV1_BasicAuth)(nil), (*PluginStaticCredentialsSpecV1_OAuthClientSecret)(nil), + (*PluginStaticCredentialsSpecV1_SSHCertAuthorities)(nil), } } @@ -18890,7 +19007,7 @@ func (m *PluginStaticCredentialsBasicAuth) Reset() { *m = PluginStaticCr func (m *PluginStaticCredentialsBasicAuth) String() string { return proto.CompactTextString(m) } func (*PluginStaticCredentialsBasicAuth) ProtoMessage() {} func (*PluginStaticCredentialsBasicAuth) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{320} + return fileDescriptor_9198ee693835762e, []int{322} } func (m *PluginStaticCredentialsBasicAuth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18936,7 +19053,7 @@ func (m *PluginStaticCredentialsOAuthClientSecret) Reset() { func (m *PluginStaticCredentialsOAuthClientSecret) String() string { return proto.CompactTextString(m) } func (*PluginStaticCredentialsOAuthClientSecret) ProtoMessage() {} func (*PluginStaticCredentialsOAuthClientSecret) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{321} + return fileDescriptor_9198ee693835762e, []int{323} } func (m *PluginStaticCredentialsOAuthClientSecret) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18965,6 +19082,54 @@ func (m *PluginStaticCredentialsOAuthClientSecret) XXX_DiscardUnknown() { var xxx_messageInfo_PluginStaticCredentialsOAuthClientSecret proto.InternalMessageInfo +// PluginStaticCredentialsSSHCertAuthorities contains the active SSH CAs used +// for the integration or plugin. +type PluginStaticCredentialsSSHCertAuthorities struct { + // CertAuthorities contains the active SSH CAs used for the integration or + // plugin. + CertAuthorities []*SSHKeyPair `protobuf:"bytes,1,rep,name=cert_authorities,json=certAuthorities,proto3" json:"cert_authorities,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PluginStaticCredentialsSSHCertAuthorities) Reset() { + *m = PluginStaticCredentialsSSHCertAuthorities{} +} +func (m *PluginStaticCredentialsSSHCertAuthorities) String() string { + return proto.CompactTextString(m) +} +func (*PluginStaticCredentialsSSHCertAuthorities) ProtoMessage() {} +func (*PluginStaticCredentialsSSHCertAuthorities) Descriptor() ([]byte, []int) { + return fileDescriptor_9198ee693835762e, []int{324} +} +func (m *PluginStaticCredentialsSSHCertAuthorities) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PluginStaticCredentialsSSHCertAuthorities) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PluginStaticCredentialsSSHCertAuthorities.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 *PluginStaticCredentialsSSHCertAuthorities) XXX_Merge(src proto.Message) { + xxx_messageInfo_PluginStaticCredentialsSSHCertAuthorities.Merge(m, src) +} +func (m *PluginStaticCredentialsSSHCertAuthorities) XXX_Size() int { + return m.Size() +} +func (m *PluginStaticCredentialsSSHCertAuthorities) XXX_DiscardUnknown() { + xxx_messageInfo_PluginStaticCredentialsSSHCertAuthorities.DiscardUnknown(m) +} + +var xxx_messageInfo_PluginStaticCredentialsSSHCertAuthorities proto.InternalMessageInfo + // SAMLIdPServiceProviderV1 is the representation of a SAML IdP service provider. type SAMLIdPServiceProviderV1 struct { // Header is the resource header for the SAML IdP service provider. @@ -18979,7 +19144,7 @@ type SAMLIdPServiceProviderV1 struct { func (m *SAMLIdPServiceProviderV1) Reset() { *m = SAMLIdPServiceProviderV1{} } func (*SAMLIdPServiceProviderV1) ProtoMessage() {} func (*SAMLIdPServiceProviderV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{322} + return fileDescriptor_9198ee693835762e, []int{325} } func (m *SAMLIdPServiceProviderV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19050,7 +19215,7 @@ func (m *SAMLIdPServiceProviderSpecV1) Reset() { *m = SAMLIdPServiceProv func (m *SAMLIdPServiceProviderSpecV1) String() string { return proto.CompactTextString(m) } func (*SAMLIdPServiceProviderSpecV1) ProtoMessage() {} func (*SAMLIdPServiceProviderSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{323} + return fileDescriptor_9198ee693835762e, []int{326} } func (m *SAMLIdPServiceProviderSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19097,7 +19262,7 @@ func (m *SAMLAttributeMapping) Reset() { *m = SAMLAttributeMapping{} } func (m *SAMLAttributeMapping) String() string { return proto.CompactTextString(m) } func (*SAMLAttributeMapping) ProtoMessage() {} func (*SAMLAttributeMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{324} + return fileDescriptor_9198ee693835762e, []int{327} } func (m *SAMLAttributeMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19139,7 +19304,7 @@ func (m *IdPOptions) Reset() { *m = IdPOptions{} } func (m *IdPOptions) String() string { return proto.CompactTextString(m) } func (*IdPOptions) ProtoMessage() {} func (*IdPOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{325} + return fileDescriptor_9198ee693835762e, []int{328} } func (m *IdPOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19181,7 +19346,7 @@ func (m *IdPSAMLOptions) Reset() { *m = IdPSAMLOptions{} } func (m *IdPSAMLOptions) String() string { return proto.CompactTextString(m) } func (*IdPSAMLOptions) ProtoMessage() {} func (*IdPSAMLOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{326} + return fileDescriptor_9198ee693835762e, []int{329} } func (m *IdPSAMLOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19231,7 +19396,7 @@ func (m *KubernetesResourceV1) Reset() { *m = KubernetesResourceV1{} } func (m *KubernetesResourceV1) String() string { return proto.CompactTextString(m) } func (*KubernetesResourceV1) ProtoMessage() {} func (*KubernetesResourceV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{327} + return fileDescriptor_9198ee693835762e, []int{330} } func (m *KubernetesResourceV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19273,7 +19438,7 @@ func (m *KubernetesResourceSpecV1) Reset() { *m = KubernetesResourceSpec func (m *KubernetesResourceSpecV1) String() string { return proto.CompactTextString(m) } func (*KubernetesResourceSpecV1) ProtoMessage() {} func (*KubernetesResourceSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{328} + return fileDescriptor_9198ee693835762e, []int{331} } func (m *KubernetesResourceSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19319,7 +19484,7 @@ func (m *ClusterMaintenanceConfigV1) Reset() { *m = ClusterMaintenanceCo func (m *ClusterMaintenanceConfigV1) String() string { return proto.CompactTextString(m) } func (*ClusterMaintenanceConfigV1) ProtoMessage() {} func (*ClusterMaintenanceConfigV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{329} + return fileDescriptor_9198ee693835762e, []int{332} } func (m *ClusterMaintenanceConfigV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19361,7 +19526,7 @@ func (m *ClusterMaintenanceConfigSpecV1) Reset() { *m = ClusterMaintenan func (m *ClusterMaintenanceConfigSpecV1) String() string { return proto.CompactTextString(m) } func (*ClusterMaintenanceConfigSpecV1) ProtoMessage() {} func (*ClusterMaintenanceConfigSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{330} + return fileDescriptor_9198ee693835762e, []int{333} } func (m *ClusterMaintenanceConfigSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19407,7 +19572,7 @@ func (m *AgentUpgradeWindow) Reset() { *m = AgentUpgradeWindow{} } func (m *AgentUpgradeWindow) String() string { return proto.CompactTextString(m) } func (*AgentUpgradeWindow) ProtoMessage() {} func (*AgentUpgradeWindow) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{331} + return fileDescriptor_9198ee693835762e, []int{334} } func (m *AgentUpgradeWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19454,7 +19619,7 @@ func (m *ScheduledAgentUpgradeWindow) Reset() { *m = ScheduledAgentUpgra func (m *ScheduledAgentUpgradeWindow) String() string { return proto.CompactTextString(m) } func (*ScheduledAgentUpgradeWindow) ProtoMessage() {} func (*ScheduledAgentUpgradeWindow) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{332} + return fileDescriptor_9198ee693835762e, []int{335} } func (m *ScheduledAgentUpgradeWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19497,7 +19662,7 @@ func (m *AgentUpgradeSchedule) Reset() { *m = AgentUpgradeSchedule{} } func (m *AgentUpgradeSchedule) String() string { return proto.CompactTextString(m) } func (*AgentUpgradeSchedule) ProtoMessage() {} func (*AgentUpgradeSchedule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{333} + return fileDescriptor_9198ee693835762e, []int{336} } func (m *AgentUpgradeSchedule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19540,7 +19705,7 @@ type UserGroupV1 struct { func (m *UserGroupV1) Reset() { *m = UserGroupV1{} } func (*UserGroupV1) ProtoMessage() {} func (*UserGroupV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{334} + return fileDescriptor_9198ee693835762e, []int{337} } func (m *UserGroupV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19582,7 +19747,7 @@ func (m *UserGroupSpecV1) Reset() { *m = UserGroupSpecV1{} } func (m *UserGroupSpecV1) String() string { return proto.CompactTextString(m) } func (*UserGroupSpecV1) ProtoMessage() {} func (*UserGroupSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{335} + return fileDescriptor_9198ee693835762e, []int{338} } func (m *UserGroupSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19626,7 +19791,7 @@ func (m *OktaImportRuleSpecV1) Reset() { *m = OktaImportRuleSpecV1{} } func (m *OktaImportRuleSpecV1) String() string { return proto.CompactTextString(m) } func (*OktaImportRuleSpecV1) ProtoMessage() {} func (*OktaImportRuleSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{336} + return fileDescriptor_9198ee693835762e, []int{339} } func (m *OktaImportRuleSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19670,7 +19835,7 @@ func (m *OktaImportRuleMappingV1) Reset() { *m = OktaImportRuleMappingV1 func (m *OktaImportRuleMappingV1) String() string { return proto.CompactTextString(m) } func (*OktaImportRuleMappingV1) ProtoMessage() {} func (*OktaImportRuleMappingV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{337} + return fileDescriptor_9198ee693835762e, []int{340} } func (m *OktaImportRuleMappingV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19713,7 +19878,7 @@ type OktaImportRuleV1 struct { func (m *OktaImportRuleV1) Reset() { *m = OktaImportRuleV1{} } func (*OktaImportRuleV1) ProtoMessage() {} func (*OktaImportRuleV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{338} + return fileDescriptor_9198ee693835762e, []int{341} } func (m *OktaImportRuleV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19761,7 +19926,7 @@ func (m *OktaImportRuleMatchV1) Reset() { *m = OktaImportRuleMatchV1{} } func (m *OktaImportRuleMatchV1) String() string { return proto.CompactTextString(m) } func (*OktaImportRuleMatchV1) ProtoMessage() {} func (*OktaImportRuleMatchV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{339} + return fileDescriptor_9198ee693835762e, []int{342} } func (m *OktaImportRuleMatchV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19804,7 +19969,7 @@ type OktaAssignmentV1 struct { func (m *OktaAssignmentV1) Reset() { *m = OktaAssignmentV1{} } func (*OktaAssignmentV1) ProtoMessage() {} func (*OktaAssignmentV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{340} + return fileDescriptor_9198ee693835762e, []int{343} } func (m *OktaAssignmentV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19858,7 +20023,7 @@ func (m *OktaAssignmentSpecV1) Reset() { *m = OktaAssignmentSpecV1{} } func (m *OktaAssignmentSpecV1) String() string { return proto.CompactTextString(m) } func (*OktaAssignmentSpecV1) ProtoMessage() {} func (*OktaAssignmentSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{341} + return fileDescriptor_9198ee693835762e, []int{344} } func (m *OktaAssignmentSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19902,7 +20067,7 @@ func (m *OktaAssignmentTargetV1) Reset() { *m = OktaAssignmentTargetV1{} func (m *OktaAssignmentTargetV1) String() string { return proto.CompactTextString(m) } func (*OktaAssignmentTargetV1) ProtoMessage() {} func (*OktaAssignmentTargetV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{342} + return fileDescriptor_9198ee693835762e, []int{345} } func (m *OktaAssignmentTargetV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19947,7 +20112,7 @@ type IntegrationV1 struct { func (m *IntegrationV1) Reset() { *m = IntegrationV1{} } func (*IntegrationV1) ProtoMessage() {} func (*IntegrationV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{343} + return fileDescriptor_9198ee693835762e, []int{346} } func (m *IntegrationV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19982,17 +20147,20 @@ type IntegrationSpecV1 struct { // // *IntegrationSpecV1_AWSOIDC // *IntegrationSpecV1_AzureOIDC - SubKindSpec isIntegrationSpecV1_SubKindSpec `protobuf_oneof:"SubKindSpec"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + // *IntegrationSpecV1_GitHub + SubKindSpec isIntegrationSpecV1_SubKindSpec `protobuf_oneof:"SubKindSpec"` + // Credentials contains credentials for the integration. + Credentials *PluginCredentialsV1 `protobuf:"bytes,4,opt,name=credentials,proto3" json:"credentials,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *IntegrationSpecV1) Reset() { *m = IntegrationSpecV1{} } func (m *IntegrationSpecV1) String() string { return proto.CompactTextString(m) } func (*IntegrationSpecV1) ProtoMessage() {} func (*IntegrationSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{344} + return fileDescriptor_9198ee693835762e, []int{347} } func (m *IntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20033,9 +20201,13 @@ type IntegrationSpecV1_AWSOIDC struct { type IntegrationSpecV1_AzureOIDC struct { AzureOIDC *AzureOIDCIntegrationSpecV1 `protobuf:"bytes,2,opt,name=AzureOIDC,proto3,oneof" json:"azure_oidc,omitempty"` } +type IntegrationSpecV1_GitHub struct { + GitHub *GitHubIntegrationSpecV1 `protobuf:"bytes,3,opt,name=GitHub,proto3,oneof" json:"github,omitempty"` +} func (*IntegrationSpecV1_AWSOIDC) isIntegrationSpecV1_SubKindSpec() {} func (*IntegrationSpecV1_AzureOIDC) isIntegrationSpecV1_SubKindSpec() {} +func (*IntegrationSpecV1_GitHub) isIntegrationSpecV1_SubKindSpec() {} func (m *IntegrationSpecV1) GetSubKindSpec() isIntegrationSpecV1_SubKindSpec { if m != nil { @@ -20058,11 +20230,19 @@ func (m *IntegrationSpecV1) GetAzureOIDC() *AzureOIDCIntegrationSpecV1 { return nil } +func (m *IntegrationSpecV1) GetGitHub() *GitHubIntegrationSpecV1 { + if x, ok := m.GetSubKindSpec().(*IntegrationSpecV1_GitHub); ok { + return x.GitHub + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*IntegrationSpecV1) XXX_OneofWrappers() []interface{} { return []interface{}{ (*IntegrationSpecV1_AWSOIDC)(nil), (*IntegrationSpecV1_AzureOIDC)(nil), + (*IntegrationSpecV1_GitHub)(nil), } } @@ -20099,7 +20279,7 @@ func (m *AWSOIDCIntegrationSpecV1) Reset() { *m = AWSOIDCIntegrationSpec func (m *AWSOIDCIntegrationSpecV1) String() string { return proto.CompactTextString(m) } func (*AWSOIDCIntegrationSpecV1) ProtoMessage() {} func (*AWSOIDCIntegrationSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{345} + return fileDescriptor_9198ee693835762e, []int{348} } func (m *AWSOIDCIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20145,7 +20325,7 @@ func (m *AzureOIDCIntegrationSpecV1) Reset() { *m = AzureOIDCIntegration func (m *AzureOIDCIntegrationSpecV1) String() string { return proto.CompactTextString(m) } func (*AzureOIDCIntegrationSpecV1) ProtoMessage() {} func (*AzureOIDCIntegrationSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{346} + return fileDescriptor_9198ee693835762e, []int{349} } func (m *AzureOIDCIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20174,6 +20354,48 @@ func (m *AzureOIDCIntegrationSpecV1) XXX_DiscardUnknown() { var xxx_messageInfo_AzureOIDCIntegrationSpecV1 proto.InternalMessageInfo +// GitHubIntegrationSpecV1 contains the specific fields to handle the GitHub integration subkind. +type GitHubIntegrationSpecV1 struct { + // Organization specifies the name of the organization for the GitHub integration. + Organization string `protobuf:"bytes,1,opt,name=Organization,proto3" json:"organization,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GitHubIntegrationSpecV1) Reset() { *m = GitHubIntegrationSpecV1{} } +func (m *GitHubIntegrationSpecV1) String() string { return proto.CompactTextString(m) } +func (*GitHubIntegrationSpecV1) ProtoMessage() {} +func (*GitHubIntegrationSpecV1) Descriptor() ([]byte, []int) { + return fileDescriptor_9198ee693835762e, []int{350} +} +func (m *GitHubIntegrationSpecV1) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GitHubIntegrationSpecV1) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GitHubIntegrationSpecV1.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 *GitHubIntegrationSpecV1) XXX_Merge(src proto.Message) { + xxx_messageInfo_GitHubIntegrationSpecV1.Merge(m, src) +} +func (m *GitHubIntegrationSpecV1) XXX_Size() int { + return m.Size() +} +func (m *GitHubIntegrationSpecV1) XXX_DiscardUnknown() { + xxx_messageInfo_GitHubIntegrationSpecV1.DiscardUnknown(m) +} + +var xxx_messageInfo_GitHubIntegrationSpecV1 proto.InternalMessageInfo + // HeadlessAuthentication holds data for an ongoing headless authentication attempt. type HeadlessAuthentication struct { // Header is the resource header. @@ -20206,7 +20428,7 @@ func (m *HeadlessAuthentication) Reset() { *m = HeadlessAuthentication{} func (m *HeadlessAuthentication) String() string { return proto.CompactTextString(m) } func (*HeadlessAuthentication) ProtoMessage() {} func (*HeadlessAuthentication) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{347} + return fileDescriptor_9198ee693835762e, []int{351} } func (m *HeadlessAuthentication) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20263,7 +20485,7 @@ func (m *WatchKind) Reset() { *m = WatchKind{} } func (m *WatchKind) String() string { return proto.CompactTextString(m) } func (*WatchKind) ProtoMessage() {} func (*WatchKind) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{348} + return fileDescriptor_9198ee693835762e, []int{352} } func (m *WatchKind) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20313,7 +20535,7 @@ func (m *WatchStatusV1) Reset() { *m = WatchStatusV1{} } func (m *WatchStatusV1) String() string { return proto.CompactTextString(m) } func (*WatchStatusV1) ProtoMessage() {} func (*WatchStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{349} + return fileDescriptor_9198ee693835762e, []int{353} } func (m *WatchStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20354,7 +20576,7 @@ func (m *WatchStatusSpecV1) Reset() { *m = WatchStatusSpecV1{} } func (m *WatchStatusSpecV1) String() string { return proto.CompactTextString(m) } func (*WatchStatusSpecV1) ProtoMessage() {} func (*WatchStatusSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{350} + return fileDescriptor_9198ee693835762e, []int{354} } func (m *WatchStatusSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20404,7 +20626,7 @@ func (m *ServerInfoV1) Reset() { *m = ServerInfoV1{} } func (m *ServerInfoV1) String() string { return proto.CompactTextString(m) } func (*ServerInfoV1) ProtoMessage() {} func (*ServerInfoV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{351} + return fileDescriptor_9198ee693835762e, []int{355} } func (m *ServerInfoV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20446,7 +20668,7 @@ func (m *ServerInfoSpecV1) Reset() { *m = ServerInfoSpecV1{} } func (m *ServerInfoSpecV1) String() string { return proto.CompactTextString(m) } func (*ServerInfoSpecV1) ProtoMessage() {} func (*ServerInfoSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{352} + return fileDescriptor_9198ee693835762e, []int{356} } func (m *ServerInfoSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20503,7 +20725,7 @@ func (m *JamfSpecV1) Reset() { *m = JamfSpecV1{} } func (m *JamfSpecV1) String() string { return proto.CompactTextString(m) } func (*JamfSpecV1) ProtoMessage() {} func (*JamfSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{353} + return fileDescriptor_9198ee693835762e, []int{357} } func (m *JamfSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20568,7 +20790,7 @@ func (m *JamfInventoryEntry) Reset() { *m = JamfInventoryEntry{} } func (m *JamfInventoryEntry) String() string { return proto.CompactTextString(m) } func (*JamfInventoryEntry) ProtoMessage() {} func (*JamfInventoryEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{354} + return fileDescriptor_9198ee693835762e, []int{358} } func (m *JamfInventoryEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20625,7 +20847,7 @@ type MessageWithHeader struct { func (m *MessageWithHeader) Reset() { *m = MessageWithHeader{} } func (*MessageWithHeader) ProtoMessage() {} func (*MessageWithHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{355} + return fileDescriptor_9198ee693835762e, []int{359} } func (m *MessageWithHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20689,7 +20911,7 @@ func (m *AWSMatcher) Reset() { *m = AWSMatcher{} } func (m *AWSMatcher) String() string { return proto.CompactTextString(m) } func (*AWSMatcher) ProtoMessage() {} func (*AWSMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{356} + return fileDescriptor_9198ee693835762e, []int{360} } func (m *AWSMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20734,7 +20956,7 @@ func (m *AssumeRole) Reset() { *m = AssumeRole{} } func (m *AssumeRole) String() string { return proto.CompactTextString(m) } func (*AssumeRole) ProtoMessage() {} func (*AssumeRole) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{357} + return fileDescriptor_9198ee693835762e, []int{361} } func (m *AssumeRole) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20796,7 +21018,7 @@ func (m *InstallerParams) Reset() { *m = InstallerParams{} } func (m *InstallerParams) String() string { return proto.CompactTextString(m) } func (*InstallerParams) ProtoMessage() {} func (*InstallerParams) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{358} + return fileDescriptor_9198ee693835762e, []int{362} } func (m *InstallerParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20839,7 +21061,7 @@ func (m *AWSSSM) Reset() { *m = AWSSSM{} } func (m *AWSSSM) String() string { return proto.CompactTextString(m) } func (*AWSSSM) ProtoMessage() {} func (*AWSSSM) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{359} + return fileDescriptor_9198ee693835762e, []int{363} } func (m *AWSSSM) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20882,7 +21104,7 @@ func (m *AzureInstallerParams) Reset() { *m = AzureInstallerParams{} } func (m *AzureInstallerParams) String() string { return proto.CompactTextString(m) } func (*AzureInstallerParams) ProtoMessage() {} func (*AzureInstallerParams) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{360} + return fileDescriptor_9198ee693835762e, []int{364} } func (m *AzureInstallerParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20936,7 +21158,7 @@ func (m *AzureMatcher) Reset() { *m = AzureMatcher{} } func (m *AzureMatcher) String() string { return proto.CompactTextString(m) } func (*AzureMatcher) ProtoMessage() {} func (*AzureMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{361} + return fileDescriptor_9198ee693835762e, []int{365} } func (m *AzureMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20991,7 +21213,7 @@ func (m *GCPMatcher) Reset() { *m = GCPMatcher{} } func (m *GCPMatcher) String() string { return proto.CompactTextString(m) } func (*GCPMatcher) ProtoMessage() {} func (*GCPMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{362} + return fileDescriptor_9198ee693835762e, []int{366} } func (m *GCPMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21037,7 +21259,7 @@ func (m *KubernetesMatcher) Reset() { *m = KubernetesMatcher{} } func (m *KubernetesMatcher) String() string { return proto.CompactTextString(m) } func (*KubernetesMatcher) ProtoMessage() {} func (*KubernetesMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{363} + return fileDescriptor_9198ee693835762e, []int{367} } func (m *KubernetesMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21079,7 +21301,7 @@ func (m *OktaOptions) Reset() { *m = OktaOptions{} } func (m *OktaOptions) String() string { return proto.CompactTextString(m) } func (*OktaOptions) ProtoMessage() {} func (*OktaOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{364} + return fileDescriptor_9198ee693835762e, []int{368} } func (m *OktaOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21123,7 +21345,7 @@ func (m *AccessGraphSync) Reset() { *m = AccessGraphSync{} } func (m *AccessGraphSync) String() string { return proto.CompactTextString(m) } func (*AccessGraphSync) ProtoMessage() {} func (*AccessGraphSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{365} + return fileDescriptor_9198ee693835762e, []int{369} } func (m *AccessGraphSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21169,7 +21391,7 @@ func (m *AccessGraphAWSSync) Reset() { *m = AccessGraphAWSSync{} } func (m *AccessGraphAWSSync) String() string { return proto.CompactTextString(m) } func (*AccessGraphAWSSync) ProtoMessage() {} func (*AccessGraphAWSSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{366} + return fileDescriptor_9198ee693835762e, []int{370} } func (m *AccessGraphAWSSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21275,6 +21497,7 @@ func init() { proto.RegisterMapType((map[string]CommandLabelV2)(nil), "types.ServerSpecV2.CmdLabelsEntry") proto.RegisterType((*AWSInfo)(nil), "types.AWSInfo") proto.RegisterType((*CloudMetadata)(nil), "types.CloudMetadata") + proto.RegisterType((*GitHubServerMetadata)(nil), "types.GitHubServerMetadata") proto.RegisterType((*AppServerV3)(nil), "types.AppServerV3") proto.RegisterType((*AppServerSpecV3)(nil), "types.AppServerSpecV3") proto.RegisterType((*AppV3List)(nil), "types.AppV3List") @@ -21383,6 +21606,7 @@ func init() { proto.RegisterType((*CertExtension)(nil), "types.CertExtension") proto.RegisterType((*RoleConditions)(nil), "types.RoleConditions") proto.RegisterType((*IdentityCenterAccountAssignment)(nil), "types.IdentityCenterAccountAssignment") + proto.RegisterType((*GitHubPermission)(nil), "types.GitHubPermission") proto.RegisterType((*SPIFFERoleCondition)(nil), "types.SPIFFERoleCondition") proto.RegisterType((*DatabasePermission)(nil), "types.DatabasePermission") proto.RegisterType((*KubernetesResource)(nil), "types.KubernetesResource") @@ -21582,6 +21806,7 @@ func init() { proto.RegisterType((*PluginStaticCredentialsSpecV1)(nil), "types.PluginStaticCredentialsSpecV1") proto.RegisterType((*PluginStaticCredentialsBasicAuth)(nil), "types.PluginStaticCredentialsBasicAuth") proto.RegisterType((*PluginStaticCredentialsOAuthClientSecret)(nil), "types.PluginStaticCredentialsOAuthClientSecret") + proto.RegisterType((*PluginStaticCredentialsSSHCertAuthorities)(nil), "types.PluginStaticCredentialsSSHCertAuthorities") proto.RegisterType((*SAMLIdPServiceProviderV1)(nil), "types.SAMLIdPServiceProviderV1") proto.RegisterType((*SAMLIdPServiceProviderSpecV1)(nil), "types.SAMLIdPServiceProviderSpecV1") proto.RegisterType((*SAMLAttributeMapping)(nil), "types.SAMLAttributeMapping") @@ -21608,6 +21833,7 @@ func init() { proto.RegisterType((*IntegrationSpecV1)(nil), "types.IntegrationSpecV1") proto.RegisterType((*AWSOIDCIntegrationSpecV1)(nil), "types.AWSOIDCIntegrationSpecV1") proto.RegisterType((*AzureOIDCIntegrationSpecV1)(nil), "types.AzureOIDCIntegrationSpecV1") + proto.RegisterType((*GitHubIntegrationSpecV1)(nil), "types.GitHubIntegrationSpecV1") proto.RegisterType((*HeadlessAuthentication)(nil), "types.HeadlessAuthentication") proto.RegisterType((*WatchKind)(nil), "types.WatchKind") proto.RegisterMapType((map[string]string)(nil), "types.WatchKind.FilterEntry") @@ -21635,1884 +21861,1901 @@ func init() { func init() { proto.RegisterFile("teleport/legacy/types/types.proto", fileDescriptor_9198ee693835762e) } var fileDescriptor_9198ee693835762e = []byte{ - // 30025 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xfd, 0x7b, 0x70, 0x1c, 0x49, - 0x7a, 0x20, 0x86, 0x4f, 0x77, 0xe3, 0xd1, 0xf8, 0xf0, 0x6a, 0x24, 0x40, 0x12, 0xc4, 0xcc, 0xb0, - 0x39, 0x35, 0x33, 0x1c, 0x72, 0x76, 0x86, 0x5c, 0x82, 0x3b, 0xdc, 0x9d, 0x9d, 0xd7, 0x36, 0xba, - 0x41, 0xa2, 0x49, 0x00, 0xc4, 0x56, 0x03, 0xc4, 0x8e, 0xf6, 0x51, 0x5b, 0xe8, 0x4e, 0x00, 0x35, - 0xe8, 0xee, 0xea, 0xad, 0xaa, 0x26, 0x88, 0xdd, 0xd3, 0xef, 0xf4, 0xda, 0xd3, 0x4f, 0x21, 0xeb, - 0x75, 0x96, 0x4e, 0x3a, 0x87, 0x4e, 0x56, 0xc8, 0x3e, 0x5b, 0x71, 0x0e, 0x29, 0x6c, 0xc9, 0xb2, - 0x65, 0x2b, 0x2c, 0x4b, 0x0e, 0x59, 0x96, 0x15, 0x8e, 0x93, 0xe2, 0x7c, 0x7e, 0xad, 0x2f, 0x20, - 0xcb, 0xf2, 0x1f, 0x0e, 0x44, 0x38, 0x42, 0xf2, 0x45, 0x38, 0xc2, 0x7b, 0xa1, 0x3b, 0x47, 0x7e, - 0x99, 0x59, 0x95, 0x59, 0x55, 0xdd, 0x68, 0xcc, 0x70, 0x74, 0xe2, 0x84, 0xfe, 0x21, 0xd1, 0x5f, - 0x7e, 0xdf, 0x97, 0x95, 0xef, 0x2f, 0xbf, 0xfc, 0x1e, 0xf0, 0x42, 0x40, 0x9b, 0xb4, 0xe3, 0x7a, - 0xc1, 0x8d, 0x26, 0xdd, 0xb3, 0xeb, 0x47, 0x37, 0x82, 0xa3, 0x0e, 0xf5, 0xf9, 0xbf, 0xd7, 0x3b, - 0x9e, 0x1b, 0xb8, 0x64, 0x18, 0x7f, 0x2c, 0xcc, 0xed, 0xb9, 0x7b, 0x2e, 0x42, 0x6e, 0xb0, 0xbf, - 0x78, 0xe1, 0xc2, 0xa5, 0x3d, 0xd7, 0xdd, 0x6b, 0xd2, 0x1b, 0xf8, 0x6b, 0xa7, 0xbb, 0x7b, 0xa3, - 0xd1, 0xf5, 0xec, 0xc0, 0x71, 0xdb, 0xa2, 0xbc, 0x18, 0x2f, 0x0f, 0x9c, 0x16, 0xf5, 0x03, 0xbb, - 0xd5, 0xe9, 0xc5, 0xe0, 0xd0, 0xb3, 0x3b, 0x1d, 0xea, 0x89, 0xda, 0x17, 0xae, 0x85, 0x1f, 0x68, - 0x07, 0x01, 0xa3, 0x64, 0xcc, 0x6f, 0x3c, 0xba, 0xa9, 0xfe, 0x14, 0xa8, 0xb7, 0x7b, 0xb4, 0xc5, - 0xeb, 0xfa, 0x01, 0x6d, 0x58, 0x0d, 0xfa, 0xc8, 0xa9, 0x53, 0xcb, 0xa3, 0xdf, 0xe8, 0x3a, 0x1e, - 0x6d, 0xd1, 0x76, 0x20, 0xe8, 0x5e, 0x4f, 0xa7, 0x93, 0x1f, 0x12, 0xfb, 0x22, 0xe3, 0x17, 0x72, - 0x30, 0x76, 0x9f, 0xd2, 0x4e, 0xa9, 0xe9, 0x3c, 0xa2, 0xe4, 0x45, 0x18, 0x5a, 0xb7, 0x5b, 0x74, - 0x3e, 0x73, 0x39, 0x73, 0x75, 0x6c, 0x69, 0xfa, 0xe4, 0xb8, 0x38, 0xee, 0x53, 0xef, 0x11, 0xf5, - 0xac, 0xb6, 0xdd, 0xa2, 0x26, 0x16, 0x92, 0x4f, 0xc1, 0x18, 0xfb, 0xdf, 0xef, 0xd8, 0x75, 0x3a, - 0x9f, 0x45, 0xcc, 0xc9, 0x93, 0xe3, 0xe2, 0x58, 0x5b, 0x02, 0xcd, 0xa8, 0x9c, 0x54, 0x61, 0x74, - 0xf9, 0x71, 0xc7, 0xf1, 0xa8, 0x3f, 0x3f, 0x74, 0x39, 0x73, 0x75, 0x7c, 0x71, 0xe1, 0x3a, 0xef, - 0xa3, 0xeb, 0xb2, 0x8f, 0xae, 0x6f, 0xca, 0x4e, 0x5c, 0x9a, 0xfd, 0x83, 0xe3, 0xe2, 0x33, 0x27, - 0xc7, 0xc5, 0x51, 0xca, 0x49, 0x7e, 0xf2, 0x4f, 0x8a, 0x19, 0x53, 0xd2, 0x93, 0xb7, 0x61, 0x68, - 0xf3, 0xa8, 0x43, 0xe7, 0xc7, 0x2e, 0x67, 0xae, 0x4e, 0x2d, 0x5e, 0xba, 0xce, 0x87, 0x35, 0xfc, - 0xf8, 0xe8, 0x2f, 0x86, 0xb5, 0x94, 0x3f, 0x39, 0x2e, 0x0e, 0x31, 0x14, 0x13, 0xa9, 0xc8, 0xeb, - 0x30, 0xb2, 0xe2, 0xfa, 0x41, 0xb5, 0x32, 0x0f, 0xf8, 0xc9, 0xe7, 0x4e, 0x8e, 0x8b, 0x33, 0xfb, - 0xae, 0x1f, 0x58, 0x4e, 0xe3, 0x35, 0xb7, 0xe5, 0x04, 0xb4, 0xd5, 0x09, 0x8e, 0x4c, 0x81, 0x64, - 0x3c, 0x86, 0x49, 0x8d, 0x1f, 0x19, 0x87, 0xd1, 0xad, 0xf5, 0xfb, 0xeb, 0x0f, 0xb6, 0xd7, 0x0b, - 0xcf, 0x90, 0x3c, 0x0c, 0xad, 0x3f, 0xa8, 0x2c, 0x17, 0x32, 0x64, 0x14, 0x72, 0xa5, 0x8d, 0x8d, - 0x42, 0x96, 0x4c, 0x40, 0xbe, 0x52, 0xda, 0x2c, 0x2d, 0x95, 0x6a, 0xcb, 0x85, 0x1c, 0x99, 0x85, - 0xe9, 0xed, 0xea, 0x7a, 0xe5, 0xc1, 0x76, 0xcd, 0xaa, 0x2c, 0xd7, 0xee, 0x6f, 0x3e, 0xd8, 0x28, - 0x0c, 0x91, 0x29, 0x80, 0xfb, 0x5b, 0x4b, 0xcb, 0xe6, 0xfa, 0xf2, 0xe6, 0x72, 0xad, 0x30, 0x4c, - 0xe6, 0xa0, 0x20, 0x49, 0xac, 0xda, 0xb2, 0xf9, 0xb0, 0x5a, 0x5e, 0x2e, 0x8c, 0xdc, 0x1b, 0xca, - 0xe7, 0x0a, 0x43, 0xe6, 0xe8, 0x2a, 0xb5, 0x7d, 0x5a, 0xad, 0x18, 0xff, 0x4e, 0x0e, 0xf2, 0x6b, - 0x34, 0xb0, 0x1b, 0x76, 0x60, 0x93, 0xe7, 0xb4, 0xf1, 0xc1, 0x26, 0x2a, 0x03, 0xf3, 0x62, 0x72, - 0x60, 0x86, 0x4f, 0x8e, 0x8b, 0x99, 0xd7, 0xd5, 0x01, 0x79, 0x0b, 0xc6, 0x2b, 0xd4, 0xaf, 0x7b, - 0x4e, 0x87, 0x4d, 0xb6, 0xf9, 0x1c, 0xa2, 0x5d, 0x3c, 0x39, 0x2e, 0x9e, 0x6b, 0x44, 0x60, 0xa5, - 0x43, 0x54, 0x6c, 0x52, 0x85, 0x91, 0x55, 0x7b, 0x87, 0x36, 0xfd, 0xf9, 0xe1, 0xcb, 0xb9, 0xab, - 0xe3, 0x8b, 0xcf, 0x8a, 0x41, 0x90, 0x1f, 0x78, 0x9d, 0x97, 0x2e, 0xb7, 0x03, 0xef, 0x68, 0x69, - 0xee, 0xe4, 0xb8, 0x58, 0x68, 0x22, 0x40, 0xed, 0x60, 0x8e, 0x42, 0x6a, 0xd1, 0xc4, 0x18, 0x39, - 0x75, 0x62, 0x3c, 0xff, 0x07, 0xc7, 0xc5, 0x0c, 0x1b, 0x30, 0x31, 0x31, 0x22, 0x7e, 0xfa, 0x14, - 0x59, 0x84, 0xbc, 0x49, 0x1f, 0x39, 0x3e, 0x6b, 0x59, 0x1e, 0x5b, 0x76, 0xfe, 0xe4, 0xb8, 0x48, - 0x3c, 0x01, 0x53, 0x3e, 0x23, 0xc4, 0x5b, 0x78, 0x13, 0xc6, 0x95, 0xaf, 0x26, 0x05, 0xc8, 0x1d, - 0xd0, 0x23, 0xde, 0xc3, 0x26, 0xfb, 0x93, 0xcc, 0xc1, 0xf0, 0x23, 0xbb, 0xd9, 0x15, 0x5d, 0x6a, - 0xf2, 0x1f, 0x9f, 0xcf, 0x7e, 0x2e, 0x73, 0x6f, 0x28, 0x3f, 0x5a, 0xc8, 0x9b, 0xd9, 0x6a, 0xc5, - 0xf8, 0xbb, 0x43, 0x90, 0x37, 0x5d, 0xbe, 0x80, 0xc9, 0x35, 0x18, 0xae, 0x05, 0x76, 0x20, 0x87, - 0x69, 0xf6, 0xe4, 0xb8, 0x38, 0xcd, 0x16, 0x37, 0x55, 0xea, 0xe7, 0x18, 0x0c, 0x75, 0x63, 0xdf, - 0xf6, 0xe5, 0x70, 0x21, 0x6a, 0x87, 0x01, 0x54, 0x54, 0xc4, 0x20, 0x57, 0x60, 0x68, 0xcd, 0x6d, - 0x50, 0x31, 0x62, 0xe4, 0xe4, 0xb8, 0x38, 0xd5, 0x72, 0x1b, 0x2a, 0x22, 0x96, 0x93, 0xd7, 0x60, - 0xac, 0xdc, 0xf5, 0x3c, 0xda, 0x66, 0x73, 0x7d, 0x08, 0x91, 0xa7, 0x4e, 0x8e, 0x8b, 0x50, 0xe7, - 0x40, 0xcb, 0x69, 0x98, 0x11, 0x02, 0x1b, 0x86, 0x5a, 0x60, 0x7b, 0x01, 0x6d, 0xcc, 0x0f, 0x0f, - 0x34, 0x0c, 0x6c, 0x7d, 0xce, 0xf8, 0x9c, 0x24, 0x3e, 0x0c, 0x82, 0x13, 0x59, 0x81, 0xf1, 0xbb, - 0x9e, 0x5d, 0xa7, 0x1b, 0xd4, 0x73, 0xdc, 0x06, 0x8e, 0x6f, 0x6e, 0xe9, 0xca, 0xc9, 0x71, 0xf1, - 0xfc, 0x1e, 0x03, 0x5b, 0x1d, 0x84, 0x47, 0xd4, 0xdf, 0x3d, 0x2e, 0xe6, 0x2b, 0x62, 0xab, 0x35, - 0x55, 0x52, 0xf2, 0x75, 0x36, 0x38, 0x7e, 0x80, 0x5d, 0x4b, 0x1b, 0xf3, 0xa3, 0xa7, 0x7e, 0xa2, - 0x21, 0x3e, 0xf1, 0x7c, 0xd3, 0xf6, 0x03, 0xcb, 0xe3, 0x74, 0xb1, 0xef, 0x54, 0x59, 0x92, 0x07, - 0x90, 0xaf, 0xd5, 0xf7, 0x69, 0xa3, 0xdb, 0xa4, 0x38, 0x65, 0xc6, 0x17, 0x2f, 0x88, 0x49, 0x2d, - 0xc7, 0x53, 0x16, 0x2f, 0x2d, 0x08, 0xde, 0xc4, 0x17, 0x10, 0x75, 0x3e, 0x49, 0xac, 0xcf, 0xe7, - 0x7f, 0xee, 0x17, 0x8b, 0xcf, 0x7c, 0xdf, 0x3f, 0xbb, 0xfc, 0x8c, 0xf1, 0x9f, 0x66, 0xa1, 0x10, - 0x67, 0x42, 0x76, 0x61, 0x72, 0xab, 0xd3, 0xb0, 0x03, 0x5a, 0x6e, 0x3a, 0xb4, 0x1d, 0xf8, 0x38, - 0x49, 0xfa, 0xb7, 0xe9, 0x25, 0x51, 0xef, 0x7c, 0x17, 0x09, 0xad, 0x3a, 0xa7, 0x8c, 0xb5, 0x4a, - 0x67, 0x1b, 0xd5, 0x53, 0xc3, 0x0d, 0xdc, 0xc7, 0x19, 0x76, 0xb6, 0x7a, 0xf8, 0xd6, 0xdf, 0xa3, - 0x1e, 0xc1, 0x56, 0x4c, 0xa0, 0x76, 0x63, 0xe7, 0x08, 0x67, 0xe6, 0xe0, 0x13, 0x88, 0x91, 0xa4, - 0x4c, 0x20, 0x06, 0x36, 0xfe, 0x8f, 0x0c, 0x4c, 0x99, 0xd4, 0x77, 0xbb, 0x5e, 0x9d, 0xae, 0x50, - 0xbb, 0x41, 0x3d, 0x36, 0xfd, 0xef, 0x3b, 0xed, 0x86, 0x58, 0x53, 0x38, 0xfd, 0x0f, 0x9c, 0xb6, - 0xba, 0x75, 0x63, 0x39, 0xf9, 0x34, 0x8c, 0xd6, 0xba, 0x3b, 0x88, 0x9a, 0x8d, 0x76, 0x00, 0xbf, - 0xbb, 0x63, 0xc5, 0xd0, 0x25, 0x1a, 0xb9, 0x01, 0xa3, 0x0f, 0xa9, 0xe7, 0x47, 0xbb, 0x21, 0x1e, - 0x0d, 0x8f, 0x38, 0x48, 0x25, 0x10, 0x58, 0xe4, 0x6e, 0xb4, 0x23, 0x8b, 0x43, 0x6d, 0x3a, 0xb6, - 0x0f, 0x46, 0x53, 0xa5, 0x25, 0x20, 0xea, 0x54, 0x91, 0x58, 0xc6, 0x4f, 0x65, 0xa1, 0x50, 0xb1, - 0x03, 0x7b, 0xc7, 0xf6, 0x45, 0x7f, 0x3e, 0xbc, 0xc5, 0xf6, 0x78, 0xa5, 0xa1, 0xb8, 0xc7, 0xb3, - 0x2f, 0xff, 0xd0, 0xcd, 0x7b, 0x39, 0xde, 0xbc, 0x71, 0x76, 0xc2, 0x8a, 0xe6, 0x45, 0x8d, 0x7a, - 0xe7, 0xf4, 0x46, 0x15, 0x44, 0xa3, 0xf2, 0xb2, 0x51, 0x51, 0x53, 0xc8, 0x3b, 0x30, 0x54, 0xeb, - 0xd0, 0xba, 0xd8, 0x44, 0xe4, 0xb9, 0xa0, 0x37, 0x8e, 0x21, 0x3c, 0xbc, 0xb5, 0x34, 0x21, 0xd8, - 0x0c, 0xf9, 0x1d, 0x5a, 0x37, 0x91, 0x4c, 0x59, 0x34, 0xbf, 0x99, 0x83, 0xb9, 0x34, 0x32, 0xb5, - 0x1d, 0x23, 0x7d, 0xda, 0x71, 0x15, 0xf2, 0xec, 0x08, 0x67, 0xc7, 0x22, 0x6e, 0x17, 0x63, 0x4b, - 0x13, 0xec, 0x93, 0xf7, 0x05, 0xcc, 0x0c, 0x4b, 0xc9, 0x8b, 0xa1, 0x44, 0x90, 0x8f, 0xf8, 0x09, - 0x89, 0x40, 0xca, 0x01, 0x6c, 0xac, 0xe5, 0x12, 0x46, 0xc1, 0x21, 0xea, 0x16, 0x09, 0x8e, 0xc6, - 0xda, 0x13, 0x10, 0xed, 0x98, 0x91, 0x87, 0xc2, 0x32, 0xe4, 0x65, 0xb3, 0xe6, 0x27, 0x90, 0xd1, - 0x4c, 0xac, 0x93, 0x1e, 0xde, 0xe2, 0x83, 0xd9, 0x10, 0xbf, 0x55, 0x36, 0x12, 0x87, 0xdc, 0x82, - 0xfc, 0x86, 0xe7, 0x3e, 0x3e, 0xaa, 0x56, 0xfc, 0xf9, 0xc9, 0xcb, 0xb9, 0xab, 0x63, 0x4b, 0x17, - 0x4e, 0x8e, 0x8b, 0xb3, 0x1d, 0x06, 0xb3, 0x9c, 0x86, 0x7a, 0xd2, 0x86, 0x88, 0xf7, 0x86, 0xf2, - 0x99, 0x42, 0xf6, 0xde, 0x50, 0x3e, 0x5b, 0xc8, 0x71, 0xf1, 0xe2, 0xde, 0x50, 0x7e, 0xa8, 0x30, - 0x7c, 0x6f, 0x28, 0x3f, 0x8c, 0x02, 0xc7, 0x58, 0x01, 0xee, 0x0d, 0xe5, 0xc7, 0x0b, 0x13, 0xda, - 0x69, 0x8f, 0x0c, 0x02, 0xb7, 0xee, 0x36, 0xcd, 0xdc, 0x96, 0x59, 0x35, 0x47, 0xca, 0xa5, 0x32, - 0xf5, 0x02, 0x33, 0x57, 0xda, 0xae, 0x99, 0x93, 0x95, 0xa3, 0xb6, 0xdd, 0x72, 0xea, 0xfc, 0xe8, - 0x34, 0x73, 0x77, 0xcb, 0x1b, 0x46, 0x09, 0xa6, 0xa2, 0xb6, 0xac, 0x3a, 0x7e, 0x40, 0x6e, 0xc0, - 0x98, 0x84, 0xb0, 0x8d, 0x2e, 0x97, 0xda, 0x6a, 0x33, 0xc2, 0x31, 0x7e, 0x3f, 0x0b, 0x10, 0x95, - 0x3c, 0xa5, 0x6b, 0xe1, 0xb3, 0xda, 0x5a, 0x38, 0x17, 0x5f, 0x0b, 0x3d, 0x57, 0x01, 0x79, 0x0f, - 0x46, 0x98, 0x58, 0xd0, 0x95, 0x22, 0xd1, 0x85, 0x38, 0x29, 0x16, 0x3e, 0xbc, 0xb5, 0x34, 0x25, - 0x88, 0x47, 0x7c, 0x84, 0x98, 0x82, 0x4c, 0x59, 0x46, 0xbf, 0x30, 0x1a, 0x0d, 0x86, 0x58, 0x40, - 0x57, 0x21, 0x1c, 0x50, 0xd1, 0xa1, 0xb8, 0x32, 0x3a, 0x72, 0x90, 0xc3, 0x52, 0x72, 0x11, 0xd8, - 0x80, 0x8b, 0x4e, 0x1d, 0x3d, 0x39, 0x2e, 0xe6, 0xba, 0x9e, 0x83, 0x93, 0x80, 0xdc, 0x00, 0x31, - 0x0d, 0x44, 0x07, 0xb2, 0xd9, 0x37, 0x53, 0xb7, 0xad, 0x3a, 0xf5, 0x82, 0xa8, 0xc7, 0xe7, 0x33, - 0x72, 0xb6, 0x90, 0x0e, 0xe8, 0x53, 0x65, 0x7e, 0x08, 0xa7, 0xc1, 0xd5, 0xd4, 0x5e, 0xb9, 0xae, - 0xa1, 0x72, 0x31, 0xf2, 0xb2, 0x3c, 0x95, 0x1a, 0xbc, 0xcc, 0x4a, 0x88, 0x94, 0x7a, 0x05, 0xe4, - 0x16, 0xb0, 0x19, 0x2a, 0x7a, 0x1f, 0x44, 0x3d, 0xa5, 0xed, 0xda, 0xd2, 0x39, 0xc1, 0x69, 0xd2, - 0x3e, 0x54, 0xc9, 0x19, 0x36, 0x79, 0x0b, 0xd8, 0x14, 0x16, 0xfd, 0x4e, 0x04, 0xd1, 0xdd, 0xf2, - 0x46, 0xb9, 0xe9, 0x76, 0x1b, 0xb5, 0x2f, 0xae, 0x46, 0xc4, 0x7b, 0xf5, 0x8e, 0x4a, 0x7c, 0xb7, - 0xbc, 0x41, 0xde, 0x82, 0xe1, 0xd2, 0x37, 0xbb, 0x1e, 0x15, 0xf2, 0xc9, 0x84, 0xac, 0x93, 0xc1, - 0x96, 0x2e, 0x08, 0xc2, 0x69, 0x9b, 0xfd, 0x54, 0xe5, 0x3a, 0x2c, 0x67, 0x35, 0x6f, 0xae, 0xd6, - 0x84, 0xec, 0x41, 0x62, 0xdd, 0xb2, 0xb9, 0xaa, 0x7c, 0x76, 0xa0, 0xb5, 0x9a, 0x51, 0x91, 0x1b, - 0x90, 0x2d, 0x55, 0xf0, 0x46, 0x34, 0xbe, 0x38, 0x26, 0xab, 0xad, 0x2c, 0xcd, 0x09, 0x92, 0x09, - 0x5b, 0x5d, 0x06, 0xd9, 0x52, 0x85, 0x2c, 0xc1, 0xf0, 0xda, 0x51, 0xed, 0x8b, 0xab, 0x62, 0x33, - 0x9b, 0x95, 0xf3, 0x9a, 0xc1, 0x1e, 0xe0, 0xb2, 0xf7, 0xa3, 0x2f, 0x6e, 0x1d, 0xf9, 0xdf, 0x68, - 0xaa, 0x5f, 0x8c, 0x68, 0x64, 0x03, 0xc6, 0x4a, 0x8d, 0x96, 0xd3, 0xde, 0xf2, 0xa9, 0x37, 0x3f, - 0x8e, 0x7c, 0xe6, 0x63, 0xdf, 0x1d, 0x96, 0x2f, 0xcd, 0x9f, 0x1c, 0x17, 0xe7, 0x6c, 0xf6, 0xd3, - 0xea, 0xfa, 0xd4, 0x53, 0xb8, 0x45, 0x4c, 0xc8, 0x06, 0xc0, 0x9a, 0xdb, 0xde, 0x73, 0x4b, 0x41, - 0xd3, 0xf6, 0x63, 0xdb, 0x63, 0x54, 0x10, 0x8a, 0x0f, 0xe7, 0x5a, 0x0c, 0x66, 0xd9, 0x0c, 0xa8, - 0x30, 0x54, 0x78, 0x90, 0x3b, 0x30, 0xf2, 0xc0, 0xb3, 0xeb, 0x4d, 0x3a, 0x3f, 0x89, 0xdc, 0xe6, - 0x04, 0x37, 0x0e, 0x94, 0x2d, 0x9d, 0x17, 0x0c, 0x0b, 0x2e, 0x82, 0xd5, 0x6b, 0x0a, 0x47, 0x5c, - 0xd8, 0x06, 0x92, 0x9c, 0x93, 0x29, 0x97, 0x84, 0x4f, 0xa9, 0x97, 0x84, 0x68, 0xd1, 0x97, 0xdd, - 0x56, 0xcb, 0x6e, 0x37, 0x90, 0xf6, 0xe1, 0xa2, 0x72, 0x77, 0x30, 0xbe, 0x01, 0x33, 0x89, 0xce, - 0x3a, 0xe5, 0x7e, 0xf7, 0x2e, 0x4c, 0x57, 0xe8, 0xae, 0xdd, 0x6d, 0x06, 0xe1, 0x49, 0xc2, 0x97, - 0x28, 0xde, 0xb4, 0x1a, 0xbc, 0xc8, 0x92, 0xc7, 0x87, 0x19, 0x47, 0x36, 0xde, 0x81, 0x49, 0xad, - 0xf9, 0xec, 0xaa, 0x50, 0xea, 0x36, 0x9c, 0x00, 0x07, 0x32, 0x13, 0x5d, 0x15, 0x6c, 0x06, 0xc4, - 0xe1, 0x32, 0x23, 0x04, 0xe3, 0xdf, 0x55, 0xa5, 0x15, 0xb1, 0x13, 0xb1, 0x6b, 0xb5, 0xd8, 0x0f, - 0x32, 0x91, 0xec, 0x94, 0xd8, 0x0f, 0xc2, 0xdd, 0xe0, 0x1a, 0x5f, 0x9b, 0xd9, 0xc4, 0xda, 0x1c, - 0x17, 0x23, 0x91, 0xb3, 0x0f, 0x7d, 0xbe, 0x22, 0xc3, 0x99, 0x9a, 0xfb, 0xf0, 0x33, 0xf5, 0x3d, - 0x98, 0x58, 0xb3, 0xdb, 0xf6, 0x1e, 0x6d, 0xb0, 0x16, 0xf0, 0xbd, 0x67, 0x6c, 0xe9, 0xd9, 0x93, - 0xe3, 0xe2, 0x85, 0x16, 0x87, 0x63, 0x2b, 0xd5, 0x49, 0xa4, 0x11, 0x90, 0x9b, 0x72, 0x65, 0x0f, - 0xa7, 0xac, 0xec, 0x49, 0x51, 0xfb, 0x30, 0xae, 0x6c, 0xb1, 0x9e, 0x8d, 0xdf, 0x19, 0xc3, 0x36, - 0x92, 0xd7, 0x60, 0xc4, 0xa4, 0x7b, 0xec, 0xa8, 0xc9, 0x44, 0x83, 0xe4, 0x21, 0x44, 0xed, 0x18, - 0x8e, 0x83, 0x72, 0x06, 0x6d, 0xf8, 0xfb, 0xce, 0x6e, 0x20, 0x7a, 0x27, 0x94, 0x33, 0x04, 0x58, - 0x91, 0x33, 0x04, 0x44, 0xbf, 0xce, 0x72, 0x18, 0xdb, 0xfd, 0xcc, 0x4a, 0x4d, 0x74, 0x9a, 0xec, - 0x61, 0xb3, 0xa2, 0x6c, 0x23, 0x9e, 0x26, 0x25, 0x30, 0x6c, 0x72, 0x1b, 0xc6, 0x4a, 0xf5, 0xba, - 0xdb, 0x55, 0xee, 0x8c, 0x7c, 0xdd, 0x72, 0xa0, 0xae, 0x22, 0x89, 0x50, 0x49, 0x0d, 0xc6, 0x97, - 0xd9, 0x45, 0xcb, 0x29, 0xdb, 0xf5, 0x7d, 0xd9, 0x49, 0x72, 0x0f, 0x53, 0x4a, 0xa2, 0x95, 0x4b, - 0x11, 0x58, 0x67, 0x40, 0x55, 0xc9, 0xa0, 0xe0, 0x92, 0x4d, 0x18, 0xaf, 0xd1, 0xba, 0x47, 0x83, - 0x5a, 0xe0, 0x7a, 0x34, 0xb6, 0x25, 0x2b, 0x25, 0x4b, 0x97, 0xe4, 0x5d, 0xcf, 0x47, 0xa0, 0xe5, - 0x33, 0xa8, 0xca, 0x55, 0x41, 0xe6, 0x42, 0x7b, 0xcb, 0xf5, 0x8e, 0x2a, 0x4b, 0x62, 0x9b, 0x8e, - 0xce, 0x74, 0x0e, 0x56, 0x85, 0x76, 0x06, 0x69, 0xec, 0xe8, 0x42, 0x3b, 0xc7, 0xc2, 0x91, 0xaa, - 0xd4, 0x50, 0xb6, 0x12, 0x9b, 0xf6, 0x74, 0xd4, 0xcb, 0x08, 0x56, 0x46, 0xaa, 0xe1, 0xa3, 0x64, - 0xa6, 0x8d, 0x94, 0xc0, 0x22, 0x1d, 0x20, 0x72, 0xd4, 0xb8, 0xa0, 0xdb, 0xa4, 0xbe, 0x2f, 0xf6, - 0xf2, 0x8b, 0xb1, 0xc1, 0x8f, 0x10, 0x96, 0x5e, 0x16, 0xcc, 0x9f, 0x97, 0xd3, 0x40, 0xdc, 0xd3, - 0x58, 0xa1, 0x52, 0x4f, 0x0a, 0x6f, 0xf2, 0x26, 0xc0, 0xf2, 0xe3, 0x80, 0x7a, 0x6d, 0xbb, 0x19, - 0xea, 0xc1, 0x50, 0xf5, 0x43, 0x05, 0x54, 0x1f, 0x68, 0x05, 0x99, 0x94, 0x61, 0xb2, 0xe4, 0xfb, - 0xdd, 0x16, 0x35, 0xdd, 0x26, 0x2d, 0x99, 0xeb, 0xb8, 0xef, 0x8f, 0x2d, 0x3d, 0x7f, 0x72, 0x5c, - 0xbc, 0x68, 0x63, 0x81, 0xe5, 0xb9, 0x4d, 0x6a, 0xd9, 0x9e, 0x3a, 0xbb, 0x75, 0x1a, 0xf2, 0x00, - 0xe0, 0x41, 0x87, 0xb6, 0x6b, 0xd4, 0xf6, 0xea, 0xfb, 0xb1, 0x6d, 0x3e, 0x2a, 0x58, 0x7a, 0x4e, - 0xb4, 0x70, 0xce, 0xed, 0xd0, 0xb6, 0x8f, 0x30, 0xf5, 0xab, 0x22, 0x4c, 0xb2, 0x0d, 0xd3, 0xd5, - 0xd2, 0xda, 0x86, 0xdb, 0x74, 0xea, 0x47, 0x42, 0x72, 0x9a, 0x42, 0xed, 0xe0, 0x79, 0xc1, 0x35, - 0x56, 0xca, 0xb7, 0x27, 0xc7, 0x6e, 0x59, 0x1d, 0x84, 0x5a, 0x42, 0x7e, 0x8a, 0x73, 0x21, 0xef, - 0xb3, 0x39, 0xe8, 0x33, 0x61, 0x70, 0xd3, 0xde, 0xf3, 0xe7, 0xa7, 0x35, 0x6d, 0x57, 0x69, 0xbb, - 0x76, 0x5d, 0x29, 0xe5, 0x62, 0xca, 0x02, 0x9f, 0x88, 0x08, 0xb5, 0x02, 0x7b, 0xcf, 0xd7, 0x27, - 0x62, 0x88, 0x4d, 0xee, 0x01, 0x54, 0xdc, 0x7a, 0xb7, 0x45, 0xdb, 0x41, 0x65, 0x69, 0xbe, 0xa0, - 0x5f, 0x05, 0xc2, 0x82, 0x68, 0x6b, 0x6b, 0xb8, 0x75, 0x6d, 0x26, 0x2a, 0xd4, 0x0b, 0xef, 0x42, - 0x21, 0xfe, 0x21, 0x67, 0x54, 0x60, 0x4d, 0x16, 0xa6, 0x94, 0xd6, 0x2f, 0x3f, 0x76, 0xfc, 0xc0, - 0x37, 0xbe, 0xa5, 0xad, 0x40, 0xb6, 0x3b, 0xdc, 0xa7, 0x47, 0x1b, 0x1e, 0xdd, 0x75, 0x1e, 0x8b, - 0xcd, 0x0c, 0x77, 0x87, 0x03, 0x7a, 0x64, 0x75, 0x10, 0xaa, 0xee, 0x0e, 0x21, 0x2a, 0xf9, 0x0c, - 0xe4, 0xef, 0xaf, 0xd5, 0xee, 0xd3, 0xa3, 0x6a, 0x45, 0x1c, 0x54, 0x9c, 0xac, 0xe5, 0x5b, 0x8c, - 0x54, 0x9b, 0x6b, 0x21, 0xa6, 0xb1, 0x14, 0xed, 0x84, 0xac, 0xe6, 0x72, 0xb3, 0xeb, 0x07, 0xd4, - 0xab, 0x56, 0xd4, 0x9a, 0xeb, 0x1c, 0x18, 0xdb, 0x97, 0x42, 0x54, 0xe3, 0x5f, 0x65, 0x71, 0x17, - 0x64, 0x13, 0xbe, 0xda, 0xf6, 0x03, 0xbb, 0x5d, 0xa7, 0x21, 0x03, 0x9c, 0xf0, 0x8e, 0x80, 0xc6, - 0x26, 0x7c, 0x84, 0xac, 0x57, 0x9d, 0x1d, 0xb8, 0x6a, 0x56, 0xa5, 0xd4, 0x5c, 0x54, 0x2b, 0xaa, - 0x7a, 0xd5, 0x13, 0xd0, 0x58, 0x95, 0x11, 0x32, 0xb9, 0x02, 0xa3, 0xd5, 0xd2, 0x5a, 0xa9, 0x1b, - 0xec, 0xe3, 0x1e, 0x9c, 0xe7, 0xf2, 0x39, 0x9b, 0xad, 0x76, 0x37, 0xd8, 0x37, 0x65, 0x21, 0xb9, - 0x81, 0xf7, 0x9e, 0x36, 0x0d, 0xb8, 0x1a, 0x56, 0x1c, 0xba, 0x3e, 0x07, 0xc5, 0xae, 0x3d, 0x0c, - 0x44, 0x5e, 0x85, 0xe1, 0x87, 0x1b, 0xe5, 0x6a, 0x45, 0x5c, 0x9c, 0xf1, 0x24, 0x7a, 0xd4, 0xa9, - 0xeb, 0x5f, 0xc2, 0x51, 0xc8, 0x32, 0x4c, 0xd5, 0x68, 0xbd, 0xeb, 0x39, 0xc1, 0xd1, 0x5d, 0xcf, - 0xed, 0x76, 0xfc, 0xf9, 0x51, 0xac, 0x03, 0x57, 0xba, 0x2f, 0x4a, 0xac, 0x3d, 0x2c, 0x52, 0xa8, - 0x63, 0x44, 0xc6, 0xef, 0x66, 0xa2, 0x6d, 0x92, 0x5c, 0xd1, 0xc4, 0x1a, 0xd4, 0xdd, 0x30, 0xb1, - 0x46, 0xd5, 0xdd, 0xa0, 0x80, 0x63, 0x02, 0x29, 0x77, 0xfd, 0xc0, 0x6d, 0x2d, 0xb7, 0x1b, 0x1d, - 0xd7, 0x69, 0x07, 0x48, 0xc5, 0x3b, 0xdf, 0x38, 0x39, 0x2e, 0x5e, 0xaa, 0x63, 0xa9, 0x45, 0x45, - 0xb1, 0x15, 0xe3, 0x92, 0x42, 0xfd, 0x11, 0xc6, 0xc3, 0xf8, 0xc3, 0xac, 0x76, 0xbc, 0xb1, 0xcf, - 0x33, 0x69, 0xa7, 0xe9, 0xd4, 0xf1, 0x46, 0x8f, 0x0d, 0x0d, 0x67, 0x15, 0x7e, 0x9e, 0x17, 0x95, - 0xf2, 0x1e, 0xd2, 0x79, 0xa7, 0x50, 0x93, 0x2f, 0xc0, 0x04, 0x93, 0x34, 0xc4, 0x4f, 0x7f, 0x3e, - 0x8b, 0x9d, 0xfd, 0x1c, 0x6a, 0xe1, 0x7c, 0xea, 0x85, 0x6c, 0x34, 0x11, 0x45, 0xa5, 0x20, 0x0d, - 0x98, 0xdf, 0xf4, 0xec, 0xb6, 0xef, 0x04, 0xcb, 0xed, 0xba, 0x77, 0x84, 0x92, 0xd1, 0x72, 0xdb, - 0xde, 0x69, 0xd2, 0x06, 0x36, 0x37, 0xbf, 0x74, 0xf5, 0xe4, 0xb8, 0xf8, 0x52, 0xc0, 0x71, 0x2c, - 0x1a, 0x22, 0x59, 0x94, 0x63, 0x29, 0x9c, 0x7b, 0x72, 0x62, 0x92, 0x94, 0xec, 0x56, 0x7c, 0x84, - 0xe1, 0x42, 0x02, 0x4a, 0x52, 0xe1, 0x68, 0xb0, 0x3d, 0x4c, 0xfd, 0x4c, 0x95, 0xc0, 0xf8, 0x7f, - 0x32, 0xd1, 0x01, 0x4c, 0xde, 0x86, 0x71, 0xb1, 0x62, 0x94, 0x79, 0x81, 0x3b, 0xa8, 0x5c, 0x5e, - 0xb1, 0x91, 0x55, 0xd1, 0xd9, 0xbd, 0xbf, 0x54, 0x5e, 0x55, 0xe6, 0x06, 0xde, 0xfb, 0xed, 0x7a, - 0x33, 0x4e, 0x25, 0xd1, 0xd8, 0x24, 0xd8, 0x5c, 0xad, 0xe9, 0xbd, 0x82, 0x93, 0x20, 0x68, 0xfa, - 0x29, 0xdd, 0xa0, 0x20, 0x7f, 0xf4, 0x86, 0xff, 0x4f, 0x99, 0xb4, 0x73, 0x9e, 0x2c, 0xc1, 0xe4, - 0xb6, 0xeb, 0x1d, 0xe0, 0xf8, 0x2a, 0x9d, 0x80, 0x23, 0x7f, 0x28, 0x0b, 0xe2, 0x0d, 0xd2, 0x49, - 0xd4, 0x6f, 0x53, 0x7a, 0x43, 0xff, 0xb6, 0x18, 0x07, 0x8d, 0x80, 0x8d, 0x43, 0xc8, 0x31, 0x5c, - 0x1d, 0x38, 0x0e, 0xd1, 0x27, 0x68, 0x53, 0x58, 0x45, 0x37, 0xfe, 0x8b, 0x8c, 0x7a, 0x9e, 0xb3, - 0x4e, 0xae, 0xb8, 0x2d, 0xdb, 0x69, 0x2b, 0xcd, 0xe1, 0x0f, 0x4b, 0x08, 0x8d, 0x7f, 0x89, 0x82, - 0x4c, 0x6e, 0x41, 0x9e, 0xff, 0x0a, 0xf7, 0x5a, 0xd4, 0x6a, 0x09, 0x42, 0xfd, 0xa0, 0x90, 0x88, - 0x89, 0x91, 0xc9, 0x9d, 0x75, 0x64, 0x7e, 0x27, 0xa3, 0x1e, 0xc5, 0x1f, 0xf6, 0xb0, 0x89, 0x1d, - 0x32, 0xd9, 0xb3, 0x1c, 0x32, 0x1f, 0xb9, 0x09, 0xdf, 0x97, 0x81, 0x71, 0x45, 0x4b, 0xc1, 0xda, - 0xb0, 0xe1, 0xb9, 0x1f, 0xd0, 0x7a, 0xa0, 0xb7, 0xa1, 0xc3, 0x81, 0xb1, 0x36, 0x84, 0xa8, 0x1f, - 0xa1, 0x0d, 0xc6, 0x5f, 0x64, 0xc4, 0x1d, 0x69, 0xe0, 0x6d, 0x5e, 0xdf, 0x92, 0xb3, 0x67, 0x39, - 0x22, 0xbf, 0x00, 0xc3, 0x26, 0x6d, 0x38, 0xbe, 0xb8, 0xdf, 0xcc, 0xa8, 0xf7, 0x31, 0x2c, 0x88, - 0xe4, 0x26, 0x8f, 0xfd, 0x54, 0xcf, 0x37, 0x2c, 0x67, 0x82, 0x6c, 0xd5, 0xbf, 0xd3, 0xa4, 0x8f, - 0x1d, 0xbe, 0x18, 0xc5, 0x51, 0x8b, 0xc7, 0x9b, 0xe3, 0x5b, 0xbb, 0xac, 0x44, 0x48, 0xd4, 0xea, - 0xc2, 0xd3, 0x68, 0x8c, 0xf7, 0x01, 0xa2, 0x2a, 0xc9, 0x7d, 0x28, 0x88, 0xd9, 0xe0, 0xb4, 0xf7, - 0xb8, 0x20, 0x25, 0xfa, 0xa0, 0x78, 0x72, 0x5c, 0x7c, 0xb6, 0x1e, 0x96, 0x09, 0xa9, 0x53, 0xe1, - 0x9b, 0x20, 0x34, 0xfe, 0xfd, 0x2c, 0x64, 0x4b, 0x38, 0x20, 0xf7, 0xe9, 0x51, 0x60, 0xef, 0xdc, - 0x71, 0x9a, 0xda, 0x62, 0x3a, 0x40, 0xa8, 0xb5, 0xeb, 0x68, 0xea, 0x0a, 0x05, 0x99, 0x2d, 0xa6, - 0xfb, 0xde, 0xce, 0x1b, 0x48, 0xa8, 0x2c, 0xa6, 0x03, 0x6f, 0xe7, 0x8d, 0x38, 0x59, 0x88, 0x48, - 0x0c, 0x18, 0xe1, 0x0b, 0x4b, 0xcc, 0x41, 0x38, 0x39, 0x2e, 0x8e, 0xf0, 0xf5, 0x67, 0x8a, 0x12, - 0x72, 0x11, 0x72, 0xb5, 0x8d, 0x75, 0xb1, 0x03, 0xa2, 0x5a, 0xd0, 0xef, 0xb4, 0x4d, 0x06, 0x63, - 0x75, 0xae, 0x56, 0x4a, 0x1b, 0xa8, 0x08, 0x18, 0x8e, 0xea, 0x6c, 0x36, 0xec, 0x4e, 0x5c, 0x15, - 0x10, 0x22, 0x92, 0x77, 0x60, 0xfc, 0x7e, 0xa5, 0xbc, 0xe2, 0xfa, 0x7c, 0xf7, 0x1a, 0x89, 0x26, - 0xff, 0x41, 0xa3, 0x6e, 0xa1, 0x26, 0x3e, 0x7e, 0x0c, 0x28, 0xf8, 0xc6, 0xb7, 0xb3, 0x30, 0xae, - 0xe8, 0xc9, 0xc8, 0x67, 0xc4, 0x03, 0x69, 0x46, 0xbb, 0x01, 0x28, 0x18, 0xac, 0x94, 0x2b, 0x55, - 0x5a, 0x6e, 0x83, 0x8a, 0xe7, 0xd2, 0x48, 0x81, 0x91, 0x1d, 0x44, 0x81, 0xf1, 0x26, 0x00, 0x9f, - 0x03, 0xf8, 0xc9, 0x8a, 0x38, 0xa1, 0xd8, 0x49, 0xa8, 0xe3, 0x12, 0x21, 0x93, 0x87, 0x30, 0xbb, - 0xe9, 0x75, 0xfd, 0xa0, 0x76, 0xe4, 0x07, 0xb4, 0xc5, 0xb8, 0x6d, 0xb8, 0x6e, 0x53, 0xcc, 0xbf, - 0x97, 0x4e, 0x8e, 0x8b, 0x97, 0xd1, 0xb8, 0xc3, 0xf2, 0xb1, 0x1c, 0x3f, 0xc0, 0xea, 0xb8, 0xae, - 0xaa, 0xd6, 0x48, 0x63, 0x60, 0x98, 0x30, 0xa1, 0x2a, 0x45, 0xd8, 0xc9, 0x22, 0x1e, 0x93, 0x84, - 0xaa, 0x5b, 0x39, 0x59, 0xc4, 0x57, 0x26, 0x1f, 0xb7, 0x74, 0x12, 0xe3, 0x33, 0xaa, 0x42, 0x6e, - 0xd0, 0x85, 0x6d, 0xfc, 0x40, 0x26, 0xda, 0x46, 0x1e, 0xde, 0x24, 0x6f, 0xc1, 0x08, 0x7f, 0xbc, - 0x13, 0x6f, 0x9c, 0xe7, 0xc2, 0x4b, 0xad, 0xfa, 0xb2, 0xc7, 0x35, 0xe1, 0x7f, 0xcc, 0x1f, 0xf8, - 0x9f, 0x31, 0x05, 0x49, 0xa8, 0x44, 0xd7, 0xf5, 0x69, 0x92, 0x3b, 0xaa, 0x8b, 0x6f, 0xa6, 0x29, - 0xd1, 0x8d, 0xdf, 0x1b, 0x82, 0x29, 0x1d, 0x4d, 0x7d, 0xe1, 0xcb, 0x0c, 0xf4, 0xc2, 0xf7, 0x05, - 0xc8, 0xb3, 0xfe, 0x70, 0xea, 0x54, 0x4a, 0x64, 0x2f, 0xe1, 0xd3, 0x82, 0x80, 0x69, 0x2f, 0xd7, - 0xc0, 0x87, 0x83, 0xdd, 0x71, 0xcd, 0x90, 0x8a, 0x2c, 0x2a, 0xcf, 0x50, 0xb9, 0x48, 0x48, 0x91, - 0xcf, 0x50, 0xea, 0x7a, 0x08, 0x1f, 0xa4, 0x5e, 0x87, 0x11, 0x26, 0xdf, 0x87, 0x2a, 0x18, 0xfc, - 0x4a, 0x26, 0xfa, 0xc7, 0x4c, 0x54, 0x38, 0x12, 0xd9, 0x86, 0xfc, 0xaa, 0xed, 0x07, 0x35, 0x4a, - 0xdb, 0x03, 0xbc, 0xdd, 0x17, 0x45, 0x57, 0xcd, 0xe2, 0xc3, 0xb8, 0x4f, 0x69, 0x3b, 0xf6, 0xf8, - 0x1a, 0x32, 0x23, 0x5f, 0x05, 0x28, 0xbb, 0xed, 0xc0, 0x73, 0x9b, 0xab, 0xee, 0xde, 0xfc, 0x08, - 0xde, 0x7d, 0x2f, 0xc5, 0x06, 0x20, 0x42, 0xe0, 0xd7, 0xdf, 0x50, 0xc1, 0x53, 0xe7, 0x05, 0x56, - 0xd3, 0xdd, 0x53, 0xd7, 0x41, 0x84, 0x4f, 0xee, 0x40, 0x41, 0x2a, 0x16, 0xb6, 0x3a, 0x7b, 0x1e, - 0x4e, 0x90, 0xd1, 0x48, 0xf2, 0xa0, 0x8f, 0x03, 0xab, 0x2b, 0xe0, 0xea, 0x4e, 0x19, 0xa7, 0x21, - 0x5f, 0x81, 0x0b, 0x71, 0x98, 0x1c, 0xe5, 0x7c, 0x24, 0x93, 0xab, 0xec, 0x52, 0xe6, 0x7d, 0x2f, - 0x16, 0xc6, 0x77, 0xb3, 0x70, 0xa1, 0x47, 0x63, 0xd9, 0x7a, 0xc0, 0xe3, 0x5a, 0x59, 0x0f, 0xb1, - 0x53, 0x9a, 0xdb, 0x1c, 0x5d, 0x86, 0xac, 0x38, 0xe0, 0x86, 0x96, 0x0a, 0x27, 0xc7, 0xc5, 0x09, - 0x6d, 0x1c, 0xb3, 0xd5, 0x0a, 0xb9, 0x07, 0x43, 0x6c, 0x88, 0x06, 0x78, 0x3a, 0x97, 0x3a, 0xa5, - 0xa9, 0xc0, 0x51, 0xa7, 0x0f, 0x0e, 0x1d, 0xf2, 0x20, 0x9f, 0x81, 0xdc, 0xe6, 0xe6, 0x2a, 0xce, - 0x9d, 0x1c, 0xb6, 0x7d, 0x32, 0x08, 0x9a, 0xda, 0x54, 0x9d, 0x64, 0xb4, 0xd7, 0x43, 0x4b, 0x0b, - 0x86, 0x4e, 0xbe, 0x14, 0x33, 0xe9, 0x79, 0xb5, 0xff, 0x40, 0x0f, 0x6e, 0xe1, 0xf3, 0x11, 0x0c, - 0x6b, 0x8c, 0x9f, 0xcf, 0x46, 0x6b, 0xf8, 0x8e, 0xd3, 0x0c, 0xa8, 0x47, 0x16, 0xf8, 0x92, 0x8c, - 0x84, 0x33, 0x33, 0xfc, 0x4d, 0xe6, 0xa3, 0xf5, 0xcd, 0x59, 0x85, 0x0b, 0xf9, 0x55, 0x65, 0x21, - 0xe7, 0x70, 0x21, 0x4f, 0xf5, 0x5c, 0xb2, 0xaf, 0xa6, 0xcc, 0x4b, 0x5c, 0x88, 0x29, 0x73, 0xef, - 0x25, 0x98, 0x5c, 0x77, 0x97, 0x1f, 0x07, 0x21, 0x22, 0x5b, 0x80, 0x79, 0x53, 0x07, 0x32, 0x8e, - 0x0f, 0x9a, 0x0d, 0xea, 0x6d, 0xee, 0xdb, 0x6d, 0xed, 0xed, 0xda, 0x4c, 0xc0, 0x19, 0xee, 0x3a, - 0x3d, 0xd4, 0x71, 0x47, 0x39, 0x6e, 0x1c, 0x6e, 0x7c, 0x7f, 0x56, 0x76, 0xc6, 0xc3, 0xc5, 0xa7, - 0xf4, 0x8d, 0xf4, 0x0d, 0xed, 0x8d, 0x74, 0x36, 0xd4, 0xee, 0x86, 0x0f, 0xfe, 0x8b, 0xa7, 0xd8, - 0x09, 0xfc, 0xcf, 0xc3, 0x30, 0xa1, 0xa2, 0xb3, 0x7e, 0x28, 0x35, 0x1a, 0x9e, 0xda, 0x0f, 0x76, - 0xa3, 0xe1, 0x99, 0x08, 0xd5, 0xcc, 0x02, 0x72, 0x7d, 0xcd, 0x02, 0xbe, 0x06, 0x63, 0xe5, 0x56, - 0x43, 0x7b, 0xac, 0x34, 0x52, 0x3e, 0xef, 0x7a, 0x88, 0xc4, 0xd7, 0x42, 0xa8, 0xb4, 0xac, 0xb7, - 0x1a, 0xc9, 0x27, 0xca, 0x88, 0xa5, 0x66, 0x51, 0x30, 0xfc, 0x51, 0x2c, 0x0a, 0x6e, 0xc3, 0xd8, - 0x96, 0x4f, 0x37, 0xbb, 0xed, 0x36, 0x6d, 0xe2, 0xb4, 0xca, 0x73, 0x59, 0xbf, 0xeb, 0x53, 0x2b, - 0x40, 0xa8, 0xfa, 0x01, 0x21, 0xaa, 0x3a, 0xc0, 0xa3, 0x7d, 0x06, 0xf8, 0x16, 0xe4, 0x37, 0x28, - 0xf5, 0xb0, 0x4f, 0xc7, 0x23, 0x91, 0xae, 0x43, 0xa9, 0x67, 0xb1, 0x8e, 0xd5, 0x2c, 0x0d, 0x04, - 0xa2, 0x66, 0x9e, 0x30, 0x31, 0xa0, 0x79, 0x02, 0x79, 0x01, 0x26, 0x3a, 0xdd, 0x9d, 0xa6, 0x53, - 0x47, 0xbe, 0xc2, 0xae, 0xc1, 0x1c, 0xe7, 0x30, 0xc6, 0xd6, 0x27, 0x5f, 0x82, 0x49, 0xbc, 0xe3, - 0x84, 0x53, 0x6e, 0x4a, 0x7b, 0xd5, 0xd3, 0xca, 0xb8, 0xa4, 0x53, 0x67, 0x20, 0x2b, 0xc5, 0xfc, - 0x46, 0x67, 0xb4, 0x50, 0x83, 0x29, 0x7d, 0x24, 0x9f, 0xc0, 0xe3, 0x5e, 0x68, 0x6a, 0x91, 0x2f, - 0x8c, 0xdd, 0x1b, 0xca, 0x43, 0x61, 0x9c, 0x1b, 0x59, 0x98, 0xb0, 0x11, 0xb6, 0xc9, 0x24, 0xf7, - 0xbb, 0x3b, 0xd4, 0x6b, 0xd3, 0x80, 0xfa, 0xe2, 0x12, 0xe0, 0x9b, 0x43, 0xa5, 0x4e, 0xc7, 0x37, - 0xfe, 0xe3, 0x2c, 0x8c, 0x96, 0xb6, 0x6b, 0xd5, 0xf6, 0xae, 0x8b, 0x4f, 0x74, 0xe1, 0xcb, 0x8c, - 0xfa, 0x44, 0x17, 0xbe, 0xcc, 0xa8, 0xef, 0x31, 0x37, 0x52, 0xae, 0x71, 0x68, 0xc5, 0xab, 0x5c, - 0xe3, 0xb4, 0x0b, 0x68, 0xf4, 0x48, 0x95, 0x1b, 0xe0, 0x91, 0x2a, 0xd4, 0x23, 0x0e, 0x9d, 0xae, - 0x47, 0x7c, 0x0b, 0xc6, 0xab, 0xed, 0x80, 0xee, 0x79, 0xd1, 0x4c, 0x0f, 0xaf, 0x94, 0x21, 0x58, - 0x15, 0xed, 0x15, 0x6c, 0x36, 0x8d, 0xb8, 0xee, 0x32, 0xd4, 0x59, 0xe2, 0x34, 0xe2, 0x2a, 0xce, - 0x98, 0x3e, 0x40, 0x22, 0x1a, 0x95, 0xd8, 0x1c, 0x91, 0x86, 0x00, 0x5c, 0xf8, 0x9c, 0x8a, 0x94, - 0xf7, 0xac, 0x63, 0x97, 0x66, 0xd2, 0x0d, 0x01, 0x8c, 0x1f, 0xce, 0xc2, 0x78, 0xa9, 0xd3, 0x79, - 0xca, 0xcd, 0xb1, 0x3e, 0xa7, 0x6d, 0xaf, 0xf2, 0x2e, 0x14, 0xb6, 0x6b, 0x20, 0x4b, 0xac, 0x5f, - 0xcd, 0xc2, 0x74, 0x8c, 0x42, 0xfd, 0xfa, 0xcc, 0x80, 0x46, 0x58, 0xd9, 0x01, 0x8d, 0xb0, 0x72, - 0x83, 0x19, 0x61, 0x0d, 0x7d, 0x94, 0x2d, 0xf3, 0x15, 0xc8, 0x95, 0x3a, 0x9d, 0xf8, 0x63, 0x6e, - 0xa7, 0xf3, 0xf0, 0x16, 0xbf, 0xcf, 0xda, 0x9d, 0x8e, 0xc9, 0x30, 0xb4, 0x7d, 0x6c, 0x64, 0xc0, - 0x7d, 0xcc, 0x78, 0x1d, 0xc6, 0x90, 0x17, 0x9a, 0x3e, 0x5d, 0x06, 0x5c, 0xcc, 0xc2, 0xea, 0x49, - 0xab, 0x4b, 0x2c, 0xf3, 0x7f, 0x91, 0x81, 0x61, 0xfc, 0xfd, 0x94, 0xce, 0xb1, 0x45, 0x6d, 0x8e, - 0x15, 0x94, 0x39, 0x36, 0xc8, 0xec, 0xfa, 0x47, 0x39, 0x80, 0xf2, 0x03, 0xb3, 0xc6, 0xd5, 0x1e, - 0xe4, 0x0e, 0x4c, 0xdb, 0xcd, 0xa6, 0x7b, 0x48, 0x1b, 0x96, 0xeb, 0x39, 0x7b, 0x4e, 0x9b, 0xf7, - 0x9c, 0x7c, 0x61, 0xd4, 0x8b, 0xd4, 0x77, 0x07, 0x51, 0xf4, 0x80, 0x97, 0xa8, 0x7c, 0x5a, 0x34, - 0xd8, 0x77, 0x1b, 0xf2, 0x02, 0xa7, 0xf1, 0x11, 0x45, 0x29, 0x7c, 0xd6, 0x78, 0x89, 0xca, 0x67, - 0x1f, 0x2f, 0xa4, 0x52, 0x7e, 0xd4, 0xf8, 0x88, 0xa2, 0x14, 0x3e, 0xfc, 0x16, 0xeb, 0x93, 0x55, - 0x98, 0x41, 0x88, 0x55, 0xf7, 0x68, 0x83, 0xb6, 0x03, 0xc7, 0x6e, 0xfa, 0xe2, 0xca, 0x8f, 0xca, - 0xa1, 0x44, 0xa1, 0x7a, 0xe5, 0xc1, 0xc2, 0x72, 0x54, 0x46, 0xae, 0xc3, 0x68, 0xcb, 0x7e, 0x6c, - 0xd9, 0x7b, 0xfc, 0xad, 0x7d, 0x92, 0x5f, 0x11, 0x05, 0x48, 0xdd, 0xb0, 0x5b, 0xf6, 0xe3, 0xd2, - 0x1e, 0x65, 0xad, 0xa0, 0x8f, 0x3b, 0xae, 0xaf, 0xb4, 0x62, 0x24, 0x6a, 0x45, 0xac, 0x48, 0x6d, - 0x85, 0x28, 0x12, 0xad, 0x30, 0x7e, 0x25, 0x03, 0xcf, 0x56, 0xf1, 0x2b, 0x82, 0xa3, 0x32, 0x6d, - 0x07, 0xd4, 0xdb, 0xa0, 0x5e, 0xcb, 0xc1, 0x97, 0xc7, 0x1a, 0x0d, 0xc8, 0x8b, 0x90, 0x2b, 0x99, - 0xeb, 0x62, 0xfe, 0xf2, 0x9d, 0x55, 0x7b, 0x07, 0x66, 0xa5, 0xa1, 0x16, 0x21, 0x7b, 0x8a, 0x7a, - 0xb0, 0x04, 0x13, 0x25, 0xdf, 0x77, 0xf6, 0xda, 0x2d, 0x6e, 0xc3, 0x9e, 0xd3, 0x5e, 0x9a, 0x05, - 0x3c, 0xa1, 0xd7, 0x56, 0x49, 0x8c, 0xff, 0x24, 0x03, 0x33, 0xa5, 0x4e, 0x47, 0xff, 0x64, 0xdd, - 0xca, 0x21, 0x33, 0xb8, 0x95, 0x83, 0x03, 0x53, 0x5a, 0x73, 0xf9, 0x94, 0x8a, 0xc4, 0xc2, 0x3e, - 0x3d, 0xc3, 0x3f, 0xbb, 0x13, 0x82, 0x2c, 0x5f, 0x7f, 0xa2, 0x8b, 0x31, 0x36, 0xfe, 0xed, 0x51, - 0xdc, 0x43, 0xc4, 0x6e, 0x2b, 0xec, 0xf0, 0x32, 0x29, 0x76, 0x78, 0x6f, 0x82, 0x22, 0x4b, 0xa8, - 0x3a, 0x54, 0x45, 0x92, 0x52, 0xef, 0xdf, 0x11, 0x32, 0x39, 0x88, 0x5b, 0xe4, 0xe5, 0xb0, 0x35, - 0x2f, 0xc6, 0x17, 0xf0, 0x13, 0x31, 0xc6, 0x5b, 0x01, 0x52, 0x6d, 0xe3, 0xb3, 0x21, 0xad, 0x1d, - 0x38, 0x9d, 0x87, 0xd4, 0x73, 0x76, 0x8f, 0xc4, 0x02, 0xc0, 0xce, 0x77, 0x44, 0xa9, 0xe5, 0x1f, - 0x38, 0x1d, 0x76, 0x41, 0x77, 0x76, 0x8f, 0xcc, 0x14, 0x1a, 0xf2, 0x1e, 0x8c, 0x9a, 0xf4, 0xd0, - 0x73, 0x02, 0x69, 0x67, 0x32, 0x15, 0xaa, 0x93, 0x10, 0xca, 0xd7, 0x82, 0xc7, 0x7f, 0xa8, 0xbb, - 0xa2, 0x28, 0x27, 0x8b, 0x5c, 0x1c, 0xe0, 0xf6, 0x24, 0x93, 0x51, 0x6b, 0x4b, 0xdb, 0xb5, 0x5e, - 0xd2, 0x00, 0xb9, 0x06, 0xc3, 0x28, 0x53, 0x08, 0x49, 0x19, 0xfd, 0x33, 0x50, 0xb2, 0x54, 0x05, - 0x1e, 0xc4, 0x20, 0x97, 0x00, 0xc2, 0x77, 0x39, 0x7f, 0x3e, 0x8f, 0x32, 0xac, 0x02, 0x89, 0x0b, - 0x44, 0x63, 0x67, 0x12, 0x88, 0x56, 0xa1, 0x60, 0x72, 0x57, 0xaf, 0x46, 0xa9, 0x83, 0x8f, 0x3f, - 0xfe, 0x3c, 0xe0, 0x4a, 0xbe, 0x7c, 0x72, 0x5c, 0x7c, 0x4e, 0xb8, 0x81, 0x35, 0x2c, 0xbb, 0xc3, - 0xdf, 0x8c, 0xb4, 0x6d, 0x24, 0x4e, 0x49, 0xde, 0x84, 0x21, 0xb6, 0xf5, 0x0a, 0xdb, 0x3d, 0xa9, - 0x44, 0x8f, 0x76, 0x63, 0xbe, 0x38, 0xeb, 0xae, 0xb6, 0x27, 0x20, 0x09, 0xb1, 0x60, 0x4a, 0x9f, - 0xee, 0xc2, 0x8c, 0x63, 0x3e, 0xea, 0x4f, 0xbd, 0x5c, 0x68, 0xd6, 0x05, 0xcc, 0xaa, 0x23, 0x50, - 0x5d, 0x01, 0xb1, 0x45, 0xba, 0x0c, 0xf9, 0xcd, 0xf2, 0xc6, 0x86, 0xeb, 0x05, 0xfc, 0x22, 0x10, - 0x9d, 0x2c, 0x0c, 0x66, 0xda, 0xed, 0x3d, 0xca, 0xcf, 0xe2, 0xa0, 0xde, 0xb1, 0x3a, 0x0c, 0x4d, - 0x3d, 0x8b, 0x25, 0xe9, 0xc7, 0x67, 0xb7, 0xf7, 0xab, 0x59, 0x78, 0x31, 0x94, 0x8a, 0x1e, 0x78, - 0xb5, 0xd2, 0xda, 0x6a, 0xb5, 0xb1, 0x21, 0x94, 0x08, 0x1b, 0x9e, 0xfb, 0xc8, 0x69, 0x50, 0xef, - 0xe1, 0xcd, 0x53, 0xce, 0xf4, 0x55, 0xbe, 0xcc, 0xf9, 0x0b, 0x44, 0x56, 0xb3, 0x70, 0x52, 0x84, - 0x4f, 0xb1, 0x3d, 0x75, 0x3a, 0x89, 0x07, 0x89, 0x95, 0x67, 0xcc, 0x88, 0x01, 0xf9, 0x81, 0x0c, - 0x9c, 0x4f, 0xff, 0x10, 0xa1, 0x58, 0x2a, 0xca, 0x0b, 0x6c, 0x8f, 0xaf, 0x5d, 0x7a, 0xe5, 0xe4, - 0xb8, 0xf8, 0xa2, 0x6f, 0xb7, 0x9a, 0x96, 0xd3, 0xe0, 0xb5, 0x39, 0x75, 0x6a, 0x75, 0x04, 0x82, - 0x56, 0x6f, 0x8f, 0x9a, 0x3e, 0x0f, 0xf2, 0x68, 0x9f, 0xcf, 0x2c, 0x01, 0xe4, 0xa5, 0x92, 0xd7, - 0xf8, 0x8d, 0x0c, 0x28, 0x4b, 0x30, 0x6f, 0xd2, 0x86, 0xe3, 0xd1, 0x7a, 0x20, 0x8e, 0x77, 0xe1, - 0x9f, 0xc5, 0x61, 0x31, 0x83, 0x36, 0x84, 0x91, 0x77, 0x61, 0x54, 0x1c, 0x43, 0x62, 0xdb, 0x95, - 0x4b, 0x57, 0xa8, 0x8f, 0xb9, 0x23, 0x5f, 0xe2, 0x08, 0x93, 0x44, 0x6c, 0xd7, 0xbf, 0xb7, 0xbd, - 0x59, 0x6e, 0xda, 0x4e, 0xcb, 0x17, 0x67, 0x09, 0x76, 0xeb, 0x07, 0x87, 0x81, 0x55, 0x47, 0xa8, - 0xba, 0xeb, 0x87, 0xa8, 0xc6, 0x5d, 0xa9, 0xbd, 0x3e, 0xc5, 0x2a, 0xb3, 0x08, 0xc3, 0x0f, 0x23, - 0x2d, 0xd6, 0xd2, 0xd8, 0xc9, 0x71, 0x91, 0x4f, 0x17, 0x93, 0xc3, 0x0d, 0x0a, 0x63, 0xe1, 0xd4, - 0x65, 0xbc, 0xd8, 0x0f, 0xe4, 0x35, 0xc9, 0x79, 0xb1, 0x49, 0x6c, 0x22, 0x94, 0x89, 0x7a, 0xcb, - 0xed, 0x06, 0x22, 0x64, 0x11, 0x01, 0xbb, 0x87, 0xb6, 0x1b, 0x38, 0xd3, 0xd5, 0xd6, 0x09, 0x34, - 0x45, 0xa0, 0xfa, 0xd1, 0x0c, 0x4c, 0xe9, 0xd3, 0x96, 0x5c, 0x87, 0x11, 0xe1, 0x82, 0x95, 0x41, - 0xa5, 0x20, 0xe3, 0x36, 0xc2, 0x9d, 0xaf, 0x34, 0x97, 0x2b, 0x81, 0xc5, 0xe4, 0x46, 0xc1, 0x41, - 0x08, 0x4d, 0x28, 0x37, 0xd6, 0x39, 0xc8, 0x94, 0x65, 0xc4, 0x60, 0x97, 0x46, 0xbf, 0xdb, 0x0c, - 0xd4, 0xb7, 0x22, 0x0f, 0x21, 0xa6, 0x28, 0x31, 0xca, 0x30, 0xc2, 0xb7, 0xd6, 0x98, 0xd1, 0x59, - 0xe6, 0x0c, 0x46, 0x67, 0xc6, 0x71, 0x06, 0xa0, 0x56, 0x5b, 0xb9, 0x4f, 0x8f, 0x36, 0x6c, 0x07, - 0xcf, 0x6f, 0x7e, 0x8c, 0xdd, 0x17, 0x6b, 0x78, 0x42, 0x3c, 0x6e, 0xf2, 0x23, 0xef, 0x80, 0x1e, - 0x69, 0x8f, 0x9b, 0x12, 0x15, 0xcf, 0x4a, 0xcf, 0x79, 0x64, 0x07, 0x94, 0x11, 0x66, 0x91, 0x90, - 0x9f, 0x95, 0x1c, 0x1a, 0xa3, 0x54, 0x90, 0xc9, 0x57, 0x61, 0x2a, 0xfa, 0x15, 0x3e, 0xd1, 0x4e, - 0x85, 0xfb, 0x84, 0x5e, 0xb8, 0x74, 0xe9, 0xe4, 0xb8, 0xb8, 0xa0, 0x70, 0x8d, 0x3f, 0xde, 0xc6, - 0x98, 0x19, 0xbf, 0x94, 0x41, 0xc3, 0x04, 0xd9, 0xc0, 0x2b, 0x30, 0x14, 0x9a, 0xd2, 0x4e, 0x88, - 0x4d, 0x58, 0x7f, 0x86, 0xc2, 0x72, 0x26, 0x6e, 0x45, 0x2d, 0xc1, 0xa3, 0x4b, 0x6f, 0x01, 0x2b, - 0x25, 0x77, 0x61, 0x74, 0xa0, 0x6f, 0xc6, 0x29, 0x96, 0xf2, 0xad, 0x92, 0x1a, 0x47, 0xe1, 0xde, - 0xf6, 0xe6, 0x27, 0x77, 0x14, 0x7e, 0x22, 0x0b, 0xd3, 0xac, 0x5f, 0x4b, 0xdd, 0x60, 0xdf, 0xf5, - 0x9c, 0xe0, 0xe8, 0xa9, 0xd5, 0xaa, 0xbe, 0xad, 0x5d, 0xc9, 0x16, 0xe4, 0x61, 0xa6, 0xb6, 0x6d, - 0x20, 0xe5, 0xea, 0x7f, 0x37, 0x0c, 0xb3, 0x29, 0x54, 0xe4, 0x35, 0xed, 0xe1, 0x63, 0x5e, 0xba, - 0x58, 0x7f, 0xf7, 0xb8, 0x38, 0x21, 0xd1, 0x37, 0x23, 0x97, 0xeb, 0x45, 0xdd, 0xca, 0x87, 0xf7, - 0x14, 0xbe, 0x83, 0xa8, 0x56, 0x3e, 0xba, 0x6d, 0xcf, 0x35, 0x18, 0x36, 0xdd, 0x26, 0x95, 0x96, - 0x6d, 0x28, 0x70, 0x79, 0x0c, 0xa0, 0xbd, 0xe4, 0x33, 0x00, 0x59, 0x81, 0x51, 0xf6, 0xc7, 0x9a, - 0xdd, 0x11, 0x6f, 0x54, 0x24, 0x54, 0x0a, 0x20, 0xb4, 0xe3, 0xb4, 0xf7, 0x54, 0xbd, 0x40, 0x93, - 0x5a, 0x2d, 0xbb, 0xa3, 0x49, 0x86, 0x1c, 0x51, 0xd3, 0x2f, 0xe4, 0x7b, 0xeb, 0x17, 0x32, 0xa7, - 0xea, 0x17, 0x76, 0x01, 0x6a, 0xce, 0x5e, 0xdb, 0x69, 0xef, 0x95, 0x9a, 0x7b, 0xc2, 0x51, 0xfd, - 0x5a, 0xef, 0x51, 0xb8, 0x1e, 0x21, 0xe3, 0xc4, 0x7d, 0x16, 0x1f, 0x92, 0x39, 0xcc, 0xb2, 0x9b, - 0x7b, 0x9a, 0x43, 0x8d, 0xc2, 0x99, 0xac, 0x03, 0x94, 0xea, 0x81, 0xf3, 0x88, 0x4d, 0x61, 0x5f, - 0x88, 0x71, 0xf2, 0x93, 0xcb, 0xa5, 0xfb, 0xf4, 0x08, 0xaf, 0x1e, 0xf2, 0x49, 0xce, 0x46, 0x54, - 0xb6, 0x12, 0x34, 0x6f, 0x89, 0x88, 0x03, 0xe9, 0xc0, 0xb9, 0x52, 0xa3, 0xe1, 0xb0, 0x36, 0xd8, - 0xcd, 0x4d, 0x1e, 0x62, 0x00, 0x59, 0x4f, 0xa4, 0xb3, 0xbe, 0x26, 0x58, 0xbf, 0x60, 0x87, 0x54, - 0x96, 0x8c, 0x4c, 0x10, 0xab, 0x26, 0x9d, 0xb1, 0x51, 0x83, 0x29, 0xbd, 0xf1, 0xba, 0x83, 0xfd, - 0x04, 0xe4, 0xcd, 0x5a, 0xc9, 0xaa, 0xad, 0x94, 0x6e, 0x16, 0x32, 0xa4, 0x00, 0x13, 0xe2, 0xd7, - 0xa2, 0xb5, 0xf8, 0xc6, 0xed, 0x42, 0x56, 0x83, 0xbc, 0x71, 0x73, 0xb1, 0x90, 0x5b, 0xc8, 0xce, - 0x67, 0x62, 0xbe, 0x6d, 0xa3, 0x85, 0x3c, 0x57, 0xbe, 0x1a, 0xbf, 0x96, 0x81, 0xbc, 0xfc, 0x76, - 0x72, 0x1b, 0x72, 0xb5, 0xda, 0x4a, 0xcc, 0x1b, 0x2d, 0x3a, 0x65, 0xf8, 0x7e, 0xea, 0xfb, 0xaa, - 0xc9, 0x31, 0x23, 0x60, 0x74, 0x9b, 0xab, 0x35, 0x21, 0x83, 0x48, 0xba, 0x68, 0xf3, 0xe6, 0x74, - 0x29, 0x2e, 0x3a, 0xb7, 0x21, 0x77, 0x6f, 0x7b, 0x53, 0x5c, 0xb2, 0x24, 0x5d, 0xb4, 0x9f, 0x72, - 0xba, 0x0f, 0x0e, 0xd5, 0x5d, 0x9e, 0x11, 0x18, 0x26, 0x8c, 0x2b, 0x13, 0x99, 0x1f, 0xba, 0x2d, - 0x37, 0xf4, 0x2a, 0x17, 0x87, 0x2e, 0x83, 0x98, 0xa2, 0x84, 0x89, 0x22, 0xab, 0x6e, 0xdd, 0x6e, - 0x8a, 0xd3, 0x1b, 0x45, 0x91, 0x26, 0x03, 0x98, 0x1c, 0x6e, 0xfc, 0x6e, 0x06, 0x0a, 0x28, 0xb0, - 0xa1, 0xc9, 0xb0, 0x7b, 0x40, 0xdb, 0x0f, 0x6f, 0x92, 0xd7, 0xe5, 0x92, 0xcb, 0x84, 0x8a, 0xae, - 0x61, 0x5c, 0x72, 0xb1, 0x97, 0x32, 0xb1, 0xec, 0x14, 0xc7, 0xfd, 0xec, 0xe0, 0x0e, 0xbf, 0xa7, - 0x38, 0xee, 0x17, 0x61, 0x18, 0x3f, 0x47, 0x6c, 0x8e, 0xf8, 0xe5, 0x01, 0x03, 0x98, 0x1c, 0xae, - 0xec, 0x4d, 0x3f, 0x95, 0x4d, 0xb4, 0x61, 0xf1, 0x13, 0xe5, 0x34, 0xab, 0x37, 0x6e, 0xa0, 0xfd, - 0xfa, 0x7d, 0x98, 0x8b, 0x77, 0x09, 0x2a, 0x21, 0x4b, 0x30, 0xad, 0xc3, 0xa5, 0x3e, 0xf2, 0x42, - 0x6a, 0x5d, 0x0f, 0x17, 0xcd, 0x38, 0xbe, 0xf1, 0xbf, 0x67, 0x60, 0x0c, 0xff, 0x34, 0xbb, 0x4d, - 0x34, 0xdd, 0x2a, 0x6d, 0xd7, 0x84, 0x6a, 0x44, 0x15, 0xe6, 0xec, 0x43, 0xdf, 0x12, 0x7a, 0x14, - 0x6d, 0x8f, 0x09, 0x91, 0x05, 0x29, 0x7f, 0x49, 0x90, 0x4a, 0xb9, 0x90, 0x94, 0x3f, 0x39, 0xf8, - 0x31, 0x52, 0x81, 0x8c, 0x06, 0x9f, 0xdb, 0x35, 0x36, 0xfd, 0x54, 0x5b, 0x0a, 0xa4, 0x73, 0x9b, - 0xba, 0xc1, 0x27, 0x47, 0x43, 0x53, 0x8a, 0xed, 0x5a, 0xc9, 0x5c, 0xd7, 0x4c, 0x29, 0xd8, 0x37, - 0x6a, 0x7a, 0x29, 0x81, 0x64, 0xfc, 0xfc, 0x78, 0xbc, 0x03, 0xc5, 0x81, 0x77, 0xc6, 0xb5, 0xf1, - 0x16, 0x0c, 0x97, 0x9a, 0x4d, 0xf7, 0x50, 0xec, 0x12, 0xf2, 0xe6, 0x1a, 0xf6, 0x1f, 0x3f, 0xcf, - 0x50, 0xad, 0xa7, 0x39, 0x02, 0x32, 0x00, 0x29, 0xc3, 0x58, 0x69, 0xbb, 0x56, 0xad, 0x56, 0x36, - 0x37, 0xb9, 0xd3, 0x53, 0x6e, 0xe9, 0x65, 0xd9, 0x3f, 0x8e, 0xd3, 0xb0, 0xe2, 0xaf, 0xf9, 0x91, - 0xfc, 0x1e, 0xd1, 0x91, 0x77, 0x00, 0xee, 0xb9, 0x4e, 0x9b, 0xab, 0x31, 0x45, 0xe3, 0xd9, 0x0d, - 0x7c, 0xfc, 0x03, 0xd7, 0x69, 0x0b, 0xbd, 0x27, 0xfb, 0xf6, 0x08, 0xc9, 0x54, 0xfe, 0x66, 0x3d, - 0xbd, 0xe4, 0x72, 0x73, 0xac, 0xe1, 0xa8, 0xa7, 0x77, 0xdc, 0x84, 0xbe, 0x4d, 0xa2, 0x91, 0x16, - 0x4c, 0xd7, 0xba, 0x7b, 0x7b, 0x94, 0xed, 0xec, 0x42, 0x9f, 0x34, 0x22, 0xae, 0xd2, 0x61, 0xa8, - 0x19, 0x7e, 0x1f, 0x61, 0x97, 0x21, 0x7f, 0xe9, 0x35, 0x36, 0x91, 0xbf, 0x73, 0x5c, 0x14, 0x56, - 0x02, 0x4c, 0x54, 0xf3, 0x25, 0x7d, 0x52, 0x9b, 0x14, 0xe7, 0x4d, 0x1e, 0xc0, 0xc8, 0x5d, 0x27, - 0x58, 0xe9, 0xee, 0x08, 0x27, 0x9e, 0x17, 0xfa, 0x2c, 0x1a, 0x8e, 0xc8, 0x9f, 0xa9, 0xf6, 0x9c, - 0x60, 0xbf, 0xab, 0xba, 0x51, 0x08, 0x36, 0x64, 0x1b, 0xf2, 0x65, 0xc7, 0xab, 0x37, 0x69, 0xb9, - 0x2a, 0xce, 0xfe, 0x17, 0xfb, 0xb0, 0x94, 0xa8, 0xbc, 0x5f, 0xea, 0xf8, 0xab, 0xee, 0xa8, 0xb2, - 0x80, 0xc4, 0x20, 0xff, 0x66, 0x06, 0x9e, 0x0d, 0xbf, 0xbe, 0xb4, 0x47, 0xdb, 0xc1, 0x9a, 0x1d, - 0xd4, 0xf7, 0xa9, 0x27, 0x7a, 0x69, 0xac, 0x5f, 0x2f, 0x7d, 0x3e, 0xd1, 0x4b, 0x57, 0xa3, 0x5e, - 0xb2, 0x19, 0x33, 0xab, 0xc5, 0xb9, 0x25, 0xfb, 0xac, 0x5f, 0xad, 0xc4, 0x02, 0x88, 0xde, 0x1d, - 0x85, 0x13, 0xe8, 0xcb, 0x7d, 0x1a, 0x1c, 0x21, 0x0b, 0xe7, 0x8d, 0xf0, 0xb7, 0x66, 0x7d, 0x18, - 0x42, 0xc9, 0x7d, 0xe9, 0x31, 0xc7, 0xa5, 0x92, 0xcb, 0x7d, 0x78, 0x73, 0x2f, 0xba, 0xd9, 0x3e, - 0xbe, 0xb1, 0x7c, 0xb4, 0x57, 0xed, 0x1d, 0x21, 0x88, 0x9c, 0x32, 0xda, 0xab, 0x76, 0x34, 0xda, - 0x4d, 0x3b, 0x3e, 0xda, 0xab, 0xf6, 0x0e, 0x29, 0x73, 0x37, 0x5f, 0xee, 0x13, 0x7a, 0xa9, 0x1f, - 0xb7, 0xf2, 0x06, 0x3f, 0x99, 0x53, 0xdc, 0x7d, 0xbf, 0x0c, 0x63, 0xb5, 0x8e, 0x5d, 0xa7, 0x4d, - 0x67, 0x37, 0x10, 0x0f, 0xd1, 0x2f, 0xf5, 0x61, 0x15, 0xe2, 0x8a, 0x47, 0x4c, 0xf9, 0x53, 0xbd, - 0x26, 0x85, 0x38, 0xec, 0x0b, 0x37, 0x37, 0xd6, 0xe6, 0xa7, 0x4f, 0xfd, 0xc2, 0xcd, 0x8d, 0x35, - 0x21, 0x73, 0x74, 0x5a, 0x9a, 0xcc, 0xb1, 0xb1, 0x46, 0x3a, 0x30, 0xb5, 0x49, 0x3d, 0xcf, 0xde, - 0x75, 0xbd, 0x16, 0xd7, 0x5f, 0x72, 0x3f, 0xa3, 0x6b, 0xfd, 0xf8, 0x69, 0x04, 0x5c, 0x6d, 0x17, - 0x48, 0x98, 0x15, 0x57, 0x7a, 0xc6, 0xf8, 0xb3, 0x3e, 0x59, 0x72, 0x82, 0x9d, 0x6e, 0xfd, 0x80, - 0x06, 0xf3, 0x33, 0xa7, 0xf6, 0x49, 0x88, 0xcb, 0xfb, 0x64, 0x47, 0xfe, 0x54, 0xfb, 0x24, 0xc4, - 0x31, 0x7e, 0x2b, 0x07, 0x17, 0x7a, 0x74, 0x01, 0x59, 0x97, 0x5b, 0x6e, 0x46, 0xd3, 0x62, 0xf7, - 0x40, 0xbf, 0x7e, 0xea, 0x2e, 0xbc, 0x0a, 0x85, 0xe5, 0xfb, 0x28, 0xab, 0xf3, 0x87, 0x9c, 0x72, - 0x49, 0x1e, 0x56, 0xa8, 0x69, 0xa5, 0x07, 0x68, 0x97, 0x29, 0x1f, 0x80, 0xea, 0x9a, 0x03, 0x72, - 0x82, 0x72, 0xe1, 0xfb, 0xb3, 0x30, 0x84, 0x07, 0x67, 0x2c, 0xec, 0x52, 0xe6, 0x4c, 0x61, 0x97, - 0xbe, 0x00, 0x13, 0xcb, 0xf7, 0xf9, 0x4d, 0x7a, 0xc5, 0xf6, 0xf7, 0xc5, 0xb6, 0x8e, 0x66, 0x0e, - 0xf4, 0xc0, 0x12, 0x17, 0xef, 0x7d, 0x5b, 0x93, 0x59, 0x35, 0x0a, 0xb2, 0x05, 0xb3, 0xfc, 0xdb, - 0x9c, 0x5d, 0xa7, 0xce, 0xa3, 0xb7, 0x38, 0x76, 0x53, 0xec, 0xf1, 0x2f, 0x9e, 0x1c, 0x17, 0x8b, - 0xf4, 0x00, 0x2d, 0x4e, 0x45, 0xb9, 0xe5, 0x23, 0x82, 0x6a, 0x7a, 0x9a, 0x42, 0xaf, 0x86, 0x94, - 0x30, 0xc7, 0xb0, 0x42, 0x56, 0x1b, 0xab, 0x9b, 0xe1, 0x72, 0x24, 0xe3, 0xcf, 0x87, 0x61, 0xa1, - 0xf7, 0xf6, 0x4c, 0xbe, 0xa8, 0x0f, 0xe0, 0x95, 0x53, 0x37, 0xf4, 0xd3, 0xc7, 0xf0, 0x4b, 0x30, - 0xb7, 0xdc, 0x0e, 0xa8, 0xd7, 0xf1, 0x1c, 0x19, 0x44, 0x64, 0xc5, 0xf5, 0xa5, 0x85, 0x2f, 0x9a, - 0xda, 0xd2, 0xb0, 0x5c, 0xe8, 0x56, 0xd1, 0xde, 0x58, 0x61, 0x95, 0xca, 0x81, 0x2c, 0xc3, 0x94, - 0x02, 0x6f, 0x76, 0xf7, 0xd4, 0xd7, 0x29, 0x95, 0x67, 0xb3, 0xab, 0x9a, 0x3f, 0xc6, 0x88, 0xd0, - 0x8a, 0x98, 0x5d, 0x19, 0xeb, 0xf7, 0xb6, 0xef, 0xd7, 0xc4, 0x70, 0x72, 0x2b, 0x62, 0x84, 0x5a, - 0x1f, 0x1c, 0x1e, 0x68, 0xfb, 0x6b, 0x84, 0xbc, 0xf0, 0x4b, 0x39, 0x31, 0xa3, 0x5e, 0x84, 0x5c, - 0xad, 0xbb, 0xa3, 0xbe, 0xb9, 0xf9, 0xda, 0x01, 0xc7, 0x4a, 0xc9, 0xe7, 0x00, 0x4c, 0xda, 0x71, - 0x7d, 0x27, 0x70, 0xbd, 0x23, 0xd5, 0x8d, 0xcd, 0x0b, 0xa1, 0xba, 0xa5, 0xbd, 0x84, 0x92, 0x15, - 0x98, 0x8e, 0x7e, 0x3d, 0x38, 0x6c, 0x0b, 0x5d, 0xf2, 0x18, 0xd7, 0xae, 0x44, 0xe4, 0x96, 0xcb, - 0xca, 0xd4, 0x23, 0x3b, 0x46, 0x46, 0x16, 0x21, 0xbf, 0xed, 0x7a, 0x07, 0xbb, 0x6c, 0x8c, 0x87, - 0x22, 0xa1, 0xe2, 0x50, 0xc0, 0xd4, 0xc3, 0x53, 0xe2, 0xb1, 0xe5, 0xb2, 0xdc, 0x7e, 0xe4, 0x78, - 0x2e, 0xbe, 0xe8, 0xa9, 0xd6, 0x23, 0x34, 0x02, 0x6b, 0x0e, 0xc4, 0x11, 0x98, 0x5c, 0x83, 0xe1, - 0x52, 0x3d, 0x70, 0x3d, 0x61, 0x3a, 0xc2, 0x67, 0x0a, 0x03, 0x68, 0x33, 0x85, 0x01, 0x58, 0x27, - 0x9a, 0x74, 0x57, 0xbc, 0xee, 0x60, 0x27, 0x7a, 0x74, 0x57, 0xf3, 0x8e, 0xa6, 0xbb, 0x4c, 0x28, - 0x32, 0xe9, 0x2e, 0x2a, 0x3e, 0xb4, 0xa0, 0x62, 0xbb, 0x09, 0x95, 0x99, 0x40, 0x33, 0xfe, 0x60, - 0xac, 0xe7, 0x94, 0x67, 0xa7, 0xd0, 0xd9, 0xa6, 0xfc, 0xaa, 0x3d, 0xc0, 0x94, 0x7f, 0x2d, 0xb4, - 0xdf, 0x57, 0x43, 0x02, 0x20, 0x44, 0x3d, 0x06, 0x39, 0xce, 0xc2, 0x2f, 0xe7, 0xcf, 0x32, 0x89, - 0x44, 0x27, 0x65, 0x07, 0xed, 0xa4, 0xdc, 0x40, 0x9d, 0x44, 0x96, 0x60, 0x32, 0x0c, 0x4b, 0xb7, - 0x61, 0x07, 0xda, 0xb6, 0x16, 0xc6, 0x12, 0xb4, 0x3a, 0x76, 0xa0, 0x6e, 0x6b, 0x3a, 0x09, 0x79, - 0x1b, 0xc6, 0x85, 0x13, 0x0b, 0x72, 0x18, 0x8e, 0xcc, 0x88, 0xa5, 0xc7, 0x4b, 0x8c, 0x5e, 0x45, - 0x67, 0xab, 0x79, 0xc3, 0xe9, 0xd0, 0xa6, 0xd3, 0xa6, 0x35, 0x7c, 0xac, 0x10, 0x33, 0x86, 0x3f, - 0xda, 0x8a, 0x12, 0x8b, 0xbf, 0x63, 0x68, 0xfa, 0x43, 0x8d, 0x28, 0x3e, 0x59, 0x47, 0xcf, 0x34, - 0x59, 0xb9, 0x15, 0x9f, 0xb7, 0xea, 0xee, 0x39, 0xd2, 0x6e, 0x59, 0x5a, 0xf1, 0x79, 0x56, 0x93, - 0x41, 0x63, 0x56, 0x7c, 0x1c, 0x95, 0xdd, 0x70, 0xd8, 0x8f, 0x6a, 0x45, 0xbc, 0x24, 0xe2, 0x0d, - 0x07, 0x89, 0x74, 0x63, 0x71, 0x8e, 0x24, 0xab, 0x59, 0x6e, 0xd9, 0x4e, 0x53, 0x78, 0x7e, 0x47, - 0xd5, 0x50, 0x06, 0x8d, 0x57, 0x83, 0xa8, 0xa4, 0x0e, 0x13, 0x26, 0xdd, 0xdd, 0xf0, 0xdc, 0x80, - 0xd6, 0x03, 0xda, 0x10, 0x52, 0x9d, 0xbc, 0xd8, 0x2c, 0xb9, 0x2e, 0x97, 0x58, 0x97, 0x5e, 0xff, - 0x83, 0xe3, 0x62, 0xe6, 0x3b, 0xc7, 0x45, 0x60, 0x20, 0xee, 0x89, 0x70, 0x72, 0x5c, 0xbc, 0xc0, - 0xc6, 0xbf, 0x23, 0x89, 0xd5, 0xd3, 0x49, 0x65, 0x4a, 0xbe, 0xc5, 0xf6, 0xeb, 0xb0, 0x4b, 0xa2, - 0xca, 0x26, 0x7a, 0x54, 0xf6, 0x46, 0x6a, 0x65, 0x45, 0xa5, 0xb7, 0x53, 0x2b, 0x4d, 0xad, 0x84, - 0xbc, 0x03, 0xe3, 0xe5, 0x6a, 0xd9, 0x6d, 0xef, 0x3a, 0x7b, 0xb5, 0x95, 0x12, 0x8a, 0x86, 0xc2, - 0x0b, 0xa5, 0xee, 0x58, 0x75, 0x84, 0x5b, 0xfe, 0xbe, 0xad, 0x39, 0x23, 0x46, 0xf8, 0xe4, 0x2e, - 0x4c, 0xc9, 0x9f, 0x26, 0xdd, 0xdd, 0x32, 0xab, 0x28, 0x11, 0x4a, 0xd7, 0x9f, 0x90, 0x03, 0xeb, - 0x88, 0xae, 0xa7, 0xde, 0x14, 0x62, 0x64, 0x6c, 0x32, 0x56, 0x68, 0xa7, 0xe9, 0x1e, 0xb1, 0xcf, - 0xdb, 0x74, 0xa8, 0x87, 0x32, 0xa0, 0x98, 0x8c, 0x8d, 0xb0, 0xc4, 0x0a, 0x1c, 0xfd, 0xfd, 0x54, - 0x27, 0x22, 0xeb, 0x30, 0x23, 0xa6, 0xf8, 0x43, 0xc7, 0x77, 0x76, 0x9c, 0xa6, 0x13, 0x1c, 0xa1, - 0xf4, 0x27, 0x04, 0x18, 0xb9, 0x2e, 0x1e, 0x85, 0xa5, 0x0a, 0xb3, 0x24, 0xa9, 0xf1, 0x6b, 0x59, - 0x78, 0xae, 0xdf, 0x4d, 0x88, 0xd4, 0xf4, 0xcd, 0xec, 0xea, 0x00, 0xb7, 0xa7, 0xd3, 0xb7, 0xb3, - 0x65, 0x98, 0x7a, 0xe0, 0xed, 0xd9, 0x6d, 0xe7, 0x9b, 0x78, 0xc3, 0x0d, 0x8d, 0x19, 0xb1, 0x33, - 0x5c, 0xa5, 0x44, 0x9f, 0xed, 0x31, 0xa2, 0x85, 0x47, 0x62, 0x9b, 0xfb, 0xb0, 0x6e, 0x71, 0xb7, - 0x61, 0xac, 0xec, 0xb6, 0x03, 0xfa, 0x38, 0x88, 0x39, 0x81, 0x73, 0x60, 0xdc, 0x25, 0x50, 0xa2, - 0x1a, 0xff, 0x2a, 0x0b, 0xcf, 0xf7, 0xbd, 0x0a, 0x90, 0x4d, 0xbd, 0xd7, 0xae, 0x0d, 0x72, 0x7f, - 0x38, 0xbd, 0xdb, 0x16, 0x13, 0x76, 0x77, 0xa7, 0x7a, 0x9d, 0x2c, 0xfc, 0xf7, 0x19, 0xd1, 0x49, - 0x9f, 0x86, 0x51, 0xac, 0x2a, 0xec, 0x22, 0xae, 0x25, 0xc3, 0x5d, 0xd8, 0xd1, 0xb5, 0x64, 0x1c, - 0x8d, 0xdc, 0x82, 0x7c, 0xd9, 0x6e, 0x36, 0x15, 0x17, 0x79, 0x94, 0xe6, 0xeb, 0x08, 0x8b, 0x99, - 0x69, 0x4a, 0x44, 0x26, 0xfb, 0xf0, 0xbf, 0x95, 0xb3, 0x02, 0x37, 0x4b, 0x41, 0x16, 0x3b, 0x2e, - 0x14, 0x64, 0x0c, 0xac, 0x59, 0x77, 0x43, 0x27, 0x5c, 0x1e, 0x58, 0x93, 0x01, 0xb4, 0xc0, 0x9a, - 0x0c, 0x60, 0xfc, 0x7a, 0x0e, 0x2e, 0xf5, 0xbf, 0xcf, 0x92, 0x2d, 0x7d, 0x08, 0x5e, 0x1d, 0xe8, - 0x16, 0x7c, 0xfa, 0x18, 0xc8, 0x30, 0xb5, 0xbc, 0x43, 0xae, 0x26, 0x9d, 0x43, 0xbe, 0x7b, 0x5c, - 0x54, 0x6c, 0x7f, 0xef, 0xb9, 0x4e, 0x5b, 0x79, 0x33, 0xf9, 0x86, 0x26, 0x19, 0xf2, 0xd7, 0xfb, - 0xdb, 0x83, 0x7d, 0x59, 0x44, 0xc7, 0xf7, 0x95, 0x41, 0x25, 0xca, 0xcf, 0x43, 0x21, 0x4e, 0x4a, - 0xae, 0xc0, 0x10, 0x7e, 0x80, 0xe2, 0xe1, 0x12, 0xe3, 0x80, 0xe5, 0x0b, 0x6b, 0x62, 0xee, 0x60, - 0xd4, 0x00, 0xb4, 0x07, 0xd0, 0x75, 0x83, 0x22, 0x6a, 0x00, 0x37, 0x27, 0x48, 0xea, 0x07, 0x63, - 0x44, 0xc6, 0x5f, 0x66, 0xe0, 0x62, 0x4f, 0x4d, 0x01, 0xd9, 0xd0, 0x07, 0xec, 0xe5, 0xd3, 0x54, - 0x0b, 0xa7, 0x8e, 0xd5, 0xc2, 0x8f, 0xc9, 0xb9, 0xff, 0x2e, 0x4c, 0xd4, 0xba, 0x3b, 0xf1, 0xfb, - 0x19, 0x8f, 0xe9, 0xa1, 0xc0, 0xd5, 0x13, 0x4c, 0xc5, 0x67, 0xed, 0x97, 0x06, 0x0f, 0xc2, 0x00, - 0x48, 0xb1, 0x3a, 0x0c, 0xdd, 0x5a, 0x93, 0x51, 0x13, 0x74, 0x22, 0xe3, 0x57, 0xb3, 0xe9, 0x17, - 0xdd, 0xbb, 0xe5, 0x8d, 0xb3, 0x5c, 0x74, 0xef, 0x96, 0x37, 0x4e, 0x6f, 0xfb, 0x7f, 0x25, 0xdb, - 0x8e, 0x0f, 0xb3, 0x62, 0xc7, 0x93, 0x8a, 0x4e, 0xf1, 0x30, 0x2b, 0x77, 0x47, 0x5f, 0x7f, 0x98, - 0x95, 0xc8, 0xe4, 0x0d, 0x18, 0x5b, 0x75, 0x79, 0x40, 0x03, 0xd9, 0x62, 0xee, 0xf7, 0x29, 0x81, - 0xea, 0xf6, 0x18, 0x62, 0xb2, 0xbb, 0x85, 0x3e, 0xf0, 0xd2, 0xb8, 0x12, 0xef, 0x16, 0xb1, 0xe9, - 0xa2, 0xab, 0x03, 0x75, 0x32, 0xe3, 0x3f, 0x1a, 0x06, 0xe3, 0x74, 0x65, 0x06, 0x79, 0x5f, 0xef, - 0xbb, 0xeb, 0x03, 0xab, 0x41, 0x06, 0xda, 0x72, 0x4b, 0xdd, 0x86, 0x43, 0xdb, 0x75, 0x3d, 0x1a, - 0x81, 0x80, 0xa9, 0x5b, 0xa0, 0xc4, 0xfb, 0x30, 0xce, 0x81, 0x0b, 0xff, 0x4d, 0x2e, 0x5a, 0x6a, - 0xb1, 0xa3, 0x31, 0xf3, 0x21, 0x8e, 0x46, 0x72, 0x1f, 0x0a, 0x2a, 0x44, 0x79, 0xa1, 0x45, 0xc9, - 0x45, 0x63, 0x14, 0xfb, 0xa8, 0x04, 0xa1, 0x7e, 0xbe, 0xe6, 0x06, 0x3f, 0x5f, 0x23, 0xf1, 0x1d, - 0xeb, 0x1f, 0x4a, 0x8a, 0xef, 0x71, 0x07, 0x60, 0x05, 0x5d, 0x46, 0x2f, 0xf0, 0xc5, 0xa1, 0x35, - 0xac, 0x47, 0x2f, 0x48, 0x39, 0xb8, 0x54, 0x74, 0x19, 0x80, 0x01, 0x7f, 0x2a, 0xfe, 0xc7, 0x61, - 0x00, 0x06, 0x4e, 0x9f, 0x16, 0x80, 0x21, 0x24, 0x61, 0x07, 0xa0, 0xd9, 0x6d, 0xf3, 0x08, 0xce, - 0xa3, 0xd1, 0x01, 0xe8, 0x75, 0xdb, 0x56, 0x3c, 0x8a, 0x73, 0x88, 0x68, 0xfc, 0xe6, 0x50, 0xba, - 0x70, 0x10, 0xea, 0xbb, 0xce, 0x22, 0x1c, 0x84, 0x44, 0x1f, 0xcf, 0x4c, 0xdd, 0x82, 0x59, 0x69, - 0x9f, 0x27, 0x0d, 0xbd, 0xb6, 0xcc, 0x55, 0x31, 0xc4, 0xa8, 0x37, 0x0a, 0x2d, 0xfb, 0xa4, 0xb1, - 0x98, 0xd5, 0xf5, 0x34, 0xbd, 0x51, 0x0a, 0xfd, 0xc2, 0x6f, 0x48, 0xb5, 0x98, 0x3a, 0x08, 0x5b, - 0x5b, 0xe1, 0x5c, 0x8e, 0x0d, 0x42, 0xb7, 0xab, 0x0d, 0xa3, 0x4e, 0xc2, 0xf7, 0x5e, 0xa9, 0x72, - 0x40, 0x26, 0x8a, 0xac, 0xa8, 0x28, 0x2a, 0x62, 0x5c, 0x62, 0x44, 0x64, 0x0f, 0x2e, 0x46, 0xa2, - 0xb4, 0x72, 0x53, 0x40, 0x8e, 0xbc, 0xc1, 0xd7, 0x4e, 0x8e, 0x8b, 0x2f, 0x2b, 0xa2, 0xb8, 0x7a, - 0xe1, 0x88, 0x71, 0xef, 0xcd, 0x8b, 0xed, 0xb7, 0x4b, 0x9e, 0xdd, 0xae, 0xef, 0x2b, 0x73, 0x1e, - 0xf7, 0xdb, 0x1d, 0x84, 0x26, 0x5c, 0xc8, 0x23, 0x64, 0xe3, 0xc7, 0xb2, 0x30, 0xc5, 0xcf, 0x6a, - 0xfe, 0x3a, 0xf7, 0xd4, 0xbe, 0x7c, 0xbe, 0xa5, 0xbd, 0x7c, 0xca, 0x68, 0x67, 0x6a, 0xd3, 0x06, - 0x7a, 0xf7, 0xdc, 0x07, 0x92, 0xa4, 0x21, 0x26, 0x4c, 0xa8, 0xd0, 0xfe, 0x4f, 0x9e, 0x37, 0xa3, - 0xc0, 0x78, 0x42, 0x54, 0xc2, 0x77, 0x67, 0xdf, 0xd4, 0x78, 0x18, 0x3f, 0x9a, 0x85, 0x49, 0xc5, - 0x4e, 0xe5, 0xa9, 0xed, 0xf8, 0xcf, 0x6b, 0x1d, 0x3f, 0x1f, 0xfa, 0xcf, 0x85, 0x2d, 0x1b, 0xa8, - 0xdf, 0xbb, 0x30, 0x93, 0x20, 0x89, 0x9b, 0xfb, 0x64, 0x06, 0x31, 0xf7, 0x79, 0x2d, 0x19, 0x65, - 0x8b, 0x07, 0xab, 0x0f, 0x63, 0xae, 0xa8, 0x61, 0xbd, 0x7e, 0x22, 0x0b, 0x73, 0xe2, 0x17, 0x86, - 0xa5, 0xe4, 0xc2, 0xea, 0x53, 0x3b, 0x16, 0x25, 0x6d, 0x2c, 0x8a, 0xfa, 0x58, 0x28, 0x0d, 0xec, - 0x3d, 0x24, 0xc6, 0x0f, 0x01, 0xcc, 0xf7, 0x22, 0x18, 0xd8, 0x4d, 0x3d, 0x72, 0x02, 0xcc, 0x0e, - 0xe0, 0x04, 0xb8, 0x0a, 0x05, 0xac, 0x4a, 0x04, 0x9e, 0xf3, 0xb7, 0xcc, 0xaa, 0xe8, 0x24, 0xd4, - 0x2f, 0xf0, 0xd8, 0xa1, 0x22, 0x10, 0x9e, 0x1f, 0xd3, 0x79, 0x24, 0x28, 0xc9, 0x2f, 0x65, 0x60, - 0x0a, 0x81, 0xcb, 0x8f, 0x68, 0x3b, 0x40, 0x66, 0x43, 0xc2, 0x67, 0x2d, 0x7c, 0x18, 0xad, 0x05, - 0x9e, 0xd3, 0xde, 0x13, 0x2f, 0xa3, 0x3b, 0xe2, 0x65, 0xf4, 0x6d, 0xfe, 0xa2, 0x7b, 0xbd, 0xee, - 0xb6, 0x6e, 0xec, 0x79, 0xf6, 0x23, 0x87, 0x9b, 0x60, 0xd9, 0xcd, 0x1b, 0x51, 0x8e, 0x95, 0x8e, - 0x13, 0xcb, 0x7e, 0x22, 0x58, 0xe1, 0xab, 0x33, 0xff, 0x50, 0x8a, 0xd5, 0xc6, 0x55, 0x33, 0xfa, - 0x17, 0x91, 0xef, 0x81, 0x0b, 0x3c, 0x1c, 0x14, 0xbb, 0xe1, 0x3b, 0xed, 0xae, 0xdb, 0xf5, 0x97, - 0xec, 0xfa, 0x01, 0x13, 0xf3, 0xb9, 0xdf, 0x2d, 0xb6, 0xbc, 0x1e, 0x16, 0x5a, 0x3b, 0xbc, 0x54, - 0x8b, 0x33, 0x90, 0xce, 0x80, 0xac, 0xc0, 0x0c, 0x2f, 0x2a, 0x75, 0x03, 0xb7, 0x56, 0xb7, 0x9b, - 0x4e, 0x7b, 0x0f, 0x65, 0x89, 0x3c, 0x17, 0x65, 0xec, 0x6e, 0xe0, 0x5a, 0x3e, 0x87, 0xab, 0x9a, - 0x9a, 0x04, 0x11, 0xa9, 0xc2, 0xb4, 0x49, 0xed, 0xc6, 0x9a, 0xfd, 0xb8, 0x6c, 0x77, 0xec, 0xba, - 0x13, 0xf0, 0xf8, 0x94, 0x39, 0x2e, 0xd0, 0x79, 0xd4, 0x6e, 0x58, 0x2d, 0xfb, 0xb1, 0x55, 0x17, - 0x85, 0xba, 0xca, 0x5e, 0xa3, 0x0b, 0x59, 0x39, 0xed, 0x90, 0xd5, 0x58, 0x9c, 0x95, 0xd3, 0xee, - 0xcd, 0x2a, 0xa2, 0x93, 0xac, 0x36, 0x6d, 0x6f, 0x8f, 0x06, 0xdc, 0x50, 0x1a, 0x2e, 0x67, 0xae, - 0x66, 0x14, 0x56, 0x01, 0x96, 0x59, 0x68, 0x34, 0x1d, 0x67, 0xa5, 0xd0, 0xb1, 0x99, 0xb7, 0xed, - 0x39, 0x01, 0x55, 0x5b, 0x38, 0x8e, 0x9f, 0x85, 0xfd, 0x8f, 0x26, 0xe6, 0xbd, 0x9a, 0x98, 0xa0, - 0x8c, 0xb8, 0x29, 0x8d, 0x9c, 0x48, 0x70, 0x4b, 0x6f, 0x65, 0x82, 0x32, 0xe4, 0xa6, 0xb6, 0x73, - 0x12, 0xdb, 0xa9, 0x70, 0xeb, 0xd1, 0xd0, 0x04, 0x25, 0x59, 0x67, 0x9d, 0x16, 0x30, 0xb9, 0xc9, - 0x6d, 0x0b, 0x0b, 0xee, 0x29, 0xfc, 0xb4, 0x97, 0x84, 0x19, 0x62, 0xc1, 0x93, 0xc5, 0x56, 0x8a, - 0x3d, 0x77, 0x9c, 0x98, 0xfc, 0x2d, 0x98, 0xde, 0xf2, 0xe9, 0x9d, 0xea, 0x46, 0x4d, 0x46, 0x8f, - 0x42, 0xe5, 0xe2, 0xd4, 0xe2, 0xcd, 0x53, 0x36, 0x9d, 0xeb, 0x2a, 0x0d, 0xa6, 0x2c, 0xe1, 0xe3, - 0xd6, 0xf5, 0xa9, 0xb5, 0xeb, 0x74, 0xfc, 0x30, 0x14, 0x9f, 0x3a, 0x6e, 0xb1, 0xaa, 0x8c, 0x15, - 0x98, 0x49, 0xb0, 0x21, 0x53, 0x00, 0x0c, 0x68, 0x6d, 0xad, 0xd7, 0x96, 0x37, 0x0b, 0xcf, 0x90, - 0x02, 0x4c, 0xe0, 0xef, 0xe5, 0xf5, 0xd2, 0xd2, 0xea, 0x72, 0xa5, 0x90, 0x21, 0x33, 0x30, 0x89, - 0x90, 0x4a, 0xb5, 0xc6, 0x41, 0x59, 0x1e, 0xb0, 0xde, 0x2c, 0xf0, 0xa5, 0x1b, 0xb0, 0x05, 0x80, - 0x67, 0x8a, 0xf1, 0xf7, 0xb3, 0x70, 0x51, 0x1e, 0x2b, 0x34, 0x60, 0x82, 0xa3, 0xd3, 0xde, 0x7b, - 0xca, 0x4f, 0x87, 0x3b, 0xda, 0xe9, 0xf0, 0x52, 0xec, 0xa4, 0x8e, 0xb5, 0xb2, 0xcf, 0x11, 0xf1, - 0x3b, 0x63, 0xf0, 0x7c, 0x5f, 0x2a, 0xf2, 0x45, 0x76, 0x9a, 0x3b, 0xb4, 0x1d, 0x54, 0x1b, 0x4d, - 0xba, 0xe9, 0xb4, 0xa8, 0xdb, 0x0d, 0x84, 0xc7, 0xc0, 0x8b, 0xa8, 0xcf, 0xc3, 0x42, 0xcb, 0x69, - 0x34, 0xa9, 0x15, 0xf0, 0x62, 0x6d, 0xba, 0x25, 0xa9, 0x19, 0xcb, 0x30, 0x7d, 0x52, 0xb5, 0x1d, - 0x50, 0xef, 0x11, 0x5a, 0x25, 0x86, 0x2c, 0x0f, 0x28, 0xed, 0x58, 0x36, 0x2b, 0xb5, 0x1c, 0x51, - 0xac, 0xb3, 0x4c, 0x50, 0x93, 0x3b, 0x0a, 0xcb, 0x32, 0xbb, 0xfd, 0xaf, 0xd9, 0x8f, 0x85, 0x99, - 0x94, 0x88, 0x46, 0x1a, 0xb2, 0xe4, 0xee, 0x7c, 0x2d, 0xfb, 0xb1, 0x99, 0x24, 0x21, 0x5f, 0x85, - 0x73, 0xe2, 0x00, 0x12, 0xa1, 0x4d, 0x64, 0x8b, 0x79, 0xe0, 0x94, 0x57, 0x4e, 0x8e, 0x8b, 0x17, - 0x64, 0x1c, 0x57, 0x19, 0xcc, 0x26, 0xad, 0xd5, 0xe9, 0x5c, 0xc8, 0x26, 0x3b, 0x90, 0x63, 0xdd, - 0xb1, 0x46, 0x7d, 0x5f, 0xfa, 0x6c, 0x8a, 0x9b, 0xb1, 0xda, 0x99, 0x56, 0x8b, 0x97, 0x9b, 0x3d, - 0x29, 0xc9, 0x0a, 0x4c, 0x6d, 0xd3, 0x1d, 0x75, 0x7c, 0x46, 0xc2, 0xad, 0xaa, 0x70, 0x48, 0x77, - 0x7a, 0x0f, 0x4e, 0x8c, 0x8e, 0x38, 0xf8, 0x3e, 0xf0, 0xf8, 0x68, 0xd5, 0xf1, 0x03, 0xda, 0xa6, - 0x1e, 0x86, 0xcc, 0x1a, 0xc5, 0xcd, 0x60, 0x3e, 0x92, 0x90, 0xf5, 0xf2, 0xa5, 0x17, 0x4e, 0x8e, - 0x8b, 0xcf, 0x73, 0xe7, 0xe7, 0xa6, 0x80, 0x5b, 0xb1, 0xe4, 0x43, 0x49, 0xae, 0xe4, 0xeb, 0x30, - 0x6d, 0xba, 0xdd, 0xc0, 0x69, 0xef, 0xd5, 0x02, 0xcf, 0x0e, 0xe8, 0x1e, 0x3f, 0x90, 0xa2, 0xd8, - 0x5c, 0xb1, 0x52, 0xf1, 0xb4, 0xcc, 0x81, 0x96, 0x2f, 0xa0, 0xda, 0x89, 0xa0, 0x13, 0x90, 0xaf, - 0xc1, 0x14, 0x0f, 0x6a, 0x11, 0x56, 0x30, 0xa6, 0x25, 0x4e, 0xd0, 0x0b, 0x1f, 0xde, 0x14, 0x56, - 0x2d, 0x08, 0x4d, 0xab, 0x20, 0xc6, 0x8d, 0x7c, 0x59, 0x74, 0xd6, 0x86, 0xd3, 0xde, 0x0b, 0xa7, - 0x31, 0x60, 0xcf, 0xbf, 0x1e, 0x75, 0x49, 0x87, 0x7d, 0xae, 0x9c, 0xc6, 0x3d, 0x4c, 0xf4, 0x92, - 0x7c, 0x48, 0x00, 0xcf, 0x97, 0x7c, 0xdf, 0xf1, 0x03, 0xe1, 0x57, 0xb3, 0xfc, 0x98, 0xd6, 0xbb, - 0x0c, 0x99, 0x5d, 0x6f, 0xa9, 0xc7, 0xed, 0xba, 0x87, 0x97, 0xae, 0x9f, 0x1c, 0x17, 0x5f, 0xb5, - 0x11, 0xd1, 0x12, 0xae, 0x38, 0x16, 0x95, 0xa8, 0xd6, 0x21, 0xc7, 0x55, 0xda, 0xd0, 0x9f, 0x29, - 0xf9, 0x1a, 0x9c, 0x2f, 0xdb, 0x3e, 0xad, 0xb6, 0x7d, 0xda, 0xf6, 0x9d, 0xc0, 0x79, 0x44, 0x45, - 0xa7, 0xe2, 0xe1, 0x97, 0xc7, 0x34, 0x4d, 0x46, 0xdd, 0xf6, 0xd9, 0xc2, 0x0c, 0x51, 0x2c, 0x31, - 0x28, 0x4a, 0x35, 0x3d, 0xb8, 0x10, 0x13, 0xa6, 0x6a, 0xb5, 0x95, 0x8a, 0x63, 0x87, 0xeb, 0x6a, - 0x12, 0xfb, 0xeb, 0x55, 0x54, 0xed, 0xf9, 0xfb, 0x56, 0xc3, 0xb1, 0xc3, 0x05, 0xd5, 0xa3, 0xb3, - 0x62, 0x1c, 0x8c, 0xe3, 0x0c, 0x14, 0xe2, 0x43, 0x49, 0xbe, 0x04, 0x63, 0xdc, 0xbe, 0x8d, 0xfa, - 0xfb, 0x22, 0xc6, 0x83, 0x34, 0x97, 0x0a, 0xe1, 0x3a, 0x91, 0x70, 0xa7, 0xe3, 0xd6, 0x73, 0x54, - 0xb5, 0x96, 0x41, 0x77, 0x3a, 0x49, 0x44, 0x1a, 0x30, 0xc1, 0x47, 0x8b, 0x62, 0x60, 0x3e, 0x61, - 0xe6, 0xfc, 0x82, 0xba, 0x3a, 0x44, 0x51, 0x8c, 0x3f, 0xbe, 0x1a, 0x8a, 0x39, 0xc1, 0x11, 0xb4, - 0x2a, 0x34, 0xae, 0x4b, 0x00, 0x79, 0x49, 0x68, 0x5c, 0x84, 0x0b, 0x3d, 0xbe, 0xd9, 0x78, 0x84, - 0x96, 0x04, 0x3d, 0x6a, 0x24, 0x5f, 0x82, 0x39, 0x24, 0x2c, 0xbb, 0xed, 0x36, 0xad, 0x07, 0xb8, - 0x1d, 0x49, 0xed, 0x7b, 0x8e, 0x5b, 0xba, 0xf0, 0xf6, 0xd6, 0x43, 0x04, 0x2b, 0xae, 0x84, 0x4f, - 0xe5, 0x60, 0xfc, 0x6c, 0x16, 0xe6, 0xc5, 0x0e, 0x67, 0xd2, 0xba, 0xeb, 0x35, 0x9e, 0xfe, 0x13, - 0x75, 0x59, 0x3b, 0x51, 0x5f, 0x0c, 0x83, 0xfa, 0xa4, 0x35, 0xb2, 0xcf, 0x81, 0xfa, 0xab, 0x19, - 0x78, 0xae, 0x1f, 0x11, 0xeb, 0x9d, 0x30, 0x10, 0xe1, 0x58, 0x22, 0xe0, 0x60, 0x07, 0x66, 0x71, - 0x40, 0xcb, 0xfb, 0xb4, 0x7e, 0xe0, 0xaf, 0xb8, 0x7e, 0x80, 0x9e, 0x16, 0xd9, 0x1e, 0x6f, 0xdd, - 0xaf, 0xa5, 0xbe, 0x75, 0x9f, 0xe7, 0xb3, 0xac, 0x8e, 0x3c, 0x78, 0xa8, 0xc4, 0x03, 0x7a, 0xe4, - 0x9b, 0x69, 0xac, 0xd1, 0x62, 0xbe, 0xd4, 0x0d, 0xf6, 0x37, 0x3c, 0xba, 0x4b, 0x3d, 0xda, 0xae, - 0xd3, 0x4f, 0x98, 0xc5, 0xbc, 0xde, 0xb8, 0x81, 0x34, 0x18, 0xbf, 0x37, 0x09, 0x73, 0x69, 0x64, - 0xac, 0x5f, 0x94, 0x4b, 0x73, 0x3c, 0x8b, 0xe4, 0xb7, 0x33, 0x30, 0x51, 0xa3, 0x75, 0xb7, 0xdd, - 0xb8, 0x83, 0x16, 0x45, 0xa2, 0x77, 0x6c, 0x2e, 0x34, 0x30, 0xb8, 0xb5, 0x1b, 0x33, 0x35, 0xfa, - 0xee, 0x71, 0xf1, 0x0b, 0x83, 0xdd, 0x55, 0xeb, 0x2e, 0x06, 0xe6, 0x09, 0x30, 0xcb, 0x41, 0x58, - 0x05, 0xff, 0x1a, 0x53, 0xab, 0x96, 0x2c, 0xc1, 0xa4, 0x58, 0xb0, 0xae, 0x1a, 0x89, 0x92, 0x47, - 0x3e, 0x92, 0x05, 0x09, 0xe5, 0xb5, 0x46, 0x42, 0x6e, 0x41, 0x6e, 0x6b, 0xf1, 0x8e, 0x18, 0x05, - 0x99, 0x29, 0x62, 0x6b, 0xf1, 0x0e, 0x2a, 0xc4, 0xd8, 0x25, 0x63, 0xb2, 0xbb, 0xa8, 0x99, 0xf9, - 0x6c, 0x2d, 0xde, 0x21, 0x7f, 0x1b, 0xce, 0x55, 0x1c, 0x5f, 0x54, 0xc1, 0xbd, 0x37, 0x1a, 0xe8, - 0xb3, 0x38, 0xd2, 0x63, 0xfe, 0x7e, 0x36, 0x75, 0xfe, 0xbe, 0xd0, 0x08, 0x99, 0x58, 0xdc, 0x35, - 0xa4, 0x11, 0x8f, 0xb8, 0x99, 0x5e, 0x0f, 0xf9, 0x00, 0xa6, 0x50, 0x9d, 0x8d, 0x0e, 0x2d, 0x18, - 0x2b, 0x7d, 0xb4, 0x47, 0xcd, 0x9f, 0x4e, 0xad, 0x79, 0x81, 0x47, 0xdc, 0x40, 0xb7, 0x18, 0x8c, - 0xab, 0xae, 0xdd, 0xfb, 0x35, 0xce, 0xe4, 0x1e, 0x4c, 0x0b, 0x01, 0xec, 0xc1, 0xee, 0xe6, 0x3e, - 0xad, 0xd8, 0x47, 0xc2, 0x42, 0x07, 0xef, 0x74, 0x42, 0x6a, 0xb3, 0xdc, 0x5d, 0x2b, 0xd8, 0xa7, - 0x56, 0xc3, 0xd6, 0x44, 0x95, 0x18, 0x21, 0xf9, 0x16, 0x8c, 0xaf, 0xba, 0x75, 0x26, 0x7b, 0xe3, - 0xde, 0xc0, 0x8d, 0x76, 0xde, 0xc7, 0x4c, 0x85, 0x1c, 0x1c, 0x13, 0xa8, 0xbe, 0x7b, 0x5c, 0x7c, - 0xeb, 0xac, 0xd3, 0x46, 0xa9, 0xc0, 0x54, 0x6b, 0x23, 0x65, 0xc8, 0x6f, 0xd3, 0x1d, 0xd6, 0xda, - 0x78, 0x16, 0x33, 0x09, 0x16, 0x36, 0x79, 0xe2, 0x97, 0x66, 0x93, 0x27, 0x60, 0xc4, 0x83, 0x19, - 0xec, 0x9f, 0x0d, 0xdb, 0xf7, 0x0f, 0x5d, 0xaf, 0x81, 0xe9, 0x2a, 0x7a, 0xd9, 0x03, 0x2d, 0xa6, - 0x76, 0xfe, 0x73, 0xbc, 0xf3, 0x3b, 0x0a, 0x07, 0x55, 0x84, 0x4c, 0xb0, 0x27, 0x5f, 0x87, 0x29, - 0x11, 0xbd, 0x60, 0xed, 0x4e, 0x09, 0x57, 0xc2, 0x84, 0xe6, 0xf9, 0xa9, 0x17, 0x72, 0x39, 0x55, - 0x04, 0x43, 0x90, 0x3a, 0x28, 0xab, 0xb5, 0x6b, 0xeb, 0x6a, 0x7f, 0x95, 0x84, 0x6c, 0xc0, 0x78, - 0x05, 0x73, 0xe9, 0xa2, 0x77, 0x9a, 0xb0, 0x0c, 0x0f, 0xd3, 0x30, 0x45, 0x25, 0x5c, 0x1b, 0x23, - 0xd2, 0xee, 0xa2, 0xaf, 0x9b, 0x6e, 0xad, 0x1b, 0x22, 0x92, 0xdb, 0x90, 0xab, 0x56, 0x36, 0x84, - 0x61, 0xf8, 0x4c, 0x18, 0x23, 0x64, 0x43, 0x26, 0xad, 0x41, 0x0b, 0x3a, 0xa7, 0xa1, 0x99, 0x95, - 0x57, 0x2b, 0x1b, 0x64, 0x17, 0x26, 0xb1, 0x03, 0x56, 0xa8, 0xcd, 0xfb, 0x76, 0xba, 0x47, 0xdf, - 0x5e, 0x4f, 0xed, 0xdb, 0x79, 0xde, 0xb7, 0xfb, 0x82, 0x5a, 0xcb, 0xc2, 0xa1, 0xb2, 0x65, 0x42, - 0xad, 0xc8, 0x0c, 0x24, 0x73, 0x47, 0x6c, 0xae, 0xa2, 0x85, 0x90, 0x10, 0x6a, 0x65, 0x22, 0xa1, - 0x30, 0x99, 0x45, 0x4f, 0xbf, 0x93, 0x24, 0x1f, 0xf2, 0x79, 0x18, 0x7a, 0x70, 0x10, 0xd8, 0xc2, - 0x04, 0x5c, 0xf6, 0x23, 0x03, 0xc9, 0xe6, 0xa3, 0x1e, 0xd2, 0x3d, 0xd0, 0x62, 0xb2, 0x21, 0x0d, - 0x1b, 0x8a, 0x15, 0xdb, 0x6b, 0x1c, 0xda, 0x1e, 0xba, 0x08, 0xcf, 0x6a, 0x2c, 0x94, 0x12, 0x3e, - 0x14, 0xfb, 0x02, 0x10, 0xf3, 0x1b, 0x56, 0x59, 0x90, 0xef, 0x81, 0x8b, 0xbe, 0xb3, 0xd7, 0xb6, - 0x83, 0xae, 0x47, 0x2d, 0xbb, 0xb9, 0xe7, 0x7a, 0x4e, 0xb0, 0xdf, 0xb2, 0xfc, 0xae, 0x13, 0xd0, - 0xf9, 0x39, 0x2d, 0x8f, 0x70, 0x4d, 0xe2, 0x95, 0x24, 0x5a, 0x8d, 0x61, 0x99, 0x17, 0xfc, 0xf4, - 0x02, 0xf2, 0x65, 0x98, 0x54, 0xb7, 0x64, 0x7f, 0xfe, 0xdc, 0xe5, 0xdc, 0xd5, 0xa9, 0xf0, 0xea, - 0x11, 0xdf, 0xc2, 0x65, 0xfc, 0x5d, 0xe5, 0x8c, 0xf0, 0xf5, 0xf8, 0xbb, 0x0a, 0xaf, 0x30, 0x33, - 0x1f, 0x29, 0xcc, 0x9a, 0x33, 0x62, 0xc6, 0x8a, 0x5e, 0x5e, 0xbb, 0x53, 0x32, 0x47, 0x37, 0xaa, - 0x0f, 0x6b, 0x4d, 0x37, 0x30, 0xfe, 0xb3, 0x0c, 0x6e, 0xe2, 0xe4, 0x55, 0x0c, 0x25, 0x15, 0xbe, - 0x9f, 0xa1, 0x06, 0xd7, 0xee, 0xc4, 0x82, 0xb7, 0x73, 0x14, 0xf2, 0x1a, 0x8c, 0xdc, 0xb1, 0xeb, - 0x32, 0x8c, 0x8d, 0x40, 0xde, 0x45, 0x88, 0xaa, 0xee, 0xe5, 0x38, 0x4c, 0xc2, 0xe4, 0x93, 0xbb, - 0x14, 0xa5, 0xa8, 0x2e, 0x97, 0xe4, 0x83, 0x3d, 0x4a, 0x98, 0x62, 0x51, 0x28, 0x39, 0xac, 0x63, - 0x76, 0xf1, 0xa9, 0x1c, 0x8c, 0x3f, 0xcf, 0x44, 0xbb, 0x12, 0x79, 0x05, 0x86, 0xcc, 0x8d, 0xf0, - 0xfb, 0xb9, 0xdb, 0x6f, 0xec, 0xf3, 0x11, 0x81, 0x7c, 0x19, 0xce, 0x29, 0x7c, 0x12, 0x46, 0xfa, - 0x2f, 0xa3, 0x57, 0xaa, 0xf2, 0x25, 0xe9, 0x96, 0xfa, 0xe9, 0x3c, 0x50, 0x9c, 0x8e, 0x0a, 0x2a, - 0xb4, 0xed, 0x70, 0xde, 0x4a, 0x63, 0x55, 0xde, 0x0d, 0x44, 0x88, 0x37, 0x36, 0x8d, 0x03, 0x77, - 0x4a, 0x35, 0x7e, 0x3b, 0xa3, 0xed, 0x36, 0x61, 0x4e, 0xdf, 0xcc, 0x29, 0x39, 0x7d, 0xdf, 0x04, - 0x28, 0x75, 0x03, 0x77, 0xb9, 0xed, 0xb9, 0x4d, 0xae, 0x47, 0x11, 0xf9, 0x0b, 0x50, 0x3b, 0x4c, - 0x11, 0xac, 0xf9, 0xce, 0x85, 0xc8, 0xa9, 0xfe, 0x0c, 0xb9, 0x0f, 0xeb, 0xcf, 0x60, 0xfc, 0x61, - 0x46, 0x5b, 0xa3, 0x4c, 0x4e, 0x14, 0x53, 0x51, 0xb5, 0x19, 0xeb, 0x38, 0x8f, 0x2c, 0xbf, 0xe9, - 0x6a, 0x01, 0x2b, 0x04, 0x1a, 0xf9, 0xff, 0x67, 0xe0, 0x3c, 0x77, 0x0c, 0x58, 0xef, 0xb6, 0x76, - 0xa8, 0xf7, 0xd0, 0x6e, 0x3a, 0x0d, 0xee, 0x7a, 0xcd, 0x45, 0xe0, 0xab, 0xc9, 0x05, 0x9f, 0x8e, - 0xcf, 0xaf, 0xaa, 0xdc, 0x51, 0xc1, 0x6a, 0x63, 0xa1, 0xf5, 0x28, 0x2c, 0x55, 0xaf, 0xaa, 0xe9, - 0xf4, 0xc6, 0xaf, 0x65, 0xe0, 0x85, 0x53, 0x6b, 0x21, 0x37, 0x60, 0x54, 0x26, 0x8e, 0xc8, 0x60, - 0xc7, 0xa3, 0xa5, 0x6d, 0x32, 0x69, 0x84, 0xc4, 0x22, 0x5f, 0x81, 0x73, 0x2a, 0xab, 0x4d, 0xcf, - 0x76, 0xd4, 0xf4, 0x0c, 0x29, 0x5f, 0x1d, 0x30, 0x94, 0xb8, 0xb4, 0x96, 0xce, 0xc4, 0xf8, 0x7f, - 0x33, 0x4a, 0x96, 0xef, 0xa7, 0x54, 0x8a, 0xbf, 0xad, 0x49, 0xf1, 0x32, 0x88, 0x67, 0xd8, 0x2a, - 0x56, 0x96, 0x7a, 0xf3, 0x9a, 0x56, 0x2c, 0xc6, 0x11, 0xf0, 0xc3, 0x59, 0x18, 0xdf, 0xf2, 0xa9, - 0xc7, 0x9f, 0x72, 0x3f, 0x59, 0xc1, 0x1a, 0xc3, 0x76, 0x0d, 0x14, 0x4e, 0xef, 0x4f, 0x33, 0xa8, - 0xe2, 0x57, 0x29, 0x58, 0x6f, 0x28, 0x99, 0xfd, 0xb0, 0x37, 0x30, 0xa7, 0x1f, 0x42, 0x79, 0x70, - 0xb1, 0x55, 0x3d, 0xc9, 0x27, 0x66, 0x7a, 0x5d, 0x25, 0x5f, 0x80, 0xe1, 0x2d, 0x54, 0x58, 0xea, - 0x61, 0x36, 0x42, 0xfe, 0x58, 0xc8, 0x37, 0xe9, 0xae, 0xaf, 0x47, 0x9e, 0xe3, 0x84, 0xa4, 0x06, - 0xa3, 0x65, 0x8f, 0x62, 0xce, 0xee, 0xa1, 0xc1, 0x9d, 0xc4, 0xeb, 0x9c, 0x24, 0xee, 0x24, 0x2e, - 0x38, 0x19, 0x3f, 0x93, 0x05, 0x12, 0xb5, 0x11, 0x13, 0x54, 0xf9, 0x4f, 0xed, 0xa0, 0xbf, 0xa7, - 0x0d, 0xfa, 0xf3, 0x89, 0x41, 0xe7, 0xcd, 0x1b, 0x68, 0xec, 0x7f, 0x37, 0x03, 0xe7, 0xd3, 0x09, - 0xc9, 0x8b, 0x30, 0xf2, 0x60, 0x73, 0x43, 0x46, 0x6a, 0x11, 0x4d, 0x71, 0x3b, 0xa8, 0x2d, 0x30, - 0x45, 0x11, 0x79, 0x1d, 0x46, 0xbe, 0x68, 0x96, 0xd9, 0x39, 0xa4, 0xa4, 0x40, 0xf8, 0x86, 0x67, - 0xd5, 0xf5, 0xa3, 0x48, 0x20, 0xa9, 0x63, 0x9b, 0x7b, 0x62, 0x63, 0xfb, 0x13, 0x59, 0x98, 0x2e, - 0xd5, 0xeb, 0xd4, 0xf7, 0x99, 0xb4, 0x43, 0xfd, 0xe0, 0xa9, 0x1d, 0xd8, 0xf4, 0x18, 0x2c, 0x5a, - 0xdb, 0x06, 0x1a, 0xd5, 0xdf, 0xcf, 0xc0, 0x39, 0x49, 0xf5, 0xc8, 0xa1, 0x87, 0x9b, 0xfb, 0x1e, - 0xf5, 0xf7, 0xdd, 0x66, 0x63, 0xe0, 0x3c, 0x2b, 0x4c, 0xd0, 0xc3, 0xe0, 0xe9, 0xea, 0xbb, 0xfe, - 0x2e, 0x42, 0x34, 0x41, 0x8f, 0x07, 0x58, 0xbf, 0x01, 0xa3, 0xa5, 0x4e, 0xc7, 0x73, 0x1f, 0xf1, - 0x65, 0x2f, 0x62, 0x4b, 0xda, 0x1c, 0xa4, 0xf9, 0xd8, 0x73, 0x10, 0xfb, 0x8c, 0x0a, 0x6d, 0xf3, - 0x60, 0x7e, 0x93, 0xfc, 0x33, 0x1a, 0xb4, 0xad, 0xca, 0xe2, 0x58, 0x6e, 0xd4, 0x80, 0x6c, 0x78, - 0x6e, 0xcb, 0x0d, 0x68, 0x83, 0xb7, 0x07, 0x43, 0x13, 0x9c, 0x1a, 0x54, 0x6b, 0xd3, 0x09, 0x9a, - 0x5a, 0x50, 0xad, 0x80, 0x01, 0x4c, 0x0e, 0x37, 0xfe, 0xef, 0x61, 0x98, 0x50, 0x7b, 0x87, 0x18, - 0x3c, 0x79, 0x82, 0xeb, 0xa9, 0xf1, 0x31, 0x6c, 0x84, 0x98, 0xa2, 0x24, 0x0a, 0x2e, 0x93, 0x3d, - 0x35, 0xb8, 0xcc, 0x36, 0x4c, 0x6e, 0x78, 0x2e, 0x06, 0xc1, 0xc4, 0xf7, 0x4a, 0xb1, 0x15, 0xce, - 0x2a, 0xf7, 0x4e, 0x36, 0x90, 0xf8, 0x22, 0x8a, 0x92, 0x7d, 0x47, 0x60, 0x63, 0x4a, 0x41, 0x4d, - 0xeb, 0xa2, 0xf1, 0xe1, 0xc6, 0x16, 0xb6, 0x2f, 0x22, 0xd9, 0x86, 0xc6, 0x16, 0x0c, 0xa2, 0x1b, - 0x5b, 0x30, 0x88, 0xba, 0xd6, 0x86, 0x9f, 0xd4, 0x5a, 0x23, 0x3f, 0x93, 0x81, 0xf1, 0x52, 0xbb, - 0x2d, 0x82, 0xd6, 0x9c, 0xe2, 0xaf, 0xff, 0x15, 0x61, 0x6f, 0xf1, 0xd6, 0x87, 0xb2, 0xb7, 0x40, - 0xb9, 0xc5, 0x47, 0x49, 0x35, 0xaa, 0x50, 0xbd, 0xad, 0x29, 0xdf, 0x41, 0xde, 0x82, 0x42, 0x38, - 0xc9, 0xab, 0xed, 0x06, 0x7d, 0x4c, 0x79, 0xf2, 0xb9, 0x49, 0x11, 0xc3, 0x5a, 0x95, 0x4c, 0xe3, - 0x88, 0x64, 0x13, 0xc0, 0x0e, 0x67, 0x57, 0x2c, 0x8b, 0x66, 0x72, 0xfa, 0x09, 0xe9, 0x19, 0x7f, - 0xe3, 0x93, 0x96, 0x2a, 0x3d, 0x47, 0x7c, 0x48, 0x0b, 0xa6, 0x79, 0x0a, 0xcb, 0x5a, 0x60, 0x7b, - 0x01, 0xa6, 0x6a, 0x80, 0x53, 0xc7, 0xe1, 0x15, 0xa1, 0x3f, 0x7b, 0x56, 0x24, 0xc6, 0xf4, 0x19, - 0xad, 0x95, 0x92, 0xb7, 0x21, 0xce, 0x9b, 0x47, 0x0c, 0x37, 0x2f, 0x24, 0xbf, 0x97, 0x4f, 0xfa, - 0x9f, 0xc8, 0xc0, 0x79, 0x75, 0xd2, 0xd7, 0xba, 0x3b, 0x22, 0x78, 0x28, 0xb9, 0x0e, 0x63, 0x62, - 0x4e, 0x86, 0x97, 0xa8, 0x64, 0xc6, 0x89, 0x08, 0x85, 0x2c, 0xb3, 0x69, 0xc8, 0x78, 0x08, 0xa9, - 0x7b, 0x36, 0xb6, 0x4f, 0xb1, 0xa2, 0x28, 0x3d, 0xb2, 0x87, 0xbf, 0xf5, 0xf9, 0xc9, 0x20, 0xc6, - 0xbb, 0x30, 0xa3, 0x8f, 0x44, 0x8d, 0x06, 0xe4, 0x1a, 0x8c, 0xca, 0xe1, 0xcb, 0xa4, 0x0f, 0x9f, - 0x2c, 0x37, 0xb6, 0x81, 0x24, 0xe8, 0x7d, 0x34, 0x8c, 0x62, 0xf7, 0x53, 0x6e, 0xb8, 0x27, 0x9f, - 0x25, 0x13, 0x88, 0x4b, 0xb3, 0xe2, 0xfb, 0xc6, 0x35, 0xc7, 0x04, 0x0c, 0xa4, 0xfa, 0x4f, 0xa6, - 0x61, 0x36, 0x65, 0xcf, 0x3d, 0x45, 0x26, 0x2a, 0xea, 0x1b, 0xc4, 0x58, 0x18, 0xee, 0x43, 0x6e, - 0x0b, 0xef, 0xc2, 0xf0, 0xa9, 0xdb, 0x01, 0x77, 0x4b, 0x89, 0xed, 0x02, 0x9c, 0xec, 0x63, 0x91, - 0x8b, 0xd4, 0x88, 0x3c, 0xc3, 0x4f, 0x2c, 0x22, 0xcf, 0x12, 0x4c, 0x8a, 0x56, 0x89, 0xed, 0x4a, - 0x31, 0x8f, 0xf6, 0x78, 0x81, 0x95, 0xd8, 0xb6, 0x74, 0x12, 0xce, 0xc3, 0x77, 0x9b, 0x8f, 0xa8, - 0xe0, 0x31, 0xaa, 0xf2, 0xc0, 0x82, 0x54, 0x1e, 0x0a, 0x09, 0xf9, 0x0f, 0x30, 0x7d, 0x1e, 0x42, - 0xd4, 0x3d, 0x2b, 0xdf, 0x6f, 0xcf, 0x6a, 0x3c, 0x99, 0x3d, 0xeb, 0x79, 0xf9, 0x8d, 0xe9, 0x7b, - 0x57, 0xca, 0x67, 0x91, 0x5f, 0xce, 0xc0, 0x0c, 0x0f, 0x0b, 0xa3, 0x7e, 0x6c, 0xdf, 0x50, 0x1f, - 0xf5, 0x27, 0xf3, 0xb1, 0xcf, 0x89, 0xb4, 0x51, 0xe9, 0xdf, 0x9a, 0xfc, 0x28, 0xf2, 0x3d, 0x00, - 0xe1, 0x8a, 0xe2, 0xc1, 0x64, 0xc7, 0x17, 0x9f, 0x4b, 0xd9, 0x05, 0x42, 0xa4, 0x28, 0xc5, 0x45, - 0x10, 0xd2, 0x69, 0x49, 0x13, 0x43, 0x28, 0xf9, 0xdb, 0x30, 0xc7, 0xd6, 0x4b, 0x08, 0x11, 0x41, - 0xac, 0xe6, 0xc7, 0xb1, 0x96, 0xcf, 0xf4, 0x96, 0x89, 0xae, 0xa7, 0x91, 0xf1, 0xd0, 0xc3, 0x51, - 0xfe, 0xea, 0x40, 0x8d, 0x77, 0x91, 0x5a, 0x11, 0xc6, 0x86, 0xc3, 0xaf, 0xe7, 0x69, 0x28, 0x7a, - 0xec, 0x6f, 0x17, 0xe5, 0x5a, 0xe0, 0xfb, 0x9b, 0xaf, 0x7b, 0x29, 0x23, 0x88, 0x7c, 0x11, 0x48, - 0x18, 0x4f, 0x85, 0xc3, 0xa8, 0x4c, 0x51, 0xc1, 0xd5, 0xcd, 0x51, 0x5c, 0x16, 0x4f, 0x16, 0xab, - 0x93, 0x24, 0x49, 0x4c, 0x28, 0xcc, 0x89, 0x46, 0x33, 0xa8, 0xcc, 0x6d, 0xe7, 0xcf, 0x4f, 0x69, - 0x21, 0xc2, 0xa2, 0x92, 0x28, 0xd1, 0xb5, 0x92, 0x20, 0x4f, 0x53, 0x39, 0xa5, 0xb1, 0x23, 0xb7, - 0x61, 0x0c, 0x5d, 0x85, 0x57, 0xa4, 0xb9, 0x97, 0x30, 0x3d, 0x41, 0xa7, 0x62, 0x6b, 0x5f, 0x37, - 0xda, 0x8a, 0x50, 0xd9, 0x75, 0xa0, 0xe2, 0x1d, 0x99, 0xdd, 0x36, 0x2a, 0x85, 0x85, 0xbe, 0xa3, - 0xe1, 0x1d, 0x59, 0x5e, 0x57, 0xf7, 0x25, 0x47, 0x24, 0xf2, 0x75, 0x18, 0x5f, 0xb3, 0x1f, 0x4b, - 0x9d, 0xb0, 0x50, 0xfc, 0xf6, 0xdb, 0x81, 0x0c, 0xd9, 0x9a, 0x96, 0xfd, 0xd8, 0x6a, 0x74, 0xe3, - 0x81, 0x8f, 0x71, 0x1b, 0x52, 0x59, 0x92, 0xaf, 0x02, 0x28, 0x9a, 0x6a, 0x72, 0x6a, 0x05, 0x2f, - 0xc8, 0xc0, 0x77, 0xa9, 0x1a, 0x6c, 0xe4, 0xaf, 0x30, 0x8c, 0x49, 0x0e, 0x73, 0x1f, 0x9f, 0xe4, - 0x70, 0xee, 0xe3, 0x93, 0x1c, 0xf8, 0x43, 0x09, 0x1f, 0x7b, 0xdc, 0xc1, 0x8f, 0xe6, 0xcf, 0x9f, - 0x5a, 0xdb, 0x73, 0xd2, 0x98, 0x10, 0x8f, 0x82, 0xa3, 0x58, 0x15, 0x31, 0x7e, 0x0b, 0x3b, 0x70, - 0xb1, 0xe7, 0xe2, 0x4c, 0x09, 0xac, 0x7c, 0x43, 0x0f, 0xac, 0x7c, 0xb1, 0xd7, 0x21, 0xee, 0xeb, - 0x79, 0x53, 0x66, 0x0b, 0x73, 0xbd, 0xe5, 0x9f, 0xef, 0x64, 0x63, 0x87, 0xba, 0xb8, 0xba, 0xf0, - 0x3c, 0x5b, 0xbd, 0xa4, 0x9e, 0x2c, 0xa6, 0x56, 0xe6, 0xc7, 0xbe, 0x12, 0x7b, 0x9e, 0x1d, 0xfb, - 0xaa, 0xd8, 0x80, 0x02, 0xc0, 0x47, 0x3d, 0xdf, 0xdf, 0x86, 0x29, 0x9e, 0x0d, 0xf5, 0x3e, 0x3d, - 0x3a, 0x74, 0xbd, 0x06, 0xcf, 0x20, 0x24, 0xa4, 0xfc, 0x44, 0x2a, 0xf3, 0x18, 0x2e, 0xa9, 0x48, - 0xff, 0xd6, 0x61, 0xac, 0xfd, 0x62, 0xea, 0x3e, 0xc9, 0x10, 0xfa, 0xb9, 0xbe, 0x92, 0x37, 0x42, - 0x51, 0x90, 0x7a, 0x6a, 0xf6, 0x14, 0x4f, 0x02, 0x53, 0x24, 0x42, 0xea, 0x19, 0xff, 0x2c, 0x07, - 0x84, 0xd7, 0x54, 0xb6, 0x3b, 0x36, 0x7a, 0x7f, 0x3b, 0x18, 0xcf, 0xa9, 0x20, 0x70, 0xec, 0x9d, - 0x26, 0x55, 0x83, 0xa1, 0x09, 0x03, 0xde, 0xb0, 0xcc, 0x8a, 0x5f, 0xa5, 0x12, 0x84, 0x3d, 0x36, - 0xd3, 0xec, 0x47, 0xd9, 0x4c, 0xbf, 0x0e, 0xcf, 0x96, 0x3a, 0x98, 0x56, 0x59, 0xd6, 0x72, 0xc7, - 0xf5, 0xe4, 0xd4, 0xd5, 0xfc, 0x0a, 0xed, 0x10, 0x2d, 0xf1, 0xa5, 0xfd, 0x58, 0x28, 0x92, 0x10, - 0x9b, 0x97, 0x9d, 0x40, 0x8d, 0x53, 0x21, 0x25, 0xa1, 0x0e, 0x96, 0xa4, 0x48, 0x42, 0x9c, 0x44, - 0xf2, 0x70, 0x3c, 0x29, 0x09, 0x61, 0xbe, 0xb0, 0x88, 0x87, 0xe3, 0xd1, 0x1e, 0xd2, 0x54, 0x48, - 0x42, 0xde, 0x86, 0xf1, 0x52, 0x37, 0x70, 0x05, 0x63, 0x61, 0x79, 0x1e, 0xd9, 0x88, 0x8b, 0x4f, - 0xd1, 0x2e, 0x57, 0x11, 0xba, 0xf1, 0x67, 0x39, 0xb8, 0x98, 0x1c, 0x5e, 0x51, 0x1a, 0xae, 0x8f, - 0xcc, 0x29, 0xeb, 0x23, 0x6d, 0x36, 0x64, 0xa3, 0x6c, 0x16, 0x4f, 0x62, 0x36, 0xf0, 0xec, 0xcc, - 0x1f, 0x72, 0x36, 0xd4, 0x60, 0x5c, 0x3d, 0x51, 0x87, 0x3e, 0xec, 0x89, 0xaa, 0x72, 0x21, 0xd7, - 0x60, 0x98, 0x87, 0xe7, 0x18, 0x8e, 0x1e, 0xa7, 0xe2, 0x91, 0x39, 0x38, 0x06, 0xf9, 0xff, 0xc1, - 0x65, 0xbe, 0x27, 0xc5, 0x1b, 0xbb, 0x74, 0x24, 0x39, 0x8a, 0x81, 0x5b, 0x3c, 0x39, 0x2e, 0x5e, - 0xe7, 0xca, 0x18, 0x2b, 0xd1, 0x6d, 0xd6, 0xce, 0x91, 0x25, 0xbf, 0x4c, 0xa9, 0xe4, 0x54, 0xde, - 0x46, 0x19, 0x2e, 0x8a, 0xd2, 0xc8, 0x31, 0x5c, 0x16, 0xb2, 0x41, 0x3e, 0x88, 0xf4, 0x69, 0x38, - 0xc8, 0x31, 0x55, 0x19, 0x96, 0x63, 0x5e, 0x67, 0x25, 0xe7, 0xee, 0xeb, 0x69, 0x7e, 0x3d, 0x3c, - 0x32, 0x38, 0x07, 0xeb, 0x2e, 0x3d, 0x52, 0x6b, 0x97, 0x4d, 0xd5, 0xda, 0x49, 0xb5, 0x4f, 0x2e, - 0x55, 0xed, 0x53, 0x81, 0xe9, 0x5a, 0x77, 0x47, 0xd6, 0x1d, 0xf7, 0x09, 0xf5, 0xbb, 0x3b, 0x69, - 0xbd, 0x12, 0x27, 0x31, 0x7e, 0x24, 0x0b, 0x13, 0x1b, 0xcd, 0xee, 0x9e, 0xd3, 0xae, 0xd8, 0x81, - 0xfd, 0xd4, 0x2a, 0x12, 0xdf, 0xd4, 0x14, 0x89, 0xa1, 0xfb, 0x5a, 0xd8, 0xb0, 0x81, 0xb4, 0x88, - 0x3f, 0x9d, 0x81, 0xe9, 0x88, 0x84, 0x1f, 0xd6, 0x2b, 0x30, 0xc4, 0x7e, 0x88, 0xeb, 0xf5, 0xe5, - 0x04, 0x63, 0x9e, 0xe8, 0x31, 0xfc, 0x4b, 0xa8, 0xf6, 0xf4, 0x2c, 0x6a, 0xc8, 0x61, 0xe1, 0xb3, - 0x30, 0x16, 0xb1, 0x3d, 0x4b, 0x82, 0xc7, 0x5f, 0xcf, 0x40, 0x21, 0xde, 0x12, 0x72, 0x1f, 0x46, - 0x19, 0x27, 0x87, 0xca, 0x9b, 0xff, 0x4b, 0x3d, 0xda, 0x7c, 0x5d, 0xa0, 0xf1, 0xcf, 0xc3, 0xce, - 0xa7, 0x1c, 0x62, 0x4a, 0x0e, 0x0b, 0x26, 0x4c, 0xa8, 0x58, 0x29, 0x5f, 0xf7, 0x9a, 0x2e, 0xa1, - 0x9c, 0x4f, 0xef, 0x07, 0x2d, 0x2d, 0xa5, 0xf6, 0xd5, 0x42, 0xf8, 0xb8, 0xa2, 0x4d, 0xae, 0xd4, - 0x55, 0x85, 0x93, 0x66, 0x31, 0xca, 0x89, 0xa0, 0xce, 0xb3, 0x94, 0x09, 0x1d, 0xe2, 0x91, 0xd7, - 0x60, 0x84, 0xd7, 0xa7, 0xa6, 0x67, 0xeb, 0x20, 0x44, 0x95, 0xc4, 0x39, 0x8e, 0xf1, 0x0f, 0x72, - 0x70, 0x3e, 0xfa, 0xbc, 0xad, 0x4e, 0xc3, 0x0e, 0xe8, 0x86, 0xed, 0xd9, 0x2d, 0xff, 0x94, 0x15, - 0x70, 0x35, 0xf1, 0x69, 0x98, 0xae, 0x4b, 0x7e, 0x9a, 0xf2, 0x41, 0x46, 0xec, 0x83, 0x50, 0xcb, - 0xca, 0x3f, 0x48, 0x7e, 0x06, 0xb9, 0x0f, 0xb9, 0x1a, 0x0d, 0xc4, 0xde, 0x7b, 0x25, 0xd1, 0xab, - 0xea, 0x77, 0x5d, 0xaf, 0xd1, 0x80, 0x0f, 0x22, 0x8f, 0x3d, 0xa5, 0x05, 0x00, 0x64, 0x5c, 0xc8, - 0x36, 0x8c, 0x2c, 0x3f, 0xee, 0xd0, 0x7a, 0x20, 0xd2, 0x93, 0x5e, 0xeb, 0xcf, 0x8f, 0xe3, 0x2a, - 0xd9, 0x49, 0x29, 0x02, 0xd4, 0xce, 0xe2, 0x28, 0x0b, 0xb7, 0x21, 0x2f, 0x2b, 0x3f, 0xcb, 0xcc, - 0x5d, 0x78, 0x13, 0xc6, 0x95, 0x4a, 0xce, 0x34, 0xe9, 0x7f, 0x81, 0xed, 0xab, 0x6e, 0x53, 0x66, - 0x34, 0x5d, 0x4e, 0xc8, 0x8a, 0x4a, 0xc6, 0x2b, 0x2e, 0x2b, 0x5a, 0x07, 0xa2, 0xa8, 0x8f, 0xd0, - 0x58, 0x85, 0xe9, 0xda, 0x81, 0xd3, 0x89, 0x82, 0xd1, 0x6a, 0x27, 0x32, 0x66, 0xd5, 0x11, 0xaa, - 0x81, 0xf8, 0x89, 0x1c, 0xa7, 0x33, 0xfe, 0x32, 0x03, 0x23, 0xec, 0xaf, 0x87, 0xb7, 0x9f, 0xd2, - 0x2d, 0xf3, 0x96, 0xb6, 0x65, 0xce, 0x28, 0xf1, 0xe0, 0x71, 0xe3, 0xb8, 0x7d, 0xca, 0x66, 0x79, - 0x2c, 0x06, 0x88, 0x23, 0x93, 0xbb, 0x30, 0x2a, 0x8c, 0x96, 0x84, 0x7d, 0xb9, 0x1a, 0x60, 0x5e, - 0x9a, 0x33, 0x85, 0x3a, 0x04, 0xb7, 0x13, 0x57, 0xba, 0x48, 0x6a, 0x26, 0xd7, 0xcb, 0xb0, 0xc0, - 0x5a, 0x1e, 0x6c, 0x17, 0x1d, 0x02, 0x79, 0x78, 0x74, 0x25, 0x73, 0x7d, 0x0f, 0xff, 0xfd, 0x92, - 0x78, 0x6f, 0xc9, 0xf5, 0x63, 0x72, 0x5e, 0xa6, 0x09, 0x4e, 0x7d, 0x8a, 0x69, 0xc1, 0xf9, 0x5a, - 0x6d, 0x05, 0x0d, 0x1c, 0x37, 0x5c, 0x2f, 0xb8, 0xe3, 0x7a, 0x87, 0x36, 0xda, 0x2f, 0xa3, 0x0e, - 0x51, 0xb1, 0x72, 0x48, 0x33, 0x3b, 0x7b, 0x25, 0xd5, 0xec, 0xac, 0x8f, 0x25, 0x84, 0xd1, 0x86, - 0x0b, 0xb5, 0xda, 0x0a, 0x0f, 0x4e, 0xfe, 0x57, 0x51, 0xdf, 0xaf, 0x67, 0x60, 0xa6, 0x56, 0x5b, - 0x89, 0x55, 0xb5, 0x2a, 0xa3, 0xa2, 0x67, 0xb4, 0xa7, 0xd6, 0xf4, 0x8e, 0xc0, 0x51, 0xc8, 0x70, - 0x09, 0xaf, 0xae, 0x05, 0xc0, 0xe4, 0x4c, 0xc8, 0x46, 0x18, 0x87, 0x3d, 0xab, 0xf9, 0x1c, 0xf4, - 0x68, 0x28, 0xea, 0xd0, 0x85, 0xc7, 0x1e, 0x2b, 0xd5, 0x75, 0xe8, 0x0c, 0x62, 0xfc, 0xd7, 0xe7, - 0x79, 0xa4, 0x77, 0x39, 0x5b, 0xde, 0x81, 0x09, 0x41, 0x8f, 0x86, 0xf9, 0xc2, 0xea, 0xe4, 0x22, - 0xdb, 0x20, 0x77, 0x39, 0x9c, 0x47, 0x00, 0xfe, 0xee, 0x71, 0x71, 0x88, 0x75, 0x8d, 0xa9, 0xa1, - 0x93, 0x07, 0x30, 0xb9, 0x66, 0x3f, 0x56, 0x14, 0x26, 0xdc, 0xed, 0xea, 0x1a, 0xdb, 0x55, 0x5a, - 0xf6, 0xe3, 0x01, 0xcc, 0xfa, 0x74, 0x7a, 0x72, 0x00, 0x53, 0x7a, 0x9b, 0xc4, 0x0c, 0x4c, 0x8e, - 0xd8, 0xcd, 0xd4, 0x11, 0xbb, 0xd8, 0x71, 0xbd, 0xc0, 0xda, 0x0d, 0xc9, 0xb5, 0xac, 0x06, 0x31, - 0xd6, 0xe4, 0x1d, 0x98, 0x51, 0xc2, 0x8c, 0xde, 0x71, 0xbd, 0x96, 0x2d, 0x2f, 0x5c, 0xf8, 0x8a, - 0x80, 0xd6, 0x4a, 0xbb, 0x08, 0x36, 0x93, 0x98, 0xe4, 0xcb, 0x69, 0xae, 0x6c, 0xc3, 0x91, 0x6d, - 0x63, 0x8a, 0x2b, 0x5b, 0x2f, 0xdb, 0xc6, 0xa4, 0x53, 0xdb, 0x5e, 0x3f, 0xdb, 0xe7, 0x3c, 0x6f, - 0xfd, 0x40, 0xb6, 0xcd, 0xe1, 0xc8, 0xf5, 0xb0, 0x71, 0x5e, 0x84, 0xdc, 0xd2, 0xc6, 0x1d, 0x7c, - 0xfb, 0x92, 0x66, 0x5a, 0xed, 0x7d, 0xbb, 0x5d, 0xc7, 0x8b, 0x90, 0xf0, 0x38, 0x50, 0x0f, 0xca, - 0xa5, 0x8d, 0x3b, 0xc4, 0x86, 0x59, 0xcc, 0x25, 0x17, 0x7c, 0xe9, 0xe6, 0x4d, 0x65, 0xa8, 0xf2, - 0xf8, 0x69, 0x37, 0xc4, 0xa7, 0x15, 0x31, 0x13, 0x5d, 0x60, 0x3d, 0xbe, 0x79, 0x33, 0x75, 0x40, - 0xc2, 0x0f, 0x4b, 0xe3, 0xc5, 0x0e, 0xac, 0x35, 0xfb, 0x71, 0xe4, 0x28, 0xe2, 0x0b, 0xa7, 0xe0, - 0xe7, 0xe5, 0xd4, 0x8a, 0x9c, 0x4c, 0xb4, 0x03, 0x4b, 0x27, 0x62, 0xf7, 0xd8, 0x68, 0x82, 0xf9, - 0xc2, 0x9d, 0x6a, 0x41, 0x2a, 0x04, 0xa5, 0xe7, 0xb8, 0x7a, 0x19, 0x53, 0xd0, 0xc9, 0x56, 0x78, - 0x1b, 0xe7, 0xb7, 0x59, 0x91, 0x9b, 0xf8, 0x86, 0x7a, 0x1b, 0xe7, 0x6a, 0x38, 0xad, 0x59, 0xd3, - 0xa1, 0x0a, 0x87, 0x7b, 0xce, 0x98, 0x3a, 0x97, 0xe4, 0x25, 0x7f, 0xe2, 0xec, 0x97, 0x7c, 0x0a, - 0x43, 0xab, 0x6e, 0xfd, 0x40, 0x04, 0x00, 0xfc, 0x22, 0xdb, 0x85, 0x9b, 0x6e, 0xfd, 0xe0, 0xc9, - 0xd9, 0x74, 0x23, 0x7b, 0xb2, 0xce, 0x3e, 0x95, 0xcd, 0x02, 0xd1, 0x27, 0xc2, 0x4e, 0x78, 0x2e, - 0xbc, 0xe5, 0x2a, 0x65, 0x5c, 0x1e, 0xe5, 0x93, 0x46, 0x76, 0xad, 0xa9, 0x93, 0x13, 0x0a, 0x85, - 0x0a, 0xf5, 0x0f, 0x02, 0xb7, 0x53, 0x6e, 0x3a, 0x9d, 0x1d, 0xd7, 0xf6, 0x64, 0xb8, 0xe8, 0x81, - 0xf7, 0xe4, 0x06, 0xa7, 0xb7, 0xea, 0x92, 0x81, 0x99, 0x60, 0x49, 0xbe, 0x0c, 0x53, 0x6c, 0x72, - 0x2f, 0x3f, 0x0e, 0x68, 0x9b, 0x8f, 0xfc, 0x0c, 0x4a, 0x74, 0x73, 0x4a, 0x7e, 0x94, 0xb0, 0x90, - 0xcf, 0x29, 0x5c, 0xec, 0x34, 0x24, 0xd0, 0x82, 0x27, 0x6a, 0xac, 0x48, 0x03, 0xe6, 0xd7, 0xec, - 0xc7, 0x4a, 0x46, 0x65, 0x65, 0x92, 0x12, 0x9c, 0x60, 0x57, 0x4f, 0x8e, 0x8b, 0x2f, 0xb1, 0x09, - 0x16, 0x45, 0x30, 0xef, 0x31, 0x5f, 0x7b, 0x72, 0x22, 0xdf, 0x82, 0x0b, 0xa2, 0x59, 0x15, 0xcc, - 0x4d, 0xe6, 0x7a, 0x47, 0xb5, 0x7d, 0x1b, 0x7d, 0xc4, 0x66, 0x7b, 0x74, 0xd8, 0x8d, 0xf4, 0x2d, - 0x51, 0x76, 0x58, 0x43, 0xf2, 0xb1, 0x7c, 0xce, 0xc8, 0xec, 0x55, 0x03, 0xf9, 0x00, 0xa6, 0xf8, - 0x83, 0xdf, 0x8a, 0xeb, 0x07, 0xa8, 0xac, 0x99, 0x3b, 0x9b, 0xe3, 0x03, 0x7f, 0x45, 0xe4, 0xce, - 0x42, 0x31, 0xe5, 0x4e, 0x8c, 0x33, 0x79, 0x0b, 0xc6, 0x37, 0x9c, 0x36, 0x0f, 0x6f, 0x5a, 0xdd, - 0x40, 0xc5, 0xb5, 0x38, 0x81, 0x3a, 0x4e, 0xdb, 0x92, 0x1a, 0x93, 0x4e, 0xb8, 0x5d, 0xa8, 0xd8, - 0x64, 0x1b, 0xc6, 0x6b, 0xb5, 0x95, 0x3b, 0x0e, 0x93, 0x4b, 0x3a, 0x52, 0x0f, 0x9d, 0xfc, 0xca, - 0x17, 0x53, 0xbf, 0x72, 0xd2, 0xf7, 0xf7, 0xad, 0x5d, 0xa7, 0x49, 0xad, 0xba, 0xdb, 0x39, 0x32, - 0x55, 0x4e, 0x29, 0xce, 0x00, 0x17, 0x9e, 0xb0, 0x33, 0x40, 0x15, 0xa6, 0x15, 0xf3, 0x5c, 0x34, - 0xcd, 0x9d, 0x8f, 0x62, 0x62, 0xa9, 0xc6, 0xff, 0x71, 0xf7, 0xd7, 0x38, 0x9d, 0xf4, 0x02, 0xb8, - 0x78, 0x56, 0x2f, 0x00, 0x07, 0x66, 0xf8, 0x60, 0x88, 0x79, 0x80, 0x23, 0xbd, 0xd0, 0xa3, 0x0f, - 0xaf, 0xa5, 0xf6, 0xe1, 0xac, 0x18, 0x69, 0x39, 0xc9, 0xf0, 0x81, 0x3b, 0xc9, 0x95, 0xec, 0x02, - 0x11, 0x40, 0x3b, 0xb0, 0x77, 0x6c, 0x9f, 0x62, 0x5d, 0xcf, 0xf6, 0xa8, 0xeb, 0xa5, 0xd4, 0xba, - 0xa6, 0x64, 0x5d, 0x3b, 0xbc, 0x9a, 0x14, 0x8e, 0xa4, 0x2d, 0xeb, 0x91, 0xf3, 0x0b, 0x3b, 0xf6, - 0x39, 0x4d, 0xc7, 0x9d, 0x44, 0xe0, 0xe1, 0xa5, 0xe2, 0x93, 0x36, 0xde, 0xef, 0x29, 0x9c, 0xc9, - 0x63, 0x38, 0x9f, 0xfc, 0x0a, 0xac, 0xf3, 0x79, 0xac, 0xf3, 0x79, 0xad, 0xce, 0x38, 0x12, 0x9f, - 0x37, 0x7a, 0xb3, 0xe2, 0xb5, 0xf6, 0xe0, 0x4f, 0x7e, 0x28, 0x03, 0x17, 0xd6, 0xee, 0x94, 0x30, - 0x63, 0xa9, 0xc3, 0xa3, 0xdd, 0x85, 0x6e, 0xc3, 0x97, 0xc4, 0x3b, 0x48, 0xfc, 0x3d, 0x46, 0x4a, - 0x1c, 0xb8, 0x55, 0x30, 0xd1, 0xfd, 0xc5, 0xd6, 0xae, 0xcd, 0x13, 0xa1, 0x0a, 0x16, 0x29, 0xbe, - 0xc5, 0x3f, 0xf7, 0x27, 0xc5, 0x8c, 0xd9, 0xab, 0x2a, 0xd2, 0x84, 0x05, 0xbd, 0x5b, 0xa4, 0x9f, - 0xc6, 0x3e, 0x6d, 0x36, 0xe7, 0x8b, 0x38, 0xa3, 0x5f, 0x3b, 0x39, 0x2e, 0x5e, 0x4d, 0xf4, 0x6e, - 0xe8, 0xfb, 0xc1, 0x30, 0x95, 0x06, 0xf7, 0xe1, 0x47, 0x5a, 0x29, 0x42, 0xf7, 0xfc, 0x65, 0x2d, - 0xbe, 0x50, 0xa2, 0x7c, 0xe9, 0x65, 0x21, 0x91, 0x3c, 0xcf, 0xd6, 0x7b, 0x4f, 0x01, 0xd1, 0x4c, - 0x72, 0xbe, 0x37, 0x94, 0x9f, 0x2c, 0x4c, 0xa5, 0x38, 0x45, 0x18, 0xbf, 0x93, 0x8d, 0x1d, 0x8c, - 0xa4, 0x0a, 0xa3, 0x62, 0xbe, 0xf7, 0xbc, 0x64, 0x3c, 0x9f, 0x3a, 0xab, 0x47, 0xc5, 0xd2, 0x31, - 0x25, 0x3d, 0x39, 0x64, 0xac, 0xb0, 0xd1, 0xe2, 0xc6, 0xfb, 0x55, 0x7e, 0xee, 0x21, 0x48, 0x3b, - 0xe1, 0x2b, 0x67, 0x77, 0xf6, 0xd3, 0x7d, 0x49, 0xf1, 0xa8, 0x97, 0xb5, 0x91, 0x03, 0x9e, 0xae, - 0x2a, 0x17, 0xfa, 0x8b, 0xe9, 0xb9, 0xa9, 0x9e, 0x58, 0x85, 0xac, 0x16, 0xe3, 0xb7, 0x33, 0x30, - 0xa9, 0x9d, 0xac, 0xe4, 0xb6, 0xe2, 0x0e, 0x19, 0x45, 0x08, 0xd0, 0x70, 0x70, 0xb3, 0x8d, 0x3b, - 0x4a, 0xde, 0x16, 0x9e, 0x0d, 0xd9, 0xde, 0x74, 0xb8, 0xd8, 0xe2, 0xde, 0xb1, 0xfd, 0xf5, 0xc3, - 0x61, 0xae, 0xcd, 0xa1, 0x1e, 0xb9, 0x36, 0x7f, 0xf3, 0x12, 0x4c, 0xe9, 0x37, 0x62, 0xf2, 0x1a, - 0x8c, 0xa0, 0x6e, 0x5e, 0xaa, 0x57, 0x50, 0x2d, 0x84, 0xea, 0x7b, 0xcd, 0xdd, 0x85, 0xe3, 0x90, - 0x97, 0x01, 0x42, 0x13, 0x73, 0xf9, 0x32, 0x35, 0x7c, 0x72, 0x5c, 0xcc, 0xbc, 0x6e, 0x2a, 0x05, - 0xe4, 0x6b, 0x00, 0xeb, 0x6e, 0x83, 0x86, 0x09, 0x94, 0xfb, 0xd8, 0x77, 0xbc, 0x92, 0x48, 0xe5, - 0x72, 0xae, 0xed, 0x36, 0x68, 0x32, 0x6f, 0x8b, 0xc2, 0x91, 0x7c, 0x1e, 0x86, 0xcd, 0x6e, 0x93, - 0xca, 0x17, 0x8c, 0x71, 0x79, 0xc2, 0x75, 0x9b, 0x34, 0xd2, 0x13, 0x78, 0xdd, 0xb8, 0xe9, 0x22, - 0x03, 0x90, 0xf7, 0x78, 0x8a, 0x17, 0x11, 0x87, 0x74, 0x38, 0x7a, 0xab, 0x53, 0x24, 0x9f, 0x44, - 0x24, 0x52, 0x85, 0x84, 0x3c, 0x80, 0x51, 0xf5, 0x91, 0x49, 0xf1, 0xab, 0x57, 0x1f, 0x22, 0x15, - 0xa5, 0x83, 0xc8, 0xbc, 0x1c, 0x7f, 0x7f, 0x92, 0x5c, 0xc8, 0xdb, 0x30, 0xc6, 0xd8, 0xb3, 0x9d, - 0xc3, 0x17, 0xb7, 0x1a, 0x7c, 0x91, 0x53, 0x3e, 0x88, 0xed, 0x3e, 0x5a, 0xb4, 0xd0, 0x90, 0x80, - 0x7c, 0x19, 0x73, 0xe5, 0x8a, 0xae, 0xee, 0x6b, 0xf7, 0x73, 0x25, 0xd1, 0xd5, 0x98, 0x3c, 0x37, - 0xd1, 0xd3, 0x11, 0x3f, 0xb2, 0x17, 0x86, 0x75, 0x1b, 0x24, 0x2d, 0xcf, 0xab, 0x89, 0x0a, 0xe6, - 0x65, 0xa4, 0xb2, 0x64, 0x22, 0x6c, 0x8d, 0x2f, 0xe9, 0x40, 0x21, 0x12, 0x2a, 0x45, 0x5d, 0xd0, - 0xaf, 0xae, 0xd7, 0x13, 0x75, 0xa9, 0x03, 0x98, 0xa8, 0x2e, 0xc1, 0x9d, 0x34, 0x60, 0x4a, 0x1e, - 0x50, 0xa2, 0xbe, 0xf1, 0x7e, 0xf5, 0xbd, 0x9c, 0xa8, 0x6f, 0xb6, 0xb1, 0x93, 0xac, 0x27, 0xc6, - 0x93, 0xbc, 0x0d, 0x93, 0x12, 0xc2, 0xd3, 0x52, 0x4f, 0x44, 0x79, 0x7d, 0x1b, 0x3b, 0x89, 0x64, - 0xd4, 0x3a, 0xb2, 0x4a, 0xcd, 0x67, 0xc7, 0xa4, 0x46, 0x1d, 0x9f, 0x15, 0x3a, 0x32, 0x79, 0x1f, - 0xc6, 0xab, 0x2d, 0xd6, 0x10, 0xb7, 0x6d, 0x07, 0x54, 0x78, 0x5c, 0x4a, 0x1b, 0x26, 0xa5, 0x44, - 0x99, 0xaa, 0x3c, 0xe1, 0x76, 0x54, 0xa4, 0x25, 0xdc, 0x8e, 0xc0, 0xac, 0xf3, 0xf8, 0xab, 0xa2, - 0x98, 0xc3, 0xd2, 0x1b, 0xf3, 0xf9, 0x14, 0x3b, 0x22, 0x85, 0xbd, 0x88, 0x39, 0xc9, 0xa0, 0xf2, - 0x55, 0x2f, 0x16, 0xef, 0x57, 0xe5, 0x49, 0xde, 0x81, 0x71, 0x91, 0xb1, 0xac, 0x64, 0xae, 0xfb, - 0xf3, 0x05, 0x6c, 0x3c, 0x46, 0x91, 0x90, 0xc9, 0xcd, 0x2c, 0xdb, 0x8b, 0x19, 0xcc, 0x46, 0xf8, - 0xe4, 0x4b, 0x30, 0xb7, 0xed, 0xb4, 0x1b, 0xee, 0xa1, 0x2f, 0x8e, 0x29, 0xb1, 0xd1, 0xcd, 0x44, - 0xee, 0x6a, 0x87, 0xbc, 0x3c, 0x94, 0x05, 0x13, 0x1b, 0x5f, 0x2a, 0x07, 0xf2, 0xbd, 0x09, 0xce, - 0x7c, 0x06, 0x91, 0x7e, 0x33, 0x68, 0x31, 0x31, 0x83, 0x92, 0xd5, 0xc7, 0xa7, 0x53, 0x6a, 0x35, - 0xc4, 0x05, 0xa2, 0x9f, 0xef, 0xf7, 0x5c, 0xa7, 0x3d, 0x3f, 0x8b, 0x7b, 0xe1, 0xb3, 0xf1, 0xb8, - 0x0d, 0x88, 0x27, 0x12, 0x97, 0x1b, 0x27, 0xc7, 0xc5, 0x4b, 0x71, 0x99, 0xff, 0x03, 0x57, 0x7b, - 0x2e, 0x49, 0x61, 0x4d, 0xde, 0x87, 0x09, 0xf6, 0x7f, 0xa8, 0x94, 0x98, 0xd3, 0x2c, 0x4f, 0x15, - 0x4c, 0x51, 0x0f, 0x8e, 0x11, 0xa6, 0x54, 0x4b, 0xd1, 0x57, 0x68, 0xac, 0xc8, 0x9b, 0x00, 0x4c, - 0x6c, 0x12, 0xdb, 0xf1, 0xb9, 0x28, 0xbc, 0x32, 0x4a, 0x5d, 0xc9, 0x8d, 0x38, 0x42, 0x26, 0x6f, - 0xc3, 0x38, 0xfb, 0x55, 0xeb, 0x36, 0x5c, 0xb6, 0x36, 0xce, 0x23, 0x2d, 0x77, 0x7e, 0x65, 0xb4, - 0x3e, 0x87, 0x6b, 0xce, 0xaf, 0x11, 0x3a, 0x59, 0x81, 0x69, 0x0c, 0x83, 0x2d, 0x02, 0xb0, 0x3a, - 0xd4, 0x9f, 0xbf, 0xa0, 0x58, 0x43, 0xb0, 0x22, 0xcb, 0x09, 0xcb, 0xd4, 0xbb, 0x4c, 0x8c, 0x8c, - 0xf8, 0x30, 0x9b, 0x7c, 0x4e, 0xf6, 0xe7, 0xe7, 0xb1, 0x93, 0xa4, 0x04, 0x9f, 0xc4, 0xe0, 0xfb, - 0x31, 0x1b, 0x11, 0x65, 0xe3, 0x92, 0x8f, 0x4a, 0x6a, 0x85, 0x69, 0xdc, 0x89, 0x09, 0xe4, 0x6e, - 0x79, 0x23, 0x1e, 0x27, 0xfa, 0x22, 0xb6, 0x00, 0x87, 0x79, 0xaf, 0x1e, 0x65, 0x2a, 0x4f, 0x89, - 0x15, 0x9d, 0x42, 0x4d, 0xbe, 0x09, 0xe7, 0xe4, 0x0e, 0x22, 0x8a, 0xc4, 0xbc, 0x5e, 0x38, 0xe3, - 0x4e, 0xdc, 0xd8, 0x09, 0xab, 0x4e, 0x4c, 0xe9, 0xf4, 0x2a, 0x88, 0x0d, 0xe3, 0x38, 0xac, 0xa2, - 0xc6, 0x67, 0xfb, 0xd5, 0x78, 0x35, 0x51, 0xe3, 0x79, 0x9c, 0x28, 0xc9, 0xca, 0x54, 0x9e, 0x64, - 0x09, 0x26, 0xc5, 0x3a, 0x12, 0xb3, 0xed, 0x39, 0xec, 0x2d, 0x54, 0x62, 0xc9, 0x15, 0x98, 0x98, - 0x70, 0x3a, 0x89, 0xba, 0x23, 0xf3, 0xc7, 0xa4, 0xe7, 0xb5, 0x1d, 0x39, 0xfe, 0x86, 0xa4, 0x23, - 0xb3, 0x1d, 0x29, 0x92, 0x62, 0x96, 0x1f, 0x77, 0x3c, 0xa1, 0xa2, 0xba, 0x14, 0x65, 0x5e, 0x52, - 0x84, 0x1f, 0x8b, 0x86, 0x18, 0xea, 0x96, 0x90, 0xc6, 0x81, 0x6c, 0xc1, 0x6c, 0x78, 0x6a, 0x2b, - 0x8c, 0x8b, 0x51, 0x24, 0xe2, 0xe8, 0xa8, 0x4f, 0xe7, 0x9b, 0x46, 0x4f, 0x6c, 0xb8, 0xa0, 0x9d, - 0xd3, 0x0a, 0xeb, 0xcb, 0xc8, 0x1a, 0x33, 0xe3, 0xeb, 0x87, 0x7c, 0x3a, 0xfb, 0x5e, 0x7c, 0xc8, - 0x07, 0xb0, 0x10, 0x3f, 0x9b, 0x95, 0x5a, 0x5e, 0xc0, 0x5a, 0x5e, 0x3d, 0x39, 0x2e, 0x5e, 0x49, - 0x1c, 0xef, 0xe9, 0x15, 0xf5, 0xe1, 0x46, 0xbe, 0x06, 0xf3, 0xfa, 0xf9, 0xac, 0xd4, 0x64, 0x60, - 0x4d, 0xb8, 0x74, 0xc2, 0x83, 0x3d, 0xbd, 0x86, 0x9e, 0x3c, 0x48, 0x00, 0xc5, 0xd4, 0xd9, 0xad, - 0x54, 0xf3, 0x62, 0xd4, 0xa0, 0xc4, 0x2a, 0x49, 0xaf, 0xee, 0x34, 0x96, 0xe4, 0x10, 0x2e, 0xa5, - 0x1d, 0x13, 0x4a, 0xa5, 0x2f, 0x85, 0x4a, 0xe0, 0x4f, 0xa5, 0x1f, 0x39, 0xe9, 0x35, 0x9f, 0xc2, - 0x96, 0x7c, 0x19, 0xce, 0x29, 0xeb, 0x4b, 0xa9, 0xef, 0x65, 0xac, 0x0f, 0x9d, 0xcd, 0xd5, 0x85, - 0x99, 0x5e, 0x4b, 0x3a, 0x0f, 0xd2, 0x82, 0x59, 0xd9, 0x70, 0xd4, 0xb6, 0x8b, 0xa3, 0xe7, 0x8a, - 0xb6, 0xab, 0x26, 0x31, 0x96, 0x2e, 0x8b, 0x5d, 0x75, 0xbe, 0xb1, 0x63, 0x75, 0x22, 0x42, 0x75, - 0xa6, 0xa7, 0xf0, 0x25, 0x2b, 0x30, 0x52, 0xdb, 0xa8, 0xde, 0xb9, 0xb3, 0x3c, 0xff, 0x0a, 0xd6, - 0x20, 0x3d, 0xd3, 0x38, 0x50, 0xbb, 0x34, 0x09, 0x73, 0xc5, 0x8e, 0xb3, 0xbb, 0xab, 0x3d, 0x58, - 0x71, 0x54, 0xf2, 0xbd, 0x68, 0x28, 0xc8, 0x76, 0xd4, 0x92, 0xef, 0x3b, 0x7b, 0x18, 0xd9, 0xda, - 0x9f, 0x7f, 0x55, 0x7b, 0xef, 0x97, 0x51, 0xbf, 0xcb, 0x98, 0x14, 0x2d, 0x81, 0xce, 0xa5, 0x4d, - 0x76, 0xff, 0x17, 0x3b, 0xb7, 0x65, 0x47, 0xac, 0xd4, 0x4d, 0x3c, 0x59, 0x11, 0xf9, 0xc1, 0x0c, - 0x9c, 0xdf, 0x76, 0xbd, 0x83, 0xa6, 0x6b, 0x37, 0x64, 0x35, 0x62, 0x53, 0x7d, 0xad, 0xdf, 0xa6, - 0xfa, 0x99, 0xc4, 0xa6, 0x6a, 0x1c, 0x0a, 0x36, 0x56, 0x18, 0xc5, 0x3c, 0xb1, 0xc1, 0xf6, 0xa8, - 0x8a, 0x7c, 0x2f, 0x5c, 0x4e, 0x2f, 0x51, 0x66, 0xc9, 0xeb, 0x38, 0x4b, 0x6e, 0x9e, 0x1c, 0x17, - 0x5f, 0xef, 0x55, 0x53, 0xfa, 0x8c, 0x39, 0x95, 0xf5, 0xbd, 0xa1, 0xfc, 0xd5, 0xc2, 0xb5, 0x7b, - 0x43, 0xf9, 0x6b, 0x85, 0x57, 0xcd, 0xe7, 0x6a, 0xa5, 0xb5, 0xd5, 0x6a, 0x43, 0x9e, 0x76, 0x32, - 0xd0, 0x3a, 0xa7, 0x31, 0xaf, 0xf4, 0x2b, 0x8d, 0x38, 0x1a, 0x7f, 0x2f, 0x03, 0xc5, 0x53, 0x46, - 0x8d, 0x1d, 0x30, 0xd1, 0x94, 0xaa, 0xd1, 0x40, 0x0d, 0xd7, 0x1e, 0x4d, 0x45, 0x4b, 0xb7, 0xe3, - 0xd0, 0x49, 0xd0, 0xcf, 0x50, 0xe4, 0x08, 0x51, 0xdc, 0x4d, 0x93, 0xb9, 0x41, 0x24, 0x96, 0xf1, - 0x0b, 0x19, 0x98, 0x4d, 0x99, 0xa4, 0xe4, 0x0a, 0x0c, 0x61, 0xd2, 0x2f, 0xc5, 0xf0, 0x26, 0x96, - 0xec, 0x0b, 0xcb, 0xc9, 0xa7, 0x61, 0xb4, 0xb2, 0x5e, 0xab, 0x95, 0xd6, 0xe5, 0x7d, 0x9e, 0x9f, - 0x65, 0x6d, 0xdf, 0xf2, 0x6d, 0xfd, 0xbd, 0x5e, 0xa0, 0x91, 0xd7, 0x61, 0xa4, 0xba, 0x81, 0x04, - 0xdc, 0x7c, 0x14, 0xbf, 0xd0, 0xe9, 0xc4, 0xf1, 0x05, 0x92, 0xf1, 0x63, 0x19, 0x20, 0xc9, 0x15, - 0x47, 0x6e, 0xc2, 0xb8, 0xba, 0xae, 0xb9, 0xf6, 0x01, 0x1f, 0x31, 0x95, 0x55, 0x6b, 0xaa, 0x38, - 0xa4, 0x02, 0xc3, 0x98, 0xae, 0x35, 0x34, 0x14, 0x48, 0x9d, 0xc8, 0x17, 0x12, 0x13, 0x79, 0x18, - 0x93, 0xc1, 0x9a, 0x9c, 0xd8, 0xf8, 0xfd, 0x0c, 0x90, 0x74, 0xf3, 0xbf, 0x81, 0x0c, 0x95, 0xde, - 0x50, 0x02, 0x0c, 0xa8, 0x69, 0x7d, 0xc2, 0x9c, 0x6c, 0xea, 0x4d, 0x3a, 0x0a, 0x45, 0x70, 0x45, - 0xd3, 0xdc, 0xf4, 0xf6, 0x4a, 0xbd, 0x06, 0xc3, 0x0f, 0xa9, 0xb7, 0x23, 0x2d, 0xa3, 0xd1, 0x9a, - 0xf2, 0x11, 0x03, 0xa8, 0x9a, 0x0c, 0xc4, 0x30, 0xfe, 0x2c, 0x03, 0x73, 0x69, 0x62, 0xfe, 0x29, - 0xce, 0xa3, 0x46, 0xcc, 0xef, 0x15, 0x8d, 0x94, 0xb8, 0xa9, 0x65, 0xe8, 0xed, 0x5a, 0x84, 0x61, - 0xd6, 0x58, 0x39, 0xc2, 0xa8, 0x49, 0x62, 0xbd, 0xe1, 0x9b, 0x1c, 0xce, 0x10, 0x78, 0x28, 0xbd, - 0x21, 0x8c, 0xc2, 0x88, 0x08, 0x38, 0x1f, 0x4d, 0x0e, 0x67, 0x08, 0x6b, 0x6e, 0x83, 0x4a, 0x0d, - 0x0b, 0x22, 0xb4, 0x18, 0xc0, 0xe4, 0x70, 0x72, 0x05, 0x46, 0x1f, 0xb4, 0x57, 0xa9, 0xfd, 0x48, - 0xa6, 0x96, 0x40, 0xa3, 0x2a, 0xb7, 0x6d, 0x35, 0x19, 0xcc, 0x94, 0x85, 0xc6, 0x4f, 0x67, 0x60, - 0x26, 0x71, 0xc3, 0x38, 0xdd, 0x3f, 0xb6, 0xbf, 0xa3, 0xda, 0x20, 0xed, 0xe3, 0x9f, 0x3f, 0x94, - 0xfe, 0xf9, 0xc6, 0x7f, 0x3b, 0x02, 0x17, 0x7a, 0x28, 0x7c, 0x22, 0x47, 0xda, 0xcc, 0xa9, 0x8e, - 0xb4, 0x5f, 0x81, 0xc9, 0x72, 0xd3, 0x76, 0x5a, 0xfe, 0xa6, 0x1b, 0x7d, 0x71, 0xe4, 0x8f, 0x83, - 0x65, 0xc2, 0x95, 0x20, 0x74, 0xdc, 0xb8, 0x58, 0x47, 0x0a, 0x2b, 0x70, 0x93, 0xf2, 0xa6, 0xc6, - 0x2c, 0xe1, 0xca, 0x9a, 0xfb, 0x6b, 0xe2, 0xca, 0xaa, 0x3b, 0x57, 0x0d, 0x3d, 0x51, 0xe7, 0xaa, - 0x74, 0xb3, 0xe9, 0xe1, 0x8f, 0x62, 0x44, 0x5f, 0x86, 0x49, 0x6e, 0x55, 0x56, 0xf2, 0xf9, 0x20, - 0x8d, 0x24, 0x2c, 0xd1, 0x6c, 0x3f, 0x39, 0x16, 0x1a, 0x0d, 0x59, 0xd1, 0x1d, 0x81, 0x46, 0xf1, - 0xd9, 0xf5, 0x4a, 0x6f, 0x47, 0x1f, 0xcd, 0xdc, 0x42, 0x73, 0xf8, 0xf9, 0x16, 0xcc, 0xa5, 0xdd, - 0x18, 0xe7, 0xf3, 0x9a, 0xc1, 0x6a, 0x4f, 0x43, 0xe7, 0xc1, 0xef, 0x9d, 0x07, 0xa9, 0xf7, 0x4e, - 0xe9, 0xa0, 0x3d, 0xa6, 0x45, 0x5e, 0xee, 0xb1, 0x16, 0x38, 0x6e, 0x7f, 0x37, 0x6e, 0xe3, 0x2b, - 0xf0, 0x7c, 0x5f, 0x72, 0xf2, 0x96, 0x16, 0x08, 0xe8, 0x95, 0x64, 0x20, 0xa0, 0xef, 0x1e, 0x17, - 0x67, 0x34, 0xe7, 0xca, 0xb5, 0x50, 0x67, 0x6e, 0xfc, 0x74, 0x56, 0x77, 0x0b, 0xfe, 0xeb, 0xb8, - 0x50, 0xaf, 0xc1, 0xf0, 0xf6, 0x3e, 0xf5, 0xe4, 0xf1, 0x80, 0x1f, 0x72, 0xc8, 0x00, 0xea, 0x87, - 0x20, 0x06, 0xb9, 0x03, 0x53, 0x1b, 0x7c, 0xe2, 0xca, 0xd9, 0x38, 0x14, 0xa9, 0x2d, 0x3a, 0x42, - 0xb9, 0x96, 0x32, 0x1d, 0x63, 0x54, 0xc6, 0xdd, 0x58, 0xa7, 0x8b, 0x30, 0x46, 0xdc, 0xb9, 0x88, - 0x0b, 0x10, 0x53, 0x91, 0xc3, 0x56, 0xb4, 0xd9, 0x9a, 0x31, 0xa8, 0xb1, 0x0b, 0x97, 0xfa, 0x32, - 0x62, 0xe7, 0x36, 0x74, 0xc2, 0x5f, 0x31, 0xe3, 0xe5, 0xbe, 0xa4, 0xa6, 0x42, 0x67, 0x7c, 0x0b, - 0x26, 0xd4, 0x5e, 0xc6, 0x23, 0x88, 0xfd, 0x16, 0xb3, 0x82, 0x1f, 0x41, 0x0c, 0x60, 0x72, 0x78, - 0xf4, 0x1c, 0x92, 0x4d, 0x7f, 0x0e, 0x89, 0x86, 0x3f, 0x77, 0xda, 0xf0, 0xb3, 0xca, 0x71, 0x87, - 0x53, 0x2a, 0xc7, 0xdf, 0x6a, 0xe5, 0x18, 0xa7, 0xc8, 0xe4, 0xf0, 0x27, 0x5a, 0xf9, 0xef, 0xc9, - 0x5c, 0x64, 0xe8, 0xbb, 0x24, 0x97, 0x7b, 0x26, 0x4a, 0x28, 0x96, 0xb6, 0x7a, 0x23, 0xcc, 0x48, - 0xa6, 0xc8, 0x9e, 0x26, 0x53, 0x9c, 0x65, 0x22, 0xa2, 0xa4, 0xca, 0x87, 0x74, 0x28, 0x92, 0x03, - 0xed, 0x84, 0xc1, 0x88, 0xc4, 0x32, 0x7e, 0x2e, 0x03, 0xe7, 0x52, 0xd5, 0xce, 0xac, 0x56, 0xae, - 0xdf, 0x56, 0xd6, 0x61, 0x5c, 0xb9, 0xcd, 0x31, 0xce, 0x12, 0xa4, 0x62, 0xf0, 0xb6, 0x18, 0x2f, - 0xc0, 0x58, 0xf8, 0xe8, 0x49, 0xe6, 0xe4, 0xd0, 0xa1, 0x69, 0xa1, 0x7c, 0x3b, 0xab, 0x01, 0xb0, - 0x2f, 0x78, 0xa2, 0xd6, 0xc9, 0xc6, 0xef, 0x65, 0x79, 0x9e, 0xda, 0xa7, 0x36, 0xe2, 0x6c, 0xba, - 0x49, 0x31, 0x6b, 0x52, 0xef, 0x38, 0xb3, 0x64, 0x19, 0x46, 0x6a, 0x81, 0x1d, 0x74, 0x65, 0x6c, - 0x8d, 0x59, 0x95, 0x0c, 0x0b, 0x1e, 0x2e, 0x46, 0xd1, 0x15, 0x7c, 0x84, 0x68, 0x17, 0x6d, 0x84, - 0x28, 0x96, 0xc9, 0x7f, 0x94, 0x81, 0x09, 0x95, 0x98, 0xbc, 0x0f, 0x53, 0x32, 0x8a, 0x26, 0x8f, - 0x38, 0x22, 0x5e, 0x68, 0xa5, 0x35, 0x95, 0x8c, 0xa2, 0xa9, 0x46, 0x28, 0xd1, 0xf0, 0xd5, 0xad, - 0xba, 0xa3, 0x22, 0x93, 0x06, 0x90, 0xd6, 0xae, 0x6d, 0x1d, 0x52, 0xfb, 0x80, 0xfa, 0x81, 0xc5, - 0xad, 0x5e, 0xc4, 0x43, 0xae, 0x64, 0xbf, 0x76, 0xa7, 0xc4, 0x0d, 0x5e, 0xd8, 0x48, 0x88, 0x70, - 0xa8, 0x09, 0x1a, 0xf5, 0x75, 0xaa, 0xb5, 0x6b, 0x6f, 0xf3, 0x42, 0x4e, 0x67, 0xfc, 0xf9, 0x08, - 0x9f, 0x6e, 0x22, 0xec, 0xee, 0x0e, 0x4c, 0x3d, 0xa8, 0x56, 0xca, 0x8a, 0xae, 0x5a, 0xcf, 0xda, - 0xb4, 0xfc, 0x38, 0xa0, 0x5e, 0xdb, 0x6e, 0xca, 0x1b, 0x6a, 0x74, 0x04, 0xb9, 0x4e, 0xa3, 0x9e, - 0xae, 0xc7, 0x8e, 0x71, 0x64, 0x75, 0xf0, 0xbb, 0x70, 0x58, 0x47, 0x76, 0xc0, 0x3a, 0x7c, 0xbb, - 0xd5, 0xec, 0x51, 0x87, 0xce, 0x91, 0xec, 0x43, 0xe1, 0x2e, 0x4a, 0x97, 0x4a, 0x2d, 0xb9, 0xfe, - 0xb5, 0xbc, 0x28, 0x6a, 0x79, 0x96, 0x8b, 0xa5, 0xe9, 0xf5, 0x24, 0xb8, 0x46, 0xfb, 0xc4, 0xd0, - 0xa9, 0xfb, 0xc4, 0xdf, 0xc9, 0xc0, 0x08, 0x17, 0x5f, 0xc5, 0x34, 0xee, 0x21, 0x20, 0x6f, 0x3f, - 0x19, 0x01, 0xb9, 0x80, 0xe7, 0x84, 0x36, 0xa1, 0x79, 0x19, 0xa9, 0xc4, 0xd6, 0x85, 0x34, 0xa8, - 0xc7, 0x57, 0x27, 0x5e, 0x72, 0xfa, 0xb2, 0x20, 0xd5, 0x28, 0xde, 0xc5, 0xe8, 0xa9, 0x4e, 0xce, - 0x32, 0x46, 0xc8, 0xa8, 0x88, 0x77, 0xa1, 0x47, 0xb9, 0x58, 0x85, 0x31, 0x11, 0x45, 0x63, 0xe9, - 0x48, 0xbc, 0x2d, 0x17, 0x34, 0xeb, 0xa0, 0xc6, 0xd2, 0x51, 0x24, 0x9a, 0x8b, 0x38, 0x1c, 0xd6, - 0xce, 0x91, 0x96, 0xf6, 0x57, 0x22, 0x92, 0x07, 0x3c, 0x1d, 0x26, 0x0f, 0x4b, 0xac, 0x67, 0x22, - 0x08, 0xe1, 0x22, 0x3e, 0x97, 0x74, 0xc5, 0x4f, 0x89, 0x42, 0x1c, 0xf1, 0x20, 0xab, 0x50, 0x40, - 0x8b, 0x32, 0xda, 0xe0, 0xab, 0xa6, 0x5a, 0xe1, 0x91, 0x1a, 0x84, 0x55, 0x70, 0xc0, 0xcb, 0xc4, - 0x72, 0x8b, 0xb9, 0x30, 0x26, 0x28, 0xd9, 0x75, 0xba, 0x10, 0x9f, 0x7d, 0xe4, 0x6d, 0x18, 0x0f, - 0xc3, 0x42, 0x87, 0x4e, 0xd4, 0xf8, 0xc6, 0x14, 0xc5, 0x91, 0xd6, 0x93, 0x28, 0x2a, 0xe8, 0x64, - 0x11, 0xf2, 0x6c, 0x11, 0xc7, 0x13, 0x0e, 0x77, 0x05, 0x4c, 0x75, 0x6a, 0x92, 0x78, 0xa4, 0x06, - 0xb3, 0x6c, 0xd1, 0xd4, 0x9c, 0xf6, 0x5e, 0x93, 0xae, 0xba, 0x7b, 0x6e, 0x37, 0x88, 0x72, 0x0a, - 0xf2, 0x0b, 0x8c, 0xdd, 0x6a, 0x6a, 0xc5, 0x7a, 0x46, 0xc1, 0x14, 0x6a, 0x65, 0xab, 0xfc, 0x93, - 0x2c, 0x8c, 0x2b, 0xf3, 0x89, 0x5c, 0x83, 0x7c, 0xd5, 0x5f, 0x75, 0xeb, 0x07, 0x61, 0x00, 0xc7, - 0xc9, 0x93, 0xe3, 0xe2, 0x98, 0xe3, 0x5b, 0x4d, 0x04, 0x9a, 0x61, 0x31, 0x59, 0x82, 0x49, 0xfe, - 0x97, 0x4c, 0xd8, 0x91, 0x8d, 0xd4, 0x5b, 0x1c, 0x59, 0xa6, 0xea, 0x50, 0x77, 0x4f, 0x8d, 0x84, - 0x7c, 0x15, 0x80, 0x03, 0xd0, 0xe5, 0x3f, 0x37, 0x78, 0xb0, 0x02, 0x51, 0x41, 0x8a, 0xb3, 0xbf, - 0xc2, 0x90, 0x7c, 0x9d, 0x87, 0x91, 0x96, 0xf3, 0x7f, 0x68, 0xf0, 0x68, 0x0b, 0x8c, 0xbf, 0x95, - 0x1e, 0xf4, 0x45, 0x65, 0x29, 0x72, 0xec, 0x2c, 0x98, 0xb4, 0xee, 0x3e, 0xa2, 0xde, 0x51, 0x29, - 0x40, 0x44, 0x05, 0xc3, 0xf8, 0x5f, 0x32, 0xca, 0xaa, 0x21, 0xeb, 0x98, 0x23, 0x9b, 0xcf, 0x08, - 0x61, 0x66, 0x15, 0xde, 0x19, 0x24, 0xdc, 0xa4, 0xbb, 0x4b, 0xcf, 0x0a, 0x8b, 0xaf, 0xd9, 0x70, - 0x5e, 0xc5, 0x72, 0x67, 0x73, 0x20, 0xf9, 0x02, 0x0c, 0x61, 0xd7, 0x65, 0x4f, 0x6d, 0x9a, 0x3c, - 0xb6, 0x87, 0x58, 0x9f, 0x61, 0x43, 0x90, 0x92, 0x7c, 0x5a, 0x38, 0x33, 0xf3, 0xce, 0x9f, 0x52, - 0xce, 0x5e, 0xf6, 0x1d, 0xe1, 0x79, 0x1d, 0xc5, 0xfd, 0x51, 0x66, 0xcf, 0xdf, 0xcb, 0x42, 0x21, - 0xbe, 0x56, 0xc9, 0x7b, 0x30, 0x21, 0xcf, 0xd3, 0x15, 0x5b, 0x64, 0x9b, 0x98, 0x10, 0xd9, 0x1e, - 0xe4, 0xa1, 0xba, 0x6f, 0xab, 0x66, 0x59, 0xa6, 0x46, 0xc0, 0x84, 0x9b, 0x4d, 0x11, 0x87, 0x4f, - 0x59, 0x25, 0x81, 0x1b, 0x74, 0x62, 0xd1, 0x8b, 0x25, 0x1a, 0x79, 0x03, 0x72, 0x6b, 0x77, 0x4a, - 0xc2, 0xe9, 0xad, 0x10, 0x3f, 0x75, 0xb9, 0xf5, 0xa8, 0x6e, 0xcb, 0xca, 0xf0, 0xc9, 0xaa, 0x12, - 0xe8, 0x7b, 0x44, 0x33, 0xc1, 0x93, 0xe0, 0xb0, 0x71, 0xa7, 0x47, 0xfc, 0xbe, 0x37, 0x94, 0xcf, - 0x15, 0x86, 0x44, 0xe8, 0xda, 0x7f, 0x92, 0x83, 0xb1, 0xb0, 0x7e, 0x42, 0x54, 0x57, 0x62, 0xee, - 0x36, 0x4c, 0x2e, 0x42, 0x5e, 0x8a, 0x6b, 0xc2, 0xf7, 0x6d, 0xd4, 0x17, 0xa2, 0xda, 0x3c, 0x48, - 0xb9, 0x8c, 0x2f, 0x73, 0x53, 0xfe, 0x24, 0x37, 0x21, 0x14, 0xba, 0x7a, 0x49, 0x67, 0x43, 0x6c, - 0xc0, 0xcc, 0x10, 0x8d, 0x4c, 0x41, 0xd6, 0xe1, 0xe1, 0xd0, 0xc6, 0xcc, 0xac, 0xd3, 0x20, 0xef, - 0x41, 0xde, 0x6e, 0x34, 0x68, 0xc3, 0xb2, 0xa5, 0xbd, 0x52, 0xbf, 0x49, 0x93, 0x67, 0xdc, 0xf8, - 0x21, 0x80, 0x54, 0xa5, 0x80, 0x94, 0x60, 0xac, 0x69, 0x73, 0x0b, 0xc8, 0xc6, 0x00, 0x27, 0x4a, - 0xc4, 0x21, 0xcf, 0xc8, 0xb6, 0x7c, 0xda, 0x20, 0xaf, 0xc0, 0x10, 0x1b, 0x4d, 0x71, 0x84, 0x48, - 0x29, 0x91, 0x0d, 0x26, 0xef, 0xb0, 0x95, 0x67, 0x4c, 0x44, 0x20, 0x2f, 0x41, 0xae, 0xbb, 0xb8, - 0x2b, 0x0e, 0x87, 0x42, 0x14, 0x74, 0x3f, 0x44, 0x63, 0xc5, 0xe4, 0x16, 0xe4, 0x0f, 0xf5, 0x78, - 0xed, 0xe7, 0x62, 0xc3, 0x18, 0xe2, 0x87, 0x88, 0xe4, 0x15, 0xc8, 0xf9, 0xbe, 0x2b, 0x8c, 0x7c, - 0x66, 0x43, 0xcb, 0xcb, 0x07, 0xe1, 0xa8, 0x31, 0xee, 0xbe, 0xef, 0x2e, 0xe5, 0x61, 0x84, 0x9f, - 0x18, 0xc6, 0x25, 0x80, 0xe8, 0x1b, 0x93, 0xbe, 0x8c, 0xc6, 0x57, 0x61, 0x2c, 0xfc, 0x36, 0xf2, - 0x3c, 0xc0, 0x01, 0x3d, 0xb2, 0xf6, 0xed, 0x76, 0xa3, 0xc9, 0xc5, 0xcd, 0x09, 0x73, 0xec, 0x80, - 0x1e, 0xad, 0x20, 0x80, 0x5c, 0x80, 0xd1, 0x0e, 0x1b, 0x7e, 0x31, 0xc7, 0x27, 0xcc, 0x91, 0x4e, - 0x77, 0x87, 0x4d, 0xe5, 0x79, 0x18, 0x45, 0xc5, 0xa9, 0x58, 0x91, 0x93, 0xa6, 0xfc, 0x69, 0xfc, - 0x45, 0x0e, 0xd3, 0x1a, 0x29, 0x0d, 0x22, 0x2f, 0xc2, 0x64, 0xdd, 0xa3, 0x78, 0x38, 0xd9, 0x4c, - 0xe4, 0x12, 0xf5, 0x4c, 0x44, 0xc0, 0x6a, 0x83, 0x5c, 0x81, 0xe9, 0x4e, 0x77, 0xa7, 0xe9, 0xd4, - 0x59, 0x6d, 0x56, 0x7d, 0x47, 0xe4, 0x61, 0x98, 0x30, 0x27, 0x39, 0xf8, 0x3e, 0x3d, 0x2a, 0xef, - 0x60, 0xbc, 0xbf, 0x82, 0x1a, 0xae, 0x39, 0x08, 0x13, 0xce, 0x9b, 0xd3, 0x0a, 0x1c, 0xed, 0x15, - 0xcf, 0xc3, 0x88, 0x6d, 0xef, 0x75, 0x1d, 0x1e, 0x97, 0x6b, 0xc2, 0x14, 0xbf, 0xc8, 0xa7, 0x60, - 0x26, 0x8a, 0x20, 0x2e, 0x9b, 0x31, 0x8c, 0xcd, 0x28, 0x84, 0x05, 0x65, 0x0e, 0x27, 0xaf, 0x03, - 0x51, 0xeb, 0x73, 0x77, 0x3e, 0xa0, 0x75, 0x3e, 0x27, 0x27, 0xcc, 0x19, 0xa5, 0xe4, 0x01, 0x16, - 0x90, 0x17, 0x60, 0xc2, 0xa3, 0x3e, 0x8a, 0x7b, 0xd8, 0x6d, 0x98, 0xf5, 0xcf, 0x1c, 0x97, 0x30, - 0xd6, 0x77, 0x57, 0xa1, 0xa0, 0x74, 0x07, 0x46, 0xc4, 0xe6, 0x29, 0x08, 0xcc, 0xa9, 0x08, 0x6e, - 0x76, 0xaa, 0x0d, 0xf2, 0x25, 0x58, 0x50, 0x30, 0x79, 0x02, 0x42, 0x8b, 0x36, 0x9d, 0x3d, 0x67, - 0xa7, 0x49, 0xc5, 0x7c, 0x4b, 0xce, 0xea, 0xf0, 0x4e, 0x68, 0xce, 0x47, 0xd4, 0x3c, 0x35, 0xe1, - 0xb2, 0xa0, 0x25, 0xab, 0x30, 0x17, 0xe3, 0x4c, 0x1b, 0x56, 0xb7, 0xd3, 0x33, 0x10, 0x5e, 0xc4, - 0x93, 0xe8, 0x3c, 0x69, 0x63, 0xab, 0x63, 0x7c, 0x0b, 0x26, 0xd4, 0x39, 0xc9, 0x3a, 0x41, 0x15, - 0x34, 0xc4, 0xec, 0x1b, 0x0f, 0x61, 0x55, 0x76, 0xd1, 0x9b, 0x8a, 0x50, 0x82, 0x30, 0xb7, 0xbe, - 0x39, 0x19, 0x42, 0x71, 0x08, 0x5f, 0x80, 0x89, 0x86, 0xe3, 0x77, 0x9a, 0xf6, 0x91, 0x15, 0x65, - 0xd6, 0x36, 0xc7, 0x05, 0x0c, 0x35, 0x39, 0x4b, 0x30, 0x93, 0xd8, 0x07, 0xc9, 0xeb, 0xfc, 0x86, - 0x2a, 0x84, 0x9f, 0x09, 0x7e, 0xcb, 0x47, 0x6b, 0x68, 0x4d, 0xee, 0x11, 0x48, 0x46, 0x1b, 0x26, - 0xd4, 0x73, 0xed, 0x94, 0x84, 0x21, 0xe7, 0x31, 0x34, 0x0d, 0xdf, 0xf4, 0x47, 0x4e, 0x8e, 0x8b, - 0x59, 0xa7, 0x81, 0x01, 0x69, 0xae, 0x42, 0x5e, 0x8a, 0x60, 0x42, 0xf2, 0xc1, 0xd7, 0x01, 0xf9, - 0x3a, 0x68, 0x86, 0xa5, 0xc6, 0x2b, 0x30, 0x2a, 0x8e, 0xae, 0xfe, 0x6f, 0x02, 0xc6, 0xb7, 0xb3, - 0x30, 0x6d, 0x52, 0xb6, 0xb1, 0x52, 0x9e, 0x25, 0xe8, 0xa9, 0xbd, 0x73, 0xa7, 0x87, 0x50, 0xd5, - 0xda, 0xd6, 0x27, 0x3f, 0xcf, 0xaf, 0x64, 0x60, 0x36, 0x05, 0xf7, 0x43, 0xe5, 0xa7, 0xbd, 0x0d, - 0x63, 0x15, 0xc7, 0x6e, 0x96, 0x1a, 0x8d, 0x30, 0x4e, 0x0d, 0x0a, 0xee, 0x98, 0xc4, 0xca, 0x66, - 0x50, 0x55, 0x88, 0x09, 0x51, 0xc9, 0xab, 0x62, 0x52, 0x44, 0xd9, 0xdd, 0x71, 0x52, 0x7c, 0xf7, - 0xb8, 0x08, 0xfc, 0x9b, 0x36, 0xc3, 0x29, 0x82, 0x61, 0x8d, 0x39, 0x30, 0xf2, 0x35, 0x7a, 0x6a, - 0x87, 0x2e, 0x3d, 0xac, 0x71, 0xbc, 0x79, 0x03, 0xa5, 0xe8, 0xf9, 0xf1, 0x2c, 0x9c, 0x4f, 0x27, - 0xfc, 0xb0, 0xa9, 0x86, 0x31, 0x39, 0x92, 0x12, 0x8a, 0x1d, 0x53, 0x0d, 0xf3, 0x4c, 0x4a, 0x88, - 0x1f, 0x21, 0x90, 0x5d, 0x98, 0x5c, 0xb5, 0xfd, 0x60, 0x85, 0xda, 0x5e, 0xb0, 0x43, 0xed, 0x60, - 0x00, 0x49, 0xfe, 0x25, 0x69, 0x97, 0x81, 0xc2, 0xc4, 0xbe, 0xa4, 0x8c, 0xc9, 0xda, 0x3a, 0xdb, - 0x70, 0xa2, 0x0c, 0x0d, 0x30, 0x51, 0xbe, 0x01, 0xd3, 0x35, 0xda, 0xb2, 0x3b, 0xfb, 0xae, 0x27, - 0x63, 0x08, 0x5c, 0x87, 0xc9, 0x10, 0x94, 0x3a, 0x5b, 0xf4, 0x62, 0x0d, 0x5f, 0xe9, 0x88, 0x68, - 0x2b, 0xd1, 0x8b, 0x8d, 0xbf, 0x9f, 0x85, 0x0b, 0xa5, 0xba, 0x30, 0x97, 0x14, 0x05, 0xd2, 0xaa, - 0xfb, 0x63, 0xae, 0x9b, 0xdc, 0x80, 0xb1, 0x35, 0xfb, 0xf1, 0x2a, 0xb5, 0x7d, 0xea, 0x8b, 0x44, - 0x8f, 0x5c, 0xec, 0xb5, 0x1f, 0x47, 0xaf, 0x39, 0x66, 0x84, 0xa3, 0xea, 0x05, 0x86, 0x3e, 0xa2, - 0x5e, 0xc0, 0x80, 0x91, 0x15, 0xb7, 0xd9, 0x10, 0x67, 0xbd, 0x78, 0x42, 0xde, 0x47, 0x88, 0x29, - 0x4a, 0xd8, 0x75, 0x7a, 0x2a, 0xfc, 0x62, 0xfc, 0x84, 0x8f, 0xbd, 0x4b, 0xae, 0xc0, 0x28, 0x56, - 0x14, 0x66, 0xa4, 0xc7, 0x43, 0xa3, 0x49, 0x31, 0x5d, 0x5f, 0xc3, 0x94, 0x85, 0x6a, 0x4f, 0x0c, - 0x7f, 0xb4, 0x9e, 0x30, 0xfe, 0x11, 0xbe, 0x4e, 0xab, 0xad, 0x64, 0x27, 0x91, 0xf2, 0x21, 0x99, - 0x01, 0x3f, 0x24, 0xfb, 0xc4, 0x86, 0x24, 0xd7, 0x73, 0x48, 0x7e, 0x38, 0x0b, 0xe3, 0xe1, 0xc7, - 0x7e, 0xc2, 0xf2, 0x01, 0x84, 0xed, 0x1a, 0x28, 0xee, 0x4f, 0x4d, 0xd9, 0x2b, 0x44, 0x78, 0x9d, - 0x2f, 0xc0, 0x88, 0x58, 0x4c, 0x99, 0x98, 0x75, 0x73, 0x6c, 0x74, 0x97, 0xa6, 0x04, 0xeb, 0x11, - 0x1c, 0x50, 0xdf, 0x14, 0x74, 0x18, 0x58, 0x69, 0x9b, 0xee, 0x08, 0x63, 0x85, 0xa7, 0xf6, 0x8c, - 0x4a, 0x0f, 0xac, 0x14, 0x35, 0x6c, 0xa0, 0xd3, 0xe9, 0x1f, 0xe7, 0xa1, 0x10, 0x27, 0x39, 0x3d, - 0xe3, 0xc2, 0x46, 0x77, 0x87, 0x5f, 0x55, 0x78, 0xc6, 0x85, 0x4e, 0x77, 0xc7, 0x64, 0x30, 0xb4, - 0x65, 0xf2, 0x9c, 0x47, 0xd8, 0xea, 0x09, 0x61, 0xcb, 0xe4, 0x39, 0x8f, 0x34, 0x5b, 0x26, 0xcf, - 0x79, 0x84, 0x8a, 0x84, 0xd5, 0x1a, 0x06, 0x1d, 0xc0, 0x7b, 0x8a, 0x50, 0x24, 0x34, 0xfd, 0x78, - 0xf6, 0x34, 0x89, 0xc6, 0x8e, 0xca, 0x25, 0x6a, 0x7b, 0x22, 0x3b, 0x80, 0xd8, 0xce, 0xf0, 0xa8, - 0xdc, 0x41, 0xb0, 0x15, 0x30, 0xb8, 0xa9, 0x22, 0x91, 0x26, 0x10, 0xe5, 0xa7, 0x5c, 0xc0, 0xa7, - 0xdf, 0xad, 0xa5, 0x65, 0xe2, 0x9c, 0xca, 0xda, 0x52, 0x57, 0x73, 0x0a, 0xdf, 0x27, 0xa9, 0xce, - 0xdd, 0x10, 0x21, 0x4f, 0x51, 0x81, 0x94, 0x3f, 0x95, 0x99, 0x0c, 0x96, 0x02, 0x3c, 0x24, 0x6a, - 0xa8, 0x46, 0x8a, 0x98, 0x90, 0x77, 0x61, 0x5c, 0x0d, 0x25, 0xc1, 0x03, 0x1e, 0x3c, 0xc7, 0x63, - 0x4c, 0xf6, 0xc8, 0xb8, 0xab, 0x12, 0x90, 0x1d, 0xb8, 0x50, 0x76, 0xdb, 0x7e, 0xb7, 0x25, 0xa3, - 0x59, 0x46, 0x51, 0xba, 0x01, 0x87, 0x02, 0xfd, 0xd2, 0xeb, 0x02, 0x45, 0x44, 0x2e, 0x90, 0xae, - 0x23, 0xfa, 0x05, 0xa4, 0x17, 0x23, 0xb2, 0x09, 0xe3, 0xa8, 0x12, 0x15, 0x56, 0x87, 0xe3, 0xfa, - 0xb6, 0x11, 0x95, 0x54, 0xd8, 0xc2, 0xe0, 0x91, 0xd4, 0xec, 0x56, 0x53, 0x7a, 0x2e, 0xa8, 0xaa, - 0x5d, 0x05, 0x99, 0x7c, 0x15, 0xa6, 0xf8, 0x15, 0x6d, 0x9b, 0xee, 0xf0, 0xb9, 0x33, 0xa1, 0x69, - 0x22, 0xf4, 0x42, 0xfe, 0x3a, 0x2f, 0x14, 0xd1, 0x87, 0x74, 0x87, 0x8f, 0xbd, 0xe6, 0x37, 0xa4, - 0xe1, 0x93, 0x2d, 0x98, 0x5d, 0xb1, 0x7d, 0x0e, 0x54, 0x62, 0x02, 0x4c, 0xa2, 0x86, 0x16, 0xed, - 0xb9, 0xf7, 0x6d, 0x5f, 0x6a, 0xb6, 0x53, 0x63, 0x00, 0xa4, 0xd1, 0x93, 0x6f, 0x67, 0x60, 0x5e, - 0x53, 0x7c, 0x0b, 0xc3, 0xb1, 0x16, 0x6d, 0x07, 0xe8, 0x20, 0x34, 0xb5, 0x58, 0x94, 0x42, 0x69, - 0x0f, 0x34, 0x3e, 0x24, 0x31, 0xdd, 0xba, 0x17, 0x95, 0xab, 0x86, 0xd2, 0xbd, 0x78, 0x88, 0x85, - 0x8a, 0x6b, 0x7a, 0x5a, 0x5f, 0xa8, 0xb1, 0x75, 0x2d, 0xd1, 0x8c, 0xdb, 0xf1, 0xfe, 0x16, 0x8a, - 0xae, 0x4c, 0xa8, 0xe8, 0x9a, 0x83, 0x61, 0xec, 0x55, 0x19, 0x59, 0x0a, 0x7f, 0x18, 0x9f, 0x56, - 0xf7, 0x21, 0x21, 0x16, 0xf6, 0xdd, 0x87, 0x8c, 0xff, 0x61, 0x04, 0xa6, 0x63, 0xd3, 0x42, 0xdc, - 0x53, 0x33, 0x89, 0x7b, 0x6a, 0x0d, 0x80, 0xab, 0x7a, 0x07, 0xd4, 0xc9, 0x4a, 0xe7, 0xc4, 0x71, - 0xe1, 0x5a, 0x1c, 0xae, 0x29, 0x85, 0x0d, 0x63, 0xca, 0x57, 0xec, 0x80, 0x3a, 0xf2, 0x90, 0x29, - 0x5f, 0xf4, 0x0a, 0xd3, 0x88, 0x0d, 0x29, 0xc2, 0x30, 0xc6, 0x94, 0x55, 0x7d, 0x43, 0x1d, 0x06, - 0x30, 0x39, 0x9c, 0xbc, 0x08, 0x23, 0x4c, 0x88, 0xaa, 0x56, 0xc4, 0x26, 0x88, 0x67, 0x0b, 0x93, - 0xb2, 0x98, 0xc4, 0x22, 0x8a, 0xc8, 0x6d, 0x98, 0xe0, 0x7f, 0x89, 0xd0, 0x33, 0x23, 0xba, 0x35, - 0xa3, 0xe5, 0x34, 0x64, 0xf4, 0x19, 0x0d, 0x8f, 0xdd, 0x2e, 0x6a, 0x5d, 0x54, 0xeb, 0x54, 0x2b, - 0x22, 0xcc, 0x39, 0xde, 0x2e, 0x7c, 0x0e, 0x64, 0x55, 0x44, 0x08, 0x4c, 0x96, 0x11, 0x1e, 0x1a, - 0x79, 0xbc, 0x53, 0xa2, 0x2c, 0xc3, 0x3d, 0x33, 0x4c, 0x51, 0x42, 0xae, 0xf1, 0xa7, 0x15, 0x14, - 0x0b, 0x79, 0xb6, 0x48, 0x7c, 0xb7, 0x40, 0xc5, 0x04, 0xca, 0x86, 0x61, 0x31, 0xab, 0x9c, 0xfd, - 0xbd, 0xdc, 0xb2, 0x9d, 0xa6, 0xd8, 0x56, 0xb0, 0x72, 0xc4, 0xa5, 0x0c, 0x6a, 0x46, 0x08, 0xe4, - 0x6d, 0x98, 0x62, 0x3f, 0xca, 0x6e, 0xab, 0xe5, 0xb6, 0x91, 0xfd, 0x78, 0x14, 0x5c, 0x0e, 0x49, - 0xea, 0x58, 0xc4, 0x6b, 0x89, 0xe1, 0xb2, 0xf3, 0x04, 0x9f, 0x6d, 0xbb, 0xfc, 0xd1, 0x67, 0x22, - 0x3a, 0x4f, 0x90, 0xd4, 0xe7, 0x70, 0x53, 0x45, 0x22, 0x6f, 0xc2, 0x24, 0xfb, 0x79, 0xd7, 0x79, - 0x44, 0x79, 0x85, 0x93, 0x91, 0xbd, 0x02, 0x52, 0xed, 0xb1, 0x12, 0x5e, 0x9f, 0x8e, 0x49, 0xbe, - 0x08, 0xe7, 0x90, 0x53, 0xdd, 0xed, 0xd0, 0x46, 0x69, 0x77, 0xd7, 0x69, 0x3a, 0xdc, 0xbc, 0x8c, - 0x07, 0x59, 0x41, 0x1d, 0x3c, 0xaf, 0x18, 0x31, 0x2c, 0x3b, 0x42, 0x31, 0xd3, 0x29, 0xc9, 0x36, - 0x14, 0xca, 0x5d, 0x3f, 0x70, 0x5b, 0xa5, 0x20, 0xf0, 0x9c, 0x9d, 0x6e, 0x40, 0xfd, 0xf9, 0x69, - 0x2d, 0x14, 0x09, 0x5b, 0x1c, 0x61, 0x21, 0xd7, 0x07, 0xd5, 0x91, 0xc2, 0xb2, 0x43, 0x12, 0x33, - 0xc1, 0xc4, 0xf8, 0xa7, 0x19, 0x98, 0xd4, 0x48, 0xc9, 0x1b, 0x30, 0x71, 0xc7, 0x73, 0x68, 0xbb, - 0xd1, 0x3c, 0x52, 0x2e, 0xaa, 0x78, 0x8b, 0xd9, 0x15, 0x70, 0xde, 0x6a, 0x0d, 0x2d, 0xd4, 0xf3, - 0x64, 0x53, 0x6d, 0x3f, 0x6f, 0x70, 0x17, 0x65, 0x31, 0x41, 0x73, 0x51, 0x6c, 0x24, 0x9c, 0xa0, - 0x62, 0x76, 0x2a, 0x28, 0xe4, 0x1d, 0x18, 0xe1, 0x0f, 0xbc, 0xc2, 0x10, 0xf1, 0x62, 0x5a, 0x33, - 0xb9, 0x3b, 0x3c, 0x4e, 0x44, 0xb4, 0xe2, 0xf1, 0x4d, 0x41, 0x64, 0xfc, 0x4c, 0x06, 0x48, 0x12, - 0xf5, 0x14, 0xbd, 0xd7, 0xa9, 0xd6, 0x41, 0x5f, 0x08, 0x57, 0x63, 0x4e, 0xd3, 0x99, 0xb3, 0x9a, - 0x78, 0x01, 0xef, 0x78, 0xb1, 0xea, 0x54, 0x45, 0x1c, 0x2f, 0x36, 0x7e, 0x28, 0x0b, 0x10, 0x61, - 0x93, 0xcf, 0xf1, 0xe4, 0x60, 0x5f, 0xec, 0xda, 0x4d, 0x67, 0xd7, 0xd1, 0x63, 0xd9, 0x22, 0x93, - 0x6f, 0xc8, 0x12, 0x53, 0x47, 0x24, 0xef, 0xc1, 0x74, 0x6d, 0x43, 0xa7, 0x55, 0x2c, 0xd3, 0xfd, - 0x8e, 0x15, 0x23, 0x8f, 0x63, 0xa3, 0xc1, 0xb1, 0x3a, 0x1a, 0xdc, 0xe0, 0x98, 0x0f, 0x84, 0x28, - 0x61, 0x1b, 0x4b, 0x6d, 0x43, 0x18, 0xdf, 0x37, 0xaa, 0x15, 0xb1, 0x4b, 0xe1, 0xd7, 0xf9, 0x1d, - 0xab, 0x23, 0xac, 0xf2, 0xd9, 0x3e, 0xa1, 0xe1, 0x45, 0x1d, 0x39, 0xdc, 0xc3, 0xe5, 0xfd, 0x67, - 0x51, 0xed, 0xd7, 0x72, 0x03, 0x2a, 0xb4, 0x1d, 0x4f, 0xed, 0xbd, 0x27, 0xb2, 0x0e, 0x18, 0xd6, - 0x3c, 0x79, 0xb5, 0xd6, 0x09, 0x0b, 0x98, 0x5b, 0xd1, 0x25, 0x85, 0xdb, 0x09, 0xa4, 0x18, 0xcd, - 0xfc, 0xc3, 0x0c, 0x9c, 0x4b, 0xa5, 0x25, 0xd7, 0x01, 0x22, 0x9d, 0x92, 0xe8, 0x25, 0xdc, 0x31, - 0xa3, 0x88, 0x40, 0xa6, 0x82, 0x41, 0xbe, 0x12, 0xd7, 0x06, 0x9d, 0x7e, 0x10, 0x2e, 0xc8, 0x40, - 0x7c, 0xba, 0x36, 0x28, 0x45, 0x07, 0x64, 0xfc, 0x4a, 0x0e, 0x66, 0x94, 0x80, 0x43, 0xfc, 0x5b, - 0x4f, 0x31, 0x00, 0x3f, 0x80, 0x09, 0xd6, 0x1a, 0xa7, 0x2e, 0x3c, 0x5f, 0xb8, 0x25, 0xcb, 0xab, - 0x09, 0x5f, 0x4c, 0xc1, 0xed, 0xba, 0x8a, 0xcc, 0xc3, 0x63, 0xe2, 0xd6, 0x89, 0x0f, 0x12, 0xf5, - 0xa4, 0xd7, 0x8b, 0xc6, 0x9c, 0xf8, 0x30, 0x59, 0x39, 0x6a, 0xdb, 0xad, 0xb0, 0x36, 0x6e, 0xd1, - 0xf2, 0xa9, 0x9e, 0xb5, 0x69, 0xd8, 0xbc, 0xba, 0xc8, 0x6b, 0x89, 0x97, 0xa5, 0x38, 0xcc, 0x6b, - 0x54, 0x0b, 0xef, 0xc1, 0x4c, 0xe2, 0xa3, 0xcf, 0x14, 0xa9, 0x73, 0x1b, 0x48, 0xf2, 0x3b, 0x52, - 0x38, 0x7c, 0x4a, 0x8f, 0x03, 0x7b, 0x2e, 0x7c, 0xbc, 0x6e, 0xb5, 0xec, 0x76, 0x83, 0xdb, 0xc7, - 0x2c, 0xaa, 0x71, 0x3c, 0x7f, 0x36, 0xab, 0xfa, 0xc3, 0x3e, 0xed, 0xab, 0xee, 0x0b, 0xda, 0x6d, - 0xf8, 0x52, 0xaf, 0x31, 0x1d, 0x48, 0xeb, 0xf0, 0x9d, 0x1c, 0x5c, 0xe8, 0x41, 0x49, 0x8e, 0xe2, - 0x93, 0x88, 0x6b, 0x21, 0x6e, 0xf6, 0xaf, 0xf0, 0x49, 0x4c, 0x25, 0xf2, 0x39, 0x1e, 0x11, 0xa3, - 0x8e, 0x49, 0xfa, 0xc5, 0xfd, 0x1b, 0xd5, 0xf8, 0x07, 0x21, 0x34, 0x1e, 0x0a, 0x83, 0x43, 0xc9, - 0x7b, 0x30, 0x8c, 0xce, 0xd0, 0xb1, 0x90, 0x87, 0x0c, 0x03, 0xe1, 0x4a, 0xd0, 0x4e, 0xf6, 0x53, - 0x0b, 0xda, 0xc9, 0x00, 0xe4, 0xb3, 0x90, 0x2b, 0x6d, 0xd7, 0xc4, 0xb8, 0x4c, 0xa9, 0xe4, 0xdb, - 0xb5, 0x28, 0xa5, 0x89, 0xad, 0xe5, 0x1e, 0x61, 0x14, 0x8c, 0xf0, 0x6e, 0x79, 0x43, 0x8c, 0x8a, - 0x4a, 0x78, 0xb7, 0xbc, 0x11, 0x11, 0xee, 0xd5, 0xb5, 0x00, 0x52, 0x77, 0xcb, 0x1b, 0x1f, 0xdf, - 0xb4, 0xff, 0x37, 0xb2, 0x3c, 0x8c, 0x07, 0x6f, 0xd8, 0x7b, 0x30, 0xa1, 0xc5, 0xe9, 0xce, 0x44, - 0xf2, 0x58, 0x18, 0x53, 0x3d, 0x66, 0x02, 0xa4, 0x11, 0xc8, 0xe4, 0x40, 0xec, 0x37, 0x4a, 0xbc, - 0xaa, 0xb1, 0x4d, 0xc8, 0x01, 0x65, 0xe2, 0x78, 0x72, 0xa0, 0x90, 0x84, 0xdc, 0x82, 0xfc, 0x26, - 0x6d, 0xdb, 0xed, 0x20, 0x54, 0x88, 0xa2, 0xb5, 0x70, 0x80, 0x30, 0x5d, 0x6a, 0x08, 0x11, 0xd1, - 0xb2, 0xb5, 0xbb, 0xe3, 0xd7, 0x3d, 0x07, 0xc3, 0xfd, 0x84, 0x67, 0x31, 0xb7, 0x6c, 0x55, 0x4a, - 0x74, 0x06, 0x31, 0x22, 0xe3, 0x67, 0x33, 0x30, 0x2a, 0x06, 0x92, 0x27, 0x75, 0xdb, 0x8b, 0xce, - 0x12, 0xe1, 0x0d, 0xb0, 0xe7, 0xc4, 0xbd, 0x01, 0xf6, 0x78, 0x4c, 0x9d, 0x31, 0xe1, 0xdb, 0x16, - 0x3e, 0x0d, 0xe2, 0x6c, 0x94, 0xae, 0x90, 0x7a, 0xce, 0xae, 0x10, 0x75, 0x50, 0x0f, 0x2b, 0xe3, - 0x1f, 0x88, 0x2f, 0xbb, 0x5b, 0xde, 0x20, 0x8b, 0x90, 0x5f, 0x75, 0x79, 0x78, 0x28, 0x35, 0x43, - 0x6f, 0x53, 0xc0, 0xd4, 0x0e, 0x92, 0x78, 0xec, 0xfb, 0x36, 0x3c, 0x57, 0xdc, 0x65, 0x94, 0xef, - 0xeb, 0x70, 0x60, 0xec, 0xfb, 0x42, 0xd4, 0x81, 0xbf, 0x8f, 0xa6, 0x6c, 0x12, 0x0f, 0x6f, 0x61, - 0xd6, 0x94, 0x7b, 0xaa, 0xe7, 0x9a, 0x28, 0x92, 0x3b, 0xc5, 0x42, 0xaf, 0x9d, 0xe2, 0xe1, 0x2d, - 0x33, 0x85, 0x0a, 0xdf, 0xd5, 0x22, 0x70, 0x8d, 0x7a, 0x8f, 0x9e, 0xe2, 0x5d, 0x3a, 0xfd, 0x5d, - 0x2d, 0xde, 0xbc, 0x81, 0x36, 0xe9, 0x3f, 0xca, 0xc2, 0xf9, 0x74, 0x42, 0xb5, 0x2d, 0x99, 0x3e, - 0x6d, 0xb9, 0x0a, 0xf9, 0x15, 0xd7, 0x0f, 0x14, 0xab, 0x3f, 0x54, 0xff, 0xef, 0x0b, 0x98, 0x19, - 0x96, 0xb2, 0x3b, 0x37, 0xfb, 0x3b, 0x5c, 0x9e, 0xc8, 0x0f, 0x83, 0x57, 0xb0, 0x3b, 0x37, 0x2f, - 0x22, 0x77, 0x21, 0x6f, 0x0a, 0xcf, 0xa9, 0x58, 0xd7, 0x48, 0x70, 0x28, 0x4d, 0x11, 0x4f, 0x40, - 0xb4, 0x70, 0xe9, 0x02, 0x46, 0x4a, 0x30, 0x2a, 0x46, 0x3f, 0xf6, 0x74, 0x9c, 0x32, 0x65, 0xf4, - 0x0c, 0x06, 0x92, 0x8e, 0xed, 0x28, 0xf8, 0x08, 0x58, 0xad, 0x48, 0x27, 0x28, 0xdc, 0x51, 0xf8, - 0x23, 0xa1, 0x6e, 0x60, 0x19, 0x22, 0x1a, 0xdf, 0xce, 0x02, 0x48, 0xad, 0xcd, 0x53, 0x3b, 0xc3, - 0x3e, 0xab, 0xcd, 0x30, 0xc5, 0xde, 0x68, 0xf0, 0x24, 0xc4, 0x0f, 0xd0, 0x9c, 0x67, 0xf0, 0x14, - 0xc4, 0x45, 0x18, 0xde, 0x8c, 0x14, 0x5a, 0xc2, 0xc7, 0x04, 0xd5, 0xd1, 0x1c, 0x6e, 0xec, 0xc0, - 0xdc, 0x5d, 0x1a, 0x44, 0xea, 0x2d, 0xf9, 0xf4, 0xd8, 0x9f, 0xed, 0x6b, 0x30, 0x26, 0xf0, 0xc3, - 0xfd, 0x8b, 0xeb, 0x62, 0x44, 0x3c, 0x18, 0xd4, 0xc5, 0x48, 0x04, 0xb6, 0x1b, 0x55, 0x68, 0x93, - 0x06, 0xf4, 0xe3, 0xad, 0xa6, 0x06, 0x84, 0x37, 0x05, 0x5b, 0x36, 0x58, 0x0d, 0xa7, 0xf6, 0xcf, - 0x43, 0x38, 0x17, 0x7e, 0xfb, 0x93, 0xe4, 0x7b, 0x83, 0x5d, 0x29, 0x45, 0xf0, 0xff, 0x88, 0x63, - 0x1f, 0xdb, 0x93, 0xc7, 0xb0, 0x20, 0x09, 0xb6, 0x9d, 0xd0, 0x70, 0x72, 0x20, 0x5a, 0xf2, 0x36, - 0x8c, 0x2b, 0x34, 0x22, 0x78, 0x3d, 0xaa, 0xa9, 0x0f, 0x9d, 0x60, 0xdf, 0xf2, 0x39, 0x5c, 0x55, - 0x53, 0x2b, 0xe8, 0xc6, 0x97, 0xe1, 0xd9, 0xd0, 0x0f, 0x28, 0xa5, 0xea, 0x18, 0xf3, 0xcc, 0xd9, - 0x98, 0xaf, 0x47, 0xcd, 0xaa, 0xb6, 0x43, 0x57, 0x67, 0xc9, 0x9b, 0xa8, 0xcd, 0x12, 0x8d, 0x79, - 0x2e, 0xe1, 0x3c, 0xad, 0xf8, 0x48, 0x1b, 0x6f, 0x29, 0x1f, 0x9b, 0xc2, 0x50, 0x23, 0xce, 0xc4, - 0x89, 0xbf, 0x9d, 0x85, 0xe9, 0x07, 0xd5, 0x4a, 0x39, 0xb4, 0x3e, 0xfa, 0x84, 0xa5, 0x48, 0xd6, - 0xda, 0xd6, 0x7b, 0xbf, 0x31, 0xb6, 0x60, 0x36, 0xd6, 0x0d, 0x28, 0x3a, 0xbc, 0xcb, 0x3d, 0x48, - 0x42, 0xb0, 0x14, 0x1b, 0xce, 0xa7, 0xb1, 0x7f, 0x78, 0xcb, 0x8c, 0x61, 0x1b, 0xff, 0x39, 0xc4, - 0xf8, 0x8a, 0x2d, 0xec, 0x35, 0x18, 0xab, 0xfa, 0x7e, 0x97, 0x7a, 0x5b, 0xe6, 0xaa, 0xaa, 0x2a, - 0x70, 0x10, 0x68, 0x75, 0xbd, 0xa6, 0x19, 0x21, 0x90, 0x6b, 0x90, 0x17, 0x81, 0xc3, 0xe5, 0x9e, - 0x80, 0x5a, 0xdb, 0x30, 0xee, 0xb8, 0x19, 0x16, 0x93, 0x37, 0x60, 0x82, 0xff, 0xcd, 0x67, 0x9b, - 0xe8, 0x70, 0x54, 0x0e, 0x0a, 0x74, 0x3e, 0x3b, 0x4d, 0x0d, 0x8d, 0xbc, 0x0a, 0xb9, 0x52, 0xd9, - 0x14, 0xea, 0x20, 0x21, 0x37, 0x7a, 0x16, 0xd7, 0xd9, 0x69, 0x97, 0x88, 0xb2, 0xc9, 0xa4, 0x3f, - 0x19, 0xef, 0x41, 0x68, 0xb2, 0x71, 0x06, 0x48, 0x6d, 0x53, 0xec, 0x30, 0x43, 0x18, 0xb9, 0x01, - 0xa3, 0x15, 0x6e, 0x32, 0x27, 0xf4, 0xd8, 0x3c, 0xff, 0x1f, 0x07, 0x69, 0xd1, 0x12, 0x38, 0x88, - 0x5c, 0x93, 0x59, 0xcb, 0xf2, 0x91, 0x23, 0x4a, 0x8f, 0xd4, 0x64, 0xaf, 0xc1, 0x88, 0x08, 0xaf, - 0x3d, 0xa6, 0xe4, 0x33, 0x89, 0x87, 0xd5, 0x16, 0x38, 0x49, 0x8f, 0x54, 0x78, 0x92, 0x1e, 0xa9, - 0x3b, 0x70, 0xe1, 0x2e, 0x6a, 0x6f, 0xf4, 0x20, 0x51, 0x5b, 0x66, 0x55, 0xe8, 0xc3, 0xf1, 0x19, - 0x88, 0x2b, 0x78, 0xe2, 0x71, 0xa6, 0xac, 0xae, 0xa7, 0xa6, 0xb3, 0xed, 0xc5, 0x88, 0x7c, 0x09, - 0xe6, 0xd2, 0x8a, 0x84, 0xd6, 0x1c, 0xc3, 0x21, 0xa5, 0x57, 0xa0, 0x86, 0x43, 0x4a, 0xe3, 0x40, - 0x56, 0xa1, 0xc0, 0xe1, 0xa5, 0x46, 0xcb, 0x69, 0x73, 0xcd, 0x3f, 0xd7, 0xaa, 0xa3, 0x67, 0x88, - 0xe0, 0x6a, 0xb3, 0x42, 0xfe, 0x02, 0xa0, 0xf9, 0x12, 0xc5, 0x28, 0xc9, 0x4f, 0x66, 0xd8, 0x6d, - 0x8e, 0x07, 0xa3, 0xde, 0x32, 0x57, 0x7d, 0x11, 0x4a, 0xef, 0x7c, 0xe4, 0x26, 0x54, 0x0b, 0x3c, - 0xa7, 0xbd, 0x27, 0xfc, 0x84, 0x36, 0x85, 0x9f, 0xd0, 0xdb, 0x1f, 0xca, 0x4f, 0x88, 0xb3, 0xf2, - 0x4f, 0x8e, 0x8b, 0x13, 0x9e, 0xa8, 0x13, 0x57, 0x91, 0xf6, 0x05, 0xac, 0xeb, 0xd0, 0x59, 0x76, - 0xab, 0xcd, 0x43, 0xe1, 0xd2, 0x06, 0x6f, 0xe4, 0x34, 0xee, 0xe0, 0xd8, 0x75, 0x98, 0x27, 0xc3, - 0xea, 0x86, 0x08, 0x89, 0x86, 0xa6, 0x72, 0x60, 0x17, 0x4f, 0xe9, 0x8b, 0xc2, 0xdd, 0x6b, 0x0b, - 0xd1, 0xc5, 0x53, 0x3a, 0xae, 0x58, 0x38, 0x8d, 0xd4, 0xc9, 0xa3, 0x91, 0x90, 0x1b, 0x30, 0xb2, - 0x66, 0x3f, 0x2e, 0xed, 0x51, 0x91, 0xef, 0x72, 0x52, 0x6e, 0x7f, 0x08, 0x5c, 0xca, 0xff, 0x31, - 0xf7, 0x75, 0x78, 0xc6, 0x14, 0x68, 0xe4, 0xfb, 0x32, 0x70, 0x9e, 0x2f, 0x63, 0xd9, 0xca, 0x1a, - 0x0d, 0x02, 0xd6, 0x0f, 0x22, 0xa6, 0xde, 0xe5, 0xc8, 0x60, 0x3b, 0x1d, 0x0f, 0x5d, 0xe9, 0x0d, - 0xb1, 0x33, 0x84, 0x1d, 0xe7, 0x8b, 0x52, 0x2d, 0x38, 0x71, 0x2a, 0x3d, 0xd9, 0x84, 0xf1, 0xb5, - 0x3b, 0xa5, 0xb0, 0x5a, 0x1e, 0xb1, 0xbc, 0x98, 0xb6, 0x3b, 0x2a, 0x68, 0x69, 0x9e, 0x06, 0x2a, - 0x1b, 0xe1, 0x1d, 0xf0, 0x59, 0xd9, 0x1f, 0xe4, 0x75, 0xd5, 0xb7, 0x34, 0x87, 0xd2, 0xf3, 0x68, - 0xcb, 0x7e, 0x6c, 0xd9, 0x7b, 0x54, 0x7b, 0x25, 0x17, 0xda, 0xeb, 0x9f, 0xce, 0xc0, 0xc5, 0x9e, - 0x4d, 0x26, 0xb7, 0xe1, 0x82, 0xcd, 0x3d, 0xa6, 0xad, 0xfd, 0x20, 0xe8, 0xf8, 0x96, 0xbc, 0x62, - 0x08, 0x6f, 0x54, 0xf3, 0x9c, 0x28, 0x5e, 0x61, 0xa5, 0xf2, 0xd6, 0xe1, 0x93, 0xf7, 0xe0, 0x39, - 0xa7, 0xed, 0xd3, 0x7a, 0xd7, 0xa3, 0x96, 0x64, 0x50, 0x77, 0x1a, 0x9e, 0xe5, 0xd9, 0xed, 0x3d, - 0xe9, 0x5a, 0x6b, 0x5e, 0x94, 0x38, 0xc2, 0x2b, 0xbb, 0xec, 0x34, 0x3c, 0x13, 0x11, 0x8c, 0x7f, - 0x9a, 0x81, 0xf9, 0x5e, 0x5d, 0x42, 0xe6, 0x61, 0x94, 0x2a, 0xb9, 0x4b, 0xf2, 0xa6, 0xfc, 0x49, - 0x9e, 0x85, 0x68, 0xa7, 0x17, 0xa7, 0x7f, 0xbe, 0x2e, 0xf2, 0x48, 0xa0, 0x69, 0xbb, 0xba, 0xaf, - 0x0b, 0x03, 0xe5, 0x89, 0xba, 0xba, 0xbb, 0x3f, 0x0f, 0x10, 0x6d, 0xe7, 0x5c, 0x31, 0x61, 0x8e, - 0xd9, 0x75, 0x8f, 0xaf, 0x3c, 0x72, 0x1e, 0x46, 0xf8, 0x76, 0x29, 0xfc, 0x1f, 0xc4, 0x2f, 0x76, - 0x6e, 0x8b, 0x4e, 0xc6, 0x7d, 0x3e, 0xb7, 0x34, 0xa1, 0x75, 0xf6, 0x48, 0x0b, 0x07, 0xc7, 0xf8, - 0xa9, 0x49, 0x2e, 0x42, 0x94, 0xba, 0xc1, 0xbe, 0x14, 0x3a, 0x16, 0xd3, 0x1c, 0xc0, 0xb8, 0x2d, - 0xa5, 0x62, 0x97, 0xad, 0xbb, 0x7d, 0xc9, 0xb7, 0x9f, 0x6c, 0xea, 0xdb, 0xcf, 0x6b, 0x30, 0x56, - 0xde, 0xa7, 0xf5, 0x83, 0xd0, 0x09, 0x27, 0x2f, 0x94, 0xeb, 0x0c, 0xc8, 0xc3, 0x84, 0x47, 0x08, - 0xe4, 0x06, 0x00, 0xfa, 0x9d, 0x72, 0x89, 0x54, 0x49, 0xf5, 0x81, 0x6e, 0xaa, 0xc2, 0x3c, 0x45, - 0x41, 0x41, 0xf6, 0x35, 0xf3, 0x8e, 0x6a, 0xcf, 0xc2, 0xd9, 0xfb, 0xde, 0xae, 0x40, 0x8f, 0x10, - 0x58, 0xf3, 0x94, 0x7d, 0x45, 0x9c, 0x82, 0x85, 0xc4, 0xe6, 0xa3, 0x22, 0x91, 0xeb, 0x30, 0xb6, - 0x21, 0x1d, 0x09, 0xf0, 0x10, 0x9c, 0x40, 0x0a, 0x88, 0x9c, 0x0e, 0xe6, 0x33, 0x66, 0x84, 0x42, - 0x3e, 0x0b, 0xa3, 0x65, 0xea, 0x05, 0x9b, 0x9b, 0xab, 0x68, 0x74, 0xc2, 0x33, 0x62, 0xe4, 0x31, - 0x7b, 0x41, 0x10, 0x34, 0xbf, 0x7b, 0x5c, 0x9c, 0x0c, 0x9c, 0x16, 0x0d, 0x23, 0x7d, 0x9b, 0x12, - 0x9b, 0x2c, 0x41, 0x81, 0x3f, 0x8b, 0x47, 0x77, 0x0f, 0x3c, 0x19, 0xf3, 0xfc, 0x9c, 0x16, 0x6f, - 0xe8, 0x87, 0x74, 0x27, 0xcc, 0xdd, 0x90, 0xc0, 0x27, 0xcb, 0x32, 0xe5, 0x89, 0xda, 0x4c, 0x88, - 0x94, 0x61, 0xf1, 0x1d, 0x83, 0xb5, 0x36, 0x49, 0x41, 0x4a, 0x30, 0x59, 0x76, 0x5b, 0x1d, 0x3b, - 0x70, 0x30, 0x37, 0xe4, 0x91, 0x38, 0x04, 0x51, 0xa1, 0x57, 0x57, 0x0b, 0xb4, 0x13, 0x55, 0x2d, - 0x20, 0x77, 0x60, 0xca, 0x74, 0xbb, 0x6c, 0x98, 0xe4, 0x2d, 0x9c, 0x9f, 0x73, 0x68, 0x1a, 0xe2, - 0xb1, 0x12, 0x76, 0x2c, 0x8b, 0x2b, 0xb7, 0x16, 0x15, 0x55, 0xa3, 0x22, 0xeb, 0x29, 0xcf, 0x21, - 0xea, 0xe1, 0xa6, 0x66, 0x70, 0x48, 0x30, 0x4b, 0x79, 0x49, 0xb9, 0x05, 0xe3, 0xb5, 0xda, 0x83, - 0x4d, 0xea, 0x07, 0x77, 0x9a, 0xee, 0x21, 0x9e, 0x6d, 0x79, 0x91, 0x70, 0xcc, 0x77, 0xad, 0x80, - 0xfa, 0x81, 0xb5, 0xdb, 0x74, 0x0f, 0x4d, 0x15, 0x8b, 0x7c, 0x8d, 0xf5, 0x87, 0x22, 0x09, 0x8a, - 0xf8, 0xaf, 0xfd, 0x84, 0x55, 0x3c, 0x41, 0xa2, 0x45, 0xc3, 0x44, 0x56, 0xbd, 0xb3, 0x14, 0x74, - 0xf4, 0x29, 0xf3, 0xdc, 0xc7, 0x47, 0xa5, 0x46, 0xc3, 0xa3, 0xbe, 0x2f, 0x0e, 0x21, 0xee, 0x53, - 0x86, 0xca, 0x06, 0x9b, 0x17, 0x68, 0x3e, 0x65, 0x0a, 0x01, 0xf9, 0x91, 0x0c, 0x9c, 0x53, 0xbd, - 0x4d, 0x70, 0xb9, 0xa0, 0x99, 0x0b, 0x3f, 0x92, 0x5e, 0xbf, 0x2e, 0x0f, 0xe1, 0xeb, 0x0a, 0xda, - 0xf5, 0x47, 0x37, 0xaf, 0x97, 0xa2, 0x9f, 0x35, 0x49, 0x84, 0xb1, 0xec, 0x8a, 0xa9, 0xfc, 0xb4, - 0x7c, 0x3d, 0x73, 0x76, 0x0a, 0x31, 0x29, 0x33, 0x49, 0x8d, 0xcd, 0x28, 0x34, 0x9c, 0xaa, 0x6e, - 0xe0, 0x99, 0x26, 0x34, 0xaa, 0x62, 0xfe, 0x71, 0x13, 0x2b, 0xa7, 0xa3, 0x0b, 0x64, 0x0a, 0x0d, - 0xa9, 0xc2, 0x34, 0x07, 0xb0, 0x6d, 0x81, 0xa7, 0x3e, 0x9a, 0x8d, 0x92, 0x2f, 0x08, 0x36, 0xf8, - 0xd6, 0x8f, 0xe9, 0x8f, 0xd4, 0x80, 0xa5, 0x31, 0x3a, 0xf2, 0x1e, 0x4c, 0x61, 0x5c, 0xf9, 0x68, - 0xbd, 0xce, 0xe1, 0x2a, 0xc6, 0xb8, 0xab, 0xa2, 0x24, 0xe6, 0x79, 0x37, 0xe1, 0xfb, 0xfb, 0xd1, - 0x8a, 0x7e, 0x0f, 0xa6, 0xd0, 0x56, 0x27, 0x62, 0x70, 0x2e, 0x62, 0x20, 0x4a, 0xe2, 0x0c, 0x82, - 0xa6, 0x1f, 0x31, 0xf8, 0xbb, 0x19, 0xb8, 0xc8, 0x2a, 0x4a, 0x1f, 0xa1, 0xf3, 0x1f, 0x66, 0x84, - 0x30, 0x12, 0x65, 0x4f, 0x9e, 0xaa, 0x38, 0xea, 0xfb, 0xfb, 0x69, 0x1c, 0xf0, 0xa3, 0xd8, 0xc7, - 0xa7, 0x7f, 0xd4, 0x85, 0x0f, 0xfd, 0x51, 0x3d, 0x79, 0xaa, 0x1f, 0x15, 0x34, 0xfd, 0x34, 0x0e, - 0x78, 0xad, 0xad, 0x95, 0xd6, 0x56, 0xa3, 0xbb, 0xd9, 0x27, 0xcb, 0x6d, 0x45, 0x6b, 0x5b, 0x1f, - 0xb7, 0x95, 0x2d, 0xee, 0x16, 0xad, 0x74, 0x83, 0xbc, 0xd6, 0x6a, 0xe0, 0xf8, 0xb5, 0x36, 0x46, - 0x63, 0xc6, 0xb0, 0x8d, 0x5f, 0x82, 0x18, 0x5f, 0x61, 0xaa, 0x6a, 0xc0, 0x08, 0xbf, 0xb5, 0x8a, - 0x4e, 0x46, 0x9b, 0x05, 0x7e, 0xa7, 0x35, 0x45, 0x09, 0xb9, 0x08, 0xb9, 0x5a, 0xed, 0x81, 0xe8, - 0x64, 0x34, 0x58, 0xf5, 0x7d, 0xd7, 0x64, 0x30, 0x36, 0x42, 0x68, 0x85, 0xaa, 0xc4, 0xe9, 0x67, - 0xe7, 0x9d, 0x89, 0x50, 0xd6, 0xdf, 0xf2, 0x0e, 0x39, 0x14, 0xf5, 0xb7, 0xb8, 0x43, 0x46, 0x37, - 0xc7, 0x32, 0xcc, 0x97, 0x7c, 0x9f, 0x7a, 0x6c, 0x42, 0x08, 0xe3, 0x46, 0x4f, 0xdc, 0x73, 0xc4, - 0xc1, 0x8e, 0x95, 0xda, 0x75, 0xdf, 0xec, 0x89, 0x48, 0xae, 0x42, 0xbe, 0xd4, 0x6d, 0x38, 0xb4, - 0x5d, 0xd7, 0xe2, 0xac, 0xd9, 0x02, 0x66, 0x86, 0xa5, 0xe4, 0x8b, 0x70, 0x2e, 0x16, 0x04, 0x51, - 0xf4, 0xc0, 0x68, 0xb4, 0xf7, 0xca, 0x7b, 0x58, 0x64, 0x90, 0xc1, 0xbb, 0x24, 0x9d, 0x92, 0x94, - 0xa0, 0xb0, 0x8c, 0x6e, 0x5a, 0x15, 0xca, 0xdf, 0x86, 0x5c, 0x8f, 0xfb, 0xe7, 0xf1, 0x5b, 0xb3, - 0x08, 0xf5, 0xd8, 0x08, 0x0b, 0xcd, 0x04, 0x3a, 0xb9, 0x0f, 0xb3, 0x71, 0x18, 0x3b, 0xc1, 0xf9, - 0x05, 0x19, 0xf7, 0x9b, 0x04, 0x17, 0x3c, 0xc3, 0xd3, 0xa8, 0xc8, 0x0e, 0xcc, 0x44, 0x06, 0x49, - 0xfa, 0xb5, 0x59, 0xda, 0x39, 0x87, 0xe5, 0xf2, 0xea, 0xfc, 0xac, 0x98, 0x8c, 0xb3, 0x91, 0x71, - 0x53, 0x78, 0x7d, 0x36, 0x93, 0xec, 0x48, 0x03, 0xa6, 0x6a, 0xce, 0x5e, 0xdb, 0x69, 0xef, 0xdd, - 0xa7, 0x47, 0x1b, 0xb6, 0xe3, 0x09, 0x8b, 0x53, 0x69, 0x4f, 0x5e, 0xf2, 0x8f, 0x5a, 0x2d, 0x1a, - 0x78, 0xb8, 0x11, 0xb2, 0x72, 0xf4, 0x41, 0x67, 0xd7, 0xa1, 0x05, 0x9f, 0xd3, 0xa1, 0xdb, 0x66, - 0xc7, 0x76, 0x34, 0x21, 0x40, 0xe7, 0xa9, 0xa9, 0x2e, 0x26, 0x06, 0x54, 0x5d, 0x34, 0x61, 0x66, - 0xb9, 0x5d, 0xf7, 0x8e, 0xf0, 0x89, 0x4e, 0x7e, 0xdc, 0xe4, 0x29, 0x1f, 0xf7, 0x92, 0xf8, 0xb8, - 0xe7, 0x6c, 0x39, 0xc3, 0xd2, 0x3e, 0x2f, 0xc9, 0x98, 0xd4, 0x60, 0x06, 0x2f, 0x0e, 0xd5, 0xca, - 0x46, 0xb5, 0xed, 0x04, 0x8e, 0x1d, 0xd0, 0x86, 0x10, 0x2e, 0xc2, 0xec, 0x26, 0xfc, 0x8a, 0xea, - 0x34, 0x3a, 0x96, 0x23, 0x51, 0x54, 0xa6, 0x09, 0xfa, 0x7e, 0xf7, 0xc4, 0xe9, 0xbf, 0xa2, 0x7b, - 0x62, 0x15, 0xa6, 0xe3, 0xb1, 0x19, 0x0a, 0xd1, 0x39, 0xec, 0x63, 0x11, 0x3b, 0xce, 0xdd, 0x2e, - 0x0a, 0x93, 0x5a, 0x42, 0x51, 0x9d, 0x2e, 0x7e, 0xe5, 0x9c, 0xd1, 0xae, 0x9c, 0xda, 0xae, 0x74, - 0x86, 0x2b, 0x27, 0xd9, 0x00, 0xb8, 0xe3, 0x7a, 0x75, 0x5a, 0x42, 0xff, 0x68, 0xa2, 0xe5, 0x80, - 0x62, 0x4c, 0xa3, 0x42, 0xbe, 0x7e, 0x76, 0xd9, 0x6f, 0x2b, 0xee, 0xe6, 0xae, 0xf0, 0x30, 0x7e, - 0x34, 0x0b, 0xf3, 0xbd, 0x3e, 0xa7, 0xcf, 0x75, 0xef, 0x53, 0x90, 0x5c, 0xe1, 0xe2, 0xda, 0x57, - 0xa0, 0xf1, 0x75, 0xbe, 0x08, 0xe9, 0x0b, 0x59, 0x5c, 0x03, 0x67, 0xe3, 0x04, 0x5b, 0x5e, 0x93, - 0xdc, 0x86, 0x71, 0xe5, 0xe3, 0x71, 0x2f, 0xed, 0xd5, 0x54, 0x13, 0x76, 0xc3, 0xbf, 0xd9, 0x35, - 0x91, 0xef, 0x5b, 0xf2, 0x9a, 0xc8, 0x7f, 0x91, 0x02, 0x77, 0x11, 0x1f, 0xe1, 0x56, 0x00, 0xbe, - 0xef, 0x12, 0x02, 0xb8, 0x6f, 0xf3, 0x2d, 0xd0, 0xc4, 0xbf, 0x8d, 0xdf, 0x98, 0xe0, 0x27, 0xb2, - 0x7a, 0x4b, 0xec, 0x65, 0x1f, 0x1c, 0xbb, 0x3d, 0x66, 0xcf, 0x72, 0x7b, 0xcc, 0x9d, 0x7e, 0x7b, - 0x1c, 0x3a, 0xed, 0xf6, 0x18, 0xbb, 0xde, 0x0d, 0x9f, 0xf9, 0x7a, 0x37, 0x72, 0xa6, 0xeb, 0xdd, - 0xe8, 0x99, 0xae, 0x77, 0xda, 0x4d, 0x35, 0x7f, 0xda, 0x4d, 0xf5, 0x6f, 0x2e, 0x83, 0x4f, 0xeb, - 0x65, 0x30, 0x4d, 0xc4, 0x3b, 0xd3, 0x65, 0xf0, 0x87, 0x7b, 0xde, 0xe5, 0x0a, 0x1f, 0x46, 0x28, - 0x7f, 0x71, 0x80, 0xbb, 0xdc, 0xa0, 0x37, 0xb9, 0x99, 0x27, 0x73, 0x93, 0x23, 0x4f, 0xec, 0x26, - 0x37, 0xfb, 0x51, 0x6f, 0x72, 0x73, 0x4f, 0xf2, 0x26, 0x77, 0xee, 0xaf, 0xe3, 0x4d, 0xee, 0xfc, - 0xbf, 0x9e, 0x9b, 0xdc, 0xdf, 0x82, 0x42, 0x5c, 0xb8, 0x3c, 0x3d, 0x8c, 0xf1, 0x13, 0x8b, 0x21, - 0xc9, 0x44, 0xdf, 0xb8, 0x70, 0x47, 0x6e, 0x00, 0x6c, 0x78, 0xce, 0x23, 0x3b, 0xa0, 0xf7, 0xa5, - 0xf5, 0x9b, 0x08, 0xc1, 0xcd, 0xa1, 0x6c, 0xe4, 0x4d, 0x05, 0x25, 0xbc, 0xd7, 0x64, 0xd3, 0xee, - 0x35, 0xc6, 0x8f, 0x64, 0x61, 0x86, 0x07, 0x62, 0x7b, 0xfa, 0x1f, 0x61, 0xdf, 0xd5, 0x6e, 0xab, - 0xd2, 0xd6, 0x3a, 0xd6, 0xba, 0x3e, 0xcf, 0xb0, 0x5f, 0x85, 0x73, 0x89, 0xae, 0xc0, 0x1b, 0x6b, - 0x45, 0x86, 0xc0, 0x4b, 0xdc, 0x59, 0xe7, 0xd3, 0x2b, 0x79, 0x78, 0xcb, 0x4c, 0x50, 0x18, 0x7f, - 0x31, 0x94, 0xe0, 0x2f, 0x1e, 0x64, 0xd5, 0x27, 0xd6, 0xcc, 0xd9, 0x9e, 0x58, 0xb3, 0x83, 0x3d, - 0xb1, 0xc6, 0x84, 0x8a, 0xdc, 0x20, 0x42, 0xc5, 0x17, 0x61, 0x72, 0x93, 0xda, 0x2d, 0x7f, 0xd3, - 0x15, 0x49, 0x98, 0xb8, 0xaf, 0x85, 0x8c, 0x70, 0xc7, 0xca, 0xe4, 0x85, 0x2b, 0xb4, 0x19, 0x0d, - 0x18, 0x01, 0x3b, 0x06, 0x79, 0x56, 0x26, 0x53, 0xe7, 0xa0, 0xde, 0xa2, 0x87, 0xfb, 0xdc, 0xa2, - 0x6b, 0x30, 0x21, 0xe8, 0xa2, 0xd8, 0xcd, 0xd1, 0x75, 0x8f, 0x15, 0x21, 0x5c, 0xd6, 0x1e, 0x66, - 0x88, 0x0f, 0x6b, 0xe7, 0x37, 0x3d, 0x8d, 0x09, 0xeb, 0x82, 0xe5, 0x76, 0xa3, 0xe3, 0x3a, 0x6d, - 0xec, 0x82, 0xd1, 0xa8, 0x0b, 0xa8, 0x00, 0xf3, 0x2e, 0x50, 0x90, 0xc8, 0xdb, 0x30, 0x55, 0xda, - 0xa8, 0xaa, 0x64, 0xf9, 0xe8, 0x95, 0xd7, 0xee, 0x38, 0x96, 0x46, 0x1a, 0xc3, 0xed, 0x77, 0xf3, - 0x19, 0xfb, 0xab, 0xb9, 0xf9, 0x18, 0xff, 0x62, 0x42, 0x2e, 0xef, 0x8f, 0xf7, 0x81, 0x44, 0x7f, - 0xf2, 0xc8, 0x9d, 0xf1, 0xc9, 0x63, 0xe8, 0x34, 0x41, 0x52, 0x93, 0x6f, 0x87, 0xcf, 0x24, 0xdf, - 0x8e, 0x7c, 0xe4, 0xe7, 0x8b, 0xd1, 0x33, 0x4a, 0xac, 0xb1, 0xb5, 0x96, 0x1f, 0x64, 0xad, 0xa5, - 0x4a, 0xb9, 0x63, 0x1f, 0x5d, 0xca, 0x85, 0x33, 0x4b, 0xb9, 0xb5, 0xc8, 0x77, 0x79, 0xfc, 0x54, - 0x97, 0x90, 0xe7, 0x85, 0x56, 0x60, 0x26, 0x3d, 0x0a, 0x5f, 0xe8, 0xc5, 0xfc, 0x89, 0x12, 0x9d, - 0xbf, 0x9e, 0x2e, 0x3a, 0xf7, 0x3f, 0x6f, 0xce, 0x24, 0x3c, 0xff, 0xc8, 0x93, 0x15, 0x9e, 0x9f, - 0xec, 0x43, 0xc8, 0xdf, 0x88, 0xcf, 0x7f, 0x23, 0x3e, 0x0f, 0x28, 0x3e, 0x7b, 0xb8, 0xbc, 0xb6, - 0x6d, 0xaf, 0x8d, 0x6a, 0xa7, 0x1b, 0x30, 0x2a, 0xc3, 0x90, 0x66, 0x22, 0x8d, 0x72, 0x32, 0xfe, - 0xa8, 0xc4, 0x22, 0x8b, 0x90, 0x97, 0xc4, 0x6a, 0xa2, 0x9b, 0x43, 0x01, 0xd3, 0x22, 0x3c, 0x0a, - 0x98, 0xf1, 0xef, 0x0d, 0xc9, 0x2d, 0x9c, 0xcd, 0x99, 0x0d, 0xdb, 0xb3, 0x5b, 0x98, 0x46, 0x2e, - 0x5c, 0x61, 0x8a, 0xf0, 0x1e, 0x5b, 0x94, 0x31, 0xd3, 0x7e, 0x9d, 0xe4, 0x43, 0x05, 0x86, 0x8d, - 0x32, 0xf5, 0xe6, 0x06, 0xc8, 0xd4, 0xfb, 0xa6, 0x96, 0xe6, 0x76, 0x28, 0xca, 0xab, 0xc8, 0xb6, - 0xb5, 0xfe, 0x09, 0x6e, 0x6f, 0xab, 0xf9, 0x68, 0x87, 0xa3, 0xa8, 0x5e, 0x48, 0xd9, 0x27, 0x13, - 0x6d, 0x78, 0x1b, 0x19, 0x39, 0x4b, 0xc8, 0xe5, 0xd1, 0x7f, 0xad, 0x21, 0x97, 0x97, 0x01, 0xc4, - 0x51, 0x1b, 0x99, 0x27, 0xbc, 0x8c, 0xab, 0x5f, 0x98, 0x29, 0x07, 0x41, 0xb3, 0x47, 0x4e, 0x0e, - 0x85, 0xd0, 0xf8, 0x43, 0x02, 0x33, 0xb5, 0xda, 0x83, 0x8a, 0x63, 0xef, 0xb5, 0x5d, 0x3f, 0x70, - 0xea, 0xd5, 0xf6, 0xae, 0xcb, 0x44, 0xf1, 0xf0, 0x38, 0x50, 0x62, 0xeb, 0x46, 0x47, 0x41, 0x58, - 0xcc, 0xae, 0x7a, 0xcb, 0x9e, 0x27, 0xf5, 0xa3, 0xfc, 0xaa, 0x47, 0x19, 0xc0, 0xe4, 0x70, 0x26, - 0xed, 0xd6, 0xba, 0x18, 0xd9, 0x42, 0xd8, 0x8c, 0xa0, 0xb4, 0xeb, 0x73, 0x90, 0x29, 0xcb, 0x08, - 0x4d, 0x4e, 0x58, 0x71, 0xfb, 0xb9, 0xa0, 0x05, 0x6e, 0x8e, 0x8a, 0xf9, 0x61, 0x27, 0x84, 0x11, - 0xdc, 0x36, 0x3b, 0x08, 0x57, 0x2d, 0xe2, 0x12, 0x6b, 0xe0, 0x08, 0xce, 0x69, 0x3e, 0xcf, 0x83, - 0x3e, 0xa6, 0xbc, 0x2a, 0xa4, 0x6b, 0x03, 0x43, 0x6c, 0xa4, 0xbc, 0xa8, 0xa8, 0x79, 0xe1, 0x52, - 0x6b, 0x60, 0xe7, 0xd9, 0xf3, 0xa9, 0x25, 0xe1, 0xea, 0x1e, 0xd7, 0x82, 0x67, 0x2b, 0x9b, 0x06, - 0xcf, 0x80, 0xd7, 0xab, 0x6a, 0x2b, 0x65, 0x2b, 0xe8, 0x5f, 0x13, 0xf9, 0xad, 0x0c, 0x5c, 0xd0, - 0x30, 0xc2, 0xed, 0xca, 0x0f, 0xc3, 0x81, 0xa4, 0xce, 0xeb, 0x0f, 0x9e, 0xcc, 0xbc, 0x7e, 0x51, - 0x6f, 0x4b, 0xb4, 0xa1, 0xaa, 0x6d, 0xe8, 0xf5, 0x85, 0xe4, 0x11, 0xcc, 0x60, 0x91, 0x7c, 0xd8, - 0x61, 0x73, 0x56, 0xbc, 0x07, 0xcd, 0x45, 0x9f, 0xcd, 0xfd, 0xf8, 0x31, 0x8b, 0xf9, 0xe2, 0x77, - 0x8e, 0x8b, 0x93, 0x1a, 0xba, 0x0c, 0x47, 0x6d, 0x45, 0xaf, 0x43, 0x4e, 0x7b, 0xd7, 0xd5, 0x52, - 0xd4, 0xc7, 0xab, 0x20, 0xff, 0x65, 0x86, 0x3f, 0x27, 0xf0, 0x66, 0xdc, 0xf1, 0xdc, 0x56, 0x58, - 0x2e, 0x4d, 0x2b, 0x7b, 0x74, 0x5b, 0xf3, 0xc9, 0x74, 0xdb, 0xcb, 0xf8, 0xc9, 0x7c, 0x4f, 0xb0, - 0x76, 0x3d, 0xb7, 0x15, 0x7d, 0xbe, 0xda, 0x71, 0x3d, 0x3f, 0x92, 0x7c, 0x7f, 0x06, 0x2e, 0x6a, - 0x5a, 0x4d, 0x35, 0x37, 0x88, 0x88, 0x96, 0x30, 0x1b, 0xc6, 0x51, 0x89, 0x8a, 0x96, 0xae, 0x8b, - 0xf9, 0x7f, 0x05, 0xbf, 0x40, 0x09, 0xdb, 0xc9, 0x90, 0xac, 0x16, 0xc7, 0x52, 0x3e, 0xa1, 0x77, - 0x2d, 0xc4, 0x81, 0x19, 0xb4, 0xb2, 0xd1, 0x4c, 0x80, 0xe7, 0x7a, 0x9b, 0x00, 0x87, 0x59, 0x7f, - 0x30, 0x23, 0x40, 0x6f, 0x3b, 0xe0, 0x24, 0x57, 0xf2, 0xbd, 0x70, 0x31, 0x01, 0x0c, 0x57, 0xdb, - 0xb9, 0x9e, 0xab, 0xed, 0x53, 0x27, 0xc7, 0xc5, 0x57, 0xd2, 0x6a, 0x4b, 0x5b, 0x69, 0xbd, 0x6b, - 0x20, 0x36, 0x40, 0x54, 0x28, 0xc4, 0x8f, 0xf4, 0x09, 0xfa, 0x29, 0x31, 0x3f, 0x14, 0x7c, 0xb6, - 0x97, 0x2b, 0xdf, 0xa0, 0x1e, 0x79, 0x11, 0x12, 0xa1, 0x30, 0xa1, 0x64, 0x43, 0x38, 0x12, 0xc6, - 0x1e, 0x3d, 0x2a, 0xf9, 0xce, 0x71, 0x51, 0xc3, 0x66, 0x17, 0x22, 0x35, 0xcd, 0x82, 0x26, 0xed, - 0xa9, 0x88, 0xe4, 0xd7, 0x33, 0x30, 0xc7, 0x00, 0xd1, 0xa4, 0x12, 0x8d, 0x9a, 0xef, 0x37, 0xeb, - 0xf7, 0x9f, 0xcc, 0xac, 0x7f, 0x01, 0xbf, 0x51, 0x9d, 0xf5, 0x89, 0x2e, 0x49, 0xfd, 0x38, 0x9c, - 0xed, 0x9a, 0x41, 0x97, 0x36, 0xdb, 0x2f, 0x0e, 0x30, 0xdb, 0xf9, 0x00, 0x9c, 0x3e, 0xdb, 0x7b, - 0xd6, 0x42, 0x36, 0x61, 0x42, 0xdc, 0x85, 0x78, 0x87, 0x5d, 0xd2, 0xc2, 0x38, 0xab, 0x45, 0xfc, - 0x82, 0x2a, 0x92, 0x45, 0x24, 0x5a, 0xa8, 0x71, 0x21, 0x6d, 0x98, 0xe5, 0xbf, 0x75, 0xdd, 0x54, - 0xb1, 0xa7, 0x6e, 0xea, 0xaa, 0x68, 0xd1, 0x65, 0xc1, 0x3f, 0xa6, 0xa2, 0x52, 0xc3, 0x2f, 0xa5, - 0x30, 0x26, 0x1d, 0x20, 0x1a, 0x98, 0x2f, 0xda, 0xcb, 0xfd, 0x35, 0x52, 0xaf, 0x88, 0x3a, 0x8b, - 0xf1, 0x3a, 0xe3, 0x2b, 0x37, 0x85, 0x37, 0xb1, 0x61, 0x5a, 0x40, 0xdd, 0x03, 0xca, 0x77, 0xf8, - 0x17, 0xb4, 0x00, 0x58, 0xb1, 0x52, 0x7e, 0x89, 0x92, 0x35, 0x61, 0x80, 0xb2, 0xd8, 0x86, 0x1e, - 0xe7, 0x47, 0x1e, 0xc0, 0x4c, 0xa9, 0xd3, 0x69, 0x3a, 0xb4, 0x81, 0xad, 0x34, 0xbb, 0xac, 0x4d, - 0x46, 0x94, 0x6f, 0xcd, 0xe6, 0x85, 0xe2, 0x66, 0xe7, 0x75, 0x63, 0xdb, 0x4d, 0x82, 0xd6, 0xf8, - 0xe1, 0x4c, 0xe2, 0xa3, 0xc9, 0x6b, 0x30, 0x86, 0x3f, 0x94, 0x98, 0x2a, 0xa8, 0xe2, 0xe1, 0x9f, - 0x88, 0xca, 0xa3, 0x08, 0x81, 0x09, 0x4b, 0x6a, 0x5c, 0xc5, 0x1c, 0x17, 0x96, 0x84, 0x5e, 0x21, - 0xd2, 0x24, 0x14, 0xa5, 0x6b, 0x46, 0x2e, 0x12, 0xba, 0xd0, 0x35, 0x43, 0x38, 0x64, 0x18, 0xdf, - 0x9f, 0xd5, 0xa7, 0x1d, 0xb9, 0xaa, 0xc8, 0xed, 0x4a, 0x64, 0x47, 0x29, 0xb7, 0x2b, 0xd2, 0xfa, - 0x3f, 0xcc, 0xc0, 0xec, 0x03, 0x6f, 0xcf, 0x6e, 0x3b, 0xdf, 0xe4, 0x61, 0xb4, 0x5d, 0x1c, 0x97, - 0xfe, 0xa9, 0x2b, 0x9f, 0x54, 0x0a, 0x3e, 0x57, 0xa9, 0x98, 0xcd, 0x14, 0x9c, 0x32, 0x66, 0xda, - 0xf7, 0xa0, 0xb3, 0x1b, 0x7e, 0x98, 0x92, 0x09, 0x91, 0xa3, 0x73, 0xb8, 0xf1, 0xe3, 0x59, 0x18, - 0x57, 0x96, 0x00, 0xf9, 0x0c, 0x4c, 0xa8, 0x7c, 0x54, 0x85, 0x9f, 0x5a, 0xad, 0xa9, 0x61, 0xa1, - 0xc6, 0x8f, 0xda, 0x2d, 0x4d, 0xe3, 0xc7, 0x26, 0x3a, 0x42, 0xcf, 0x78, 0xb5, 0x79, 0x2f, 0xe5, - 0x6a, 0x83, 0xd3, 0x56, 0xd1, 0xd8, 0xf4, 0xbd, 0xe0, 0xbc, 0x9d, 0xbc, 0xe0, 0xa0, 0xf2, 0x48, - 0xa1, 0xef, 0x7d, 0xcd, 0x31, 0x7e, 0x2a, 0x03, 0x85, 0xf8, 0x22, 0xfd, 0x58, 0x7a, 0xe5, 0x0c, - 0xaf, 0x3b, 0x3f, 0x96, 0x0d, 0x53, 0xa1, 0x48, 0x17, 0xde, 0xa7, 0xd5, 0x4c, 0xf0, 0x1d, 0xed, - 0xe1, 0xe5, 0x59, 0x3d, 0x1a, 0x9d, 0x1a, 0xfc, 0x22, 0x3d, 0x04, 0xe5, 0xd0, 0xcf, 0xfd, 0x62, - 0xf1, 0x19, 0xe3, 0x7d, 0x98, 0x8b, 0x77, 0x07, 0x3e, 0xbe, 0x94, 0x60, 0x5a, 0x87, 0xc7, 0x13, - 0x29, 0xc5, 0xa9, 0xcc, 0x38, 0xbe, 0xf1, 0xc7, 0xd9, 0x38, 0x6f, 0x61, 0x32, 0xc8, 0x36, 0x1d, - 0xd5, 0x10, 0x46, 0x6c, 0x3a, 0x1c, 0x64, 0xca, 0xb2, 0xb3, 0x24, 0x30, 0x0b, 0x1d, 0x51, 0x73, - 0xe9, 0x8e, 0xa8, 0xe4, 0x76, 0xcc, 0x4a, 0x5a, 0x89, 0x9a, 0x74, 0x48, 0x77, 0xac, 0xc8, 0x52, - 0x3a, 0x66, 0x1c, 0x5d, 0x86, 0x39, 0x2d, 0x04, 0xb8, 0xa4, 0x1f, 0x8e, 0x74, 0xed, 0x01, 0x16, - 0x70, 0xe2, 0x54, 0x64, 0xb2, 0x02, 0xa3, 0xec, 0x33, 0xd7, 0xec, 0x8e, 0x78, 0x53, 0x21, 0xa1, - 0x5b, 0x7a, 0x33, 0xbc, 0xf0, 0x29, 0x9e, 0xe9, 0x4d, 0xca, 0x8e, 0x7c, 0x75, 0x62, 0x09, 0x44, - 0xe3, 0x9f, 0x67, 0xd8, 0xfa, 0xaf, 0x1f, 0x7c, 0xc2, 0xb2, 0xa0, 0xb1, 0x26, 0xf5, 0xb1, 0x68, - 0xfd, 0xd3, 0x2c, 0xcf, 0x85, 0x23, 0xa6, 0xcf, 0x9b, 0x30, 0xb2, 0x69, 0x7b, 0x7b, 0x22, 0x6b, - 0xb4, 0xce, 0x85, 0x17, 0x44, 0x31, 0x9d, 0x02, 0xfc, 0x6d, 0x0a, 0x02, 0x55, 0x17, 0x96, 0x1d, - 0x48, 0x17, 0xa6, 0xe8, 0xe5, 0x73, 0x4f, 0x4c, 0x2f, 0xff, 0x3d, 0x61, 0xda, 0x9b, 0x52, 0x30, - 0x40, 0x84, 0xe9, 0xcb, 0xf1, 0xb4, 0x51, 0x89, 0x58, 0xe0, 0x11, 0x3b, 0x72, 0x5b, 0x4d, 0x44, - 0xa5, 0xf8, 0x76, 0x9e, 0x92, 0x72, 0xca, 0xf8, 0xd3, 0x1c, 0xef, 0x63, 0xd1, 0x51, 0x57, 0x34, - 0xbf, 0x6f, 0x5c, 0x27, 0x6c, 0xa3, 0x57, 0x43, 0x70, 0xa0, 0xd9, 0xd4, 0x15, 0x18, 0x62, 0x73, - 0x53, 0xf4, 0x26, 0xe2, 0xb1, 0xf9, 0xab, 0xe2, 0xb1, 0x72, 0xb6, 0x96, 0xf1, 0x4c, 0x52, 0x33, - 0x0c, 0xe2, 0xb1, 0xa5, 0xae, 0x65, 0xc4, 0x20, 0x57, 0x61, 0x68, 0xdd, 0x6d, 0xc8, 0x48, 0xe6, - 0x73, 0x18, 0xfd, 0x43, 0x4b, 0x61, 0x3a, 0x9f, 0x31, 0x11, 0x83, 0xb5, 0x35, 0xcc, 0xff, 0xa0, - 0xb6, 0xb5, 0xb5, 0x6b, 0x27, 0x33, 0xc7, 0x29, 0x49, 0x67, 0x96, 0x61, 0x4a, 0xcf, 0xd7, 0x2f, - 0xec, 0x7d, 0x51, 0xbb, 0x1e, 0x4b, 0xfb, 0xaf, 0x3e, 0x8b, 0xe8, 0x44, 0x64, 0x09, 0x26, 0xb5, - 0x08, 0xaa, 0xe2, 0x71, 0x13, 0xd5, 0x9b, 0x7a, 0xfc, 0x55, 0x55, 0xbd, 0xa9, 0x91, 0xb0, 0xf3, - 0x5c, 0x7c, 0xbf, 0xf2, 0xc4, 0x99, 0xf8, 0x76, 0x81, 0x43, 0x6e, 0x41, 0x9e, 0x87, 0xd9, 0xa8, - 0x56, 0xd4, 0x67, 0x2a, 0x1f, 0x61, 0xb1, 0x30, 0x35, 0x12, 0x51, 0x09, 0xab, 0xf0, 0x69, 0x28, - 0x88, 0x2d, 0x29, 0x4a, 0x7e, 0xfe, 0x1c, 0x0c, 0x95, 0xab, 0x15, 0x53, 0xdd, 0x46, 0xea, 0x4e, - 0xc3, 0x33, 0x11, 0x8a, 0x5e, 0x75, 0xeb, 0x34, 0x38, 0x74, 0xbd, 0x03, 0x93, 0xfa, 0x81, 0xe7, - 0xf0, 0x04, 0x95, 0xb8, 0x10, 0x3f, 0x43, 0xde, 0x86, 0x61, 0x34, 0x3c, 0x8d, 0x9d, 0x0c, 0xf1, - 0x3a, 0x96, 0x26, 0xc5, 0x04, 0x1e, 0x46, 0x2b, 0x56, 0x93, 0x13, 0x91, 0x37, 0x61, 0xa8, 0x42, - 0xdb, 0x47, 0xb1, 0xdc, 0x79, 0x09, 0xe2, 0x70, 0x43, 0x68, 0xd0, 0xf6, 0x91, 0x89, 0x24, 0xc6, - 0x4f, 0x65, 0xe1, 0x5c, 0xca, 0x67, 0x3d, 0xfc, 0xcc, 0x53, 0xba, 0x2b, 0x2e, 0x69, 0xbb, 0xa2, - 0x7c, 0x9f, 0xee, 0xd9, 0xf1, 0xa9, 0x9b, 0xe4, 0xcf, 0x67, 0xe0, 0x82, 0x3e, 0x41, 0x85, 0xa5, - 0xf9, 0xc3, 0x5b, 0xe4, 0x2d, 0x18, 0x59, 0xa1, 0x76, 0x83, 0xca, 0xbc, 0x5a, 0xe7, 0xc2, 0x80, - 0x78, 0x3c, 0x86, 0x00, 0x2f, 0xe4, 0x6c, 0x23, 0x8f, 0x53, 0x0e, 0x25, 0x15, 0xf1, 0x71, 0x5c, - 0x1e, 0x37, 0x64, 0x3c, 0x8f, 0xb4, 0xaa, 0xfa, 0x58, 0x79, 0x7c, 0x27, 0x03, 0xcf, 0xf6, 0xa1, - 0x61, 0x03, 0xc7, 0x86, 0x5e, 0x1d, 0x38, 0x3c, 0x51, 0x11, 0x4a, 0xde, 0x85, 0xe9, 0x4d, 0x21, - 0xcf, 0xcb, 0xe1, 0xc8, 0x46, 0xeb, 0x45, 0x8a, 0xfa, 0x96, 0x1c, 0x97, 0x38, 0xb2, 0x16, 0x68, - 0x26, 0xd7, 0x37, 0xd0, 0x8c, 0x1a, 0xb7, 0x65, 0x68, 0xd0, 0xb8, 0x2d, 0xef, 0xc3, 0x9c, 0xde, - 0x36, 0x11, 0x3e, 0x37, 0x8a, 0x5a, 0x93, 0xe9, 0x1d, 0xb5, 0xa6, 0x6f, 0x90, 0x4e, 0xe3, 0xc7, - 0x33, 0x50, 0xd0, 0x79, 0x7f, 0xd4, 0xf1, 0x7c, 0x47, 0x1b, 0xcf, 0x67, 0xd3, 0xc7, 0xb3, 0xf7, - 0x40, 0xfe, 0x5f, 0x99, 0x78, 0x63, 0x07, 0x1a, 0x41, 0x03, 0x46, 0x2a, 0x6e, 0xcb, 0x76, 0xda, - 0x6a, 0x2e, 0xfd, 0x06, 0x42, 0x4c, 0x51, 0x32, 0x58, 0x90, 0x9f, 0xcb, 0x30, 0xbc, 0xee, 0xb6, - 0x4b, 0x15, 0x61, 0xd2, 0x8b, 0x7c, 0xda, 0x6e, 0xdb, 0xb2, 0x1b, 0x26, 0x2f, 0x20, 0xab, 0x00, - 0xb5, 0xba, 0x47, 0x69, 0xbb, 0xe6, 0x7c, 0x93, 0xc6, 0x24, 0x0d, 0xd6, 0x43, 0xcd, 0x2e, 0x6e, - 0x2c, 0xfc, 0xe9, 0x12, 0x11, 0x2d, 0xdf, 0xf9, 0xa6, 0xba, 0xdf, 0x2a, 0xf4, 0xb8, 0xae, 0x44, - 0x1c, 0xb4, 0xd8, 0x38, 0xdc, 0xfc, 0x38, 0xd6, 0x55, 0x6a, 0x55, 0xd8, 0xc3, 0x37, 0x53, 0x87, - 0xe3, 0x8f, 0x32, 0xf0, 0x6c, 0x1f, 0x9a, 0x27, 0x30, 0x2a, 0x7f, 0xd5, 0x1d, 0x4e, 0x01, 0x22, - 0x22, 0x4c, 0x4d, 0xec, 0x34, 0x02, 0x9e, 0x2b, 0x6f, 0x52, 0xa4, 0x26, 0x66, 0x00, 0x2d, 0x35, - 0x31, 0x03, 0xb0, 0xb3, 0x74, 0x85, 0x3a, 0x7b, 0xfb, 0xdc, 0x3c, 0x6b, 0x92, 0xef, 0x0d, 0xfb, - 0x08, 0x51, 0xcf, 0x52, 0x8e, 0x63, 0xfc, 0xcb, 0x61, 0xb8, 0x68, 0xd2, 0x3d, 0x87, 0xdd, 0x4b, - 0xb6, 0x7c, 0xa7, 0xbd, 0xa7, 0xc5, 0xbd, 0x31, 0x62, 0x2b, 0x57, 0x24, 0x89, 0x60, 0x90, 0x70, - 0x26, 0x5e, 0x83, 0x3c, 0x13, 0x43, 0x94, 0xc5, 0x8b, 0x8f, 0x56, 0x4c, 0x58, 0x11, 0x81, 0x95, - 0x65, 0x31, 0x79, 0x55, 0x88, 0x49, 0x4a, 0x1a, 0x1f, 0x26, 0x26, 0x7d, 0xf7, 0xb8, 0x08, 0xb5, - 0x23, 0x3f, 0xa0, 0x78, 0x45, 0x16, 0xa2, 0x52, 0x78, 0x97, 0x19, 0xea, 0x71, 0x97, 0x59, 0x83, - 0xb9, 0x52, 0x83, 0x9f, 0x8e, 0x76, 0x73, 0xc3, 0x73, 0xda, 0x75, 0xa7, 0x63, 0x37, 0xe5, 0xfd, - 0x1c, 0x7b, 0xd9, 0x0e, 0xcb, 0xad, 0x4e, 0x88, 0x60, 0xa6, 0x92, 0xb1, 0x66, 0x54, 0xd6, 0x6b, - 0x18, 0x1e, 0x46, 0xbc, 0x47, 0x62, 0x33, 0x1a, 0x6d, 0x1f, 0x5b, 0xe1, 0x9b, 0x61, 0x31, 0xde, - 0xa2, 0xf0, 0x41, 0x7e, 0x73, 0xb5, 0x16, 0xb9, 0x34, 0xf3, 0x2c, 0x03, 0xfc, 0x61, 0x3f, 0x68, - 0xfa, 0x68, 0x0a, 0xa9, 0xe1, 0x45, 0x74, 0xb5, 0xda, 0x0a, 0xa3, 0xcb, 0x27, 0xe8, 0x7c, 0x7f, - 0x5f, 0xa5, 0xe3, 0x78, 0xe4, 0x06, 0x9b, 0x0a, 0x2d, 0x37, 0xa0, 0x38, 0x85, 0xc7, 0xa2, 0x3b, - 0x97, 0x87, 0x50, 0x7e, 0xe7, 0x52, 0x50, 0xc8, 0xdb, 0x30, 0xbb, 0x5c, 0x5e, 0x94, 0x5a, 0xe4, - 0x8a, 0x5b, 0xef, 0xe2, 0x43, 0x3c, 0x60, 0x7d, 0x38, 0x86, 0xb4, 0xbe, 0xc8, 0x76, 0x93, 0x34, - 0x34, 0x72, 0x05, 0x46, 0xab, 0x15, 0xde, 0xf7, 0xe3, 0x6a, 0x2a, 0x2d, 0x61, 0x19, 0x25, 0x0b, - 0xc9, 0x83, 0xe8, 0x52, 0x30, 0x71, 0xaa, 0xf4, 0x7e, 0x71, 0x80, 0x0b, 0xc1, 0x9b, 0x30, 0xb9, - 0xe4, 0x06, 0xd5, 0xb6, 0x1f, 0xd8, 0xed, 0x3a, 0xad, 0x56, 0xd4, 0xb8, 0xd6, 0x3b, 0x6e, 0x60, - 0x39, 0xa2, 0x84, 0x7d, 0xb9, 0x8e, 0x49, 0x3e, 0x87, 0xa4, 0x77, 0x69, 0x9b, 0x7a, 0x51, 0x3c, - 0xeb, 0x61, 0xde, 0xb7, 0x8c, 0x74, 0x2f, 0x2c, 0x31, 0x75, 0x44, 0x91, 0xe6, 0x8b, 0x27, 0xe7, - 0x2c, 0xbb, 0x0d, 0xea, 0xf3, 0xdd, 0xe2, 0x13, 0x94, 0xe6, 0x4b, 0x69, 0x5b, 0x9f, 0x1d, 0xf4, - 0xdf, 0xc2, 0x34, 0x5f, 0x09, 0x5c, 0xf2, 0x39, 0x18, 0xc6, 0x9f, 0x42, 0xba, 0x9d, 0x4d, 0x61, - 0x1b, 0x49, 0xb6, 0x75, 0x86, 0x69, 0x72, 0x02, 0x52, 0x85, 0x51, 0x71, 0xb1, 0x3a, 0x4b, 0xb2, - 0x1a, 0x71, 0x43, 0xe3, 0x33, 0x43, 0xd0, 0x1b, 0x0d, 0x98, 0x50, 0x2b, 0x64, 0x2b, 0x62, 0xc5, - 0xf6, 0xf7, 0x69, 0x83, 0xfd, 0x12, 0x79, 0xe6, 0x70, 0x45, 0xec, 0x23, 0xd4, 0x62, 0xdf, 0x61, - 0x2a, 0x28, 0xec, 0x4c, 0xad, 0xfa, 0x5b, 0xbe, 0xf8, 0x14, 0xa1, 0x6a, 0x71, 0x50, 0x6d, 0xd7, - 0x30, 0x45, 0x91, 0xf1, 0x3d, 0x30, 0xb7, 0xde, 0x6d, 0x36, 0xed, 0x9d, 0x26, 0x95, 0x79, 0x48, - 0x30, 0x83, 0xf7, 0x12, 0x0c, 0xd7, 0x94, 0x9c, 0xe0, 0x61, 0x2e, 0x48, 0x05, 0x07, 0x8d, 0x50, - 0x33, 0x18, 0xaa, 0x27, 0x96, 0x0d, 0x9c, 0x93, 0x1a, 0x7f, 0x90, 0x81, 0x39, 0xf9, 0xfe, 0xef, - 0xd9, 0xf5, 0x83, 0x30, 0x31, 0xfc, 0x15, 0x6d, 0xae, 0xe1, 0x84, 0x8d, 0x4d, 0x23, 0x3e, 0xeb, - 0xee, 0xc9, 0x8f, 0xd0, 0x05, 0x96, 0xb4, 0x0f, 0x3e, 0xed, 0x63, 0xc8, 0xdb, 0x30, 0x2e, 0x8e, - 0x47, 0x25, 0xc0, 0x24, 0x46, 0xf1, 0x12, 0xd7, 0xbd, 0xb8, 0x35, 0x8a, 0x8a, 0x8e, 0xb2, 0x98, - 0xde, 0x94, 0x8f, 0x2a, 0x03, 0xa4, 0xcb, 0x62, 0x7a, 0x1d, 0x7d, 0xa6, 0xee, 0xef, 0x8c, 0xc7, - 0xfb, 0x56, 0xcc, 0xdd, 0xdb, 0x6a, 0x48, 0xb9, 0x4c, 0x74, 0x33, 0x8e, 0x42, 0xca, 0xa9, 0x37, - 0xe3, 0x10, 0x35, 0x1c, 0x93, 0xec, 0x29, 0x63, 0xf2, 0xae, 0x1c, 0x93, 0x5c, 0xef, 0x89, 0x31, - 0xdb, 0x67, 0x1c, 0x6a, 0xd1, 0x0a, 0x19, 0x1a, 0x48, 0xad, 0xf2, 0x0c, 0xc6, 0xce, 0xe7, 0x24, - 0xf1, 0x5d, 0x54, 0x70, 0x52, 0x75, 0x35, 0xc3, 0x83, 0x33, 0x3d, 0x65, 0x6b, 0xfe, 0x3c, 0x4c, - 0x94, 0x82, 0xc0, 0xae, 0xef, 0xd3, 0x46, 0x85, 0x6d, 0x4f, 0x4a, 0xf4, 0x2b, 0x5b, 0xc0, 0xd5, - 0x47, 0x33, 0x15, 0x97, 0x47, 0x73, 0xb5, 0x7d, 0x61, 0xcc, 0x1a, 0x46, 0x73, 0x65, 0x10, 0x3d, - 0x9a, 0x2b, 0x83, 0x90, 0x1b, 0x30, 0x5a, 0x6d, 0x3f, 0x72, 0x58, 0x9f, 0xf0, 0x00, 0x58, 0xa8, - 0x9b, 0x72, 0x38, 0x48, 0xdd, 0x5c, 0x05, 0x16, 0x79, 0x53, 0xb9, 0xd4, 0x8c, 0x45, 0x0a, 0x0c, - 0xae, 0xf2, 0x0a, 0x23, 0xdc, 0xa8, 0x17, 0x96, 0xf0, 0x96, 0x73, 0x1b, 0x46, 0xa5, 0x26, 0x13, - 0x22, 0xa5, 0x85, 0xa0, 0x4c, 0x06, 0x8c, 0x90, 0xc8, 0x98, 0xe4, 0x5b, 0xc9, 0x97, 0x37, 0xae, - 0x24, 0xf9, 0x56, 0xf2, 0xe5, 0x69, 0x49, 0xbe, 0x95, 0xcc, 0x79, 0xa1, 0x12, 0x68, 0xe2, 0x54, - 0x25, 0xd0, 0x43, 0x98, 0xd8, 0xb0, 0xbd, 0xc0, 0x61, 0x32, 0x4a, 0x3b, 0xf0, 0xe7, 0x27, 0x35, - 0xbd, 0xa9, 0x52, 0xb4, 0x74, 0x49, 0xe6, 0xa5, 0xee, 0x28, 0xf8, 0x7a, 0x02, 0xe5, 0x08, 0x9e, - 0x6e, 0xca, 0x3a, 0xf5, 0x51, 0x4c, 0x59, 0xb1, 0x53, 0x51, 0x57, 0x36, 0x1d, 0x69, 0x64, 0xf0, - 0xd2, 0x12, 0x53, 0x98, 0x85, 0x88, 0xe4, 0x2b, 0x30, 0xc1, 0xfe, 0xde, 0x70, 0x9b, 0x4e, 0xdd, - 0xa1, 0xfe, 0x7c, 0x01, 0x1b, 0x77, 0x29, 0x75, 0xf5, 0x23, 0xd2, 0x51, 0x8d, 0x06, 0x7c, 0x01, - 0x23, 0xe3, 0xb8, 0x12, 0x5c, 0xe3, 0x46, 0xde, 0x83, 0x09, 0x36, 0xfb, 0x76, 0x6c, 0x9f, 0x8b, - 0xa6, 0x33, 0x91, 0x31, 0x72, 0x43, 0xc0, 0x13, 0x01, 0x95, 0x55, 0x02, 0x76, 0xcc, 0x97, 0x3a, - 0x7c, 0x83, 0x24, 0xca, 0x6c, 0xef, 0x24, 0x36, 0x47, 0x89, 0x46, 0xbe, 0x00, 0x13, 0xa5, 0x4e, - 0x27, 0xda, 0x71, 0x66, 0x15, 0x45, 0x58, 0xa7, 0x63, 0xa5, 0xee, 0x3a, 0x1a, 0x45, 0x7c, 0x63, - 0x9e, 0x3b, 0xd3, 0xc6, 0x4c, 0x5e, 0x0f, 0xa5, 0xf5, 0x73, 0x91, 0x56, 0x57, 0x5c, 0x1c, 0x35, - 0xd1, 0x9f, 0x0b, 0xee, 0x65, 0x98, 0xe4, 0x6a, 0x4e, 0x29, 0xcd, 0x9c, 0x4f, 0xac, 0x9e, 0x14, - 0xa1, 0x46, 0xa7, 0x21, 0xcb, 0x30, 0xc5, 0xbd, 0xad, 0x9b, 0x22, 0xd2, 0xf5, 0xfc, 0x05, 0x5c, - 0xb5, 0xc8, 0x85, 0x3b, 0x69, 0x37, 0x31, 0x01, 0x8a, 0xad, 0x71, 0x89, 0x11, 0x19, 0x7f, 0x96, - 0x81, 0x0b, 0x3d, 0x46, 0x3c, 0x8c, 0x83, 0x9c, 0xe9, 0x1f, 0x07, 0x99, 0xed, 0x1c, 0xba, 0x56, - 0x04, 0xdb, 0x2f, 0xa4, 0x2c, 0x75, 0xbc, 0xa4, 0xbc, 0xe5, 0x02, 0x11, 0x39, 0x86, 0x44, 0xd5, - 0xf7, 0x5c, 0x54, 0xcd, 0xe6, 0x92, 0x87, 0x90, 0xc0, 0xe3, 0x1f, 0xb5, 0x64, 0x9c, 0x1c, 0x17, - 0x2f, 0x89, 0x14, 0x46, 0xe1, 0xb0, 0x7e, 0xe0, 0x6a, 0x2b, 0x38, 0x85, 0xb5, 0x71, 0x9c, 0x81, - 0x71, 0x65, 0x1d, 0x92, 0xcb, 0x8a, 0x17, 0x70, 0x81, 0x27, 0xc1, 0x52, 0x38, 0x64, 0xf9, 0x49, - 0x84, 0x8b, 0x2a, 0x7b, 0xba, 0x02, 0x7a, 0x8d, 0x89, 0x42, 0x4a, 0xac, 0xe8, 0x96, 0xa6, 0x2d, - 0x36, 0xb1, 0x1c, 0xd3, 0xe9, 0xdb, 0x7e, 0x50, 0xaa, 0x07, 0xce, 0x23, 0x3a, 0xc0, 0xa1, 0x13, - 0xa5, 0xd3, 0xb7, 0xfd, 0xc0, 0xb2, 0x91, 0x2c, 0x91, 0x4e, 0x3f, 0x64, 0x68, 0xfc, 0x40, 0x06, - 0x60, 0xab, 0x5a, 0xc6, 0x60, 0xef, 0x1f, 0x55, 0x28, 0x48, 0x0f, 0xa0, 0x2b, 0xb9, 0xf7, 0x11, - 0x07, 0xfe, 0xc7, 0x0c, 0x4c, 0xe9, 0x68, 0xe4, 0x5d, 0x98, 0xae, 0xd5, 0x3d, 0xb7, 0xd9, 0xdc, - 0xb1, 0xeb, 0x07, 0xab, 0x4e, 0x9b, 0xf2, 0xd0, 0xa5, 0xc3, 0xfc, 0x2c, 0xf2, 0xc3, 0x22, 0xab, - 0xc9, 0xca, 0xcc, 0x38, 0x32, 0xf9, 0xc1, 0x0c, 0x4c, 0xd6, 0xf6, 0xdd, 0xc3, 0x30, 0xda, 0xa8, - 0x18, 0x90, 0xaf, 0xb2, 0xb5, 0xed, 0xef, 0xbb, 0x87, 0x51, 0x06, 0x4d, 0xcd, 0xf8, 0xf3, 0x9d, - 0xc1, 0xde, 0xe5, 0xeb, 0x2e, 0xde, 0x64, 0x02, 0xff, 0xba, 0x56, 0x89, 0xa9, 0xd7, 0x69, 0xfc, - 0x65, 0x06, 0xc6, 0xf1, 0xce, 0xd3, 0x6c, 0xa2, 0xcc, 0xf5, 0x49, 0x4a, 0xc7, 0x18, 0xb6, 0xab, - 0xcf, 0xc0, 0xbe, 0x01, 0xd3, 0x31, 0x34, 0x62, 0xc0, 0x48, 0x0d, 0x1d, 0xfc, 0x55, 0x05, 0x05, - 0x77, 0xf9, 0x37, 0x45, 0x89, 0xb1, 0xac, 0x90, 0x3d, 0xbc, 0x89, 0xcf, 0xba, 0x8b, 0x00, 0x8e, - 0x04, 0xc9, 0x9b, 0x0d, 0x89, 0x7f, 0xc9, 0xc3, 0x9b, 0xa6, 0x82, 0x65, 0xac, 0xc3, 0x48, 0xcd, - 0xf5, 0x82, 0xa5, 0x23, 0x7e, 0x99, 0xa8, 0x50, 0xbf, 0xae, 0xbe, 0xdb, 0x3a, 0xf8, 0x56, 0x52, - 0x37, 0x45, 0x11, 0x29, 0xc2, 0xf0, 0x1d, 0x87, 0x36, 0x1b, 0xaa, 0x81, 0xee, 0x2e, 0x03, 0x98, - 0x1c, 0xce, 0x2e, 0x5c, 0xe7, 0xa3, 0x9c, 0x28, 0x91, 0x25, 0xf0, 0x47, 0x5d, 0x37, 0x65, 0xad, - 0x7f, 0x5f, 0x08, 0xf3, 0x10, 0x24, 0x6b, 0xea, 0xd3, 0xd5, 0xff, 0x61, 0x06, 0x16, 0x7a, 0x93, - 0xa8, 0xc6, 0xc5, 0x99, 0x3e, 0xc6, 0xc5, 0x2f, 0xc7, 0xdf, 0x19, 0x11, 0x4d, 0xbc, 0x33, 0x46, - 0xaf, 0x8b, 0x15, 0xb4, 0xed, 0xae, 0x53, 0x99, 0x08, 0xe5, 0x72, 0x9f, 0x6f, 0x46, 0x44, 0x3e, - 0xcc, 0x01, 0xd2, 0x98, 0x82, 0xd6, 0xf8, 0xed, 0x21, 0xb8, 0xd8, 0x93, 0x82, 0xac, 0x28, 0xe9, - 0x95, 0xa6, 0xc2, 0xc4, 0x2e, 0x3d, 0xf1, 0xaf, 0xe3, 0xbf, 0x68, 0xbe, 0x17, 0xf7, 0x36, 0x7b, - 0x10, 0xa6, 0xd5, 0xc9, 0x22, 0xaf, 0x4f, 0x9d, 0xca, 0x8b, 0xa3, 0x23, 0x33, 0x48, 0x66, 0xd8, - 0x41, 0xbf, 0x44, 0x1a, 0xd8, 0x4e, 0xd3, 0x57, 0x97, 0x5d, 0x83, 0x83, 0x4c, 0x59, 0x16, 0x59, - 0x7c, 0x0f, 0xa5, 0x5b, 0x7c, 0x1b, 0xff, 0x32, 0x03, 0x63, 0xe1, 0x67, 0x93, 0x05, 0x38, 0xbf, - 0x69, 0x96, 0xca, 0xcb, 0xd6, 0xe6, 0xfb, 0x1b, 0xcb, 0xd6, 0xd6, 0x7a, 0x6d, 0x63, 0xb9, 0x5c, - 0xbd, 0x53, 0x5d, 0xae, 0x14, 0x9e, 0x21, 0x33, 0x30, 0xb9, 0xb5, 0x7e, 0x7f, 0xfd, 0xc1, 0xf6, - 0xba, 0xb5, 0x6c, 0x9a, 0x0f, 0xcc, 0x42, 0x86, 0x4c, 0xc2, 0x98, 0xb9, 0x54, 0x2a, 0x5b, 0xeb, - 0x0f, 0x2a, 0xcb, 0x85, 0x2c, 0x29, 0xc0, 0x44, 0xf9, 0xc1, 0xfa, 0xfa, 0x72, 0x79, 0xb3, 0xfa, - 0xb0, 0xba, 0xf9, 0x7e, 0x21, 0x47, 0x08, 0x4c, 0x21, 0xc2, 0x86, 0x59, 0x5d, 0x2f, 0x57, 0x37, - 0x4a, 0xab, 0x85, 0x21, 0x06, 0x63, 0xf8, 0x0a, 0x6c, 0x38, 0x64, 0x74, 0x7f, 0x6b, 0x69, 0xb9, - 0x30, 0xc2, 0x50, 0xd8, 0x5f, 0x0a, 0xca, 0x28, 0xab, 0x1e, 0x51, 0x2a, 0xa5, 0xcd, 0xd2, 0x52, - 0xa9, 0xb6, 0x5c, 0xc8, 0x93, 0x0b, 0x30, 0xab, 0x81, 0xac, 0xd5, 0x07, 0x77, 0xab, 0xeb, 0x85, - 0x31, 0x32, 0x07, 0x85, 0x10, 0x56, 0x59, 0xb2, 0xb6, 0x6a, 0xcb, 0x66, 0x01, 0xe2, 0xd0, 0xf5, - 0xd2, 0xda, 0x72, 0x61, 0xdc, 0x78, 0x87, 0xfb, 0x01, 0xf2, 0xae, 0x26, 0xe7, 0x81, 0xd4, 0x36, - 0x4b, 0x9b, 0x5b, 0xb5, 0x58, 0xe3, 0xc7, 0x61, 0xb4, 0xb6, 0x55, 0x2e, 0x2f, 0xd7, 0x6a, 0x85, - 0x0c, 0x01, 0x18, 0xb9, 0x53, 0xaa, 0xae, 0x2e, 0x57, 0x0a, 0x59, 0xe3, 0x27, 0x33, 0x30, 0x23, - 0x25, 0x40, 0xf9, 0x68, 0xf4, 0x11, 0xd7, 0xe2, 0xbb, 0xda, 0xc5, 0x56, 0x3a, 0x69, 0xc5, 0x2a, - 0xe9, 0xb3, 0x0c, 0x7f, 0x3e, 0x03, 0xe7, 0x52, 0xb1, 0xc9, 0xfb, 0x50, 0x90, 0x5f, 0xb0, 0x66, - 0x07, 0xf5, 0xfd, 0x68, 0x1f, 0xbb, 0x14, 0xab, 0x25, 0x86, 0xc6, 0xd5, 0x9a, 0x51, 0xc2, 0xe7, - 0x04, 0x9b, 0xc1, 0xd3, 0x11, 0x18, 0x3f, 0x97, 0x81, 0x0b, 0x3d, 0xaa, 0x21, 0x65, 0x18, 0x09, - 0x13, 0xd3, 0xf4, 0xb1, 0x60, 0x9b, 0xfb, 0xce, 0x71, 0x51, 0x20, 0x62, 0x86, 0x5c, 0xfc, 0xcb, - 0x1c, 0x09, 0x33, 0xcd, 0x60, 0xba, 0x17, 0xde, 0x7d, 0x17, 0x63, 0x3d, 0x2f, 0x6a, 0x2a, 0x6d, - 0xd7, 0x96, 0xc6, 0x45, 0xdf, 0xe5, 0xec, 0x43, 0x1f, 0xf3, 0xbd, 0x18, 0x3f, 0x9d, 0x61, 0xc2, - 0x5d, 0x1c, 0x91, 0xc9, 0xbc, 0x25, 0xdf, 0xef, 0xb6, 0xa8, 0xe9, 0x36, 0x69, 0xc9, 0x5c, 0x17, - 0xc7, 0x06, 0x4a, 0xab, 0x36, 0x16, 0xe0, 0xb5, 0xc2, 0xb2, 0xbd, 0xb6, 0xf6, 0x5a, 0xad, 0xd2, - 0x90, 0x37, 0x01, 0x96, 0x1f, 0x07, 0xd4, 0x6b, 0xdb, 0xcd, 0x30, 0x46, 0x0b, 0x8f, 0x2c, 0x25, - 0xa0, 0xba, 0xbc, 0xad, 0x20, 0x1b, 0x7f, 0x27, 0x03, 0x13, 0xe2, 0xd2, 0x54, 0x6a, 0x52, 0x2f, - 0xf8, 0x68, 0xd3, 0xeb, 0x4d, 0x6d, 0x7a, 0x85, 0x0e, 0x1b, 0x0a, 0x7f, 0x56, 0x9c, 0x3a, 0xb3, - 0xfe, 0x71, 0x06, 0x0a, 0x71, 0x44, 0xf2, 0x2e, 0xe4, 0x6b, 0xf4, 0x11, 0xf5, 0x9c, 0xe0, 0x48, - 0x6c, 0x94, 0x32, 0x85, 0x1f, 0xc7, 0x11, 0x65, 0x7c, 0x3e, 0xf8, 0xe2, 0x97, 0x19, 0xd2, 0x0c, - 0xba, 0xdf, 0x2b, 0x6a, 0x8f, 0xdc, 0x93, 0x52, 0x7b, 0x18, 0xff, 0x5b, 0x16, 0x2e, 0xdc, 0xa5, - 0x81, 0xda, 0xa6, 0xd0, 0xbc, 0xe0, 0xd3, 0x83, 0xb5, 0x4b, 0x69, 0xc9, 0x3c, 0x8c, 0x62, 0x91, - 0x1c, 0x5f, 0x53, 0xfe, 0x24, 0x4b, 0xe1, 0xbc, 0xce, 0x69, 0x39, 0xc2, 0x7a, 0xd4, 0x7d, 0x5d, - 0xc9, 0x1a, 0x14, 0x4e, 0xeb, 0x2b, 0x30, 0x85, 0x61, 0xf1, 0xbb, 0x6c, 0x39, 0xd0, 0x86, 0x50, - 0xff, 0xe4, 0xcd, 0x18, 0x94, 0xbc, 0x0a, 0x05, 0x06, 0x29, 0xd5, 0x0f, 0xda, 0xee, 0x61, 0x93, - 0x36, 0xf6, 0x68, 0x03, 0x8f, 0xf5, 0xbc, 0x99, 0x80, 0x4b, 0x9e, 0x5b, 0x6d, 0x7e, 0x75, 0xa3, - 0x0d, 0xd4, 0xd1, 0x08, 0x9e, 0x11, 0x74, 0xe1, 0x4d, 0x18, 0xff, 0x90, 0x19, 0xc0, 0x8c, 0xff, - 0x35, 0x03, 0x73, 0xd8, 0x38, 0xa5, 0x62, 0x99, 0x9d, 0x55, 0xf6, 0x96, 0x92, 0x14, 0xc7, 0x66, - 0x20, 0x7d, 0x29, 0x84, 0xbd, 0x18, 0xe9, 0x84, 0xb2, 0x03, 0xe8, 0x84, 0x6a, 0x67, 0xc9, 0x44, - 0x3f, 0xa0, 0x4a, 0xeb, 0xde, 0x50, 0x3e, 0x57, 0x18, 0x8a, 0x86, 0xdc, 0xf8, 0xc1, 0x2c, 0x8c, - 0x9a, 0x14, 0x53, 0x74, 0x93, 0x2b, 0x30, 0xba, 0xee, 0x06, 0xd4, 0x5f, 0xd3, 0xf2, 0xb1, 0xb7, - 0x19, 0xc8, 0x6a, 0x35, 0x4c, 0x59, 0xc8, 0x26, 0xfc, 0x86, 0xe7, 0x36, 0xba, 0xf5, 0x40, 0x9d, - 0xf0, 0x1d, 0x0e, 0x32, 0x65, 0x19, 0x79, 0x0d, 0xc6, 0x04, 0xe7, 0xf0, 0x51, 0x17, 0x8d, 0x91, - 0x3d, 0x1a, 0xa6, 0x78, 0x8f, 0x10, 0x50, 0xa6, 0xe5, 0x02, 0xc6, 0x90, 0x22, 0xd3, 0x26, 0x64, - 0x06, 0x29, 0xaa, 0x0f, 0xf7, 0x11, 0xd5, 0x3f, 0x0d, 0x23, 0x25, 0xdf, 0xa7, 0x81, 0x8c, 0x62, - 0x30, 0x11, 0x86, 0x6d, 0xf3, 0x69, 0xc0, 0x19, 0xdb, 0x58, 0x6e, 0x0a, 0x3c, 0xe3, 0x9f, 0x67, - 0x61, 0x18, 0xff, 0xc4, 0x27, 0x53, 0xaf, 0xbe, 0xaf, 0x3d, 0x99, 0x7a, 0xf5, 0x7d, 0x13, 0xa1, - 0xe4, 0x26, 0x6a, 0x2a, 0x64, 0xfe, 0x26, 0xd1, 0x7a, 0x54, 0xc1, 0x37, 0x22, 0xb0, 0xa9, 0xe2, - 0x84, 0x2f, 0xfc, 0xb9, 0xd4, 0xd8, 0x25, 0xe7, 0x21, 0xfb, 0xa0, 0x26, 0x5a, 0x8c, 0x11, 0xb1, - 0x5c, 0xdf, 0xcc, 0x3e, 0xa8, 0x61, 0x6f, 0xac, 0x94, 0x16, 0xdf, 0xb8, 0x2d, 0x1a, 0xca, 0x7b, - 0x63, 0xdf, 0x5e, 0x7c, 0xe3, 0xb6, 0x29, 0x4a, 0x58, 0xff, 0xe2, 0x37, 0xe3, 0xc3, 0x2b, 0xf7, - 0xb9, 0xc7, 0xfe, 0xc5, 0xb6, 0xe1, 0x23, 0xab, 0x19, 0x21, 0x90, 0x45, 0x18, 0x17, 0xb1, 0x1e, - 0x10, 0x5f, 0x89, 0xc5, 0x20, 0x62, 0x41, 0x70, 0x0a, 0x15, 0x89, 0x3f, 0xc1, 0x89, 0x01, 0x92, - 0x59, 0x66, 0xc5, 0x13, 0x9c, 0x1c, 0x42, 0xdf, 0x54, 0x50, 0xd8, 0x27, 0xf1, 0x37, 0xbc, 0xc8, - 0x97, 0x7e, 0x4a, 0x09, 0x1a, 0x80, 0x69, 0x0e, 0x42, 0x04, 0xe3, 0x97, 0xb3, 0x90, 0xdf, 0x68, - 0x76, 0xf7, 0x9c, 0xf6, 0xc3, 0x9b, 0x84, 0x00, 0x5e, 0xe3, 0x64, 0x1e, 0x0c, 0xf6, 0x37, 0xb9, - 0x08, 0x79, 0x79, 0x73, 0x93, 0x1b, 0x92, 0x2f, 0x6e, 0x6d, 0xf3, 0x20, 0xc7, 0x5d, 0x84, 0x3e, - 0x93, 0x3f, 0xc9, 0x4d, 0x08, 0xef, 0x5f, 0xbd, 0x2e, 0x6a, 0x43, 0x6c, 0xb1, 0x98, 0x21, 0x1a, - 0x79, 0x1d, 0xf0, 0x90, 0x10, 0x97, 0x07, 0xa9, 0xd0, 0xe6, 0x9f, 0x26, 0xe4, 0x14, 0x4e, 0x82, - 0x68, 0xe4, 0x16, 0x88, 0x89, 0x29, 0xb2, 0x99, 0x9f, 0xd3, 0x09, 0x78, 0x7e, 0x48, 0x49, 0x22, - 0x50, 0xc9, 0xdb, 0x30, 0x5e, 0xf7, 0x28, 0xbe, 0x3a, 0xda, 0xcd, 0x28, 0x49, 0xb9, 0x4a, 0x59, - 0x8e, 0xca, 0x1f, 0xde, 0x34, 0x55, 0x74, 0xe3, 0x97, 0xf3, 0x30, 0xa1, 0x7e, 0x0f, 0x31, 0x61, - 0xd6, 0x6f, 0xb2, 0xbb, 0xbb, 0x30, 0x36, 0xeb, 0x60, 0xa1, 0x38, 0x4e, 0x2f, 0xeb, 0x1f, 0xc4, - 0xf0, 0xb8, 0xe5, 0x99, 0x0c, 0x52, 0xb1, 0xf2, 0x8c, 0x39, 0xe3, 0x47, 0x60, 0x8e, 0x47, 0x4a, - 0x90, 0x77, 0x3b, 0xfe, 0x1e, 0x6d, 0x3b, 0xf2, 0xbd, 0xe5, 0x45, 0x8d, 0xd1, 0x03, 0x51, 0x98, - 0xe0, 0x15, 0x92, 0x91, 0x37, 0x60, 0xc4, 0xed, 0xd0, 0xb6, 0xed, 0x88, 0x33, 0xee, 0xd9, 0x18, - 0x03, 0xda, 0x2e, 0x55, 0x15, 0x42, 0x81, 0x4c, 0x6e, 0xc0, 0x90, 0x7b, 0x10, 0x8e, 0xd7, 0x45, - 0x9d, 0xe8, 0x20, 0xb0, 0x15, 0x12, 0x44, 0x64, 0x04, 0x1f, 0xd8, 0xad, 0x5d, 0x31, 0x62, 0x3a, - 0xc1, 0x3d, 0xbb, 0xb5, 0xab, 0x12, 0x30, 0x44, 0xf2, 0x1e, 0x40, 0xc7, 0xde, 0xa3, 0x9e, 0xd5, - 0xe8, 0x06, 0x47, 0x62, 0xdc, 0x2e, 0x69, 0x64, 0x1b, 0xac, 0xb8, 0xd2, 0x0d, 0x8e, 0x14, 0xda, - 0xb1, 0x8e, 0x04, 0x92, 0x12, 0x40, 0xcb, 0x0e, 0x02, 0xea, 0xb5, 0x5c, 0x61, 0xed, 0x17, 0x05, - 0x21, 0xe4, 0x0c, 0xd6, 0xc2, 0x62, 0x85, 0x83, 0x42, 0x84, 0x1f, 0xed, 0x78, 0xb6, 0xc8, 0x29, - 0x1f, 0xfb, 0x68, 0xc7, 0xd3, 0x5a, 0xc9, 0x10, 0xc9, 0xe7, 0x60, 0xb4, 0xe1, 0xf8, 0x75, 0xd7, - 0x6b, 0x88, 0xe8, 0x25, 0xcf, 0x69, 0x34, 0x15, 0x5e, 0xa6, 0x90, 0x49, 0x74, 0xf6, 0xb5, 0x22, - 0x08, 0xe9, 0xba, 0x7b, 0x88, 0x6a, 0xfe, 0xf8, 0xd7, 0xd6, 0xc2, 0x62, 0xf5, 0x6b, 0x23, 0x22, - 0x36, 0x94, 0x7b, 0x4e, 0xd0, 0xb4, 0x77, 0xc4, 0x3b, 0xb7, 0x3e, 0x94, 0x77, 0xb1, 0x48, 0x1d, - 0x4a, 0x8e, 0x4c, 0xde, 0x84, 0x3c, 0x6d, 0x07, 0x9e, 0x6d, 0x39, 0x0d, 0xe1, 0x25, 0xa9, 0x7f, - 0x34, 0x3b, 0x80, 0xed, 0x6a, 0x45, 0xfd, 0x68, 0xc4, 0xaf, 0x36, 0x58, 0xff, 0xf8, 0x75, 0xa7, - 0x25, 0x9c, 0x1b, 0xf5, 0xfe, 0xa9, 0x95, 0xab, 0x6b, 0x6a, 0xff, 0x30, 0x44, 0xf2, 0x2e, 0x8c, - 0xb2, 0xf5, 0xdb, 0x70, 0xf7, 0x44, 0x40, 0x08, 0x43, 0xef, 0x1f, 0x5e, 0x96, 0x98, 0xae, 0x92, - 0x88, 0x2d, 0x64, 0xfb, 0xd0, 0xb7, 0x9c, 0xba, 0x08, 0xf2, 0xa0, 0x2f, 0xc7, 0xd2, 0x76, 0xad, - 0x5a, 0x56, 0xc8, 0x86, 0xed, 0x43, 0xbf, 0x5a, 0x27, 0x8b, 0x30, 0x8c, 0x29, 0x22, 0x44, 0x20, - 0x4a, 0x9d, 0x06, 0x93, 0x43, 0xa8, 0x34, 0x88, 0xca, 0x06, 0xb2, 0xe5, 0xa3, 0xbf, 0x88, 0x48, - 0xd4, 0xa0, 0xf7, 0xc9, 0x5a, 0x0d, 0x9d, 0x48, 0xd4, 0x4f, 0x14, 0xe8, 0xe4, 0x12, 0x40, 0xf4, - 0x8a, 0xcf, 0xdf, 0x5c, 0x4c, 0x05, 0xf2, 0xf9, 0xa1, 0xff, 0xf3, 0x17, 0x8b, 0x99, 0x25, 0x80, - 0xbc, 0x8c, 0x50, 0x63, 0xac, 0xc2, 0xc5, 0x9e, 0xeb, 0x9e, 0x5c, 0x83, 0xc2, 0xae, 0x2d, 0xb4, - 0x7e, 0xf5, 0x7d, 0xbb, 0xdd, 0xa6, 0x4d, 0xb1, 0xe3, 0x4e, 0x4b, 0x78, 0x99, 0x83, 0x39, 0x67, - 0xe3, 0x3d, 0x98, 0x4b, 0x1b, 0x70, 0xf2, 0x02, 0x4c, 0xa8, 0xc1, 0x78, 0x04, 0x93, 0x71, 0xbb, - 0xe3, 0xc8, 0x70, 0x3c, 0x82, 0xc1, 0x6f, 0x65, 0xe0, 0xb9, 0x7e, 0xdb, 0x07, 0x59, 0x80, 0x7c, - 0xc7, 0x73, 0x5c, 0x14, 0x53, 0x45, 0xb6, 0x03, 0xf9, 0x1b, 0x13, 0x19, 0xa0, 0x3c, 0x15, 0xd8, - 0x7b, 0xc2, 0xc1, 0xc3, 0x1c, 0x43, 0xc8, 0xa6, 0xbd, 0xe7, 0x93, 0x4f, 0xc1, 0x4c, 0x83, 0xee, - 0xda, 0xdd, 0x66, 0x60, 0xf9, 0xf5, 0x7d, 0xda, 0x40, 0x9f, 0x2a, 0x34, 0xdc, 0x33, 0x0b, 0xa2, - 0xa0, 0x26, 0xe1, 0x89, 0x2f, 0x1e, 0xee, 0xf1, 0xc5, 0xf7, 0x86, 0xf2, 0x99, 0x42, 0xd6, 0x44, - 0x4b, 0x29, 0xe3, 0xfb, 0xb2, 0x30, 0xdf, 0x6b, 0xbd, 0x90, 0x77, 0xd2, 0xfa, 0x80, 0x3f, 0x5c, - 0xa8, 0x70, 0xf5, 0xe1, 0x42, 0xa9, 0x8d, 0x2c, 0x42, 0xe8, 0x11, 0x75, 0x5a, 0x74, 0x03, 0x09, - 0x63, 0x34, 0x1d, 0xdb, 0xf7, 0x0f, 0xd9, 0x96, 0x90, 0x53, 0x02, 0xda, 0x0a, 0x98, 0x4a, 0x23, - 0x61, 0xe4, 0xb3, 0x00, 0xf5, 0xa6, 0xeb, 0x53, 0xb4, 0x0f, 0x10, 0xb2, 0x06, 0x37, 0x0b, 0x0f, - 0xa1, 0xea, 0x83, 0x30, 0x42, 0xcb, 0x6e, 0x83, 0x8a, 0x01, 0xb4, 0xe1, 0x42, 0x8f, 0x0d, 0x92, - 0x0d, 0x4f, 0x94, 0x1d, 0x5e, 0xe6, 0x9a, 0xea, 0x86, 0x39, 0xe2, 0xe3, 0x3d, 0x9e, 0xed, 0x35, - 0x47, 0x8e, 0x80, 0x24, 0x77, 0x41, 0xc6, 0x5d, 0x18, 0x37, 0x77, 0xbd, 0x90, 0x3b, 0x87, 0x6c, - 0x79, 0xcd, 0xff, 0x8f, 0xbd, 0x6f, 0x89, 0x6d, 0x24, 0x39, 0x0f, 0x9e, 0x26, 0x29, 0x89, 0xfa, - 0xa8, 0x47, 0xab, 0xe6, 0xa5, 0x9d, 0xe7, 0x4e, 0xef, 0xcc, 0x78, 0x86, 0xeb, 0x5d, 0x7b, 0x66, - 0xff, 0xf5, 0xee, 0xda, 0xbf, 0x1f, 0x2d, 0xb2, 0x25, 0x71, 0xc4, 0x97, 0xbb, 0x49, 0xc9, 0xe3, - 0xb1, 0xdd, 0xee, 0x25, 0x5b, 0x52, 0xdb, 0x14, 0x9b, 0x66, 0x93, 0x3b, 0x1e, 0x23, 0x40, 0x62, - 0x04, 0xb0, 0x81, 0xbc, 0x9c, 0x38, 0x09, 0xb2, 0xc8, 0xc5, 0x87, 0x18, 0x41, 0x0e, 0xb9, 0x06, - 0x09, 0x92, 0x5c, 0x7c, 0x33, 0x60, 0x18, 0x30, 0x90, 0x9c, 0x92, 0x60, 0x91, 0x2c, 0x90, 0x00, - 0x79, 0xdc, 0x82, 0xf8, 0xe0, 0x53, 0x50, 0x5f, 0x55, 0x75, 0x57, 0x3f, 0xc8, 0xd1, 0x78, 0xd7, - 0x49, 0x0c, 0xf8, 0x24, 0xf1, 0xab, 0xaf, 0xbe, 0xae, 0x77, 0x7d, 0xdf, 0x57, 0xdf, 0x83, 0x5c, - 0x87, 0x92, 0xc8, 0x25, 0x49, 0x79, 0x79, 0x46, 0x1c, 0x38, 0x68, 0xcf, 0xc5, 0xc5, 0x83, 0x11, - 0x4b, 0xd1, 0xef, 0x8d, 0x73, 0x09, 0xcb, 0x08, 0xe9, 0x3c, 0x19, 0x89, 0xde, 0x5d, 0x11, 0xeb, - 0x3b, 0x7e, 0x37, 0xf1, 0xd2, 0xdf, 0x57, 0xc4, 0xf4, 0xa7, 0x0f, 0xf7, 0xa7, 0xb5, 0x8f, 0x00, - 0x7a, 0x29, 0xf1, 0x86, 0xe1, 0xff, 0x94, 0x6b, 0x11, 0xbb, 0x8e, 0x73, 0x2d, 0xfc, 0x27, 0xb9, - 0x0d, 0xeb, 0x63, 0x66, 0xc7, 0x3a, 0xf1, 0xf9, 0x78, 0xb2, 0xbc, 0x1d, 0xab, 0x0c, 0xdc, 0xf1, - 0x71, 0x4c, 0x79, 0xbb, 0x1e, 0x84, 0x03, 0x26, 0xdd, 0x75, 0xe4, 0x65, 0x58, 0xa6, 0x77, 0x1d, - 0x46, 0xba, 0x49, 0xb8, 0x47, 0x20, 0x1e, 0x72, 0x0e, 0x66, 0xf1, 0x4b, 0xfc, 0x7f, 0x4e, 0xeb, - 0xed, 0x9c, 0x20, 0x26, 0xdf, 0xb4, 0xe4, 0x22, 0x2c, 0xf9, 0xe3, 0x23, 0xa9, 0x6b, 0x8b, 0xfe, - 0xf8, 0x88, 0xf6, 0xeb, 0x0e, 0xa8, 0xcc, 0x5b, 0x87, 0x85, 0x41, 0x08, 0x9e, 0x0c, 0x99, 0x28, - 0x5e, 0x34, 0xd7, 0x18, 0x1c, 0x13, 0xe6, 0x3f, 0x19, 0xf6, 0x28, 0x66, 0x10, 0xf8, 0xb6, 0x1c, - 0xe0, 0x8a, 0x77, 0x7b, 0x2d, 0x08, 0xfc, 0x28, 0xd2, 0x55, 0x9f, 0x6c, 0xc1, 0x2a, 0xa5, 0x13, - 0x86, 0xd9, 0xe2, 0x8c, 0xc0, 0xd5, 0x34, 0x23, 0xf0, 0x64, 0xd8, 0x13, 0x4d, 0x34, 0x57, 0x02, - 0xe9, 0x17, 0xd9, 0x03, 0x55, 0xe2, 0x98, 0xd0, 0x1f, 0x33, 0x61, 0x53, 0x1d, 0x91, 0x91, 0x38, - 0xad, 0xda, 0xf0, 0xd0, 0x37, 0xd7, 0x7b, 0x71, 0x00, 0x1f, 0x9a, 0xef, 0x28, 0xe2, 0x2c, 0xcd, - 0xa8, 0x44, 0x34, 0x58, 0x3d, 0x76, 0x02, 0x3b, 0x08, 0x4e, 0x98, 0x8d, 0x18, 0x0f, 0xec, 0x5b, - 0x3a, 0x76, 0x02, 0x2b, 0x38, 0x11, 0x89, 0x43, 0xce, 0x53, 0x1c, 0xdf, 0x99, 0x4e, 0x8e, 0x6d, - 0x99, 0xff, 0x63, 0x23, 0x76, 0xf6, 0xd8, 0x09, 0x5a, 0xb4, 0x4c, 0xa2, 0x4d, 0x6e, 0xc2, 0x1a, - 0xd2, 0xed, 0x79, 0x82, 0x30, 0x86, 0xb2, 0x30, 0x57, 0x28, 0xe1, 0x9e, 0xc7, 0x28, 0xf3, 0x16, - 0xfe, 0x6b, 0x0e, 0x2e, 0x64, 0x8f, 0x0e, 0x2e, 0x4f, 0x3a, 0xa6, 0xe8, 0xa3, 0xc7, 0xdb, 0xb6, - 0x4c, 0x21, 0x2c, 0x0c, 0x49, 0xd6, 0xe4, 0xe4, 0x32, 0x27, 0xa7, 0x0c, 0x1b, 0x48, 0x88, 0x73, - 0x9a, 0x03, 0x2f, 0x98, 0xf0, 0xe8, 0x1a, 0xe6, 0x3a, 0x2d, 0x60, 0xe7, 0x79, 0x9d, 0x82, 0xc9, - 0x2d, 0x58, 0x13, 0x27, 0xb2, 0xff, 0x78, 0x48, 0x3f, 0xcc, 0x8e, 0xe3, 0x55, 0x0e, 0x6d, 0x21, - 0x90, 0x9c, 0x87, 0x45, 0x67, 0x34, 0xa2, 0x9f, 0x64, 0xa7, 0xf0, 0x82, 0x33, 0x1a, 0xb1, 0xe4, - 0x36, 0xe8, 0x91, 0x68, 0x1f, 0xa2, 0x95, 0x10, 0x37, 0x49, 0x34, 0x57, 0x10, 0xc8, 0x2c, 0x87, - 0x02, 0xba, 0xef, 0x69, 0x5d, 0x81, 0xb2, 0x84, 0x28, 0xe0, 0x8c, 0x42, 0x84, 0xe7, 0xa0, 0x28, - 0xde, 0xab, 0x99, 0x63, 0x85, 0xb9, 0xe4, 0xf0, 0xb7, 0xea, 0x57, 0xe1, 0x62, 0xdf, 0x0b, 0x70, - 0xf1, 0xb2, 0x2e, 0x8d, 0x46, 0xdc, 0x07, 0x92, 0x05, 0xc9, 0x35, 0xcf, 0xf1, 0x62, 0x3a, 0x92, - 0xfa, 0x68, 0xc4, 0x3c, 0x21, 0xf9, 0x58, 0xbf, 0x0e, 0xeb, 0x9c, 0xe3, 0xe2, 0x57, 0x24, 0xb6, - 0x85, 0x6f, 0x60, 0x2a, 0x0a, 0xf1, 0x74, 0x42, 0xc0, 0x41, 0xb5, 0xbe, 0xa8, 0xf9, 0x0f, 0x0a, - 0x9c, 0xcf, 0x64, 0xd9, 0xc8, 0x17, 0x81, 0xb9, 0x7c, 0x4d, 0x7c, 0x7b, 0xec, 0xf6, 0xbc, 0x91, - 0x87, 0x41, 0x31, 0x98, 0x4a, 0xf3, 0xfe, 0x3c, 0x66, 0x0f, 0xdd, 0xc7, 0x3a, 0xbe, 0x19, 0x56, - 0x62, 0xba, 0x16, 0x75, 0x9c, 0x00, 0x5f, 0x7a, 0x04, 0xe7, 0x33, 0x51, 0x33, 0x74, 0x20, 0x1f, - 0x8c, 0x27, 0x73, 0x16, 0x8f, 0x54, 0x89, 0x4e, 0x4b, 0xba, 0x11, 0xde, 0xbd, 0xef, 0x85, 0xdd, - 0x4b, 0x30, 0x77, 0xc4, 0x48, 0xee, 0xeb, 0x2c, 0xf9, 0x44, 0x54, 0x9a, 0xbd, 0xb5, 0x1f, 0xc1, - 0x79, 0xbe, 0xf8, 0x8e, 0xc6, 0xce, 0xe8, 0x38, 0x22, 0xc7, 0x1a, 0xfa, 0x81, 0x2c, 0x72, 0x6c, - 0x55, 0xee, 0x50, 0xfc, 0x90, 0xea, 0x59, 0x27, 0x0d, 0xe4, 0x7d, 0xf8, 0x7a, 0x4e, 0x6c, 0xf5, - 0x8c, 0xe6, 0x64, 0x2c, 0x6b, 0x25, 0x6b, 0x59, 0x9f, 0x7e, 0x4f, 0x35, 0x81, 0xc8, 0x87, 0x15, - 0xd3, 0x7a, 0x72, 0x83, 0x2a, 0xc1, 0xa7, 0xf3, 0x86, 0x48, 0x47, 0x83, 0xc5, 0x92, 0x69, 0x6e, - 0xf4, 0x92, 0x20, 0x72, 0x19, 0x96, 0xc3, 0x7c, 0xd5, 0xfc, 0xe2, 0x28, 0x32, 0x40, 0xad, 0x4f, - 0x9e, 0x87, 0x15, 0xc6, 0x92, 0xc7, 0xf6, 0x1c, 0x20, 0x4c, 0xa7, 0x1b, 0x4f, 0x8c, 0x81, 0x02, - 0xcf, 0x3f, 0x6d, 0x0c, 0xc9, 0x01, 0x5c, 0x40, 0xb3, 0x8e, 0xc0, 0x0f, 0xa7, 0xc1, 0xee, 0x39, - 0xbd, 0x63, 0x97, 0xaf, 0x5a, 0x2d, 0x73, 0x32, 0x46, 0x23, 0xcb, 0x6a, 0x49, 0xf3, 0x30, 0x1a, - 0x59, 0x81, 0x2f, 0x7e, 0x57, 0x68, 0x75, 0xde, 0x86, 0x3e, 0x5c, 0x9e, 0x53, 0x53, 0x3a, 0x38, - 0x14, 0xf9, 0xe0, 0xb8, 0x03, 0xea, 0xa1, 0xdb, 0xa7, 0x3c, 0xb1, 0xdb, 0xc7, 0xa6, 0xbd, 0x75, - 0x9f, 0x65, 0x68, 0x37, 0xd7, 0x42, 0xb8, 0x15, 0xf8, 0xfb, 0xf7, 0xf9, 0x57, 0x4e, 0xc4, 0x95, - 0x27, 0x8b, 0x15, 0xe4, 0x65, 0x38, 0x9b, 0x08, 0x38, 0x12, 0x79, 0xb0, 0x9b, 0x1b, 0xb4, 0x28, - 0x1e, 0x9e, 0xea, 0x06, 0xac, 0x88, 0x55, 0x31, 0x0e, 0xfd, 0xe0, 0xcc, 0x12, 0x87, 0xd1, 0x5d, - 0xc7, 0x3f, 0x37, 0x15, 0x9d, 0xca, 0x94, 0x48, 0x4e, 0xc1, 0x4b, 0x93, 0x97, 0x80, 0x84, 0x7c, - 0x7b, 0x78, 0x50, 0xf0, 0x0f, 0x6e, 0x88, 0x92, 0x70, 0x87, 0xf3, 0xcf, 0xfe, 0x75, 0x0e, 0xce, - 0x66, 0x88, 0x32, 0x54, 0x08, 0xf0, 0x86, 0x13, 0xf7, 0x88, 0x89, 0x10, 0x72, 0x27, 0xd7, 0x25, - 0x38, 0xd7, 0x4f, 0x2d, 0xb2, 0x0c, 0xe4, 0xfc, 0x5b, 0xfc, 0x17, 0x3d, 0x3c, 0x9c, 0xb1, 0x50, - 0xbd, 0xd0, 0x7f, 0x49, 0x0d, 0x36, 0x30, 0xad, 0x42, 0xe0, 0xf9, 0x98, 0x9d, 0x01, 0x99, 0x90, - 0x42, 0x4c, 0xd8, 0xc1, 0x56, 0xb4, 0x25, 0x24, 0xca, 0x85, 0x98, 0xea, 0x28, 0x01, 0x21, 0x1f, - 0x83, 0x4b, 0xd2, 0x5d, 0x63, 0x27, 0x76, 0x1e, 0x5a, 0xba, 0x9b, 0x17, 0x9d, 0xf0, 0xd6, 0xa9, - 0xc6, 0xf6, 0xe0, 0x16, 0x5c, 0xc3, 0x49, 0xf4, 0xfa, 0x23, 0x3b, 0x95, 0x87, 0x03, 0xbb, 0xca, - 0x02, 0xd7, 0x5f, 0xa2, 0x58, 0xb5, 0xfe, 0x28, 0x91, 0x92, 0x83, 0xf6, 0x9a, 0x0f, 0xdf, 0x23, - 0x38, 0x9f, 0xd9, 0x62, 0x7a, 0xc1, 0xa0, 0x21, 0x55, 0xc4, 0x1b, 0x2d, 0xd1, 0xdf, 0x94, 0x39, - 0xba, 0x01, 0x2b, 0x6f, 0xba, 0xce, 0xd8, 0x1d, 0xf3, 0x9b, 0x9b, 0x2f, 0x09, 0x06, 0x93, 0x2f, - 0xee, 0x7e, 0x7c, 0x6a, 0xb8, 0xce, 0x88, 0x34, 0xe0, 0x2c, 0xbb, 0x01, 0xbd, 0x13, 0x64, 0x06, - 0xb9, 0x9e, 0x49, 0x89, 0xb1, 0x43, 0x58, 0x05, 0xaf, 0xa6, 0x1a, 0x62, 0xb1, 0xda, 0xe6, 0xc6, - 0x51, 0x12, 0x44, 0x77, 0xf4, 0x85, 0x6c, 0x6c, 0xb2, 0x05, 0x25, 0x46, 0x9c, 0x89, 0x05, 0xec, - 0x81, 0xe0, 0xc6, 0xdc, 0x2f, 0x54, 0xd0, 0xbe, 0x38, 0x08, 0xff, 0xa7, 0xf7, 0x35, 0xbe, 0xc5, - 0xda, 0x27, 0xf2, 0xfb, 0x87, 0xb9, 0x82, 0x40, 0xfe, 0xee, 0xa1, 0xfd, 0x8d, 0x22, 0xba, 0x1a, - 0x13, 0x8e, 0xe9, 0xd2, 0x0a, 0xdc, 0xa1, 0x78, 0x03, 0x5a, 0x36, 0xf9, 0xaf, 0x67, 0x5c, 0xea, - 0xe4, 0x35, 0x58, 0xa1, 0x64, 0x8f, 0xa6, 0x43, 0xb6, 0xe4, 0xf2, 0xb1, 0x40, 0x3b, 0x0d, 0x56, - 0x44, 0xa7, 0x6d, 0xf7, 0x8c, 0x59, 0x3a, 0x89, 0x7e, 0x52, 0x6e, 0x39, 0x38, 0x99, 0x8c, 0xe4, - 0x85, 0x2a, 0x14, 0x85, 0x56, 0xa3, 0xd3, 0xe6, 0x55, 0x8a, 0x14, 0x27, 0xe2, 0x96, 0xb7, 0x16, - 0x99, 0xaa, 0x50, 0x7b, 0x11, 0x4a, 0x12, 0x6d, 0xda, 0x19, 0xe6, 0x39, 0x23, 0x3a, 0xc3, 0x7e, - 0xf1, 0xc9, 0x7e, 0x13, 0x8a, 0x82, 0x24, 0x15, 0x0b, 0x8e, 0xfd, 0x40, 0x6c, 0x72, 0xfc, 0x9f, - 0xc2, 0xe8, 0x28, 0x63, 0x27, 0x17, 0x4c, 0xfc, 0x1f, 0xef, 0x92, 0x89, 0x43, 0xe5, 0x81, 0x41, - 0x60, 0x8f, 0xd0, 0x02, 0x2b, 0x64, 0x9e, 0x29, 0xbc, 0x33, 0x08, 0x98, 0x5d, 0x16, 0xff, 0xc6, - 0x5f, 0x84, 0x97, 0x70, 0x42, 0x9b, 0x30, 0xeb, 0xcc, 0x8c, 0x5d, 0x19, 0xb9, 0xf4, 0x95, 0xc1, - 0x02, 0xa8, 0xf0, 0x9a, 0xec, 0xcb, 0x80, 0x30, 0xbc, 0x32, 0xa4, 0x93, 0xa1, 0x10, 0x3b, 0x19, - 0x24, 0x99, 0x3c, 0x9a, 0x3d, 0x76, 0xe3, 0x08, 0x99, 0x3c, 0x79, 0x4e, 0xfd, 0x71, 0x4e, 0xa8, - 0x08, 0xb6, 0x7c, 0x7f, 0x12, 0x4c, 0xc6, 0xce, 0x28, 0xa6, 0x0a, 0x25, 0x27, 0xf0, 0x1c, 0x72, - 0xd0, 0xf7, 0x31, 0x85, 0x85, 0x3f, 0x16, 0x31, 0x3b, 0xc2, 0x95, 0x5b, 0xba, 0xff, 0xa1, 0x38, - 0x8f, 0xaf, 0x53, 0x6c, 0x5d, 0x46, 0xa6, 0x0b, 0x56, 0xa2, 0xba, 0x7b, 0xc6, 0xbc, 0xc8, 0x68, - 0xa6, 0xb0, 0xc8, 0x6e, 0xc6, 0x26, 0x4e, 0xea, 0x42, 0xb7, 0xa2, 0x1d, 0x1d, 0xa7, 0x2a, 0xef, - 0x75, 0xf2, 0x09, 0x58, 0xf6, 0xfa, 0x72, 0xa6, 0xc6, 0xa4, 0x16, 0xae, 0xd6, 0x67, 0xd1, 0xa2, - 0x23, 0x1a, 0x74, 0xcd, 0x79, 0x1c, 0xba, 0xb5, 0x1a, 0x53, 0x1a, 0x6b, 0x5b, 0x42, 0x1a, 0x4d, - 0x57, 0x23, 0x6b, 0x90, 0x0b, 0x67, 0x38, 0xe7, 0xf5, 0xd9, 0xf6, 0x8a, 0xe2, 0x55, 0x9b, 0xfc, - 0x97, 0xf6, 0x4b, 0x70, 0xe7, 0xb4, 0x63, 0x44, 0xb7, 0xe2, 0x8c, 0x01, 0x5f, 0x36, 0x37, 0x9c, - 0xd4, 0xb8, 0xdd, 0x00, 0x39, 0xdc, 0xae, 0x27, 0x0e, 0x3f, 0x01, 0xeb, 0x8e, 0x3d, 0xed, 0xcf, - 0xf3, 0xb0, 0x16, 0x57, 0x93, 0x93, 0x17, 0xa1, 0x20, 0x9d, 0x40, 0x17, 0x33, 0x74, 0xe9, 0x78, - 0xee, 0x20, 0xd2, 0xa9, 0x4e, 0x1c, 0xf2, 0x00, 0xd6, 0xd0, 0x70, 0x0f, 0x59, 0xcf, 0x89, 0xc7, - 0x1f, 0x5f, 0xe6, 0xbf, 0x9f, 0x15, 0xbf, 0xff, 0xce, 0xf5, 0x33, 0xf8, 0x54, 0xb6, 0x42, 0xeb, - 0x52, 0xee, 0x8f, 0x16, 0x4a, 0x5a, 0xd0, 0xc2, 0x6c, 0x2d, 0x28, 0xef, 0xca, 0x0c, 0x2d, 0xe8, - 0xc2, 0x1c, 0x2d, 0x68, 0x54, 0x53, 0xd6, 0x82, 0xa2, 0x2e, 0x7c, 0x69, 0x96, 0x2e, 0x3c, 0xaa, - 0xc3, 0x74, 0xe1, 0x91, 0x16, 0xb3, 0x38, 0x53, 0x8b, 0x19, 0xd5, 0xe1, 0x5a, 0xcc, 0x9b, 0x7c, - 0x8c, 0xc6, 0xce, 0x63, 0x1b, 0x07, 0x8f, 0x5f, 0x8b, 0xd8, 0x7b, 0xd3, 0x79, 0x8c, 0xc6, 0x35, - 0x5b, 0xcb, 0x20, 0x2c, 0x72, 0xb4, 0xdf, 0x55, 0x12, 0x9a, 0x40, 0x31, 0x7f, 0xb7, 0x60, 0x8d, - 0x5d, 0x56, 0x6e, 0x5f, 0x92, 0x35, 0x57, 0xcd, 0x55, 0x01, 0x65, 0xf2, 0xe6, 0x07, 0x60, 0x3d, - 0x44, 0xe3, 0x22, 0x17, 0x7a, 0xea, 0x99, 0x61, 0x6d, 0x1e, 0x76, 0xe6, 0x45, 0xd8, 0x08, 0x11, - 0xb9, 0x36, 0x87, 0x89, 0x9b, 0xab, 0xa6, 0x2a, 0x0a, 0xda, 0x1c, 0xae, 0x1d, 0x25, 0x25, 0x8f, - 0x9f, 0x51, 0xab, 0xb4, 0xef, 0xe5, 0x63, 0x5a, 0x12, 0xf1, 0x19, 0x7a, 0x8b, 0x06, 0xbe, 0xcd, - 0x07, 0x89, 0x9f, 0x45, 0x37, 0x66, 0xcc, 0x19, 0xb7, 0x69, 0xb2, 0xac, 0x96, 0x09, 0x41, 0xe0, - 0x0b, 0x13, 0x27, 0x9b, 0x71, 0xd4, 0xec, 0xde, 0xc7, 0x35, 0x2b, 0xc8, 0xb1, 0x83, 0xa7, 0x3c, - 0x9f, 0x9c, 0x10, 0x53, 0xe9, 0x92, 0x45, 0xce, 0x3a, 0xfc, 0x25, 0x3e, 0xd0, 0x05, 0x54, 0x2a, - 0x06, 0x71, 0xe2, 0xf9, 0x0c, 0xd9, 0x29, 0x45, 0x1c, 0x47, 0x09, 0x29, 0xab, 0x53, 0xf1, 0xaf, - 0x20, 0x6b, 0xc0, 0x0a, 0xea, 0x28, 0x04, 0xc1, 0x42, 0x86, 0x0a, 0x3e, 0xdd, 0xf9, 0x4a, 0xad, - 0x61, 0x96, 0x68, 0x3d, 0x41, 0xe6, 0x18, 0x9e, 0x93, 0x35, 0x0b, 0xf1, 0x46, 0x2e, 0x88, 0x28, - 0xba, 0x73, 0x47, 0x20, 0x52, 0x40, 0x60, 0x53, 0x2f, 0x38, 0x71, 0x00, 0x47, 0xd3, 0x8e, 0xe1, - 0xd2, 0xec, 0x29, 0x99, 0x93, 0xa1, 0x29, 0xba, 0x40, 0x73, 0xf2, 0x05, 0x2a, 0xeb, 0x19, 0xf2, - 0x31, 0x3d, 0x83, 0xf6, 0x47, 0x79, 0x78, 0xe1, 0x14, 0xd3, 0x35, 0xe7, 0x9b, 0x9f, 0x8a, 0xb3, - 0x67, 0xb9, 0x98, 0x64, 0x48, 0x89, 0xf2, 0x03, 0x92, 0x4a, 0xa9, 0xd9, 0xcc, 0xd9, 0x17, 0x61, - 0x9d, 0x9d, 0x82, 0xcc, 0x2c, 0xf1, 0x70, 0x3a, 0x38, 0xc5, 0x31, 0x78, 0x59, 0xf8, 0x50, 0x25, - 0xaa, 0xe2, 0xc9, 0x88, 0x27, 0x86, 0x15, 0xc2, 0x48, 0x07, 0x4a, 0x88, 0x76, 0xe8, 0x78, 0x83, - 0x53, 0x39, 0xf3, 0x08, 0x0f, 0x2d, 0xb9, 0x1a, 0xb3, 0xa6, 0xa6, 0x80, 0x6d, 0xfc, 0x4d, 0x6e, - 0xc3, 0xfa, 0x70, 0x7a, 0x42, 0x19, 0x0f, 0xb6, 0x16, 0xb8, 0xf5, 0xc7, 0x82, 0xb9, 0x3a, 0x9c, - 0x9e, 0xe8, 0xa3, 0x11, 0x4e, 0x29, 0x9a, 0x89, 0x6c, 0x50, 0x3c, 0xb6, 0x6b, 0x05, 0xe6, 0x22, - 0x62, 0x52, 0x02, 0x6c, 0xdf, 0x72, 0xdc, 0x73, 0xc0, 0x8c, 0x06, 0x79, 0x86, 0x2a, 0xf6, 0x43, - 0xfb, 0x71, 0x4e, 0xc8, 0xbb, 0xb3, 0xd7, 0xfd, 0x2f, 0xa6, 0x28, 0x63, 0x8a, 0xee, 0x80, 0x4a, - 0x87, 0x3e, 0x3a, 0x54, 0xc2, 0x39, 0x5a, 0x1b, 0x4e, 0x4f, 0xc2, 0xb1, 0x93, 0x07, 0x7e, 0x51, - 0x1e, 0xf8, 0xd7, 0x84, 0x3c, 0x9c, 0x79, 0x3c, 0xcc, 0x1e, 0x72, 0xed, 0x3f, 0xf2, 0x70, 0xfb, - 0x74, 0x87, 0xc0, 0x2f, 0xe6, 0x2d, 0x63, 0xde, 0x12, 0xaa, 0xd3, 0x85, 0x94, 0xea, 0x34, 0x63, - 0xef, 0x2d, 0x66, 0xed, 0xbd, 0x94, 0xa2, 0x76, 0x29, 0x43, 0x51, 0x9b, 0xb9, 0x41, 0x8b, 0x4f, - 0xd9, 0xa0, 0xcb, 0xf2, 0x3a, 0xf9, 0x97, 0x50, 0x81, 0x11, 0x97, 0x07, 0x1e, 0xc1, 0x59, 0x21, - 0x0f, 0xb0, 0x9b, 0x23, 0xd2, 0xbf, 0x97, 0xee, 0xdf, 0xcd, 0x92, 0x04, 0x10, 0x2d, 0x83, 0x5b, - 0xdf, 0xe0, 0x32, 0x40, 0x54, 0xfe, 0x7f, 0x87, 0xfb, 0x27, 0x0f, 0xe1, 0x02, 0xc6, 0x77, 0xef, - 0xc9, 0x2f, 0x07, 0xf6, 0xd8, 0x3d, 0xe4, 0xeb, 0xe1, 0x46, 0x8a, 0x57, 0xf6, 0x7a, 0x52, 0x73, - 0x4c, 0xf7, 0x70, 0xf7, 0x8c, 0x79, 0x2e, 0xc8, 0x80, 0x27, 0x05, 0x8b, 0x3f, 0x55, 0x40, 0x7b, - 0xfa, 0x78, 0xa1, 0xa2, 0x2a, 0x39, 0xe0, 0xcb, 0x66, 0xc9, 0x91, 0x46, 0xef, 0x05, 0x58, 0x1d, - 0xbb, 0x87, 0x63, 0x37, 0x38, 0x8e, 0x69, 0x40, 0x56, 0x38, 0x50, 0x0c, 0x8c, 0x88, 0x32, 0xf9, - 0x4c, 0x9c, 0xb9, 0xa8, 0xa4, 0x6d, 0x87, 0xf2, 0x62, 0xe6, 0x3c, 0xd0, 0xd5, 0x24, 0x37, 0x90, - 0xfd, 0x78, 0x50, 0x28, 0xe6, 0xd4, 0xbc, 0xc9, 0x63, 0x61, 0x1e, 0x7a, 0x03, 0x57, 0xfb, 0x4b, - 0x45, 0x70, 0x04, 0x59, 0x83, 0x47, 0x1e, 0x49, 0xc6, 0xbc, 0xf9, 0x14, 0x1b, 0x92, 0x55, 0x45, - 0xb6, 0x7b, 0xe4, 0xe1, 0x19, 0x11, 0x10, 0x0b, 0xcf, 0x88, 0x90, 0xf7, 0x60, 0x91, 0xc8, 0xa5, - 0xe6, 0x37, 0x84, 0x45, 0x10, 0x3d, 0xf3, 0xf6, 0xef, 0x91, 0xbb, 0xb0, 0xc4, 0x8c, 0x80, 0x44, - 0x73, 0xd7, 0x63, 0xcd, 0xdd, 0xbf, 0x67, 0x8a, 0x72, 0xed, 0xed, 0xf0, 0x5d, 0x2b, 0xd5, 0x89, - 0xfd, 0x7b, 0xe4, 0xb5, 0xd3, 0x19, 0xe7, 0x16, 0x85, 0x71, 0x6e, 0x68, 0x98, 0xfb, 0x7a, 0xcc, - 0x30, 0xf7, 0xe6, 0xfc, 0xd1, 0xe2, 0xaf, 0x91, 0x2c, 0x1c, 0x61, 0x14, 0xa6, 0xea, 0xc7, 0x0a, - 0x5c, 0x9d, 0x5b, 0x83, 0x5c, 0x81, 0xa2, 0xde, 0xae, 0x75, 0xa2, 0xf9, 0xa5, 0x7b, 0x46, 0x40, - 0xc8, 0x0e, 0x2c, 0x6f, 0x39, 0x81, 0xd7, 0xa3, 0xcb, 0x38, 0xf3, 0x79, 0x20, 0x45, 0x36, 0x44, - 0xdf, 0x3d, 0x63, 0x46, 0x75, 0x89, 0x0d, 0x1b, 0xb8, 0x17, 0x62, 0xa9, 0x9f, 0xf2, 0x19, 0xba, - 0x86, 0x14, 0xc1, 0x54, 0x35, 0x7a, 0xce, 0xa4, 0x80, 0xc9, 0x2d, 0xf8, 0x96, 0xe0, 0x45, 0x66, - 0x37, 0xf0, 0x19, 0xe2, 0xaa, 0xde, 0x81, 0x62, 0x5b, 0xd8, 0x09, 0x48, 0xd6, 0xec, 0xc2, 0x26, - 0xc0, 0x0c, 0x4b, 0xb5, 0xdf, 0x50, 0x84, 0x42, 0xe0, 0xe9, 0x1d, 0x91, 0xb2, 0x66, 0xf5, 0xe7, - 0x67, 0xcd, 0xea, 0xff, 0x94, 0x59, 0xb3, 0xb4, 0x3f, 0xe1, 0x51, 0xcf, 0x6b, 0xfd, 0x76, 0x42, - 0x33, 0xfb, 0x5e, 0xbd, 0x12, 0x8c, 0xd8, 0xea, 0x7c, 0x41, 0xca, 0xba, 0x98, 0xfe, 0xd6, 0x6c, - 0xe7, 0x04, 0x69, 0xa9, 0xfe, 0x41, 0x1e, 0xae, 0xcc, 0xab, 0x9e, 0x99, 0xd7, 0x59, 0x79, 0xb6, - 0xbc, 0xce, 0x77, 0xa1, 0xc8, 0x60, 0xa1, 0xc9, 0x3d, 0x0e, 0x38, 0xaf, 0x4a, 0x07, 0x5c, 0x14, - 0x93, 0x17, 0x60, 0x51, 0xaf, 0x58, 0x51, 0xaa, 0x31, 0xb4, 0x8d, 0x75, 0x7a, 0x01, 0x5a, 0x5d, - 0xf2, 0x22, 0xf2, 0x85, 0x74, 0x76, 0x3d, 0x9e, 0x63, 0xec, 0xb2, 0x34, 0x20, 0xa9, 0x84, 0x04, - 0xd8, 0xde, 0x28, 0x80, 0x3e, 0x8f, 0x49, 0x6d, 0xa6, 0x33, 0xf5, 0x69, 0xb0, 0xd8, 0x1e, 0xbb, - 0x81, 0x3b, 0x91, 0xed, 0x56, 0x47, 0x08, 0x31, 0x79, 0x09, 0xb7, 0x2a, 0x75, 0x9e, 0xb0, 0x20, - 0x02, 0x8b, 0x72, 0x60, 0x17, 0x34, 0x43, 0xa5, 0x60, 0x53, 0x42, 0xa1, 0x15, 0xea, 0xce, 0x74, - 0xd8, 0x3b, 0xee, 0x9a, 0x75, 0xce, 0x6a, 0xb0, 0x0a, 0x03, 0x84, 0xd2, 0x0e, 0x06, 0xa6, 0x84, - 0xa2, 0x7d, 0x53, 0x81, 0x73, 0x59, 0xfd, 0x20, 0x57, 0xa0, 0x30, 0xcc, 0x4c, 0x24, 0x38, 0x64, - 0xbe, 0xcf, 0x25, 0xfa, 0xd7, 0x3e, 0xf4, 0xc7, 0x27, 0xce, 0x44, 0xb6, 0xee, 0x95, 0xc0, 0x26, - 0xd0, 0x1f, 0xdb, 0xf8, 0x3f, 0xb9, 0x2e, 0xce, 0xe8, 0x7c, 0x2a, 0xf5, 0x20, 0xfe, 0xd1, 0x74, - 0x80, 0x5a, 0xbf, 0xdd, 0x1a, 0xb1, 0x80, 0xf8, 0xaf, 0x40, 0x81, 0x36, 0x2b, 0xb1, 0x7a, 0xe9, - 0xfa, 0xd1, 0x1b, 0x75, 0x8e, 0xc4, 0x5a, 0x15, 0x38, 0x27, 0x03, 0x13, 0x91, 0xb5, 0x03, 0x58, - 0x8b, 0x63, 0x10, 0x23, 0x1e, 0x42, 0xb5, 0x74, 0x5f, 0xe5, 0x94, 0xb6, 0x7c, 0x9f, 0x79, 0x98, - 0x6c, 0x3d, 0xf7, 0x77, 0xef, 0x5c, 0x07, 0xfa, 0x93, 0xd5, 0xc9, 0x0a, 0xb1, 0xaa, 0x7d, 0x2b, - 0x07, 0xe7, 0x22, 0xa7, 0x76, 0xb1, 0x87, 0x7e, 0x6e, 0x3d, 0x2c, 0xf5, 0x98, 0x07, 0xa0, 0x60, - 0xb4, 0xd2, 0x1d, 0x9c, 0xe3, 0x78, 0xb4, 0x03, 0x9b, 0xb3, 0xf0, 0xc9, 0x8b, 0xb0, 0x8c, 0x71, - 0x90, 0x46, 0x4e, 0xcf, 0x95, 0xcf, 0xbe, 0xa1, 0x00, 0x9a, 0x51, 0xb9, 0xf6, 0x43, 0x05, 0x2e, - 0x71, 0xbf, 0x88, 0x86, 0xe3, 0x0d, 0x51, 0xad, 0xde, 0x73, 0xdf, 0x1f, 0x0f, 0xe1, 0x9d, 0xd8, - 0x39, 0x76, 0x2b, 0xee, 0xfe, 0x92, 0xfa, 0xda, 0xec, 0xde, 0x92, 0xbb, 0x18, 0xdb, 0x8b, 0x3f, - 0x3b, 0x17, 0x58, 0x44, 0x86, 0x21, 0x05, 0xc8, 0x11, 0x19, 0x10, 0x43, 0xfb, 0x65, 0xb8, 0x36, - 0xff, 0x03, 0xe4, 0xf3, 0xb0, 0x8a, 0xc9, 0xa2, 0xba, 0xa3, 0xa3, 0xb1, 0xd3, 0x77, 0x85, 0x2a, - 0x4c, 0xa8, 0x2f, 0xe5, 0x32, 0x16, 0xaa, 0x8c, 0x47, 0x08, 0x38, 0xc2, 0x34, 0x54, 0xbc, 0x52, - 0xcc, 0xf9, 0x48, 0xa6, 0xa6, 0xfd, 0x8a, 0x02, 0x24, 0x4d, 0x83, 0x7c, 0x04, 0x56, 0xba, 0x9d, - 0x8a, 0x35, 0x71, 0xc6, 0x93, 0x5d, 0x7f, 0x3a, 0xe6, 0x71, 0xc2, 0x98, 0xc3, 0xf8, 0xa4, 0x67, - 0xb3, 0x07, 0x94, 0x63, 0x7f, 0x3a, 0x36, 0x63, 0x78, 0x98, 0xe5, 0xc8, 0x75, 0xbf, 0xdc, 0x77, - 0x9e, 0xc4, 0xb3, 0x1c, 0x71, 0x58, 0x2c, 0xcb, 0x11, 0x87, 0x69, 0xdf, 0x55, 0xe0, 0xb2, 0xb0, - 0x26, 0xec, 0x67, 0xb4, 0xa5, 0x82, 0x61, 0x51, 0xc6, 0x22, 0x30, 0xed, 0x3c, 0x96, 0x76, 0x43, - 0x44, 0x0e, 0xc2, 0x06, 0x22, 0x6f, 0xcb, 0xea, 0x92, 0x4f, 0x41, 0xc1, 0x9a, 0xf8, 0xa3, 0x53, - 0x84, 0x0e, 0x52, 0xc3, 0x19, 0x9d, 0xf8, 0x23, 0x24, 0x81, 0x35, 0x35, 0x17, 0xce, 0xc9, 0x8d, - 0x13, 0x2d, 0x26, 0x0d, 0x58, 0xe2, 0x31, 0xe2, 0x12, 0x0f, 0xf5, 0x73, 0xfa, 0xb4, 0xb5, 0x2e, - 0xe2, 0x13, 0xf1, 0xc0, 0xa8, 0xa6, 0xa0, 0xa1, 0xfd, 0x96, 0x02, 0x25, 0xca, 0x6d, 0xa0, 0x14, - 0xf7, 0x5e, 0x97, 0x74, 0x9c, 0x71, 0x14, 0x76, 0x27, 0x21, 0xf9, 0x53, 0xdd, 0xc6, 0xaf, 0xc2, - 0x7a, 0xa2, 0x02, 0xd1, 0x30, 0x32, 0xc5, 0xc0, 0xeb, 0x39, 0x2c, 0x69, 0x0a, 0xb3, 0xd9, 0x88, - 0xc1, 0xb4, 0x5f, 0x53, 0xe0, 0x1c, 0x95, 0xf9, 0xd9, 0x3b, 0xa7, 0x39, 0x1d, 0x88, 0xfd, 0x4e, - 0x39, 0x28, 0x61, 0x96, 0xca, 0xbc, 0xe6, 0x19, 0x07, 0xc5, 0x61, 0x66, 0x58, 0x4a, 0x76, 0xa1, - 0xc8, 0xef, 0x97, 0x80, 0xc7, 0x33, 0xbd, 0x26, 0x29, 0x13, 0x22, 0xc2, 0x1c, 0x89, 0xf6, 0x04, - 0x8f, 0x30, 0x5e, 0xc7, 0x0c, 0x6b, 0x6b, 0xff, 0xa9, 0xc0, 0xc5, 0x19, 0x75, 0xc8, 0xc7, 0x61, - 0x01, 0x3d, 0xfa, 0xf8, 0xec, 0x5d, 0x99, 0xf1, 0x89, 0x49, 0xef, 0x78, 0xff, 0x1e, 0xbb, 0x88, - 0x4e, 0xe8, 0x0f, 0x93, 0xd5, 0x22, 0x8f, 0x60, 0x59, 0xef, 0xf7, 0xb9, 0x38, 0x93, 0x8b, 0x89, - 0x33, 0x33, 0xbe, 0xf8, 0x72, 0x88, 0xcf, 0xc4, 0x19, 0xe6, 0x5b, 0xd2, 0xef, 0xdb, 0xdc, 0x5b, - 0x31, 0xa2, 0x77, 0xe9, 0xff, 0xc3, 0x5a, 0x1c, 0xf9, 0x99, 0x1c, 0xac, 0xde, 0x56, 0x40, 0x8d, - 0xb7, 0xe1, 0x67, 0x13, 0x59, 0x29, 0x6b, 0x9a, 0x9f, 0xb2, 0xa8, 0x7e, 0x27, 0x07, 0xe7, 0x33, - 0x47, 0x98, 0xbc, 0x04, 0x8b, 0xfa, 0x68, 0x54, 0xab, 0xf2, 0x55, 0xc5, 0x39, 0x24, 0xd4, 0x12, - 0xc7, 0xa4, 0x3d, 0x86, 0x44, 0x5e, 0x81, 0x22, 0x7b, 0x4e, 0xaf, 0x8a, 0x03, 0x07, 0x43, 0xc5, - 0xf0, 0xb7, 0xfe, 0x78, 0x64, 0x51, 0x81, 0x48, 0xb6, 0x61, 0x8d, 0x07, 0x59, 0x31, 0xdd, 0x23, - 0xf7, 0xab, 0x61, 0x88, 0x7b, 0x8c, 0xc2, 0x2f, 0x54, 0xcf, 0xf6, 0x98, 0x95, 0xc9, 0x61, 0x46, - 0xe2, 0xb5, 0x48, 0x1d, 0x54, 0xa4, 0x29, 0x53, 0x62, 0xe1, 0x4d, 0x31, 0xec, 0x0d, 0x6b, 0xc4, - 0x0c, 0x5a, 0xa9, 0x9a, 0xe1, 0x74, 0xe9, 0x41, 0xe0, 0x1d, 0x0d, 0x4f, 0xdc, 0xe1, 0xe4, 0x67, - 0x37, 0x5d, 0xd1, 0x37, 0x4e, 0x35, 0x5d, 0xbf, 0x57, 0x60, 0x9b, 0x39, 0x59, 0x8d, 0x72, 0x34, - 0x52, 0x44, 0x6b, 0xe4, 0x68, 0xa8, 0xd0, 0xc4, 0xc3, 0x88, 0x54, 0x61, 0x89, 0x85, 0x77, 0x11, - 0x3b, 0xe3, 0x6a, 0x66, 0x13, 0x18, 0xce, 0xfe, 0x3d, 0xc6, 0xbe, 0x30, 0xd7, 0xc2, 0xc0, 0x14, - 0x55, 0xc9, 0x3e, 0x94, 0x2a, 0x03, 0xd7, 0x19, 0x4e, 0x47, 0x9d, 0xd3, 0x3d, 0x39, 0x6e, 0xf2, - 0xbe, 0xac, 0xf4, 0x58, 0x35, 0x7c, 0xaa, 0xc4, 0x93, 0x5c, 0x26, 0x44, 0x3a, 0xa1, 0xb7, 0x51, - 0x01, 0x35, 0x95, 0x1f, 0x9e, 0x33, 0x3e, 0x49, 0x20, 0xd6, 0x8b, 0xbb, 0xd2, 0x71, 0x77, 0x24, - 0x1b, 0xd6, 0xea, 0x4e, 0x30, 0xe9, 0x8c, 0x9d, 0x61, 0x80, 0x61, 0x21, 0x4f, 0x11, 0x36, 0xeb, - 0xb2, 0x48, 0x39, 0x8c, 0x3a, 0xc6, 0x49, 0x58, 0x95, 0x69, 0x30, 0xe3, 0xe4, 0x28, 0xbf, 0xb4, - 0xed, 0x0d, 0x9d, 0x81, 0xf7, 0x35, 0xe1, 0x94, 0xc9, 0xf8, 0xa5, 0x43, 0x01, 0x34, 0xa3, 0x72, - 0xed, 0x73, 0xa9, 0x79, 0x63, 0xad, 0x2c, 0xc1, 0x12, 0x77, 0xd9, 0x67, 0x2e, 0xec, 0x6d, 0xa3, - 0x59, 0xad, 0x35, 0x77, 0x54, 0x85, 0xac, 0x01, 0xb4, 0xcd, 0x56, 0xc5, 0xb0, 0x2c, 0xfa, 0x3b, - 0x47, 0x7f, 0x73, 0xff, 0xf6, 0xed, 0x6e, 0x5d, 0xcd, 0x4b, 0x2e, 0xee, 0x05, 0xed, 0x07, 0x0a, - 0x5c, 0xc8, 0x9e, 0x4a, 0xd2, 0x01, 0x0c, 0x72, 0xc0, 0x1f, 0x9f, 0x3f, 0x32, 0x77, 0xde, 0x33, - 0xc1, 0xc9, 0x60, 0x09, 0x13, 0xe6, 0x84, 0x9f, 0x13, 0x8f, 0x45, 0xcc, 0xab, 0xcf, 0xeb, 0x9b, - 0x39, 0xaf, 0xaf, 0x55, 0x60, 0x73, 0x16, 0x8d, 0x78, 0x57, 0xd7, 0xa1, 0xa4, 0xb7, 0xdb, 0xf5, - 0x5a, 0x45, 0xef, 0xd4, 0x5a, 0x4d, 0x55, 0x21, 0xcb, 0xb0, 0xb0, 0x63, 0xb6, 0xba, 0x6d, 0x35, - 0xa7, 0x7d, 0x5b, 0x81, 0xd5, 0x5a, 0x64, 0xa6, 0xf5, 0x5e, 0x37, 0xdf, 0x47, 0x63, 0x9b, 0x6f, - 0x33, 0x0c, 0x07, 0x12, 0x7e, 0xe0, 0x54, 0x3b, 0xef, 0x6f, 0x15, 0xd8, 0x48, 0xd5, 0x21, 0x16, - 0x2c, 0xe9, 0x07, 0x56, 0xab, 0x56, 0xad, 0xf0, 0x96, 0x5d, 0x8f, 0xec, 0x8b, 0x30, 0xe3, 0x53, - 0xea, 0x2b, 0xcc, 0x85, 0xf6, 0x71, 0x60, 0xfb, 0x5e, 0x5f, 0xca, 0xd6, 0xba, 0x7b, 0xc6, 0x14, - 0x94, 0xf0, 0x26, 0xfb, 0xda, 0x74, 0xec, 0x22, 0xd9, 0x5c, 0x4c, 0x11, 0x1a, 0xc2, 0xd3, 0x84, - 0xd1, 0xe1, 0xc1, 0xa1, 0xe5, 0x69, 0xd2, 0x11, 0xbd, 0xad, 0x55, 0x28, 0x71, 0xa9, 0x05, 0x05, - 0x82, 0xef, 0x29, 0xb0, 0x39, 0xab, 0xad, 0x54, 0x10, 0x8a, 0xfb, 0xd3, 0x5f, 0x08, 0x33, 0x38, - 0xc4, 0x1d, 0xe9, 0x05, 0x1a, 0xf9, 0x24, 0x94, 0x6a, 0x41, 0x30, 0x75, 0xc7, 0xd6, 0x2b, 0x5d, - 0xb3, 0xc6, 0x17, 0xc8, 0xd5, 0x7f, 0x7b, 0xe7, 0xfa, 0x45, 0x74, 0x4b, 0x18, 0xdb, 0xc1, 0x2b, - 0xf6, 0x74, 0xec, 0xc5, 0xa2, 0xdd, 0xcb, 0x35, 0x28, 0xdf, 0xea, 0x4c, 0xfb, 0x9e, 0x2b, 0xb8, - 0x76, 0xe1, 0x73, 0xcc, 0x61, 0xf2, 0x2d, 0x22, 0x60, 0xda, 0x37, 0x14, 0xb8, 0x34, 0x7b, 0x60, - 0xe8, 0xcd, 0xd4, 0x61, 0x56, 0x3f, 0xc2, 0xeb, 0x17, 0x6f, 0xa6, 0xd0, 0x34, 0x48, 0xa6, 0x29, - 0x10, 0x69, 0xa5, 0x30, 0x7b, 0x7a, 0x2e, 0x95, 0x32, 0x39, 0x5e, 0x49, 0x20, 0x6a, 0xff, 0x9e, - 0x83, 0x0b, 0x74, 0xd1, 0x0d, 0xdc, 0x20, 0xd0, 0xa7, 0x93, 0x63, 0x77, 0x38, 0xe1, 0x6c, 0x18, - 0x79, 0x0d, 0x16, 0x8f, 0x9f, 0x4d, 0xe5, 0xc8, 0xd0, 0x09, 0x01, 0x3c, 0xc8, 0x85, 0x93, 0x05, - 0xfd, 0x9f, 0xdc, 0x00, 0x39, 0x49, 0x75, 0x1e, 0xc3, 0x64, 0xe6, 0x36, 0x15, 0x73, 0x79, 0x14, - 0xe6, 0x93, 0x7d, 0x1d, 0x16, 0x50, 0xcd, 0xc0, 0x8f, 0x54, 0xc1, 0x0a, 0x67, 0xb7, 0x0e, 0x95, - 0x10, 0x26, 0xab, 0x40, 0x3e, 0x04, 0x10, 0x65, 0x18, 0xe0, 0x67, 0xa6, 0x10, 0xbf, 0xc3, 0x24, - 0x03, 0xe6, 0xf2, 0xc9, 0xa1, 0xc3, 0xc3, 0xf6, 0x97, 0x61, 0x43, 0x0c, 0xcb, 0x48, 0x44, 0xd7, - 0xe3, 0xaf, 0x61, 0xeb, 0xac, 0xa0, 0x36, 0x12, 0x11, 0xf6, 0x6e, 0xa6, 0x12, 0xed, 0x62, 0x90, - 0xdd, 0x44, 0x36, 0xdd, 0x9b, 0xa9, 0x6c, 0xba, 0x45, 0x86, 0x25, 0xa7, 0xcc, 0xd5, 0xfe, 0x39, - 0x07, 0xcb, 0x07, 0x94, 0x59, 0x41, 0x11, 0x7c, 0xbe, 0x48, 0x7f, 0x1f, 0x4a, 0x75, 0xdf, 0xe1, - 0xcf, 0x0e, 0xdc, 0x37, 0x81, 0xf9, 0x06, 0x0f, 0x7c, 0x47, 0xbc, 0x60, 0x04, 0xa6, 0x8c, 0xf4, - 0x14, 0xbf, 0xe6, 0x07, 0xb0, 0xc8, 0x9e, 0x81, 0xb8, 0x76, 0x49, 0xb0, 0xab, 0x61, 0x8b, 0x5e, - 0x66, 0xc5, 0x92, 0xa6, 0x9c, 0x3d, 0x25, 0xc9, 0xbc, 0x13, 0x8f, 0x15, 0x2a, 0x29, 0x1c, 0x16, - 0x4e, 0xa7, 0x70, 0x90, 0x62, 0xa2, 0x2d, 0x9e, 0x26, 0x26, 0xda, 0xa5, 0x37, 0xa0, 0x24, 0xb5, - 0xe7, 0x99, 0xb8, 0xd7, 0xaf, 0xe7, 0x60, 0x15, 0x7b, 0x15, 0xda, 0x84, 0xfc, 0x7c, 0xaa, 0x4f, - 0x3e, 0x1a, 0x53, 0x9f, 0x6c, 0xca, 0xf3, 0xc5, 0x7a, 0x36, 0x47, 0x6f, 0xf2, 0x00, 0x36, 0x52, - 0x88, 0xe4, 0x55, 0x58, 0xa0, 0xcd, 0x17, 0xe2, 0xa6, 0x9a, 0x5c, 0x01, 0x51, 0xfc, 0x5c, 0xda, - 0xf1, 0xc0, 0x64, 0xd8, 0xda, 0x7f, 0x29, 0xb0, 0xc2, 0xd3, 0x57, 0x0c, 0x0f, 0xfd, 0xa7, 0x0e, - 0xe7, 0xed, 0xe4, 0x70, 0xb2, 0x28, 0x1d, 0x7c, 0x38, 0xff, 0xa7, 0x07, 0xf1, 0x8d, 0xd8, 0x20, - 0x5e, 0x0c, 0xa3, 0xe9, 0x89, 0xee, 0xcc, 0x19, 0xc3, 0xbf, 0xc2, 0xf8, 0xb2, 0x71, 0x44, 0xf2, - 0x05, 0x58, 0x6e, 0xba, 0x8f, 0x63, 0x52, 0xdb, 0xed, 0x19, 0x44, 0x5f, 0x0e, 0x11, 0xd9, 0x9e, - 0xc2, 0x0b, 0x6f, 0xe8, 0x3e, 0xb6, 0x53, 0x2f, 0x50, 0x11, 0x49, 0x2a, 0xb8, 0xc5, 0xab, 0x3d, - 0xcb, 0xd2, 0xe7, 0x8e, 0x92, 0x18, 0x78, 0xe6, 0x9b, 0x79, 0x80, 0xc8, 0xc7, 0x8c, 0x6e, 0xc0, - 0xd8, 0xe3, 0xbb, 0x50, 0x78, 0x23, 0x48, 0x5e, 0xe3, 0xe2, 0x4d, 0xfe, 0x36, 0x57, 0xcc, 0xe6, - 0x66, 0x47, 0x3b, 0x44, 0x15, 0x6d, 0x85, 0x3b, 0x35, 0xf5, 0xdd, 0x81, 0xc3, 0xce, 0xf6, 0xfc, - 0xd6, 0x4d, 0x0c, 0x6e, 0x1b, 0x42, 0x67, 0xe4, 0x21, 0x46, 0xd7, 0xa7, 0x2a, 0x45, 0x48, 0xf9, - 0x6d, 0x16, 0x9e, 0xcd, 0x6f, 0xb3, 0x0d, 0xcb, 0xde, 0xf0, 0x2d, 0x77, 0x38, 0xf1, 0xc7, 0x4f, - 0x50, 0x1b, 0x1d, 0xa9, 0xb9, 0xe8, 0x10, 0xd4, 0x44, 0x19, 0x9b, 0x07, 0xbc, 0x18, 0x43, 0x7c, - 0x79, 0x1a, 0x42, 0x60, 0xe8, 0x77, 0xba, 0xa0, 0x2e, 0x3e, 0x28, 0x14, 0x17, 0xd5, 0xa5, 0x07, - 0x85, 0x62, 0x51, 0x5d, 0x7e, 0x50, 0x28, 0x2e, 0xab, 0x60, 0x4a, 0xef, 0x3b, 0xe1, 0xfb, 0x8d, - 0xf4, 0xe4, 0x12, 0x7f, 0x4e, 0xd1, 0x7e, 0x92, 0x03, 0x92, 0x6e, 0x06, 0xf9, 0x28, 0x94, 0xd8, - 0x01, 0x6b, 0x8f, 0x83, 0xaf, 0x70, 0xb3, 0x75, 0x16, 0xbe, 0x47, 0x02, 0xcb, 0xe1, 0x7b, 0x18, - 0xd8, 0x0c, 0xbe, 0x32, 0x20, 0x9f, 0x87, 0xb3, 0x38, 0xbc, 0x23, 0x77, 0xec, 0xf9, 0x7d, 0x1b, - 0x63, 0xad, 0x3a, 0x03, 0x9e, 0x33, 0xf0, 0x25, 0x4c, 0x6e, 0x9b, 0x2e, 0x9e, 0x31, 0x0d, 0xe8, - 0x4a, 0xd6, 0x46, 0xcc, 0x36, 0x43, 0x24, 0x1d, 0x50, 0xe5, 0xfa, 0x87, 0xd3, 0xc1, 0x80, 0xcf, - 0x6c, 0x99, 0x0a, 0xba, 0xc9, 0xb2, 0x19, 0x84, 0xd7, 0x22, 0xc2, 0xdb, 0xd3, 0xc1, 0x80, 0xbc, - 0x06, 0xe0, 0x0f, 0xed, 0x13, 0x2f, 0x08, 0xd8, 0x1b, 0x47, 0xe8, 0xf5, 0x1a, 0x41, 0xe5, 0xc9, - 0xf0, 0x87, 0x0d, 0x06, 0x24, 0xff, 0x0f, 0xd0, 0xeb, 0x1f, 0xc3, 0x61, 0x30, 0xab, 0x16, 0x9e, - 0x05, 0x44, 0x00, 0xe3, 0x4e, 0xb6, 0x47, 0xae, 0xe5, 0x7d, 0x4d, 0xb8, 0x0c, 0x7c, 0x16, 0x36, - 0xb8, 0x11, 0xea, 0x81, 0x37, 0x39, 0xe6, 0x1c, 0xf6, 0x7b, 0x61, 0xcf, 0x25, 0x16, 0xfb, 0xef, - 0x0b, 0x00, 0xfa, 0x81, 0x25, 0x22, 0x4d, 0xdd, 0x85, 0x05, 0x2a, 0x37, 0x08, 0xfd, 0x03, 0x6a, - 0x6f, 0x91, 0xae, 0xac, 0xbd, 0x45, 0x0c, 0xba, 0x1b, 0x4d, 0x34, 0xce, 0x16, 0xba, 0x07, 0xdc, - 0x8d, 0xcc, 0x5e, 0x3b, 0x16, 0xe9, 0x97, 0x63, 0x91, 0x3a, 0x40, 0x14, 0xfb, 0x89, 0x4b, 0xb2, - 0x1b, 0x51, 0x10, 0x15, 0x5e, 0xc0, 0xb3, 0x0d, 0x44, 0xf1, 0xa3, 0xe4, 0xe5, 0x13, 0xa1, 0x91, - 0x3d, 0x28, 0x74, 0x9c, 0xd0, 0xa7, 0x73, 0x46, 0x44, 0xac, 0xe7, 0x79, 0x4e, 0xc7, 0x28, 0x2a, - 0xd6, 0xda, 0xc4, 0x89, 0xa5, 0xbe, 0x45, 0x22, 0xc4, 0x80, 0x45, 0x9e, 0xaf, 0x7b, 0x46, 0x24, - 0x45, 0x9e, 0xae, 0x9b, 0xc7, 0x4f, 0x46, 0xa0, 0xcc, 0x53, 0xf0, 0xcc, 0xdc, 0xf7, 0x21, 0x6f, - 0x59, 0x0d, 0x1e, 0x07, 0x62, 0x35, 0x92, 0x4a, 0x2c, 0xab, 0xc1, 0xde, 0x28, 0x83, 0xe0, 0x44, - 0xaa, 0x46, 0x91, 0xc9, 0xc7, 0xa0, 0x24, 0xb1, 0xcf, 0x3c, 0x82, 0x0a, 0x8e, 0x81, 0xe4, 0x35, - 0x23, 0x1f, 0x1a, 0x12, 0x36, 0xa9, 0x83, 0xba, 0x37, 0x7d, 0xd3, 0xd5, 0x47, 0x23, 0x74, 0xa7, - 0x7b, 0xcb, 0x1d, 0x33, 0xb6, 0xad, 0x18, 0x85, 0x1e, 0x46, 0x5b, 0xfb, 0xbe, 0x28, 0x95, 0x75, - 0x30, 0xc9, 0x9a, 0xa4, 0x0d, 0x1b, 0x96, 0x3b, 0x99, 0x8e, 0x98, 0x9d, 0xc6, 0xb6, 0x3f, 0xa6, - 0x42, 0x08, 0x8b, 0xb7, 0x82, 0x51, 0x5a, 0x03, 0x5a, 0x28, 0x8c, 0x63, 0x0e, 0xfd, 0x71, 0x42, - 0x20, 0x49, 0x57, 0xd6, 0x5c, 0x79, 0xca, 0xe9, 0xad, 0x1a, 0x17, 0x6d, 0xf0, 0x56, 0x15, 0xa2, - 0x4d, 0x24, 0xd0, 0x7c, 0x28, 0x23, 0x26, 0x18, 0x3e, 0x98, 0x49, 0x31, 0xc1, 0x62, 0x91, 0xc0, - 0xbe, 0x5b, 0x90, 0xc2, 0x52, 0xf2, 0xb9, 0xf8, 0x38, 0xc0, 0x03, 0xdf, 0x1b, 0x36, 0xdc, 0xc9, - 0xb1, 0xdf, 0x97, 0x42, 0x93, 0x95, 0xbe, 0xe4, 0x7b, 0x43, 0xfb, 0x04, 0xc1, 0x3f, 0x79, 0xe7, - 0xba, 0x84, 0x64, 0x4a, 0xff, 0x93, 0x0f, 0xc2, 0x32, 0xfd, 0xd5, 0x89, 0xac, 0x4d, 0x98, 0xaa, - 0x12, 0x6b, 0xb3, 0xe4, 0x0d, 0x11, 0x02, 0x79, 0x03, 0xd3, 0x95, 0x78, 0xa3, 0x89, 0xc4, 0xbc, - 0x8a, 0xdc, 0x24, 0xde, 0x68, 0x92, 0x8c, 0x34, 0x2c, 0x21, 0x93, 0xdd, 0xb0, 0xe9, 0x22, 0xc3, - 0x10, 0xcf, 0x8a, 0x82, 0xfa, 0x38, 0xbe, 0xd6, 0x6c, 0x11, 0xe2, 0x54, 0xce, 0x05, 0x9b, 0xa8, - 0x86, 0x8d, 0xb0, 0x76, 0xab, 0xec, 0x01, 0x85, 0x33, 0xb5, 0xac, 0x11, 0xc1, 0x71, 0xdf, 0xee, - 0x21, 0x38, 0xd6, 0x88, 0x10, 0x99, 0x6c, 0xc1, 0x3a, 0xe3, 0xf1, 0xc3, 0x4c, 0x85, 0x9c, 0xc5, - 0xc5, 0xb3, 0x2d, 0x4a, 0x65, 0x28, 0x7f, 0x3e, 0x51, 0x81, 0x6c, 0xc3, 0x02, 0x0a, 0x84, 0xdc, - 0xc4, 0xfc, 0xb2, 0x2c, 0x3d, 0x27, 0xf7, 0x11, 0x9e, 0x2b, 0x28, 0x37, 0xcb, 0xe7, 0x0a, 0xa2, - 0x92, 0xcf, 0x00, 0x18, 0xc3, 0xb1, 0x3f, 0x18, 0x60, 0x10, 0xde, 0x22, 0x8a, 0x52, 0x57, 0xe3, - 0xfb, 0x11, 0xa9, 0x44, 0x48, 0x3c, 0x60, 0x1c, 0xfe, 0xb6, 0x13, 0xa1, 0x7a, 0x25, 0x5a, 0x5a, - 0x0d, 0x16, 0xd9, 0x66, 0xc4, 0x80, 0xd6, 0x3c, 0x45, 0x87, 0x14, 0x0e, 0x99, 0x05, 0xb4, 0xe6, - 0xf0, 0x74, 0x40, 0x6b, 0xa9, 0x82, 0xb6, 0x07, 0xe7, 0xb2, 0x3a, 0x16, 0x13, 0x61, 0x95, 0xd3, - 0x8a, 0xb0, 0xdf, 0xc9, 0xc3, 0x0a, 0x52, 0x13, 0xa7, 0xb0, 0x0e, 0xab, 0xd6, 0xf4, 0xcd, 0x30, - 0xda, 0x93, 0x38, 0x8d, 0xb1, 0x7d, 0x81, 0x5c, 0x20, 0x3f, 0x6d, 0xc5, 0x6a, 0x10, 0x03, 0xd6, - 0xc4, 0x4d, 0xb0, 0x23, 0x2c, 0xd0, 0xc3, 0x58, 0xd2, 0x22, 0x62, 0x61, 0x3a, 0x53, 0x6b, 0xa2, - 0x52, 0x74, 0x1f, 0xe4, 0x9f, 0xe5, 0x3e, 0x28, 0x9c, 0xea, 0x3e, 0x78, 0x04, 0x2b, 0xe2, 0x6b, - 0x78, 0x92, 0x2f, 0xbc, 0xb7, 0x93, 0x3c, 0x46, 0x8c, 0xd4, 0xc3, 0x13, 0x7d, 0x71, 0xee, 0x89, - 0x8e, 0xef, 0x85, 0x62, 0x97, 0x8d, 0x10, 0x96, 0x3e, 0xd8, 0x31, 0x95, 0xe1, 0x4e, 0xa5, 0xfd, - 0x53, 0xdc, 0x92, 0xaf, 0xc2, 0x72, 0xdd, 0x17, 0x4f, 0x45, 0x92, 0x8e, 0x7e, 0x20, 0x80, 0x32, - 0xbb, 0x10, 0x62, 0x86, 0xb7, 0x5b, 0xfe, 0xfd, 0xb8, 0xdd, 0xde, 0x00, 0xe0, 0xae, 0x0d, 0x51, - 0x0a, 0x32, 0xdc, 0x32, 0x22, 0xd2, 0x45, 0xfc, 0xa9, 0x40, 0x42, 0xa6, 0xa7, 0x13, 0xb7, 0x42, - 0xd1, 0x7b, 0x3d, 0x7f, 0x3a, 0x9c, 0xc4, 0x72, 0xf6, 0x0a, 0x4f, 0x48, 0x87, 0x97, 0xc9, 0xc7, - 0x43, 0xa2, 0xda, 0xfb, 0x3b, 0x21, 0xe4, 0xd3, 0xa1, 0x11, 0xdd, 0xd2, 0xbc, 0x11, 0xd2, 0x52, - 0x23, 0x34, 0xd3, 0x74, 0x4e, 0xfb, 0x81, 0x22, 0x07, 0xf2, 0xff, 0x29, 0xa6, 0xfa, 0x75, 0x80, - 0xf0, 0xad, 0x5e, 0xcc, 0x35, 0x93, 0x97, 0x42, 0xa8, 0x3c, 0xca, 0x11, 0xae, 0xd4, 0x9b, 0xfc, - 0xfb, 0xd5, 0x9b, 0x0e, 0x94, 0x5a, 0x5f, 0x9e, 0x38, 0x91, 0x71, 0x07, 0x58, 0x21, 0x27, 0x8b, - 0x27, 0x53, 0x7e, 0xeb, 0x16, 0xde, 0x0d, 0x11, 0x1f, 0x3c, 0x83, 0x05, 0x96, 0x2a, 0x6a, 0x7f, - 0xa6, 0xc0, 0xba, 0xec, 0xbe, 0xfd, 0x64, 0xd8, 0x23, 0x9f, 0x60, 0x71, 0x45, 0x95, 0x98, 0xc8, - 0x22, 0x21, 0xd1, 0x23, 0xf7, 0xc9, 0xb0, 0xc7, 0x18, 0x20, 0xe7, 0xb1, 0xdc, 0x58, 0x5a, 0x91, - 0xbc, 0x09, 0x2b, 0x6d, 0x7f, 0x30, 0xa0, 0x6c, 0xcd, 0xf8, 0x2d, 0x2e, 0x00, 0x50, 0x42, 0xc9, - 0x17, 0x03, 0xd1, 0xa0, 0xad, 0x17, 0xb8, 0x9c, 0x7b, 0x71, 0x44, 0xcf, 0x7b, 0x8f, 0xd7, 0x8b, - 0xc8, 0xbe, 0x8d, 0xfe, 0x56, 0x32, 0x4d, 0xed, 0x47, 0x0a, 0x90, 0x74, 0x93, 0xe4, 0x23, 0x4b, - 0xf9, 0x5f, 0x60, 0x61, 0x13, 0xac, 0x5f, 0xe1, 0x59, 0x58, 0xbf, 0xf2, 0x6f, 0x2b, 0xb0, 0x5e, - 0xd3, 0x1b, 0x3c, 0xb4, 0x3f, 0x7b, 0xd8, 0xb8, 0x01, 0x57, 0x6b, 0x7a, 0xc3, 0x6e, 0xb7, 0xea, - 0xb5, 0xca, 0x43, 0x3b, 0x33, 0x62, 0xef, 0x55, 0x78, 0x2e, 0x8d, 0x12, 0x3d, 0x80, 0x5c, 0x81, - 0xcd, 0x74, 0xb1, 0x88, 0xea, 0x9b, 0x5d, 0x59, 0x04, 0x00, 0xce, 0x97, 0x3f, 0x09, 0xeb, 0x22, - 0x82, 0x6d, 0xa7, 0x6e, 0x61, 0x8c, 0xfc, 0x75, 0x28, 0xed, 0x1b, 0x66, 0x6d, 0xfb, 0xa1, 0xbd, - 0xdd, 0xad, 0xd7, 0xd5, 0x33, 0x64, 0x15, 0x96, 0x39, 0xa0, 0xa2, 0xab, 0x0a, 0x59, 0x81, 0x62, - 0xad, 0x69, 0x19, 0x95, 0xae, 0x69, 0xa8, 0xb9, 0xf2, 0x27, 0x61, 0xad, 0x3d, 0xf6, 0xde, 0x72, - 0x26, 0xee, 0x9e, 0xfb, 0x04, 0xdf, 0x2f, 0x96, 0x20, 0x6f, 0xea, 0x07, 0xea, 0x19, 0x02, 0xb0, - 0xd8, 0xde, 0xab, 0x58, 0xf7, 0xee, 0xa9, 0x0a, 0x29, 0xc1, 0xd2, 0x4e, 0xa5, 0x6d, 0xef, 0x35, - 0x2c, 0x35, 0x47, 0x7f, 0xe8, 0x07, 0x16, 0xfe, 0xc8, 0x97, 0x3f, 0x0c, 0x1b, 0xc8, 0x90, 0xd4, - 0xbd, 0x60, 0xe2, 0x0e, 0xdd, 0x31, 0xb6, 0x61, 0x05, 0x8a, 0x96, 0x4b, 0x4f, 0x92, 0x89, 0xcb, - 0x1a, 0xd0, 0x98, 0x0e, 0x26, 0xde, 0x68, 0xe0, 0x7e, 0x55, 0x55, 0xca, 0x6f, 0xc0, 0xba, 0xe9, - 0x4f, 0x27, 0xde, 0xf0, 0xc8, 0x9a, 0x50, 0x8c, 0xa3, 0x27, 0xe4, 0x3c, 0x6c, 0x74, 0x9b, 0x7a, - 0x63, 0xab, 0xb6, 0xd3, 0x6d, 0x75, 0x2d, 0xbb, 0xa1, 0x77, 0x2a, 0xbb, 0xec, 0xf5, 0xa4, 0xd1, - 0xb2, 0x3a, 0xb6, 0x69, 0x54, 0x8c, 0x66, 0x47, 0x55, 0xca, 0xdf, 0x42, 0xdd, 0x4a, 0xcf, 0x1f, - 0xf6, 0xb7, 0x9d, 0xde, 0xc4, 0x1f, 0x63, 0x83, 0x35, 0xb8, 0x66, 0x19, 0x95, 0x56, 0xb3, 0x6a, - 0x6f, 0xeb, 0x95, 0x4e, 0xcb, 0xcc, 0x0a, 0x19, 0x7d, 0x09, 0x2e, 0x64, 0xe0, 0xb4, 0x3a, 0x6d, - 0x55, 0x21, 0xd7, 0xe1, 0x72, 0x46, 0xd9, 0x81, 0xb1, 0xa5, 0x77, 0x3b, 0xbb, 0x4d, 0x35, 0x37, - 0xa3, 0xb2, 0x65, 0xb5, 0xd4, 0x7c, 0xf9, 0xd7, 0x15, 0x58, 0xeb, 0x06, 0xdc, 0x74, 0xb9, 0x8b, - 0x5e, 0x8b, 0xcf, 0xc3, 0x95, 0xae, 0x65, 0x98, 0x76, 0xa7, 0xb5, 0x67, 0x34, 0xed, 0xae, 0xa5, - 0xef, 0x24, 0x5b, 0x73, 0x1d, 0x2e, 0x4b, 0x18, 0xa6, 0x51, 0x69, 0xed, 0x1b, 0xa6, 0xdd, 0xd6, - 0x2d, 0xeb, 0xa0, 0x65, 0x56, 0x55, 0x85, 0x7e, 0x31, 0x03, 0xa1, 0xb1, 0xad, 0xb3, 0xd6, 0xc4, - 0xca, 0x9a, 0xc6, 0x81, 0x5e, 0xb7, 0xb7, 0x5a, 0x1d, 0x35, 0x5f, 0x6e, 0xd0, 0xfb, 0x1d, 0x03, - 0xb7, 0x32, 0x83, 0xbb, 0x22, 0x14, 0x9a, 0xad, 0xa6, 0x91, 0x7c, 0x73, 0x5b, 0x81, 0xa2, 0xde, - 0x6e, 0x9b, 0xad, 0x7d, 0x5c, 0x62, 0x00, 0x8b, 0x55, 0xa3, 0x49, 0x5b, 0x96, 0xa7, 0x25, 0x6d, - 0xb3, 0xd5, 0x68, 0x75, 0x8c, 0xaa, 0x5a, 0x28, 0x9b, 0x62, 0x0b, 0x0b, 0xa2, 0x3d, 0x9f, 0x3d, - 0x70, 0x55, 0x8d, 0x6d, 0xbd, 0x5b, 0xef, 0xf0, 0x29, 0x7a, 0x68, 0x9b, 0xc6, 0xa7, 0xbb, 0x86, - 0xd5, 0xb1, 0x54, 0x85, 0xa8, 0xb0, 0xd2, 0x34, 0x8c, 0xaa, 0x65, 0x9b, 0xc6, 0x7e, 0xcd, 0x38, - 0x50, 0x73, 0x94, 0x26, 0xfb, 0x9f, 0x7e, 0xa1, 0xfc, 0x5d, 0x05, 0x08, 0x0b, 0x7a, 0x2b, 0x32, - 0xa9, 0xe0, 0x8a, 0xb9, 0x06, 0x97, 0x76, 0xe9, 0x54, 0x63, 0xd7, 0x1a, 0xad, 0x6a, 0x72, 0xc8, - 0x2e, 0x00, 0x49, 0x94, 0xb7, 0xb6, 0xb7, 0x55, 0x85, 0x5c, 0x86, 0xb3, 0x09, 0x78, 0xd5, 0x6c, - 0xb5, 0xd5, 0xdc, 0xa5, 0x5c, 0x51, 0x21, 0x17, 0x53, 0x85, 0x7b, 0x86, 0xd1, 0x56, 0xf3, 0x74, - 0x8a, 0x12, 0x05, 0x62, 0x4b, 0xb0, 0xea, 0x85, 0xf2, 0x37, 0x14, 0xb8, 0xc0, 0x9a, 0x29, 0xf6, - 0x57, 0xd8, 0xd4, 0x2b, 0xb0, 0xc9, 0x43, 0x79, 0x67, 0x35, 0xf4, 0x1c, 0xa8, 0xb1, 0x52, 0xd6, - 0xcc, 0xf3, 0xb0, 0x11, 0x83, 0x62, 0x3b, 0x72, 0xf4, 0xf4, 0x88, 0x81, 0xb7, 0x0c, 0xab, 0x63, - 0x1b, 0xdb, 0xdb, 0x2d, 0xb3, 0xc3, 0x1a, 0x92, 0x2f, 0x6b, 0xb0, 0x51, 0x71, 0xc7, 0x13, 0x2a, - 0x7a, 0x0d, 0x03, 0xcf, 0x1f, 0x62, 0x13, 0x56, 0x61, 0xd9, 0xf8, 0x4c, 0xc7, 0x68, 0x5a, 0xb5, - 0x56, 0x53, 0x3d, 0x53, 0xbe, 0x92, 0xc0, 0x11, 0xfb, 0xd8, 0xb2, 0x76, 0xd5, 0x33, 0x65, 0x07, - 0x56, 0x85, 0x91, 0x30, 0x5b, 0x15, 0xd7, 0xe0, 0x92, 0x58, 0x6b, 0x78, 0xa2, 0x24, 0xbb, 0xb0, - 0x09, 0xe7, 0xd2, 0xe5, 0x46, 0x47, 0x55, 0xe8, 0x2c, 0x24, 0x4a, 0x28, 0x3c, 0x57, 0xfe, 0x55, - 0x05, 0x56, 0xc3, 0x47, 0x13, 0x54, 0xd3, 0x5e, 0x87, 0xcb, 0x8d, 0x6d, 0xdd, 0xae, 0x1a, 0xfb, - 0xb5, 0x8a, 0x61, 0xef, 0xd5, 0x9a, 0xd5, 0xc4, 0x47, 0x9e, 0x83, 0xf3, 0x19, 0x08, 0xf8, 0x95, - 0x4d, 0x38, 0x97, 0x2c, 0xea, 0xd0, 0xad, 0x9a, 0xa3, 0x43, 0x9f, 0x2c, 0x09, 0xf7, 0x69, 0xbe, - 0xbc, 0x0f, 0x6b, 0x96, 0xde, 0xa8, 0x6f, 0xfb, 0xe3, 0x9e, 0xab, 0x4f, 0x27, 0xc7, 0x43, 0x72, - 0x19, 0x2e, 0x6e, 0xb7, 0xcc, 0x8a, 0x61, 0x23, 0x4a, 0xa2, 0x05, 0x67, 0x61, 0x5d, 0x2e, 0x7c, - 0x68, 0xd0, 0xe5, 0x4b, 0x60, 0x4d, 0x06, 0x36, 0x5b, 0x6a, 0xae, 0xfc, 0x39, 0x58, 0x89, 0x25, - 0x54, 0xbb, 0x08, 0x67, 0xe5, 0xdf, 0x6d, 0x77, 0xd8, 0xf7, 0x86, 0x47, 0xea, 0x99, 0x64, 0x81, - 0x39, 0x1d, 0x0e, 0x69, 0x01, 0xee, 0x67, 0xb9, 0xa0, 0xe3, 0x8e, 0x4f, 0xbc, 0xa1, 0x33, 0x71, - 0xfb, 0x6a, 0xae, 0xfc, 0x32, 0xac, 0xc6, 0xc2, 0x38, 0xd3, 0x89, 0xab, 0xb7, 0xf8, 0x01, 0xdc, - 0x30, 0xaa, 0xb5, 0x6e, 0x43, 0x5d, 0xa0, 0x3b, 0x79, 0xb7, 0xb6, 0xb3, 0xab, 0x42, 0xf9, 0xdb, - 0x0a, 0x95, 0x33, 0x30, 0x39, 0x4b, 0x63, 0x5b, 0x17, 0x53, 0x4d, 0x97, 0x19, 0x0b, 0x0e, 0x6f, - 0x58, 0x16, 0x7b, 0x6a, 0xbe, 0x02, 0x9b, 0xfc, 0x87, 0xad, 0x37, 0xab, 0xf6, 0xae, 0x6e, 0x56, - 0x0f, 0x74, 0x93, 0xae, 0xbd, 0x87, 0x6a, 0x0e, 0x37, 0x94, 0x04, 0xb1, 0x3b, 0xad, 0x6e, 0x65, - 0x57, 0xcd, 0xd3, 0xf5, 0x1b, 0x83, 0xb7, 0x6b, 0x4d, 0xb5, 0x80, 0xdb, 0x33, 0x85, 0x8d, 0x64, - 0x69, 0xf9, 0x42, 0xf9, 0x5d, 0x05, 0x2e, 0x5a, 0xde, 0xd1, 0xd0, 0x99, 0x4c, 0xc7, 0xae, 0x3e, - 0x38, 0xf2, 0xc7, 0xde, 0xe4, 0xf8, 0xc4, 0x9a, 0x7a, 0x13, 0x97, 0xdc, 0x85, 0x5b, 0x56, 0x6d, - 0xa7, 0xa9, 0x77, 0xe8, 0xf6, 0xd2, 0xeb, 0x3b, 0x2d, 0xb3, 0xd6, 0xd9, 0x6d, 0xd8, 0x56, 0xb7, - 0x96, 0x5a, 0x79, 0x37, 0xe1, 0xf9, 0xd9, 0xa8, 0x75, 0x63, 0x47, 0xaf, 0x3c, 0x54, 0x95, 0xf9, - 0x04, 0xb7, 0xf4, 0xba, 0xde, 0xac, 0x18, 0x55, 0x7b, 0xff, 0x9e, 0x9a, 0x23, 0xb7, 0xe0, 0xc6, - 0x6c, 0xd4, 0xed, 0x5a, 0xdb, 0xa2, 0x68, 0xf9, 0xf9, 0xdf, 0xdd, 0xb5, 0x1a, 0x14, 0xab, 0x50, - 0xfe, 0x43, 0x05, 0x36, 0x67, 0xc5, 0xf2, 0x21, 0xb7, 0x41, 0x33, 0x9a, 0x1d, 0x53, 0xaf, 0x55, - 0xed, 0x8a, 0x69, 0x54, 0x8d, 0x66, 0xa7, 0xa6, 0xd7, 0x2d, 0xdb, 0x6a, 0x75, 0xe9, 0x6a, 0x8a, - 0x2c, 0x02, 0x5e, 0x80, 0xeb, 0x73, 0xf0, 0x5a, 0xb5, 0x6a, 0x45, 0x55, 0xc8, 0x3d, 0x78, 0x69, - 0x0e, 0x92, 0xf5, 0xd0, 0xea, 0x18, 0x0d, 0xb9, 0x44, 0xcd, 0x95, 0x2b, 0x70, 0x69, 0x76, 0xb0, - 0x0f, 0x7a, 0x4c, 0xc7, 0x47, 0xba, 0x08, 0x85, 0x2a, 0xbd, 0x19, 0x62, 0x39, 0x04, 0xca, 0x1e, - 0xa8, 0x49, 0x7f, 0xfd, 0x94, 0xe9, 0x86, 0xd9, 0x6d, 0x36, 0xd9, 0x35, 0xb2, 0x0e, 0xa5, 0x56, - 0x67, 0xd7, 0x30, 0x79, 0x16, 0x06, 0x4c, 0xbb, 0xd0, 0x6d, 0xd2, 0x8d, 0xd3, 0x32, 0x6b, 0x9f, - 0xc5, 0xfb, 0x64, 0x13, 0xce, 0x59, 0x75, 0xbd, 0xb2, 0x67, 0x37, 0x5b, 0x1d, 0xbb, 0xd6, 0xb4, - 0x2b, 0xbb, 0x7a, 0xb3, 0x69, 0xd4, 0x55, 0xc0, 0xc1, 0x9c, 0xe5, 0xa3, 0x47, 0x3e, 0x08, 0x77, - 0x5a, 0x7b, 0x1d, 0xdd, 0x6e, 0xd7, 0xbb, 0x3b, 0xb5, 0xa6, 0x6d, 0x3d, 0x6c, 0x56, 0x04, 0xef, - 0x53, 0x49, 0x1f, 0xb9, 0x77, 0xe0, 0xe6, 0x5c, 0xec, 0x28, 0x5f, 0xc2, 0x6d, 0xd0, 0xe6, 0x62, - 0xf2, 0x8e, 0x94, 0x7f, 0xa8, 0xc0, 0xe5, 0x39, 0x6f, 0xc8, 0xe4, 0x25, 0xb8, 0xbb, 0x6b, 0xe8, - 0xd5, 0xba, 0x61, 0x59, 0x78, 0x50, 0xd0, 0x69, 0x60, 0x26, 0x1e, 0x99, 0x07, 0xea, 0x5d, 0xb8, - 0x35, 0x1f, 0x3d, 0xba, 0x9a, 0xef, 0xc0, 0xcd, 0xf9, 0xa8, 0xfc, 0xaa, 0xce, 0x91, 0x32, 0xdc, - 0x9e, 0x8f, 0x19, 0x5e, 0xf1, 0xf9, 0xf2, 0x6f, 0x2a, 0x70, 0x21, 0x5b, 0x91, 0x43, 0xdb, 0x56, - 0x6b, 0x5a, 0x1d, 0xbd, 0x5e, 0xb7, 0xdb, 0xba, 0xa9, 0x37, 0x6c, 0xa3, 0x69, 0xb6, 0xea, 0xf5, - 0xac, 0xab, 0xed, 0x26, 0x3c, 0x3f, 0x1b, 0xd5, 0xaa, 0x98, 0xb5, 0x36, 0x3d, 0xbd, 0x35, 0xb8, - 0x36, 0x1b, 0xcb, 0xa8, 0x55, 0x0c, 0x35, 0xb7, 0xf5, 0xf1, 0xef, 0xff, 0xd3, 0xb5, 0x33, 0xdf, - 0x7f, 0xf7, 0x9a, 0xf2, 0xa3, 0x77, 0xaf, 0x29, 0xff, 0xf8, 0xee, 0x35, 0xe5, 0xb3, 0x2f, 0x9e, - 0x2e, 0xd5, 0x10, 0xf2, 0xfd, 0x6f, 0x2e, 0xa2, 0x84, 0xf2, 0xca, 0x7f, 0x07, 0x00, 0x00, 0xff, - 0xff, 0x53, 0xda, 0x2f, 0x5a, 0xe2, 0xb9, 0x01, 0x00, + // 30295 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6d, 0x70, 0x1c, 0x49, + 0x76, 0x20, 0x36, 0xdd, 0x8d, 0x8f, 0xc6, 0xc3, 0x57, 0x23, 0x01, 0x92, 0x20, 0x66, 0x86, 0xcd, + 0xa9, 0x99, 0xe1, 0x90, 0xb3, 0x33, 0xe4, 0x12, 0xdc, 0xe1, 0xee, 0xec, 0x7c, 0x6d, 0xa3, 0x1b, + 0x24, 0x9a, 0x04, 0x01, 0x6c, 0x35, 0x40, 0xec, 0x68, 0x3f, 0x6a, 0x0b, 0xdd, 0x09, 0xa0, 0x06, + 0xdd, 0x5d, 0xbd, 0x55, 0xd5, 0x04, 0xa1, 0x3d, 0xf9, 0xf4, 0xb5, 0x27, 0x2b, 0x64, 0x7d, 0x9e, + 0x74, 0xd2, 0x39, 0x74, 0xb2, 0x42, 0xbe, 0xf3, 0x29, 0xce, 0x21, 0xc5, 0x59, 0xb2, 0xec, 0xb3, + 0x15, 0x96, 0x25, 0x87, 0x2c, 0xcb, 0x8a, 0x8b, 0x93, 0xe2, 0x7c, 0xb6, 0xc3, 0xeb, 0x0b, 0xc8, + 0xb2, 0xfc, 0xc3, 0x81, 0x08, 0x47, 0x48, 0xbe, 0x08, 0x47, 0x78, 0x1d, 0xba, 0x73, 0xe4, 0xcb, + 0xcc, 0xaa, 0xcc, 0xaa, 0xea, 0x46, 0x63, 0x86, 0xa3, 0x13, 0x27, 0xf4, 0x87, 0x44, 0xbf, 0x7c, + 0xef, 0x65, 0xe5, 0xf7, 0xcb, 0x97, 0xef, 0x03, 0x5e, 0x08, 0x68, 0x93, 0x76, 0x5c, 0x2f, 0xb8, + 0xd1, 0xa4, 0x7b, 0x76, 0xfd, 0xe8, 0x46, 0x70, 0xd4, 0xa1, 0x3e, 0xff, 0xf7, 0x7a, 0xc7, 0x73, + 0x03, 0x97, 0x0c, 0xe3, 0x8f, 0x85, 0xb9, 0x3d, 0x77, 0xcf, 0x45, 0xc8, 0x0d, 0xf6, 0x17, 0x2f, + 0x5c, 0xb8, 0xb4, 0xe7, 0xba, 0x7b, 0x4d, 0x7a, 0x03, 0x7f, 0xed, 0x74, 0x77, 0x6f, 0x34, 0xba, + 0x9e, 0x1d, 0x38, 0x6e, 0x5b, 0x94, 0x17, 0xe3, 0xe5, 0x81, 0xd3, 0xa2, 0x7e, 0x60, 0xb7, 0x3a, + 0xbd, 0x18, 0x1c, 0x7a, 0x76, 0xa7, 0x43, 0x3d, 0x51, 0xfb, 0xc2, 0xb5, 0xf0, 0x03, 0xed, 0x20, + 0x60, 0x94, 0x8c, 0xf9, 0x8d, 0x47, 0x37, 0xd5, 0x9f, 0x02, 0xf5, 0x76, 0x8f, 0xb6, 0x78, 0x5d, + 0x3f, 0xa0, 0x0d, 0xab, 0x41, 0x1f, 0x39, 0x75, 0x6a, 0x79, 0xf4, 0x1b, 0x5d, 0xc7, 0xa3, 0x2d, + 0xda, 0x0e, 0x04, 0xdd, 0xeb, 0xe9, 0x74, 0xf2, 0x43, 0x62, 0x5f, 0x64, 0xfc, 0x42, 0x0e, 0xc6, + 0xee, 0x53, 0xda, 0x29, 0x35, 0x9d, 0x47, 0x94, 0xbc, 0x08, 0x43, 0x6b, 0x76, 0x8b, 0xce, 0x67, + 0x2e, 0x67, 0xae, 0x8e, 0x2d, 0x4d, 0x9f, 0x1c, 0x17, 0xc7, 0x7d, 0xea, 0x3d, 0xa2, 0x9e, 0xd5, + 0xb6, 0x5b, 0xd4, 0xc4, 0x42, 0xf2, 0x29, 0x18, 0x63, 0xff, 0xfb, 0x1d, 0xbb, 0x4e, 0xe7, 0xb3, + 0x88, 0x39, 0x79, 0x72, 0x5c, 0x1c, 0x6b, 0x4b, 0xa0, 0x19, 0x95, 0x93, 0x2a, 0x8c, 0x2e, 0x3f, + 0xee, 0x38, 0x1e, 0xf5, 0xe7, 0x87, 0x2e, 0x67, 0xae, 0x8e, 0x2f, 0x2e, 0x5c, 0xe7, 0x7d, 0x74, + 0x5d, 0xf6, 0xd1, 0xf5, 0x4d, 0xd9, 0x89, 0x4b, 0xb3, 0xbf, 0x7f, 0x5c, 0x7c, 0xe6, 0xe4, 0xb8, + 0x38, 0x4a, 0x39, 0xc9, 0x4f, 0xfc, 0x71, 0x31, 0x63, 0x4a, 0x7a, 0xf2, 0x36, 0x0c, 0x6d, 0x1e, + 0x75, 0xe8, 0xfc, 0xd8, 0xe5, 0xcc, 0xd5, 0xa9, 0xc5, 0x4b, 0xd7, 0xf9, 0xb0, 0x86, 0x1f, 0x1f, + 0xfd, 0xc5, 0xb0, 0x96, 0xf2, 0x27, 0xc7, 0xc5, 0x21, 0x86, 0x62, 0x22, 0x15, 0x79, 0x1d, 0x46, + 0x56, 0x5c, 0x3f, 0xa8, 0x56, 0xe6, 0x01, 0x3f, 0xf9, 0xdc, 0xc9, 0x71, 0x71, 0x66, 0xdf, 0xf5, + 0x03, 0xcb, 0x69, 0xbc, 0xe6, 0xb6, 0x9c, 0x80, 0xb6, 0x3a, 0xc1, 0x91, 0x29, 0x90, 0x8c, 0xc7, + 0x30, 0xa9, 0xf1, 0x23, 0xe3, 0x30, 0xba, 0xb5, 0x76, 0x7f, 0x6d, 0x7d, 0x7b, 0xad, 0xf0, 0x0c, + 0xc9, 0xc3, 0xd0, 0xda, 0x7a, 0x65, 0xb9, 0x90, 0x21, 0xa3, 0x90, 0x2b, 0x6d, 0x6c, 0x14, 0xb2, + 0x64, 0x02, 0xf2, 0x95, 0xd2, 0x66, 0x69, 0xa9, 0x54, 0x5b, 0x2e, 0xe4, 0xc8, 0x2c, 0x4c, 0x6f, + 0x57, 0xd7, 0x2a, 0xeb, 0xdb, 0x35, 0xab, 0xb2, 0x5c, 0xbb, 0xbf, 0xb9, 0xbe, 0x51, 0x18, 0x22, + 0x53, 0x00, 0xf7, 0xb7, 0x96, 0x96, 0xcd, 0xb5, 0xe5, 0xcd, 0xe5, 0x5a, 0x61, 0x98, 0xcc, 0x41, + 0x41, 0x92, 0x58, 0xb5, 0x65, 0xf3, 0x61, 0xb5, 0xbc, 0x5c, 0x18, 0xb9, 0x37, 0x94, 0xcf, 0x15, + 0x86, 0xcc, 0xd1, 0x55, 0x6a, 0xfb, 0xb4, 0x5a, 0x31, 0xfe, 0xc3, 0x1c, 0xe4, 0x1f, 0xd0, 0xc0, + 0x6e, 0xd8, 0x81, 0x4d, 0x9e, 0xd3, 0xc6, 0x07, 0x9b, 0xa8, 0x0c, 0xcc, 0x8b, 0xc9, 0x81, 0x19, + 0x3e, 0x39, 0x2e, 0x66, 0x5e, 0x57, 0x07, 0xe4, 0x2d, 0x18, 0xaf, 0x50, 0xbf, 0xee, 0x39, 0x1d, + 0x36, 0xd9, 0xe6, 0x73, 0x88, 0x76, 0xf1, 0xe4, 0xb8, 0x78, 0xae, 0x11, 0x81, 0x95, 0x0e, 0x51, + 0xb1, 0x49, 0x15, 0x46, 0x56, 0xed, 0x1d, 0xda, 0xf4, 0xe7, 0x87, 0x2f, 0xe7, 0xae, 0x8e, 0x2f, + 0x3e, 0x2b, 0x06, 0x41, 0x7e, 0xe0, 0x75, 0x5e, 0xba, 0xdc, 0x0e, 0xbc, 0xa3, 0xa5, 0xb9, 0x93, + 0xe3, 0x62, 0xa1, 0x89, 0x00, 0xb5, 0x83, 0x39, 0x0a, 0xa9, 0x45, 0x13, 0x63, 0xe4, 0xd4, 0x89, + 0xf1, 0xfc, 0xef, 0x1f, 0x17, 0x33, 0x6c, 0xc0, 0xc4, 0xc4, 0x88, 0xf8, 0xe9, 0x53, 0x64, 0x11, + 0xf2, 0x26, 0x7d, 0xe4, 0xf8, 0xac, 0x65, 0x79, 0x6c, 0xd9, 0xf9, 0x93, 0xe3, 0x22, 0xf1, 0x04, + 0x4c, 0xf9, 0x8c, 0x10, 0x6f, 0xe1, 0x4d, 0x18, 0x57, 0xbe, 0x9a, 0x14, 0x20, 0x77, 0x40, 0x8f, + 0x78, 0x0f, 0x9b, 0xec, 0x4f, 0x32, 0x07, 0xc3, 0x8f, 0xec, 0x66, 0x57, 0x74, 0xa9, 0xc9, 0x7f, + 0x7c, 0x3e, 0xfb, 0xb9, 0xcc, 0xbd, 0xa1, 0xfc, 0x68, 0x21, 0x6f, 0x66, 0xab, 0x15, 0xe3, 0xa7, + 0x86, 0x20, 0x6f, 0xba, 0x7c, 0x01, 0x93, 0x6b, 0x30, 0x5c, 0x0b, 0xec, 0x40, 0x0e, 0xd3, 0xec, + 0xc9, 0x71, 0x71, 0x9a, 0x2d, 0x6e, 0xaa, 0xd4, 0xcf, 0x31, 0x18, 0xea, 0xc6, 0xbe, 0xed, 0xcb, + 0xe1, 0x42, 0xd4, 0x0e, 0x03, 0xa8, 0xa8, 0x88, 0x41, 0xae, 0xc0, 0xd0, 0x03, 0xb7, 0x41, 0xc5, + 0x88, 0x91, 0x93, 0xe3, 0xe2, 0x54, 0xcb, 0x6d, 0xa8, 0x88, 0x58, 0x4e, 0x5e, 0x83, 0xb1, 0x72, + 0xd7, 0xf3, 0x68, 0x9b, 0xcd, 0xf5, 0x21, 0x44, 0x9e, 0x3a, 0x39, 0x2e, 0x42, 0x9d, 0x03, 0x2d, + 0xa7, 0x61, 0x46, 0x08, 0x6c, 0x18, 0x6a, 0x81, 0xed, 0x05, 0xb4, 0x31, 0x3f, 0x3c, 0xd0, 0x30, + 0xb0, 0xf5, 0x39, 0xe3, 0x73, 0x92, 0xf8, 0x30, 0x08, 0x4e, 0x64, 0x05, 0xc6, 0xef, 0x7a, 0x76, + 0x9d, 0x6e, 0x50, 0xcf, 0x71, 0x1b, 0x38, 0xbe, 0xb9, 0xa5, 0x2b, 0x27, 0xc7, 0xc5, 0xf3, 0x7b, + 0x0c, 0x6c, 0x75, 0x10, 0x1e, 0x51, 0x7f, 0xe7, 0xb8, 0x98, 0xaf, 0x88, 0xad, 0xd6, 0x54, 0x49, + 0xc9, 0xd7, 0xd9, 0xe0, 0xf8, 0x01, 0x76, 0x2d, 0x6d, 0xcc, 0x8f, 0x9e, 0xfa, 0x89, 0x86, 0xf8, + 0xc4, 0xf3, 0x4d, 0xdb, 0x0f, 0x2c, 0x8f, 0xd3, 0xc5, 0xbe, 0x53, 0x65, 0x49, 0xd6, 0x21, 0x5f, + 0xab, 0xef, 0xd3, 0x46, 0xb7, 0x49, 0x71, 0xca, 0x8c, 0x2f, 0x5e, 0x10, 0x93, 0x5a, 0x8e, 0xa7, + 0x2c, 0x5e, 0x5a, 0x10, 0xbc, 0x89, 0x2f, 0x20, 0xea, 0x7c, 0x92, 0x58, 0x9f, 0xcf, 0xff, 0xdc, + 0x2f, 0x16, 0x9f, 0xf9, 0xde, 0x7f, 0x79, 0xf9, 0x19, 0xe3, 0x3f, 0xcf, 0x42, 0x21, 0xce, 0x84, + 0xec, 0xc2, 0xe4, 0x56, 0xa7, 0x61, 0x07, 0xb4, 0xdc, 0x74, 0x68, 0x3b, 0xf0, 0x71, 0x92, 0xf4, + 0x6f, 0xd3, 0x4b, 0xa2, 0xde, 0xf9, 0x2e, 0x12, 0x5a, 0x75, 0x4e, 0x19, 0x6b, 0x95, 0xce, 0x36, + 0xaa, 0xa7, 0x86, 0x1b, 0xb8, 0x8f, 0x33, 0xec, 0x6c, 0xf5, 0xf0, 0xad, 0xbf, 0x47, 0x3d, 0x82, + 0xad, 0x98, 0x40, 0xed, 0xc6, 0xce, 0x11, 0xce, 0xcc, 0xc1, 0x27, 0x10, 0x23, 0x49, 0x99, 0x40, + 0x0c, 0x6c, 0xfc, 0x1f, 0x19, 0x98, 0x32, 0xa9, 0xef, 0x76, 0xbd, 0x3a, 0x5d, 0xa1, 0x76, 0x83, + 0x7a, 0x6c, 0xfa, 0xdf, 0x77, 0xda, 0x0d, 0xb1, 0xa6, 0x70, 0xfa, 0x1f, 0x38, 0x6d, 0x75, 0xeb, + 0xc6, 0x72, 0xf2, 0x69, 0x18, 0xad, 0x75, 0x77, 0x10, 0x35, 0x1b, 0xed, 0x00, 0x7e, 0x77, 0xc7, + 0x8a, 0xa1, 0x4b, 0x34, 0x72, 0x03, 0x46, 0x1f, 0x52, 0xcf, 0x8f, 0x76, 0x43, 0x3c, 0x1a, 0x1e, + 0x71, 0x90, 0x4a, 0x20, 0xb0, 0xc8, 0xdd, 0x68, 0x47, 0x16, 0x87, 0xda, 0x74, 0x6c, 0x1f, 0x8c, + 0xa6, 0x4a, 0x4b, 0x40, 0xd4, 0xa9, 0x22, 0xb1, 0x8c, 0x9f, 0xcc, 0x42, 0xa1, 0x62, 0x07, 0xf6, + 0x8e, 0xed, 0x8b, 0xfe, 0x7c, 0x78, 0x8b, 0xed, 0xf1, 0x4a, 0x43, 0x71, 0x8f, 0x67, 0x5f, 0xfe, + 0xa1, 0x9b, 0xf7, 0x72, 0xbc, 0x79, 0xe3, 0xec, 0x84, 0x15, 0xcd, 0x8b, 0x1a, 0xf5, 0xce, 0xe9, + 0x8d, 0x2a, 0x88, 0x46, 0xe5, 0x65, 0xa3, 0xa2, 0xa6, 0x90, 0x77, 0x60, 0xa8, 0xd6, 0xa1, 0x75, + 0xb1, 0x89, 0xc8, 0x73, 0x41, 0x6f, 0x1c, 0x43, 0x78, 0x78, 0x6b, 0x69, 0x42, 0xb0, 0x19, 0xf2, + 0x3b, 0xb4, 0x6e, 0x22, 0x99, 0xb2, 0x68, 0xfe, 0x49, 0x0e, 0xe6, 0xd2, 0xc8, 0xd4, 0x76, 0x8c, + 0xf4, 0x69, 0xc7, 0x55, 0xc8, 0xb3, 0x23, 0x9c, 0x1d, 0x8b, 0xb8, 0x5d, 0x8c, 0x2d, 0x4d, 0xb0, + 0x4f, 0xde, 0x17, 0x30, 0x33, 0x2c, 0x25, 0x2f, 0x86, 0x12, 0x41, 0x3e, 0xe2, 0x27, 0x24, 0x02, + 0x29, 0x07, 0xb0, 0xb1, 0x96, 0x4b, 0x18, 0x05, 0x87, 0xa8, 0x5b, 0x24, 0x38, 0x1a, 0x6b, 0x4f, + 0x40, 0xb4, 0x63, 0x46, 0x1e, 0x0a, 0xcb, 0x90, 0x97, 0xcd, 0x9a, 0x9f, 0x40, 0x46, 0x33, 0xb1, + 0x4e, 0x7a, 0x78, 0x8b, 0x0f, 0x66, 0x43, 0xfc, 0x56, 0xd9, 0x48, 0x1c, 0x72, 0x0b, 0xf2, 0x1b, + 0x9e, 0xfb, 0xf8, 0xa8, 0x5a, 0xf1, 0xe7, 0x27, 0x2f, 0xe7, 0xae, 0x8e, 0x2d, 0x5d, 0x38, 0x39, + 0x2e, 0xce, 0x76, 0x18, 0xcc, 0x72, 0x1a, 0xea, 0x49, 0x1b, 0x22, 0xde, 0x1b, 0xca, 0x67, 0x0a, + 0xd9, 0x7b, 0x43, 0xf9, 0x6c, 0x21, 0xc7, 0xc5, 0x8b, 0x7b, 0x43, 0xf9, 0xa1, 0xc2, 0xf0, 0xbd, + 0xa1, 0xfc, 0x30, 0x0a, 0x1c, 0x63, 0x05, 0xb8, 0x37, 0x94, 0x1f, 0x2f, 0x4c, 0x68, 0xa7, 0x3d, + 0x32, 0x08, 0xdc, 0xba, 0xdb, 0x34, 0x73, 0x5b, 0x66, 0xd5, 0x1c, 0x29, 0x97, 0xca, 0xd4, 0x0b, + 0xcc, 0x5c, 0x69, 0xbb, 0x66, 0x4e, 0x56, 0x8e, 0xda, 0x76, 0xcb, 0xa9, 0xf3, 0xa3, 0xd3, 0xcc, + 0xdd, 0x2d, 0x6f, 0x18, 0x25, 0x98, 0x8a, 0xda, 0xb2, 0xea, 0xf8, 0x01, 0xb9, 0x01, 0x63, 0x12, + 0xc2, 0x36, 0xba, 0x5c, 0x6a, 0xab, 0xcd, 0x08, 0xc7, 0xf8, 0xbd, 0x2c, 0x40, 0x54, 0xf2, 0x94, + 0xae, 0x85, 0xcf, 0x6a, 0x6b, 0xe1, 0x5c, 0x7c, 0x2d, 0xf4, 0x5c, 0x05, 0xe4, 0x3d, 0x18, 0x61, + 0x62, 0x41, 0x57, 0x8a, 0x44, 0x17, 0xe2, 0xa4, 0x58, 0xf8, 0xf0, 0xd6, 0xd2, 0x94, 0x20, 0x1e, + 0xf1, 0x11, 0x62, 0x0a, 0x32, 0x65, 0x19, 0xfd, 0xc2, 0x68, 0x34, 0x18, 0x62, 0x01, 0x5d, 0x85, + 0x70, 0x40, 0x45, 0x87, 0xe2, 0xca, 0xe8, 0xc8, 0x41, 0x0e, 0x4b, 0xc9, 0x45, 0x60, 0x03, 0x2e, + 0x3a, 0x75, 0xf4, 0xe4, 0xb8, 0x98, 0xeb, 0x7a, 0x0e, 0x4e, 0x02, 0x72, 0x03, 0xc4, 0x34, 0x10, + 0x1d, 0xc8, 0x66, 0xdf, 0x4c, 0xdd, 0xb6, 0xea, 0xd4, 0x0b, 0xa2, 0x1e, 0x9f, 0xcf, 0xc8, 0xd9, + 0x42, 0x3a, 0xa0, 0x4f, 0x95, 0xf9, 0x21, 0x9c, 0x06, 0x57, 0x53, 0x7b, 0xe5, 0xba, 0x86, 0xca, + 0xc5, 0xc8, 0xcb, 0xf2, 0x54, 0x6a, 0xf0, 0x32, 0x2b, 0x21, 0x52, 0xea, 0x15, 0x90, 0x5b, 0xc0, + 0x66, 0xa8, 0xe8, 0x7d, 0x10, 0xf5, 0x94, 0xb6, 0x6b, 0x4b, 0xe7, 0x04, 0xa7, 0x49, 0xfb, 0x50, + 0x25, 0x67, 0xd8, 0xe4, 0x2d, 0x60, 0x53, 0x58, 0xf4, 0x3b, 0x11, 0x44, 0x77, 0xcb, 0x1b, 0xe5, + 0xa6, 0xdb, 0x6d, 0xd4, 0xbe, 0xb8, 0x1a, 0x11, 0xef, 0xd5, 0x3b, 0x2a, 0xf1, 0xdd, 0xf2, 0x06, + 0x79, 0x0b, 0x86, 0x4b, 0xdf, 0xdd, 0xf5, 0xa8, 0x90, 0x4f, 0x26, 0x64, 0x9d, 0x0c, 0xb6, 0x74, + 0x41, 0x10, 0x4e, 0xdb, 0xec, 0xa7, 0x2a, 0xd7, 0x61, 0x39, 0xab, 0x79, 0x73, 0xb5, 0x26, 0x64, + 0x0f, 0x12, 0xeb, 0x96, 0xcd, 0x55, 0xe5, 0xb3, 0x03, 0xad, 0xd5, 0x8c, 0x8a, 0xdc, 0x80, 0x6c, + 0xa9, 0x82, 0x37, 0xa2, 0xf1, 0xc5, 0x31, 0x59, 0x6d, 0x65, 0x69, 0x4e, 0x90, 0x4c, 0xd8, 0xea, + 0x32, 0xc8, 0x96, 0x2a, 0x64, 0x09, 0x86, 0x1f, 0x1c, 0xd5, 0xbe, 0xb8, 0x2a, 0x36, 0xb3, 0x59, + 0x39, 0xaf, 0x19, 0x6c, 0x1d, 0x97, 0xbd, 0x1f, 0x7d, 0x71, 0xeb, 0xc8, 0xff, 0x46, 0x53, 0xfd, + 0x62, 0x44, 0x23, 0x1b, 0x30, 0x56, 0x6a, 0xb4, 0x9c, 0xf6, 0x96, 0x4f, 0xbd, 0xf9, 0x71, 0xe4, + 0x33, 0x1f, 0xfb, 0xee, 0xb0, 0x7c, 0x69, 0xfe, 0xe4, 0xb8, 0x38, 0x67, 0xb3, 0x9f, 0x56, 0xd7, + 0xa7, 0x9e, 0xc2, 0x2d, 0x62, 0x42, 0x36, 0x00, 0x1e, 0xb8, 0xed, 0x3d, 0xb7, 0x14, 0x34, 0x6d, + 0x3f, 0xb6, 0x3d, 0x46, 0x05, 0xa1, 0xf8, 0x70, 0xae, 0xc5, 0x60, 0x96, 0xcd, 0x80, 0x0a, 0x43, + 0x85, 0x07, 0xb9, 0x03, 0x23, 0xeb, 0x9e, 0x5d, 0x6f, 0xd2, 0xf9, 0x49, 0xe4, 0x36, 0x27, 0xb8, + 0x71, 0xa0, 0x6c, 0xe9, 0xbc, 0x60, 0x58, 0x70, 0x11, 0xac, 0x5e, 0x53, 0x38, 0xe2, 0xc2, 0x36, + 0x90, 0xe4, 0x9c, 0x4c, 0xb9, 0x24, 0x7c, 0x4a, 0xbd, 0x24, 0x44, 0x8b, 0xbe, 0xec, 0xb6, 0x5a, + 0x76, 0xbb, 0x81, 0xb4, 0x0f, 0x17, 0x95, 0xbb, 0x83, 0xf1, 0x0d, 0x98, 0x49, 0x74, 0xd6, 0x29, + 0xf7, 0xbb, 0x77, 0x61, 0xba, 0x42, 0x77, 0xed, 0x6e, 0x33, 0x08, 0x4f, 0x12, 0xbe, 0x44, 0xf1, + 0xa6, 0xd5, 0xe0, 0x45, 0x96, 0x3c, 0x3e, 0xcc, 0x38, 0xb2, 0xf1, 0x0e, 0x4c, 0x6a, 0xcd, 0x67, + 0x57, 0x85, 0x52, 0xb7, 0xe1, 0x04, 0x38, 0x90, 0x99, 0xe8, 0xaa, 0x60, 0x33, 0x20, 0x0e, 0x97, + 0x19, 0x21, 0x18, 0x7f, 0x5f, 0x95, 0x56, 0xc4, 0x4e, 0xc4, 0xae, 0xd5, 0x62, 0x3f, 0xc8, 0x44, + 0xb2, 0x53, 0x62, 0x3f, 0x08, 0x77, 0x83, 0x6b, 0x7c, 0x6d, 0x66, 0x13, 0x6b, 0x73, 0x5c, 0x8c, + 0x44, 0xce, 0x3e, 0xf4, 0xf9, 0x8a, 0x0c, 0x67, 0x6a, 0xee, 0xc3, 0xcf, 0xd4, 0xf7, 0x60, 0xe2, + 0x81, 0xdd, 0xb6, 0xf7, 0x68, 0x83, 0xb5, 0x80, 0xef, 0x3d, 0x63, 0x4b, 0xcf, 0x9e, 0x1c, 0x17, + 0x2f, 0xb4, 0x38, 0x1c, 0x5b, 0xa9, 0x4e, 0x22, 0x8d, 0x80, 0xdc, 0x94, 0x2b, 0x7b, 0x38, 0x65, + 0x65, 0x4f, 0x8a, 0xda, 0x87, 0x71, 0x65, 0x8b, 0xf5, 0x6c, 0xfc, 0xf6, 0x18, 0xb6, 0x91, 0xbc, + 0x06, 0x23, 0x26, 0xdd, 0x63, 0x47, 0x4d, 0x26, 0x1a, 0x24, 0x0f, 0x21, 0x6a, 0xc7, 0x70, 0x1c, + 0x94, 0x33, 0x68, 0xc3, 0xdf, 0x77, 0x76, 0x03, 0xd1, 0x3b, 0xa1, 0x9c, 0x21, 0xc0, 0x8a, 0x9c, + 0x21, 0x20, 0xfa, 0x75, 0x96, 0xc3, 0xd8, 0xee, 0x67, 0x56, 0x6a, 0xa2, 0xd3, 0x64, 0x0f, 0x9b, + 0x15, 0x65, 0x1b, 0xf1, 0x34, 0x29, 0x81, 0x61, 0x93, 0xdb, 0x30, 0x56, 0xaa, 0xd7, 0xdd, 0xae, + 0x72, 0x67, 0xe4, 0xeb, 0x96, 0x03, 0x75, 0x15, 0x49, 0x84, 0x4a, 0x6a, 0x30, 0xbe, 0xcc, 0x2e, + 0x5a, 0x4e, 0xd9, 0xae, 0xef, 0xcb, 0x4e, 0x92, 0x7b, 0x98, 0x52, 0x12, 0xad, 0x5c, 0x8a, 0xc0, + 0x3a, 0x03, 0xaa, 0x4a, 0x06, 0x05, 0x97, 0x6c, 0xc2, 0x78, 0x8d, 0xd6, 0x3d, 0x1a, 0xd4, 0x02, + 0xd7, 0xa3, 0xb1, 0x2d, 0x59, 0x29, 0x59, 0xba, 0x24, 0xef, 0x7a, 0x3e, 0x02, 0x2d, 0x9f, 0x41, + 0x55, 0xae, 0x0a, 0x32, 0x17, 0xda, 0x5b, 0xae, 0x77, 0x54, 0x59, 0x12, 0xdb, 0x74, 0x74, 0xa6, + 0x73, 0xb0, 0x2a, 0xb4, 0x33, 0x48, 0x63, 0x47, 0x17, 0xda, 0x39, 0x16, 0x8e, 0x54, 0xa5, 0x86, + 0xb2, 0x95, 0xd8, 0xb4, 0xa7, 0xa3, 0x5e, 0x46, 0xb0, 0x32, 0x52, 0x0d, 0x1f, 0x25, 0x33, 0x6d, + 0xa4, 0x04, 0x16, 0xe9, 0x00, 0x91, 0xa3, 0xc6, 0x05, 0xdd, 0x26, 0xf5, 0x7d, 0xb1, 0x97, 0x5f, + 0x8c, 0x0d, 0x7e, 0x84, 0xb0, 0xf4, 0xb2, 0x60, 0xfe, 0xbc, 0x9c, 0x06, 0xe2, 0x9e, 0xc6, 0x0a, + 0x95, 0x7a, 0x52, 0x78, 0x93, 0x37, 0x01, 0x96, 0x1f, 0x07, 0xd4, 0x6b, 0xdb, 0xcd, 0x50, 0x0f, + 0x86, 0xaa, 0x1f, 0x2a, 0xa0, 0xfa, 0x40, 0x2b, 0xc8, 0xa4, 0x0c, 0x93, 0x25, 0xdf, 0xef, 0xb6, + 0xa8, 0xe9, 0x36, 0x69, 0xc9, 0x5c, 0xc3, 0x7d, 0x7f, 0x6c, 0xe9, 0xf9, 0x93, 0xe3, 0xe2, 0x45, + 0x1b, 0x0b, 0x2c, 0xcf, 0x6d, 0x52, 0xcb, 0xf6, 0xd4, 0xd9, 0xad, 0xd3, 0x90, 0x75, 0x80, 0xf5, + 0x0e, 0x6d, 0xd7, 0xa8, 0xed, 0xd5, 0xf7, 0x63, 0xdb, 0x7c, 0x54, 0xb0, 0xf4, 0x9c, 0x68, 0xe1, + 0x9c, 0xdb, 0xa1, 0x6d, 0x1f, 0x61, 0xea, 0x57, 0x45, 0x98, 0x64, 0x1b, 0xa6, 0xab, 0xa5, 0x07, + 0x1b, 0x6e, 0xd3, 0xa9, 0x1f, 0x09, 0xc9, 0x69, 0x0a, 0xb5, 0x83, 0xe7, 0x05, 0xd7, 0x58, 0x29, + 0xdf, 0x9e, 0x1c, 0xbb, 0x65, 0x75, 0x10, 0x6a, 0x09, 0xf9, 0x29, 0xce, 0x85, 0xbc, 0xcf, 0xe6, + 0xa0, 0xcf, 0x84, 0xc1, 0x4d, 0x7b, 0xcf, 0x9f, 0x9f, 0xd6, 0xb4, 0x5d, 0xa5, 0xed, 0xda, 0x75, + 0xa5, 0x94, 0x8b, 0x29, 0x0b, 0x7c, 0x22, 0x22, 0xd4, 0x0a, 0xec, 0x3d, 0x5f, 0x9f, 0x88, 0x21, + 0x36, 0xb9, 0x07, 0x50, 0x71, 0xeb, 0xdd, 0x16, 0x6d, 0x07, 0x95, 0xa5, 0xf9, 0x82, 0x7e, 0x15, + 0x08, 0x0b, 0xa2, 0xad, 0xad, 0xe1, 0xd6, 0xb5, 0x99, 0xa8, 0x50, 0x2f, 0xbc, 0x0b, 0x85, 0xf8, + 0x87, 0x9c, 0x51, 0x81, 0x35, 0x59, 0x98, 0x52, 0x5a, 0xbf, 0xfc, 0xd8, 0xf1, 0x03, 0xdf, 0xf8, + 0xa6, 0xb6, 0x02, 0xd9, 0xee, 0x70, 0x9f, 0x1e, 0x6d, 0x78, 0x74, 0xd7, 0x79, 0x2c, 0x36, 0x33, + 0xdc, 0x1d, 0x0e, 0xe8, 0x91, 0xd5, 0x41, 0xa8, 0xba, 0x3b, 0x84, 0xa8, 0xe4, 0x33, 0x90, 0xbf, + 0xff, 0xa0, 0x76, 0x9f, 0x1e, 0x55, 0x2b, 0xe2, 0xa0, 0xe2, 0x64, 0x2d, 0xdf, 0x62, 0xa4, 0xda, + 0x5c, 0x0b, 0x31, 0x8d, 0xa5, 0x68, 0x27, 0x64, 0x35, 0x97, 0x9b, 0x5d, 0x3f, 0xa0, 0x5e, 0xb5, + 0xa2, 0xd6, 0x5c, 0xe7, 0xc0, 0xd8, 0xbe, 0x14, 0xa2, 0x1a, 0xff, 0x26, 0x8b, 0xbb, 0x20, 0x9b, + 0xf0, 0xd5, 0xb6, 0x1f, 0xd8, 0xed, 0x3a, 0x0d, 0x19, 0xe0, 0x84, 0x77, 0x04, 0x34, 0x36, 0xe1, + 0x23, 0x64, 0xbd, 0xea, 0xec, 0xc0, 0x55, 0xb3, 0x2a, 0xa5, 0xe6, 0xa2, 0x5a, 0x51, 0xd5, 0xab, + 0x9e, 0x80, 0xc6, 0xaa, 0x8c, 0x90, 0xc9, 0x15, 0x18, 0xad, 0x96, 0x1e, 0x94, 0xba, 0xc1, 0x3e, + 0xee, 0xc1, 0x79, 0x2e, 0x9f, 0xb3, 0xd9, 0x6a, 0x77, 0x83, 0x7d, 0x53, 0x16, 0x92, 0x1b, 0x78, + 0xef, 0x69, 0xd3, 0x80, 0xab, 0x61, 0xc5, 0xa1, 0xeb, 0x73, 0x50, 0xec, 0xda, 0xc3, 0x40, 0xe4, + 0x55, 0x18, 0x7e, 0xb8, 0x51, 0xae, 0x56, 0xc4, 0xc5, 0x19, 0x4f, 0xa2, 0x47, 0x9d, 0xba, 0xfe, + 0x25, 0x1c, 0x85, 0x2c, 0xc3, 0x54, 0x8d, 0xd6, 0xbb, 0x9e, 0x13, 0x1c, 0xdd, 0xf5, 0xdc, 0x6e, + 0xc7, 0x9f, 0x1f, 0xc5, 0x3a, 0x70, 0xa5, 0xfb, 0xa2, 0xc4, 0xda, 0xc3, 0x22, 0x85, 0x3a, 0x46, + 0x64, 0xfc, 0x4e, 0x26, 0xda, 0x26, 0xc9, 0x15, 0x4d, 0xac, 0x41, 0xdd, 0x0d, 0x13, 0x6b, 0x54, + 0xdd, 0x0d, 0x0a, 0x38, 0x26, 0x90, 0x72, 0xd7, 0x0f, 0xdc, 0xd6, 0x72, 0xbb, 0xd1, 0x71, 0x9d, + 0x76, 0x80, 0x54, 0xbc, 0xf3, 0x8d, 0x93, 0xe3, 0xe2, 0xa5, 0x3a, 0x96, 0x5a, 0x54, 0x14, 0x5b, + 0x31, 0x2e, 0x29, 0xd4, 0x1f, 0x61, 0x3c, 0x8c, 0x3f, 0xc8, 0x6a, 0xc7, 0x1b, 0xfb, 0x3c, 0x93, + 0x76, 0x9a, 0x4e, 0x1d, 0x6f, 0xf4, 0xd8, 0xd0, 0x70, 0x56, 0xe1, 0xe7, 0x79, 0x51, 0x29, 0xef, + 0x21, 0x9d, 0x77, 0x0a, 0x35, 0xf9, 0x02, 0x4c, 0x30, 0x49, 0x43, 0xfc, 0xf4, 0xe7, 0xb3, 0xd8, + 0xd9, 0xcf, 0xa1, 0x16, 0xce, 0xa7, 0x5e, 0xc8, 0x46, 0x13, 0x51, 0x54, 0x0a, 0xd2, 0x80, 0xf9, + 0x4d, 0xcf, 0x6e, 0xfb, 0x4e, 0xb0, 0xdc, 0xae, 0x7b, 0x47, 0x28, 0x19, 0x2d, 0xb7, 0xed, 0x9d, + 0x26, 0x6d, 0x60, 0x73, 0xf3, 0x4b, 0x57, 0x4f, 0x8e, 0x8b, 0x2f, 0x05, 0x1c, 0xc7, 0xa2, 0x21, + 0x92, 0x45, 0x39, 0x96, 0xc2, 0xb9, 0x27, 0x27, 0x26, 0x49, 0xc9, 0x6e, 0xc5, 0x47, 0x18, 0x2e, + 0x24, 0xa0, 0x24, 0x15, 0x8e, 0x06, 0xdb, 0xc3, 0xd4, 0xcf, 0x54, 0x09, 0x8c, 0xff, 0x27, 0x13, + 0x1d, 0xc0, 0xe4, 0x6d, 0x18, 0x17, 0x2b, 0x46, 0x99, 0x17, 0xb8, 0x83, 0xca, 0xe5, 0x15, 0x1b, + 0x59, 0x15, 0x9d, 0xdd, 0xfb, 0x4b, 0xe5, 0x55, 0x65, 0x6e, 0xe0, 0xbd, 0xdf, 0xae, 0x37, 0xe3, + 0x54, 0x12, 0x8d, 0x4d, 0x82, 0xcd, 0xd5, 0x9a, 0xde, 0x2b, 0x38, 0x09, 0x82, 0xa6, 0x9f, 0xd2, + 0x0d, 0x0a, 0xf2, 0x47, 0x6f, 0xf8, 0xff, 0x9c, 0x49, 0x3b, 0xe7, 0xc9, 0x12, 0x4c, 0x6e, 0xbb, + 0xde, 0x01, 0x8e, 0xaf, 0xd2, 0x09, 0x38, 0xf2, 0x87, 0xb2, 0x20, 0xde, 0x20, 0x9d, 0x44, 0xfd, + 0x36, 0xa5, 0x37, 0xf4, 0x6f, 0x8b, 0x71, 0xd0, 0x08, 0xd8, 0x38, 0x84, 0x1c, 0xc3, 0xd5, 0x81, + 0xe3, 0x10, 0x7d, 0x82, 0x36, 0x85, 0x55, 0x74, 0xe3, 0xbf, 0xca, 0xa8, 0xe7, 0x39, 0xeb, 0xe4, + 0x8a, 0xdb, 0xb2, 0x9d, 0xb6, 0xd2, 0x1c, 0xfe, 0xb0, 0x84, 0xd0, 0xf8, 0x97, 0x28, 0xc8, 0xe4, + 0x16, 0xe4, 0xf9, 0xaf, 0x70, 0xaf, 0x45, 0xad, 0x96, 0x20, 0xd4, 0x0f, 0x0a, 0x89, 0x98, 0x18, + 0x99, 0xdc, 0x59, 0x47, 0xe6, 0xb7, 0x33, 0xea, 0x51, 0xfc, 0x61, 0x0f, 0x9b, 0xd8, 0x21, 0x93, + 0x3d, 0xcb, 0x21, 0xf3, 0x91, 0x9b, 0xf0, 0xbd, 0x19, 0x18, 0x57, 0xb4, 0x14, 0xac, 0x0d, 0x1b, + 0x9e, 0xfb, 0x01, 0xad, 0x07, 0x7a, 0x1b, 0x3a, 0x1c, 0x18, 0x6b, 0x43, 0x88, 0xfa, 0x11, 0xda, + 0x60, 0xfc, 0x79, 0x46, 0xdc, 0x91, 0x06, 0xde, 0xe6, 0xf5, 0x2d, 0x39, 0x7b, 0x96, 0x23, 0xf2, + 0x0b, 0x30, 0x6c, 0xd2, 0x86, 0xe3, 0x8b, 0xfb, 0xcd, 0x8c, 0x7a, 0x1f, 0xc3, 0x82, 0x48, 0x6e, + 0xf2, 0xd8, 0x4f, 0xf5, 0x7c, 0xc3, 0x72, 0x26, 0xc8, 0x56, 0xfd, 0x3b, 0x4d, 0xfa, 0xd8, 0xe1, + 0x8b, 0x51, 0x1c, 0xb5, 0x78, 0xbc, 0x39, 0xbe, 0xb5, 0xcb, 0x4a, 0x84, 0x44, 0xad, 0x2e, 0x3c, + 0x8d, 0xc6, 0x78, 0x1f, 0x20, 0xaa, 0x92, 0xdc, 0x87, 0x82, 0x98, 0x0d, 0x4e, 0x7b, 0x8f, 0x0b, + 0x52, 0xa2, 0x0f, 0x8a, 0x27, 0xc7, 0xc5, 0x67, 0xeb, 0x61, 0x99, 0x90, 0x3a, 0x15, 0xbe, 0x09, + 0x42, 0xe3, 0x1f, 0x66, 0x21, 0x5b, 0xc2, 0x01, 0xb9, 0x4f, 0x8f, 0x02, 0x7b, 0xe7, 0x8e, 0xd3, + 0xd4, 0x16, 0xd3, 0x01, 0x42, 0xad, 0x5d, 0x47, 0x53, 0x57, 0x28, 0xc8, 0x6c, 0x31, 0xdd, 0xf7, + 0x76, 0xde, 0x40, 0x42, 0x65, 0x31, 0x1d, 0x78, 0x3b, 0x6f, 0xc4, 0xc9, 0x42, 0x44, 0x62, 0xc0, + 0x08, 0x5f, 0x58, 0x62, 0x0e, 0xc2, 0xc9, 0x71, 0x71, 0x84, 0xaf, 0x3f, 0x53, 0x94, 0x90, 0x8b, + 0x90, 0xab, 0x6d, 0xac, 0x89, 0x1d, 0x10, 0xd5, 0x82, 0x7e, 0xa7, 0x6d, 0x32, 0x18, 0xab, 0x73, + 0xb5, 0x52, 0xda, 0x40, 0x45, 0xc0, 0x70, 0x54, 0x67, 0xb3, 0x61, 0x77, 0xe2, 0xaa, 0x80, 0x10, + 0x91, 0xbc, 0x03, 0xe3, 0xf7, 0x2b, 0xe5, 0x15, 0xd7, 0xe7, 0xbb, 0xd7, 0x48, 0x34, 0xf9, 0x0f, + 0x1a, 0x75, 0x0b, 0x35, 0xf1, 0xf1, 0x63, 0x40, 0xc1, 0x37, 0xbe, 0x95, 0x85, 0x71, 0x45, 0x4f, + 0x46, 0x3e, 0x23, 0x1e, 0x48, 0x33, 0xda, 0x0d, 0x40, 0xc1, 0x60, 0xa5, 0x5c, 0xa9, 0xd2, 0x72, + 0x1b, 0x54, 0x3c, 0x97, 0x46, 0x0a, 0x8c, 0xec, 0x20, 0x0a, 0x8c, 0x37, 0x01, 0xf8, 0x1c, 0xc0, + 0x4f, 0x56, 0xc4, 0x09, 0xc5, 0x4e, 0x42, 0x1d, 0x97, 0x08, 0x99, 0x3c, 0x84, 0xd9, 0x4d, 0xaf, + 0xeb, 0x07, 0xb5, 0x23, 0x3f, 0xa0, 0x2d, 0xc6, 0x6d, 0xc3, 0x75, 0x9b, 0x62, 0xfe, 0xbd, 0x74, + 0x72, 0x5c, 0xbc, 0x8c, 0xc6, 0x1d, 0x96, 0x8f, 0xe5, 0xf8, 0x01, 0x56, 0xc7, 0x75, 0x55, 0xb5, + 0x46, 0x1a, 0x03, 0xc3, 0x84, 0x09, 0x55, 0x29, 0xc2, 0x4e, 0x16, 0xf1, 0x98, 0x24, 0x54, 0xdd, + 0xca, 0xc9, 0x22, 0xbe, 0x32, 0xf9, 0xb8, 0xa5, 0x93, 0x18, 0x9f, 0x51, 0x15, 0x72, 0x83, 0x2e, + 0x6c, 0xe3, 0xfb, 0x33, 0xd1, 0x36, 0xf2, 0xf0, 0x26, 0x79, 0x0b, 0x46, 0xf8, 0xe3, 0x9d, 0x78, + 0xe3, 0x3c, 0x17, 0x5e, 0x6a, 0xd5, 0x97, 0x3d, 0xae, 0x09, 0xff, 0x23, 0xfe, 0xc0, 0xff, 0x8c, + 0x29, 0x48, 0x42, 0x25, 0xba, 0xae, 0x4f, 0x93, 0xdc, 0x51, 0x5d, 0x7c, 0x33, 0x4d, 0x89, 0x6e, + 0xfc, 0xee, 0x10, 0x4c, 0xe9, 0x68, 0xea, 0x0b, 0x5f, 0x66, 0xa0, 0x17, 0xbe, 0x2f, 0x40, 0x9e, + 0xf5, 0x87, 0x53, 0xa7, 0x52, 0x22, 0x7b, 0x09, 0x9f, 0x16, 0x04, 0x4c, 0x7b, 0xb9, 0x06, 0x3e, + 0x1c, 0xec, 0x8e, 0x6b, 0x86, 0x54, 0x64, 0x51, 0x79, 0x86, 0xca, 0x45, 0x42, 0x8a, 0x7c, 0x86, + 0x52, 0xd7, 0x43, 0xf8, 0x20, 0xf5, 0x3a, 0x8c, 0x30, 0xf9, 0x3e, 0x54, 0xc1, 0xe0, 0x57, 0x32, + 0xd1, 0x3f, 0x66, 0xa2, 0xc2, 0x91, 0xc8, 0x36, 0xe4, 0x57, 0x6d, 0x3f, 0xa8, 0x51, 0xda, 0x1e, + 0xe0, 0xed, 0xbe, 0x28, 0xba, 0x6a, 0x16, 0x1f, 0xc6, 0x7d, 0x4a, 0xdb, 0xb1, 0xc7, 0xd7, 0x90, + 0x19, 0xf9, 0x2a, 0x40, 0xd9, 0x6d, 0x07, 0x9e, 0xdb, 0x5c, 0x75, 0xf7, 0xe6, 0x47, 0xf0, 0xee, + 0x7b, 0x29, 0x36, 0x00, 0x11, 0x02, 0xbf, 0xfe, 0x86, 0x0a, 0x9e, 0x3a, 0x2f, 0xb0, 0x9a, 0xee, + 0x9e, 0xba, 0x0e, 0x22, 0x7c, 0x72, 0x07, 0x0a, 0x52, 0xb1, 0xb0, 0xd5, 0xd9, 0xf3, 0x70, 0x82, + 0x8c, 0x46, 0x92, 0x07, 0x7d, 0x1c, 0x58, 0x5d, 0x01, 0x57, 0x77, 0xca, 0x38, 0x0d, 0xf9, 0x0a, + 0x5c, 0x88, 0xc3, 0xe4, 0x28, 0xe7, 0x23, 0x99, 0x5c, 0x65, 0x97, 0x32, 0xef, 0x7b, 0xb1, 0x30, + 0xbe, 0x93, 0x85, 0x0b, 0x3d, 0x1a, 0xcb, 0xd6, 0x03, 0x1e, 0xd7, 0xca, 0x7a, 0x88, 0x9d, 0xd2, + 0xdc, 0xe6, 0xe8, 0x32, 0x64, 0xc5, 0x01, 0x37, 0xb4, 0x54, 0x38, 0x39, 0x2e, 0x4e, 0x68, 0xe3, + 0x98, 0xad, 0x56, 0xc8, 0x3d, 0x18, 0x62, 0x43, 0x34, 0xc0, 0xd3, 0xb9, 0xd4, 0x29, 0x4d, 0x05, + 0x8e, 0x3a, 0x7d, 0x70, 0xe8, 0x90, 0x07, 0xf9, 0x0c, 0xe4, 0x36, 0x37, 0x57, 0x71, 0xee, 0xe4, + 0xb0, 0xed, 0x93, 0x41, 0xd0, 0xd4, 0xa6, 0xea, 0x24, 0xa3, 0xbd, 0x1e, 0x5a, 0x5a, 0x30, 0x74, + 0xf2, 0xa5, 0x98, 0x49, 0xcf, 0xab, 0xfd, 0x07, 0x7a, 0x70, 0x0b, 0x9f, 0x8f, 0x60, 0x58, 0x63, + 0xfc, 0x7c, 0x36, 0x5a, 0xc3, 0x77, 0x9c, 0x66, 0x40, 0x3d, 0xb2, 0xc0, 0x97, 0x64, 0x24, 0x9c, + 0x99, 0xe1, 0x6f, 0x32, 0x1f, 0xad, 0x6f, 0xce, 0x2a, 0x5c, 0xc8, 0xaf, 0x2a, 0x0b, 0x39, 0x87, + 0x0b, 0x79, 0xaa, 0xe7, 0x92, 0x7d, 0x35, 0x65, 0x5e, 0xe2, 0x42, 0x4c, 0x99, 0x7b, 0x2f, 0xc1, + 0xe4, 0x9a, 0xbb, 0xfc, 0x38, 0x08, 0x11, 0xd9, 0x02, 0xcc, 0x9b, 0x3a, 0x90, 0x71, 0x5c, 0x6f, + 0x36, 0xa8, 0xb7, 0xb9, 0x6f, 0xb7, 0xb5, 0xb7, 0x6b, 0x33, 0x01, 0x67, 0xb8, 0x6b, 0xf4, 0x50, + 0xc7, 0x1d, 0xe5, 0xb8, 0x71, 0xb8, 0xf1, 0x7d, 0x59, 0xd9, 0x19, 0x0f, 0x17, 0x9f, 0xd2, 0x37, + 0xd2, 0x37, 0xb4, 0x37, 0xd2, 0xd9, 0x50, 0xbb, 0x1b, 0x3e, 0xf8, 0x2f, 0x9e, 0x62, 0x27, 0xf0, + 0xf7, 0x47, 0x60, 0x42, 0x45, 0x67, 0xfd, 0x50, 0x6a, 0x34, 0x3c, 0xb5, 0x1f, 0xec, 0x46, 0xc3, + 0x33, 0x11, 0xaa, 0x99, 0x05, 0xe4, 0xfa, 0x9a, 0x05, 0x7c, 0x0d, 0xc6, 0xca, 0xad, 0x86, 0xf6, + 0x58, 0x69, 0xa4, 0x7c, 0xde, 0xf5, 0x10, 0x89, 0xaf, 0x85, 0x50, 0x69, 0x59, 0x6f, 0x35, 0x92, + 0x4f, 0x94, 0x11, 0x4b, 0xcd, 0xa2, 0x60, 0xf8, 0xa3, 0x58, 0x14, 0xdc, 0x86, 0xb1, 0x2d, 0x9f, + 0x6e, 0x76, 0xdb, 0x6d, 0xda, 0xc4, 0x69, 0x95, 0xe7, 0xb2, 0x7e, 0xd7, 0xa7, 0x56, 0x80, 0x50, + 0xf5, 0x03, 0x42, 0x54, 0x75, 0x80, 0x47, 0xfb, 0x0c, 0xf0, 0x2d, 0xc8, 0x6f, 0x50, 0xea, 0x61, + 0x9f, 0x8e, 0x47, 0x22, 0x5d, 0x87, 0x52, 0xcf, 0x62, 0x1d, 0xab, 0x59, 0x1a, 0x08, 0x44, 0xcd, + 0x3c, 0x61, 0x62, 0x40, 0xf3, 0x04, 0xf2, 0x02, 0x4c, 0x74, 0xba, 0x3b, 0x4d, 0xa7, 0x8e, 0x7c, + 0x85, 0x5d, 0x83, 0x39, 0xce, 0x61, 0x8c, 0xad, 0x4f, 0xbe, 0x04, 0x93, 0x78, 0xc7, 0x09, 0xa7, + 0xdc, 0x94, 0xf6, 0xaa, 0xa7, 0x95, 0x71, 0x49, 0xa7, 0xce, 0x40, 0x56, 0x8a, 0xf9, 0x8d, 0xce, + 0x88, 0xdc, 0x83, 0xd1, 0x3d, 0x27, 0xb0, 0xf6, 0xbb, 0x3b, 0xf3, 0xd3, 0x9a, 0xed, 0xca, 0x5d, + 0x27, 0x58, 0xe9, 0xee, 0xf0, 0x21, 0x0f, 0x59, 0xe3, 0x8e, 0xb7, 0xe7, 0x04, 0xfb, 0x5d, 0x55, + 0x25, 0x3b, 0xb2, 0x87, 0xb8, 0x0b, 0x35, 0x98, 0xd2, 0x67, 0xc5, 0x13, 0x78, 0x28, 0x0c, 0xcd, + 0x36, 0xf2, 0x85, 0xb1, 0x7b, 0x43, 0x79, 0x28, 0x8c, 0x73, 0x83, 0x0d, 0x13, 0x36, 0xc2, 0xfe, + 0x31, 0xc9, 0xfd, 0xee, 0x0e, 0xf5, 0xda, 0x34, 0xa0, 0xbe, 0xb8, 0x50, 0xf8, 0xe6, 0x50, 0xa9, + 0xd3, 0xf1, 0x8d, 0xff, 0x34, 0x0b, 0xa3, 0xa5, 0xed, 0x5a, 0xb5, 0xbd, 0xeb, 0xe2, 0x73, 0x5f, + 0xf8, 0xca, 0xa3, 0x3e, 0xf7, 0x85, 0xaf, 0x3c, 0xea, 0xdb, 0xce, 0x8d, 0x94, 0x2b, 0x21, 0x5a, + 0x04, 0x2b, 0x57, 0x42, 0xed, 0x32, 0x1b, 0x3d, 0x78, 0xe5, 0x06, 0x78, 0xf0, 0x0a, 0x75, 0x92, + 0x43, 0xa7, 0xeb, 0x24, 0xdf, 0x82, 0xf1, 0x6a, 0x3b, 0xa0, 0x7b, 0x5e, 0xb4, 0x6a, 0xc2, 0xeb, + 0x69, 0x08, 0x56, 0xaf, 0x09, 0x0a, 0x36, 0x9b, 0x92, 0x5c, 0x0f, 0x1a, 0xea, 0x3f, 0x71, 0x4a, + 0x72, 0x75, 0x69, 0x4c, 0xb7, 0x20, 0x11, 0x8d, 0x4a, 0x6c, 0xbe, 0x49, 0xa3, 0x02, 0x2e, 0xc8, + 0x4e, 0x45, 0x0f, 0x01, 0xac, 0x63, 0x97, 0x66, 0xd2, 0x8d, 0x0a, 0x8c, 0xbf, 0x9d, 0x81, 0xb9, + 0xb4, 0x69, 0x44, 0xde, 0x85, 0x09, 0xd7, 0xdb, 0xb3, 0xdb, 0xce, 0x77, 0xf3, 0x16, 0x29, 0x0a, + 0x30, 0x15, 0xae, 0x5e, 0xfb, 0x55, 0x38, 0xeb, 0x10, 0xa5, 0xe5, 0xfa, 0x7d, 0x3d, 0xb5, 0x43, + 0x14, 0xb0, 0xf1, 0x43, 0x59, 0x18, 0x2f, 0x75, 0x3a, 0x4f, 0xb9, 0xc1, 0xd9, 0xe7, 0xb4, 0x03, + 0x44, 0xde, 0xf6, 0xc2, 0x76, 0x0d, 0x64, 0x6b, 0xf6, 0xab, 0x59, 0x98, 0x8e, 0x51, 0xa8, 0x5f, + 0x9f, 0x19, 0xd0, 0xcc, 0x2c, 0x3b, 0xa0, 0x99, 0x59, 0x6e, 0x30, 0x33, 0xb3, 0xa1, 0x8f, 0x72, + 0x28, 0xbc, 0x02, 0xb9, 0x52, 0xa7, 0x13, 0x7f, 0xae, 0xee, 0x74, 0x1e, 0xde, 0xe2, 0x37, 0x76, + 0xbb, 0xd3, 0x31, 0x19, 0x86, 0xb6, 0x53, 0x8f, 0x0c, 0xb8, 0x53, 0x1b, 0xaf, 0xc3, 0x18, 0xf2, + 0x42, 0xe3, 0xae, 0xcb, 0x80, 0x5b, 0x8c, 0xb0, 0xeb, 0xd2, 0xea, 0x12, 0x9b, 0xcf, 0xff, 0x97, + 0x81, 0x61, 0xfc, 0xfd, 0x94, 0xce, 0xb1, 0x45, 0x6d, 0x8e, 0x15, 0x94, 0x39, 0x36, 0xc8, 0xec, + 0xfa, 0x47, 0x39, 0x80, 0xf2, 0xba, 0x59, 0xe3, 0x8a, 0x1d, 0x72, 0x07, 0xa6, 0xed, 0x66, 0xd3, + 0x3d, 0xa4, 0x0d, 0xcb, 0xf5, 0x9c, 0x3d, 0xa7, 0xcd, 0x7b, 0x4e, 0xbe, 0xa1, 0xea, 0x45, 0xea, + 0xcb, 0x8a, 0x28, 0x5a, 0xe7, 0x25, 0x2a, 0x9f, 0x16, 0x0d, 0xf6, 0xdd, 0x86, 0xbc, 0xa2, 0x6a, + 0x7c, 0x44, 0x51, 0x0a, 0x9f, 0x07, 0xbc, 0x44, 0xe5, 0xb3, 0x8f, 0x57, 0x6e, 0x29, 0x21, 0x6b, + 0x7c, 0x44, 0x51, 0x0a, 0x1f, 0x7e, 0x4f, 0xf7, 0xc9, 0x2a, 0xcc, 0x20, 0xc4, 0xaa, 0x7b, 0xb4, + 0x41, 0xdb, 0x81, 0x63, 0x37, 0x7d, 0xa1, 0xd4, 0x40, 0xf5, 0x57, 0xa2, 0x50, 0xbd, 0xd4, 0x61, + 0x61, 0x39, 0x2a, 0x23, 0xd7, 0x61, 0xb4, 0x65, 0x3f, 0xb6, 0xec, 0x3d, 0x6e, 0x4d, 0x30, 0xc9, + 0x2f, 0xc1, 0x02, 0xa4, 0x1e, 0x23, 0x2d, 0xfb, 0x71, 0x69, 0x8f, 0xb2, 0x56, 0xd0, 0xc7, 0x1d, + 0xd7, 0x57, 0x5a, 0x31, 0x12, 0xb5, 0x22, 0x56, 0xa4, 0xb6, 0x42, 0x14, 0x89, 0x56, 0x18, 0xbf, + 0x92, 0x81, 0x67, 0xab, 0xf8, 0x15, 0xc1, 0x51, 0x99, 0xb6, 0x03, 0xea, 0x6d, 0x50, 0xaf, 0xe5, + 0xe0, 0xdb, 0x6a, 0x8d, 0x06, 0xe4, 0x45, 0xc8, 0x95, 0xcc, 0x35, 0x31, 0x7f, 0xf9, 0x7e, 0xaf, + 0xbd, 0x74, 0xb3, 0xd2, 0x50, 0x4f, 0x92, 0x3d, 0x45, 0x01, 0x5a, 0x82, 0x89, 0x92, 0xef, 0x3b, + 0x7b, 0xed, 0x16, 0xb7, 0xd2, 0xcf, 0x69, 0x6f, 0xe9, 0x02, 0x9e, 0xd0, 0xdc, 0xab, 0x24, 0xc6, + 0x7f, 0x96, 0x81, 0x99, 0x52, 0xa7, 0xa3, 0x7f, 0xb2, 0x6e, 0xc7, 0x91, 0x19, 0xdc, 0x8e, 0xc3, + 0x81, 0x29, 0xad, 0xb9, 0x7c, 0x4a, 0x45, 0x82, 0x6f, 0x9f, 0x9e, 0xe1, 0x9f, 0xdd, 0x09, 0x41, + 0x96, 0xaf, 0x3f, 0x42, 0xc6, 0x18, 0x1b, 0xff, 0xc1, 0x28, 0xee, 0x21, 0x62, 0xb7, 0x15, 0x96, + 0x86, 0x99, 0x14, 0x4b, 0xc3, 0x37, 0x41, 0x91, 0x70, 0xd4, 0x23, 0x4e, 0x91, 0x15, 0x55, 0x0d, + 0x43, 0x84, 0x4c, 0x0e, 0xe2, 0x36, 0x87, 0x39, 0x6c, 0xcd, 0x8b, 0xf1, 0x05, 0xfc, 0x44, 0xcc, + 0x0d, 0x57, 0x80, 0x54, 0xdb, 0xf8, 0x30, 0x4a, 0x6b, 0x07, 0x4e, 0xe7, 0x21, 0xf5, 0x9c, 0xdd, + 0x23, 0xb1, 0x00, 0xb0, 0xf3, 0x1d, 0x51, 0x6a, 0xf9, 0x07, 0x4e, 0xc7, 0x7a, 0x84, 0xe5, 0x66, + 0x0a, 0x0d, 0x79, 0x0f, 0x46, 0x4d, 0x7a, 0xe8, 0x39, 0x81, 0xb4, 0xa4, 0x99, 0x0a, 0x15, 0x66, + 0x08, 0xe5, 0x6b, 0xc1, 0xe3, 0x3f, 0xd4, 0x5d, 0x51, 0x94, 0x93, 0x45, 0x2e, 0xa4, 0x70, 0x8b, + 0x99, 0xc9, 0xa8, 0xb5, 0xa5, 0xed, 0x5a, 0x2f, 0x19, 0x85, 0x5c, 0x83, 0x61, 0x94, 0x74, 0xc4, + 0x5d, 0x00, 0x3d, 0x50, 0x50, 0x76, 0x56, 0xc5, 0x30, 0xc4, 0x20, 0x97, 0x00, 0xc2, 0x97, 0x47, + 0x7f, 0x3e, 0x8f, 0x52, 0xba, 0x02, 0x89, 0x8b, 0x69, 0x63, 0x67, 0x12, 0xd3, 0x56, 0xa1, 0x60, + 0x72, 0x67, 0xb6, 0x46, 0xa9, 0x83, 0xcf, 0x5b, 0xfe, 0x3c, 0xe0, 0x4a, 0xbe, 0x7c, 0x72, 0x5c, + 0x7c, 0x4e, 0x38, 0xba, 0x35, 0x2c, 0xbb, 0xc3, 0x5f, 0xc5, 0xb4, 0x6d, 0x24, 0x4e, 0x49, 0xde, + 0x84, 0x21, 0xb6, 0xf5, 0x0a, 0xeb, 0x44, 0xf9, 0x4c, 0x10, 0xed, 0xc6, 0x7c, 0x71, 0xd6, 0x5d, + 0x6d, 0x4f, 0x40, 0x12, 0x62, 0xc1, 0x94, 0x3e, 0xdd, 0x85, 0xa1, 0xca, 0x7c, 0xd4, 0x9f, 0x7a, + 0xb9, 0x78, 0x3b, 0x10, 0x30, 0xab, 0x8e, 0x40, 0x75, 0x05, 0xc4, 0x16, 0xe9, 0x32, 0xe4, 0x37, + 0xcb, 0x1b, 0x1b, 0xae, 0x17, 0xf0, 0xab, 0x4e, 0x74, 0xb2, 0x30, 0x98, 0x69, 0xb7, 0xf7, 0x28, + 0x3f, 0x8b, 0x83, 0x7a, 0xc7, 0xea, 0x30, 0x34, 0xf5, 0x2c, 0x96, 0xa4, 0x1f, 0x9f, 0x65, 0xe2, + 0xaf, 0x66, 0xe1, 0xc5, 0x50, 0x2a, 0x5a, 0xf7, 0x6a, 0xa5, 0x07, 0xab, 0xd5, 0xc6, 0x86, 0x50, + 0x93, 0x6c, 0x78, 0xee, 0x23, 0xa7, 0x41, 0xbd, 0x87, 0x37, 0x4f, 0x39, 0xd3, 0x57, 0xf9, 0x32, + 0xe7, 0x6f, 0x2c, 0x59, 0xcd, 0x86, 0x4b, 0x11, 0x3e, 0xc5, 0xf6, 0xd4, 0xe9, 0x24, 0x9e, 0x5c, + 0x56, 0x9e, 0x31, 0x23, 0x06, 0xe4, 0xfb, 0x33, 0x70, 0x3e, 0xfd, 0x43, 0x84, 0xea, 0xac, 0x28, + 0xaf, 0xe8, 0x3d, 0xbe, 0x76, 0xe9, 0x95, 0x93, 0xe3, 0xe2, 0x8b, 0xbe, 0xdd, 0x6a, 0x5a, 0x4e, + 0x83, 0xd7, 0xe6, 0xd4, 0xa9, 0xd5, 0x11, 0x08, 0x5a, 0xbd, 0x3d, 0x6a, 0xfa, 0x3c, 0xc8, 0xa3, + 0x7d, 0x3e, 0xb3, 0x04, 0x90, 0x97, 0x6a, 0x6c, 0xe3, 0x37, 0x32, 0xa0, 0x2c, 0xc1, 0xbc, 0x49, + 0x1b, 0x8e, 0x47, 0xeb, 0x81, 0x38, 0xde, 0x85, 0x07, 0x1a, 0x87, 0xc5, 0x4c, 0xf6, 0x10, 0x46, + 0xde, 0x85, 0x51, 0x71, 0x0c, 0x89, 0x6d, 0x57, 0x2e, 0x5d, 0xa1, 0x20, 0xe7, 0xae, 0x8a, 0x89, + 0x23, 0x4c, 0x12, 0xb1, 0x5d, 0xff, 0xde, 0xf6, 0x66, 0xb9, 0x69, 0x3b, 0x2d, 0x5f, 0x9c, 0x25, + 0xd8, 0xad, 0x1f, 0x1c, 0x06, 0x56, 0x1d, 0xa1, 0xea, 0xae, 0x1f, 0xa2, 0x1a, 0x77, 0xa5, 0x7e, + 0xfe, 0x14, 0xbb, 0xd3, 0x22, 0x0c, 0x3f, 0x8c, 0xf4, 0x74, 0x4b, 0x63, 0x27, 0xc7, 0x45, 0x3e, + 0x5d, 0x4c, 0x0e, 0x37, 0x28, 0x8c, 0x85, 0x53, 0x97, 0xf1, 0x62, 0x3f, 0x90, 0xd7, 0x24, 0xe7, + 0xc5, 0x26, 0xb1, 0x89, 0x50, 0x26, 0xea, 0x2d, 0xb7, 0x1b, 0x88, 0x90, 0x45, 0x04, 0xec, 0x1e, + 0xda, 0x6e, 0xe0, 0x4c, 0x57, 0x5b, 0x27, 0xd0, 0x14, 0x81, 0xea, 0x47, 0x32, 0x30, 0xa5, 0x4f, + 0x5b, 0x72, 0x1d, 0x46, 0x84, 0x93, 0x59, 0x06, 0xd5, 0x9e, 0x8c, 0xdb, 0x08, 0x77, 0x2f, 0xd3, + 0x9c, 0xca, 0x04, 0x16, 0x93, 0x1b, 0x05, 0x07, 0x21, 0x34, 0xa1, 0xdc, 0x58, 0xe7, 0x20, 0x53, + 0x96, 0x11, 0x83, 0x5d, 0x65, 0xfd, 0x6e, 0x33, 0x50, 0x5f, 0xc3, 0x3c, 0x84, 0x98, 0xa2, 0xc4, + 0x28, 0xc3, 0x08, 0xdf, 0x5a, 0x63, 0x66, 0x75, 0x99, 0x33, 0x98, 0xd5, 0x19, 0xc7, 0x19, 0x80, + 0x5a, 0x6d, 0xe5, 0x3e, 0x3d, 0xda, 0xb0, 0x1d, 0x3c, 0xbf, 0xf9, 0x31, 0x76, 0x5f, 0xac, 0xe1, + 0x09, 0xf1, 0x7c, 0xcb, 0x8f, 0xbc, 0x03, 0x7a, 0xa4, 0x3d, 0xdf, 0x4a, 0x54, 0x3c, 0x2b, 0x3d, + 0xe7, 0x91, 0x1d, 0x50, 0x46, 0x98, 0x45, 0x42, 0x7e, 0x56, 0x72, 0x68, 0x8c, 0x52, 0x41, 0x26, + 0x5f, 0x85, 0xa9, 0xe8, 0x57, 0xf8, 0x08, 0x3d, 0x15, 0xee, 0x13, 0x7a, 0xe1, 0xd2, 0xa5, 0x93, + 0xe3, 0xe2, 0x82, 0xc2, 0x35, 0xfe, 0x3c, 0x1d, 0x63, 0x66, 0xfc, 0x52, 0x06, 0x4d, 0x2f, 0x64, + 0x03, 0xaf, 0xc0, 0x50, 0x68, 0x2c, 0x3c, 0x21, 0x36, 0x61, 0xfd, 0xa1, 0x0d, 0xcb, 0x99, 0xb8, + 0x15, 0xb5, 0x04, 0x8f, 0x2e, 0xbd, 0x05, 0xac, 0x94, 0xdc, 0x85, 0xd1, 0x81, 0xbe, 0x19, 0xa7, + 0x58, 0xca, 0xb7, 0x4a, 0x6a, 0x1c, 0x85, 0x7b, 0xdb, 0x9b, 0x9f, 0xdc, 0x51, 0xf8, 0xf1, 0x2c, + 0x4c, 0xb3, 0x7e, 0x2d, 0x75, 0x83, 0x7d, 0xd7, 0x73, 0x82, 0xa3, 0xa7, 0x56, 0x6f, 0xfc, 0xb6, + 0x76, 0x25, 0x5b, 0x90, 0x87, 0x99, 0xda, 0xb6, 0x81, 0xd4, 0xc7, 0xff, 0x74, 0x18, 0x66, 0x53, + 0xa8, 0xc8, 0x6b, 0xda, 0xd3, 0xce, 0xbc, 0x74, 0x22, 0xff, 0xce, 0x71, 0x71, 0x42, 0xa2, 0x6f, + 0x46, 0x4e, 0xe5, 0x8b, 0xba, 0x1d, 0x13, 0xef, 0x29, 0x7c, 0xe9, 0x51, 0xed, 0x98, 0x74, 0xeb, + 0xa5, 0x6b, 0x30, 0x6c, 0xba, 0x4d, 0x2a, 0x6d, 0xf7, 0x50, 0xe0, 0xf2, 0x18, 0x40, 0xb3, 0x55, + 0x60, 0x00, 0xb2, 0x02, 0xa3, 0xec, 0x8f, 0x07, 0x76, 0x47, 0xbc, 0xc2, 0x91, 0x50, 0x29, 0x80, + 0xd0, 0x8e, 0xd3, 0xde, 0x53, 0xf5, 0x02, 0x4d, 0x6a, 0xb5, 0xec, 0x8e, 0x26, 0x19, 0x72, 0x44, + 0x4d, 0xbf, 0x90, 0xef, 0xad, 0x5f, 0xc8, 0x9c, 0xaa, 0x5f, 0xd8, 0x05, 0xa8, 0x39, 0x7b, 0x6d, + 0xa7, 0xbd, 0x57, 0x6a, 0xee, 0x09, 0x57, 0xfc, 0x6b, 0xbd, 0x47, 0xe1, 0x7a, 0x84, 0x8c, 0x13, + 0xf7, 0x59, 0x7c, 0x2a, 0xe7, 0x30, 0xcb, 0x6e, 0xee, 0x69, 0x2e, 0x43, 0x0a, 0x67, 0xb2, 0x06, + 0x50, 0xaa, 0x07, 0xce, 0x23, 0x36, 0x85, 0x7d, 0x21, 0xc6, 0xc9, 0x4f, 0x2e, 0x97, 0xee, 0xd3, + 0x23, 0xbc, 0x7a, 0xc8, 0x47, 0x47, 0x1b, 0x51, 0xd9, 0x4a, 0xd0, 0xfc, 0x41, 0x22, 0x0e, 0xa4, + 0x03, 0xe7, 0x4a, 0x8d, 0x86, 0xc3, 0xda, 0x60, 0x37, 0x37, 0x79, 0x10, 0x05, 0x64, 0x3d, 0x91, + 0xce, 0xfa, 0x9a, 0x60, 0xfd, 0x82, 0x1d, 0x52, 0x59, 0x32, 0xf6, 0x42, 0xac, 0x9a, 0x74, 0xc6, + 0x46, 0x0d, 0xa6, 0xf4, 0xc6, 0xeb, 0x21, 0x04, 0x26, 0x20, 0x6f, 0xd6, 0x4a, 0x56, 0x6d, 0xa5, + 0x74, 0xb3, 0x90, 0x21, 0x05, 0x98, 0x10, 0xbf, 0x16, 0xad, 0xc5, 0x37, 0x6e, 0x17, 0xb2, 0x1a, + 0xe4, 0x8d, 0x9b, 0x8b, 0x85, 0xdc, 0x42, 0x76, 0x3e, 0x13, 0xf3, 0xde, 0x1b, 0x2d, 0xe4, 0xb9, + 0x4a, 0xd8, 0xf8, 0xb5, 0x0c, 0xe4, 0xe5, 0xb7, 0x93, 0xdb, 0x90, 0xab, 0xd5, 0x56, 0x62, 0xfe, + 0x76, 0xd1, 0x29, 0xc3, 0xf7, 0x53, 0xdf, 0x57, 0x8d, 0xaa, 0x19, 0x01, 0xa3, 0xdb, 0x5c, 0xad, + 0x09, 0x19, 0x44, 0xd2, 0x45, 0x9b, 0x37, 0xa7, 0x4b, 0x71, 0x42, 0xba, 0x0d, 0xb9, 0x7b, 0xdb, + 0x9b, 0xe2, 0x92, 0x25, 0xe9, 0xa2, 0xfd, 0x94, 0xd3, 0x7d, 0x70, 0xa8, 0xee, 0xf2, 0x8c, 0xc0, + 0x30, 0x61, 0x5c, 0x99, 0xc8, 0xfc, 0xd0, 0x6d, 0xb9, 0xa1, 0xdf, 0xbc, 0x38, 0x74, 0x19, 0xc4, + 0x14, 0x25, 0x4c, 0x14, 0x59, 0x75, 0xeb, 0x76, 0x53, 0x9c, 0xde, 0x28, 0x8a, 0x34, 0x19, 0xc0, + 0xe4, 0x70, 0xe3, 0x77, 0x32, 0x50, 0x40, 0x81, 0x0d, 0x8d, 0xa2, 0xdd, 0x03, 0xda, 0x7e, 0x78, + 0x93, 0xbc, 0x2e, 0x97, 0x5c, 0x26, 0x54, 0x74, 0x0d, 0xe3, 0x92, 0x8b, 0xbd, 0x05, 0x8a, 0x65, + 0xa7, 0x84, 0x26, 0xc8, 0x0e, 0xee, 0xd2, 0x7c, 0x4a, 0x68, 0x82, 0x22, 0x0c, 0xe3, 0xe7, 0x88, + 0xcd, 0x11, 0xbf, 0x3c, 0x60, 0x00, 0x93, 0xc3, 0x95, 0xbd, 0xe9, 0x27, 0xb3, 0x89, 0x36, 0x2c, + 0x7e, 0xa2, 0xdc, 0x82, 0xf5, 0xc6, 0x0d, 0xb4, 0x5f, 0xbf, 0x0f, 0x73, 0xf1, 0x2e, 0x41, 0x25, + 0x64, 0x09, 0xa6, 0x75, 0xb8, 0xd4, 0x47, 0x5e, 0x48, 0xad, 0xeb, 0xe1, 0xa2, 0x19, 0xc7, 0x37, + 0xfe, 0xf7, 0x0c, 0x8c, 0xe1, 0x9f, 0x66, 0xb7, 0x89, 0xc6, 0x69, 0xa5, 0xed, 0x9a, 0x50, 0x8d, + 0xa8, 0xc2, 0x9c, 0x7d, 0xe8, 0x5b, 0x42, 0x8f, 0xa2, 0xed, 0x31, 0x21, 0xb2, 0x20, 0xe5, 0xef, + 0x1b, 0x52, 0x29, 0x17, 0x92, 0xf2, 0x87, 0x10, 0x3f, 0x46, 0x2a, 0x90, 0xd1, 0xa4, 0x75, 0xbb, + 0xc6, 0xa6, 0x9f, 0x6a, 0x2d, 0x82, 0x74, 0x6e, 0x53, 0x37, 0x69, 0xe5, 0x68, 0x68, 0x2c, 0xb2, + 0x5d, 0x2b, 0x99, 0x6b, 0x9a, 0xb1, 0x08, 0xfb, 0x46, 0x4d, 0x2f, 0x25, 0x90, 0x8c, 0x9f, 0x1f, + 0x8f, 0x77, 0xa0, 0x38, 0xf0, 0xce, 0xb8, 0x36, 0xde, 0x82, 0xe1, 0x52, 0xb3, 0xe9, 0x1e, 0x8a, + 0x5d, 0x42, 0xde, 0x5c, 0xc3, 0xfe, 0xe3, 0xe7, 0x19, 0xaa, 0xf5, 0x34, 0x57, 0x47, 0x06, 0x20, + 0x65, 0x18, 0x2b, 0x6d, 0xd7, 0xaa, 0xd5, 0xca, 0xe6, 0x26, 0x77, 0xeb, 0xca, 0x2d, 0xbd, 0x2c, + 0xfb, 0xc7, 0x71, 0x1a, 0x56, 0xdc, 0x5e, 0x21, 0x92, 0xdf, 0x23, 0x3a, 0xf2, 0x0e, 0xc0, 0x3d, + 0xd7, 0x69, 0x73, 0x35, 0xa6, 0x68, 0x3c, 0xbb, 0x81, 0x8f, 0x7f, 0xe0, 0x3a, 0x6d, 0xa1, 0xf7, + 0x64, 0xdf, 0x1e, 0x21, 0x99, 0xca, 0xdf, 0xac, 0xa7, 0x97, 0x5c, 0x6e, 0x70, 0x36, 0x1c, 0xf5, + 0xf4, 0x8e, 0x9b, 0xd0, 0xb7, 0x49, 0x34, 0xd2, 0x82, 0xe9, 0x5a, 0x77, 0x6f, 0x8f, 0xb2, 0x9d, + 0x5d, 0xe8, 0x93, 0x46, 0xc4, 0x55, 0x3a, 0x0c, 0xa6, 0xc3, 0xef, 0x23, 0xec, 0x32, 0xe4, 0x2f, + 0xbd, 0xc6, 0x26, 0xf2, 0xb7, 0x8f, 0x8b, 0xc2, 0x0e, 0x82, 0x89, 0x6a, 0xbe, 0xa4, 0x4f, 0x6a, + 0x93, 0xe2, 0xbc, 0xc9, 0x3a, 0x8c, 0xf0, 0x37, 0x23, 0xe1, 0xa6, 0xf4, 0x42, 0x9f, 0x45, 0xc3, + 0x11, 0x7b, 0xbd, 0x4a, 0xf2, 0x52, 0xb2, 0x0d, 0xf9, 0xb2, 0xe3, 0xd5, 0x9b, 0xb4, 0x5c, 0x15, + 0x67, 0xff, 0x8b, 0x7d, 0x58, 0x4a, 0x54, 0xde, 0x2f, 0x75, 0xfc, 0x55, 0x77, 0x54, 0x59, 0x40, + 0x62, 0x90, 0xbf, 0x9d, 0x81, 0x67, 0xc3, 0xaf, 0x2f, 0xed, 0xd1, 0x76, 0xf0, 0xc0, 0x0e, 0xea, + 0xfb, 0xd4, 0x13, 0xbd, 0x34, 0xd6, 0xaf, 0x97, 0x3e, 0x9f, 0xe8, 0xa5, 0xab, 0x51, 0x2f, 0xd9, + 0x8c, 0x99, 0xd5, 0xe2, 0xdc, 0x92, 0x7d, 0xd6, 0xaf, 0x56, 0x62, 0x01, 0x44, 0xaf, 0xa1, 0xc2, + 0xcd, 0xf5, 0xe5, 0x3e, 0x0d, 0x8e, 0x90, 0x85, 0x7b, 0x4a, 0xf8, 0x5b, 0xb3, 0xaf, 0x0c, 0xa1, + 0xe4, 0xbe, 0xf4, 0x09, 0xe4, 0x52, 0xc9, 0xe5, 0x3e, 0xbc, 0xb9, 0x9f, 0xe0, 0x6c, 0x1f, 0xef, + 0x5f, 0x3e, 0xda, 0xab, 0xf6, 0x8e, 0x10, 0x44, 0x4e, 0x19, 0xed, 0x55, 0x3b, 0x1a, 0xed, 0xa6, + 0x1d, 0x1f, 0xed, 0x55, 0x7b, 0x87, 0x94, 0xb9, 0x23, 0x33, 0xf7, 0x7a, 0xbd, 0xd4, 0x8f, 0x5b, + 0x79, 0x83, 0x9f, 0xcc, 0x29, 0x0e, 0xcd, 0x5f, 0x86, 0xb1, 0x5a, 0xc7, 0xae, 0xd3, 0xa6, 0xb3, + 0x1b, 0x88, 0xa7, 0xf6, 0x97, 0xfa, 0xb0, 0x0a, 0x71, 0xc5, 0xd3, 0xaa, 0xfc, 0xa9, 0x5e, 0x93, + 0x42, 0x1c, 0xf6, 0x85, 0x9b, 0x1b, 0x0f, 0xc4, 0x6b, 0x7b, 0xbf, 0x2f, 0xdc, 0xdc, 0x78, 0x20, + 0x64, 0x8e, 0x4e, 0x4b, 0x93, 0x39, 0x36, 0x1e, 0x90, 0x0e, 0x4c, 0x6d, 0x52, 0xcf, 0xb3, 0x77, + 0x5d, 0xaf, 0xc5, 0xf5, 0x97, 0xdc, 0x93, 0xea, 0x5a, 0x3f, 0x7e, 0x1a, 0x01, 0x57, 0xdb, 0x05, + 0x12, 0x66, 0xc5, 0x95, 0x9e, 0x31, 0xfe, 0xac, 0x4f, 0x96, 0x9c, 0x60, 0xa7, 0x5b, 0x3f, 0xa0, + 0xc1, 0xfc, 0xcc, 0xa9, 0x7d, 0x12, 0xe2, 0xf2, 0x3e, 0xd9, 0x91, 0x3f, 0xd5, 0x3e, 0x09, 0x71, + 0x8c, 0xdf, 0xcc, 0xc1, 0x85, 0x1e, 0x5d, 0x40, 0xd6, 0xe4, 0x96, 0x9b, 0xd1, 0xb4, 0xd8, 0x3d, + 0xd0, 0xaf, 0x9f, 0xba, 0x0b, 0xaf, 0x42, 0x61, 0xf9, 0x3e, 0xca, 0xea, 0xfc, 0x21, 0xa7, 0x5c, + 0x92, 0x87, 0x15, 0x6a, 0x5a, 0xe9, 0x01, 0x5a, 0x9e, 0xca, 0x07, 0xa0, 0xba, 0xe6, 0x62, 0x9d, + 0xa0, 0x5c, 0xf8, 0xbe, 0x2c, 0x0c, 0xe1, 0xc1, 0x19, 0x0b, 0x2c, 0x95, 0x39, 0x53, 0x60, 0xa9, + 0x2f, 0xc0, 0xc4, 0xf2, 0x7d, 0x7e, 0x93, 0x5e, 0xb1, 0xfd, 0x7d, 0xb1, 0xad, 0xa3, 0x21, 0x07, + 0x3d, 0xb0, 0xc4, 0xc5, 0x7b, 0xdf, 0xd6, 0x64, 0x56, 0x8d, 0x82, 0x6c, 0xc1, 0x2c, 0xff, 0x36, + 0x67, 0xd7, 0xa9, 0xf3, 0xf8, 0x34, 0x8e, 0xdd, 0x14, 0x7b, 0xfc, 0x8b, 0x27, 0xc7, 0xc5, 0x22, + 0x3d, 0x40, 0x9b, 0x5a, 0x51, 0x6e, 0xf9, 0x88, 0xa0, 0x1a, 0xd7, 0xa6, 0xd0, 0xab, 0x41, 0x33, + 0xcc, 0x31, 0xac, 0x90, 0xd5, 0xc6, 0xea, 0x66, 0xb8, 0x1c, 0xc9, 0xf8, 0xb3, 0x61, 0x58, 0xe8, + 0xbd, 0x3d, 0x93, 0x2f, 0xea, 0x03, 0x78, 0xe5, 0xd4, 0x0d, 0xfd, 0xf4, 0x31, 0xfc, 0x12, 0xcc, + 0x2d, 0xb7, 0x03, 0xea, 0x75, 0x3c, 0x47, 0x86, 0x49, 0x59, 0x71, 0x7d, 0x69, 0xc3, 0x8c, 0xc6, + 0xc4, 0x34, 0x2c, 0x17, 0xba, 0x55, 0xb4, 0xa8, 0x56, 0x58, 0xa5, 0x72, 0x20, 0xcb, 0x30, 0xa5, + 0xc0, 0x9b, 0xdd, 0x3d, 0xf5, 0x75, 0x4a, 0xe5, 0xd9, 0xec, 0xaa, 0x06, 0x9e, 0x31, 0x22, 0xb4, + 0x93, 0x66, 0x57, 0xc6, 0xfa, 0xbd, 0xed, 0xfb, 0x35, 0x31, 0x9c, 0xdc, 0x4e, 0x1a, 0xa1, 0xd6, + 0x07, 0x87, 0x07, 0xda, 0xfe, 0x1a, 0x21, 0x2f, 0xfc, 0x52, 0x4e, 0xcc, 0xa8, 0x17, 0x21, 0x57, + 0xeb, 0xee, 0xa8, 0x6f, 0x6e, 0xbe, 0x76, 0xc0, 0xb1, 0x52, 0xf2, 0x39, 0x00, 0x93, 0x76, 0x5c, + 0xdf, 0x09, 0x5c, 0xef, 0x48, 0x75, 0xd4, 0xf3, 0x42, 0xa8, 0xee, 0x4b, 0x20, 0xa1, 0x64, 0x05, + 0xa6, 0xa3, 0x5f, 0xeb, 0x87, 0x6d, 0xa1, 0x4b, 0x1e, 0xe3, 0xda, 0x95, 0x88, 0xdc, 0x72, 0x59, + 0x99, 0x7a, 0x64, 0xc7, 0xc8, 0xc8, 0x22, 0xe4, 0xb7, 0x5d, 0xef, 0x60, 0x97, 0x8d, 0xf1, 0x50, + 0x24, 0x54, 0x1c, 0x0a, 0x98, 0x7a, 0x78, 0x4a, 0x3c, 0xb6, 0x5c, 0x96, 0xdb, 0x8f, 0x1c, 0xcf, + 0xc5, 0x17, 0x3d, 0xd5, 0xa6, 0x85, 0x46, 0x60, 0xcd, 0x45, 0x3a, 0x02, 0x93, 0x6b, 0x30, 0x5c, + 0xaa, 0x07, 0xae, 0x27, 0x0c, 0x5a, 0xf8, 0x4c, 0x61, 0x00, 0x6d, 0xa6, 0x30, 0x00, 0xeb, 0x44, + 0x93, 0xee, 0x8a, 0xd7, 0x1d, 0xec, 0x44, 0x8f, 0xee, 0x6a, 0xfe, 0xdf, 0x74, 0x97, 0x09, 0x45, + 0x26, 0xdd, 0x45, 0xc5, 0x87, 0x16, 0x36, 0x6d, 0x37, 0xa1, 0x32, 0x13, 0x68, 0xc6, 0xef, 0x8f, + 0xf5, 0x9c, 0xf2, 0xec, 0x14, 0x3a, 0xdb, 0x94, 0x5f, 0xb5, 0x07, 0x98, 0xf2, 0xaf, 0x85, 0x1e, + 0x0a, 0x6a, 0xd0, 0x03, 0x84, 0xa8, 0xc7, 0x20, 0xc7, 0x59, 0xf8, 0xe5, 0xfc, 0x59, 0x26, 0x91, + 0xe8, 0xa4, 0xec, 0xa0, 0x9d, 0x94, 0x1b, 0xa8, 0x93, 0xc8, 0x12, 0x4c, 0x86, 0x81, 0xf7, 0x36, + 0xec, 0x40, 0xdb, 0xd6, 0xc2, 0x68, 0x89, 0x56, 0xc7, 0x0e, 0xd4, 0x6d, 0x4d, 0x27, 0x21, 0x6f, + 0xc3, 0xb8, 0x70, 0xd3, 0x41, 0x0e, 0xc3, 0x91, 0xa5, 0x90, 0xf4, 0xe9, 0x89, 0xd1, 0xab, 0xe8, + 0x6c, 0x35, 0x6f, 0x38, 0x1d, 0xda, 0x74, 0xda, 0xb4, 0x86, 0x8f, 0x15, 0x62, 0xc6, 0xf0, 0x47, + 0x5b, 0x51, 0x62, 0xf1, 0x77, 0x0c, 0x4d, 0x7f, 0xa8, 0x11, 0xc5, 0x27, 0xeb, 0xe8, 0x99, 0x26, + 0x2b, 0xb7, 0x53, 0xf4, 0x56, 0xdd, 0x3d, 0x47, 0x5a, 0x66, 0x4b, 0x3b, 0x45, 0xcf, 0x6a, 0x32, + 0x68, 0xcc, 0x4e, 0x91, 0xa3, 0xb2, 0x1b, 0x0e, 0xfb, 0x51, 0xad, 0x88, 0x97, 0x44, 0xbc, 0xe1, + 0x20, 0x91, 0x6e, 0x0e, 0xcf, 0x91, 0x64, 0x35, 0xcb, 0x2d, 0xdb, 0x69, 0x0a, 0xdf, 0xf6, 0xa8, + 0x1a, 0xca, 0xa0, 0xf1, 0x6a, 0x10, 0x95, 0xd4, 0x61, 0xc2, 0xa4, 0xbb, 0x1b, 0x9e, 0x1b, 0xd0, + 0x7a, 0x40, 0x1b, 0x42, 0xaa, 0x93, 0x17, 0x9b, 0x25, 0xd7, 0xe5, 0x12, 0xeb, 0xd2, 0xeb, 0xbf, + 0x7f, 0x5c, 0xcc, 0x7c, 0xfb, 0xb8, 0x08, 0x0c, 0xc4, 0x7d, 0x2d, 0x4e, 0x8e, 0x8b, 0x17, 0xd8, + 0xf8, 0x77, 0x24, 0xb1, 0x7a, 0x3a, 0xa9, 0x4c, 0xc9, 0x37, 0xd9, 0x7e, 0x1d, 0x76, 0x49, 0x54, + 0xd9, 0x44, 0x8f, 0xca, 0xde, 0x48, 0xad, 0xac, 0xa8, 0xf4, 0x76, 0x6a, 0xa5, 0xa9, 0x95, 0x90, + 0x77, 0x60, 0xbc, 0x5c, 0x2d, 0xbb, 0xed, 0x5d, 0x67, 0xaf, 0xb6, 0x52, 0x42, 0xd1, 0x50, 0xf8, + 0xd9, 0xd4, 0x1d, 0xab, 0x8e, 0x70, 0xcb, 0xdf, 0xb7, 0x35, 0x77, 0xcb, 0x08, 0x9f, 0xdc, 0x85, + 0x29, 0xf9, 0xd3, 0xa4, 0xbb, 0x5b, 0x66, 0x15, 0x25, 0x42, 0xe9, 0xdc, 0x14, 0x72, 0x60, 0x1d, + 0xd1, 0xf5, 0xd4, 0x9b, 0x42, 0x8c, 0x8c, 0x4d, 0xc6, 0x0a, 0xed, 0x34, 0xdd, 0x23, 0xf6, 0x79, + 0x9b, 0x0e, 0xf5, 0x50, 0x06, 0x14, 0x93, 0xb1, 0x11, 0x96, 0x58, 0x81, 0xa3, 0xbf, 0x9f, 0xea, + 0x44, 0x64, 0x0d, 0x66, 0xc4, 0x14, 0x7f, 0xe8, 0xf8, 0xce, 0x8e, 0xd3, 0x74, 0x82, 0x23, 0x94, + 0xfe, 0x84, 0x00, 0x23, 0xd7, 0xc5, 0xa3, 0xb0, 0x54, 0x61, 0x96, 0x24, 0x35, 0x7e, 0x2d, 0x0b, + 0xcf, 0xf5, 0xbb, 0x09, 0x91, 0x9a, 0xbe, 0x99, 0x5d, 0x1d, 0xe0, 0xf6, 0x74, 0xfa, 0x76, 0xb6, + 0x0c, 0x53, 0xeb, 0x8a, 0x49, 0x5f, 0x68, 0x62, 0x89, 0x9d, 0xa1, 0x1a, 0xfb, 0xe9, 0xb3, 0x3d, + 0x46, 0xb4, 0xf0, 0x48, 0x6c, 0x73, 0x1f, 0xd6, 0xf1, 0xef, 0x36, 0x8c, 0x95, 0xdd, 0x76, 0x40, + 0x1f, 0x07, 0x31, 0x37, 0x77, 0x0e, 0x8c, 0x3b, 0x3d, 0x4a, 0x54, 0xe3, 0xdf, 0x64, 0xe1, 0xf9, + 0xbe, 0x57, 0x01, 0xb2, 0xa9, 0xf7, 0xda, 0xb5, 0x41, 0xee, 0x0f, 0xa7, 0x77, 0xdb, 0x62, 0xc2, + 0xee, 0xee, 0x54, 0xbf, 0x9a, 0x85, 0xff, 0x21, 0x23, 0x3a, 0xe9, 0xd3, 0x30, 0x8a, 0x55, 0x85, + 0x5d, 0xc4, 0xb5, 0x64, 0xb8, 0x0b, 0x3b, 0xba, 0x96, 0x8c, 0xa3, 0x91, 0x5b, 0x90, 0x2f, 0xdb, + 0xcd, 0xa6, 0x12, 0x04, 0x00, 0xa5, 0xf9, 0x3a, 0xc2, 0x62, 0xc6, 0xa3, 0x12, 0x91, 0xc9, 0x3e, + 0xfc, 0x6f, 0xe5, 0xac, 0xc0, 0xcd, 0x52, 0x90, 0xc5, 0x8e, 0x0b, 0x05, 0x19, 0x43, 0x87, 0xd6, + 0xdd, 0xd0, 0xcd, 0x98, 0x87, 0x0e, 0x65, 0x00, 0x2d, 0x74, 0x28, 0x03, 0x18, 0xbf, 0x9e, 0x83, + 0x4b, 0xfd, 0xef, 0xb3, 0x64, 0x4b, 0x1f, 0x82, 0x57, 0x07, 0xba, 0x05, 0x9f, 0x3e, 0x06, 0x32, + 0x10, 0x2f, 0xef, 0x90, 0xab, 0x49, 0xf7, 0x97, 0xef, 0x1c, 0x17, 0x15, 0x8b, 0xe4, 0x7b, 0xae, + 0xd3, 0x56, 0xde, 0x4c, 0xbe, 0xa1, 0x49, 0x86, 0xfc, 0xf5, 0xfe, 0xf6, 0x60, 0x5f, 0x16, 0xd1, + 0xf1, 0x7d, 0x65, 0x50, 0x89, 0xf2, 0xf3, 0x50, 0x88, 0x93, 0x92, 0x2b, 0x30, 0x84, 0x1f, 0xa0, + 0xf8, 0xf0, 0xc4, 0x38, 0x60, 0xf9, 0xc2, 0x03, 0x31, 0x77, 0x30, 0x2e, 0x02, 0xda, 0x03, 0xe8, + 0xba, 0x41, 0x11, 0x17, 0x81, 0x9b, 0x13, 0x24, 0xf5, 0x83, 0x31, 0x22, 0xe3, 0x2f, 0x32, 0x70, + 0xb1, 0xa7, 0xa6, 0x80, 0x6c, 0xe8, 0x03, 0xf6, 0xf2, 0x69, 0xaa, 0x85, 0x53, 0xc7, 0x6a, 0xe1, + 0x47, 0xe5, 0xdc, 0x7f, 0x17, 0x26, 0x6a, 0xdd, 0x9d, 0xf8, 0xfd, 0x8c, 0x47, 0x2d, 0x51, 0xe0, + 0xea, 0x09, 0xa6, 0xe2, 0xb3, 0xf6, 0x4b, 0x83, 0x07, 0x61, 0x00, 0xa4, 0x58, 0x1d, 0x86, 0x8e, + 0xbb, 0xc9, 0xb8, 0x10, 0x3a, 0x91, 0xf1, 0xab, 0xd9, 0xf4, 0x8b, 0xee, 0xdd, 0xf2, 0xc6, 0x59, + 0x2e, 0xba, 0x77, 0xcb, 0x1b, 0xa7, 0xb7, 0xfd, 0xbf, 0x91, 0x6d, 0xc7, 0x87, 0x59, 0xb1, 0xe3, + 0x49, 0x45, 0xa7, 0x78, 0x98, 0x95, 0xbb, 0xa3, 0xaf, 0x3f, 0xcc, 0x4a, 0x64, 0xf2, 0x06, 0x8c, + 0xad, 0xba, 0x3c, 0x64, 0x83, 0x6c, 0x31, 0xf7, 0x6c, 0x95, 0x40, 0x75, 0x7b, 0x0c, 0x31, 0xd9, + 0xdd, 0x42, 0x1f, 0x78, 0x69, 0x5c, 0x89, 0x77, 0x8b, 0xd8, 0x74, 0xd1, 0xd5, 0x81, 0x3a, 0x99, + 0xf1, 0x9f, 0x0c, 0x83, 0x71, 0xba, 0x32, 0x83, 0xbc, 0xaf, 0xf7, 0xdd, 0xf5, 0x81, 0xd5, 0x20, + 0x03, 0x6d, 0xb9, 0xa5, 0x6e, 0xc3, 0xa1, 0xed, 0xba, 0x1e, 0x6f, 0x41, 0xc0, 0xd4, 0x2d, 0x50, + 0xe2, 0x7d, 0x18, 0xf7, 0xc7, 0x85, 0xff, 0x2e, 0x17, 0x2d, 0xb5, 0xd8, 0xd1, 0x98, 0xf9, 0x10, + 0x47, 0x23, 0xb9, 0x0f, 0x05, 0x15, 0xa2, 0xbc, 0xd0, 0xa2, 0xe4, 0xa2, 0x31, 0x8a, 0x7d, 0x54, + 0x82, 0x50, 0x3f, 0x5f, 0x73, 0x83, 0x9f, 0xaf, 0x91, 0xf8, 0x8e, 0xf5, 0x0f, 0x25, 0xc5, 0xf7, + 0xb8, 0x8b, 0xb3, 0x82, 0x2e, 0xe3, 0x33, 0xf8, 0xe2, 0xd0, 0x1a, 0xd6, 0xe3, 0x33, 0xa4, 0x1c, + 0x5c, 0x2a, 0xba, 0x0c, 0x31, 0x81, 0x3f, 0x15, 0x0f, 0xeb, 0x30, 0xc4, 0x04, 0xa7, 0x4f, 0x0b, + 0x31, 0x11, 0x92, 0xb0, 0x03, 0xd0, 0xec, 0xb6, 0x79, 0x8c, 0xea, 0xd1, 0xe8, 0x00, 0xf4, 0xba, + 0x6d, 0x2b, 0x1e, 0xa7, 0x3a, 0x44, 0x34, 0xfe, 0xc9, 0x50, 0xba, 0x70, 0x10, 0xea, 0xbb, 0xce, + 0x22, 0x1c, 0x84, 0x44, 0x1f, 0xcf, 0x4c, 0xdd, 0x82, 0x59, 0x69, 0x9f, 0x27, 0x0d, 0xbd, 0xb6, + 0xcc, 0x55, 0x31, 0xc4, 0xa8, 0x37, 0x0a, 0x2d, 0xfb, 0xa4, 0xb1, 0x98, 0xd5, 0xf5, 0x34, 0xbd, + 0x51, 0x0a, 0xfd, 0xc2, 0x6f, 0x48, 0xb5, 0x98, 0x3a, 0x08, 0x5b, 0x5b, 0xe1, 0x5c, 0x8e, 0x0d, + 0x42, 0xb7, 0xab, 0x0d, 0xa3, 0x4e, 0xc2, 0xf7, 0x5e, 0xa9, 0x72, 0x40, 0x26, 0x8a, 0xac, 0xa8, + 0x28, 0x2a, 0x62, 0x5c, 0x62, 0x44, 0x64, 0x0f, 0x2e, 0x46, 0xa2, 0xb4, 0x72, 0x53, 0x40, 0x8e, + 0xbc, 0xc1, 0xd7, 0x4e, 0x8e, 0x8b, 0x2f, 0x2b, 0xa2, 0xb8, 0x7a, 0xe1, 0x88, 0x71, 0xef, 0xcd, + 0x8b, 0xed, 0xb7, 0x4b, 0x9e, 0xdd, 0xae, 0xef, 0x2b, 0x73, 0x1e, 0xf7, 0xdb, 0x1d, 0x84, 0x26, + 0x9c, 0xe4, 0x23, 0x64, 0xe3, 0x47, 0xb3, 0x30, 0xc5, 0xcf, 0x6a, 0xfe, 0x3a, 0xf7, 0xd4, 0xbe, + 0x7c, 0xbe, 0xa5, 0xbd, 0x7c, 0xca, 0x78, 0x6e, 0x6a, 0xd3, 0x06, 0x7a, 0xf7, 0xdc, 0x07, 0x92, + 0xa4, 0x21, 0x26, 0x4c, 0xa8, 0xd0, 0xfe, 0x4f, 0x9e, 0x37, 0xa3, 0xd0, 0x7f, 0x42, 0x54, 0xc2, + 0x77, 0x67, 0xdf, 0xd4, 0x78, 0x18, 0x3f, 0x92, 0x85, 0x49, 0xc5, 0x4e, 0xe5, 0xa9, 0xed, 0xf8, + 0xcf, 0x6b, 0x1d, 0x3f, 0x1f, 0x7a, 0x08, 0x86, 0x2d, 0x1b, 0xa8, 0xdf, 0xbb, 0x30, 0x93, 0x20, + 0x89, 0x9b, 0xfb, 0x64, 0x06, 0x31, 0xf7, 0x79, 0x2d, 0x19, 0x47, 0x8c, 0x87, 0xe3, 0x0f, 0xa3, + 0xca, 0xa8, 0x81, 0xcb, 0x7e, 0x3c, 0x0b, 0x73, 0xe2, 0x17, 0x06, 0xde, 0xe4, 0xc2, 0xea, 0x53, + 0x3b, 0x16, 0x25, 0x6d, 0x2c, 0x8a, 0xfa, 0x58, 0x28, 0x0d, 0xec, 0x3d, 0x24, 0xc6, 0x0f, 0x02, + 0xcc, 0xf7, 0x22, 0x18, 0xd8, 0x11, 0x3f, 0x72, 0x4d, 0xcc, 0x0e, 0xe0, 0x9a, 0xb8, 0x0a, 0x05, + 0xac, 0x4a, 0x84, 0xd6, 0xf3, 0xb7, 0xcc, 0xaa, 0xe8, 0x24, 0xd4, 0x2f, 0xf0, 0xe8, 0xa8, 0x22, + 0xd4, 0x9f, 0x1f, 0xd3, 0x79, 0x24, 0x28, 0xc9, 0x2f, 0x65, 0x60, 0x0a, 0x81, 0xcb, 0x8f, 0x68, + 0x3b, 0x40, 0x66, 0x43, 0xc2, 0x67, 0x2d, 0x7c, 0x18, 0xad, 0x05, 0x9e, 0xd3, 0xde, 0x13, 0x2f, + 0xa3, 0x3b, 0xe2, 0x65, 0xf4, 0x6d, 0xfe, 0xa2, 0x7b, 0xbd, 0xee, 0xb6, 0x6e, 0xec, 0x79, 0xf6, + 0x23, 0x87, 0x9b, 0x60, 0xd9, 0xcd, 0x1b, 0x51, 0x16, 0x99, 0x8e, 0x13, 0xcb, 0xef, 0x22, 0x58, + 0xe1, 0xab, 0x33, 0xff, 0x50, 0x8a, 0xd5, 0xc6, 0x55, 0x33, 0xfa, 0x17, 0x91, 0xef, 0x82, 0x0b, + 0x3c, 0xe0, 0x15, 0xbb, 0xe1, 0x3b, 0xed, 0xae, 0xdb, 0xf5, 0x97, 0xec, 0xfa, 0x01, 0x13, 0xf3, + 0xb9, 0x67, 0x31, 0xb6, 0xbc, 0x1e, 0x16, 0x5a, 0x3b, 0xbc, 0x54, 0x8b, 0xa4, 0x90, 0xce, 0x80, + 0xac, 0xc0, 0x0c, 0x2f, 0x2a, 0x75, 0x03, 0xb7, 0x56, 0xb7, 0x9b, 0x4e, 0x7b, 0x0f, 0x65, 0x89, + 0x3c, 0x17, 0x65, 0xec, 0x6e, 0xe0, 0x5a, 0x3e, 0x87, 0xab, 0x9a, 0x9a, 0x04, 0x11, 0xa9, 0xc2, + 0xb4, 0x49, 0xed, 0xc6, 0x03, 0xfb, 0x71, 0xd9, 0xee, 0xd8, 0x75, 0x27, 0xe0, 0x11, 0x38, 0x73, + 0x5c, 0xa0, 0xf3, 0xa8, 0xdd, 0xb0, 0x5a, 0xf6, 0x63, 0xab, 0x2e, 0x0a, 0x75, 0x95, 0xbd, 0x46, + 0x17, 0xb2, 0x72, 0xda, 0x21, 0xab, 0xb1, 0x38, 0x2b, 0xa7, 0xdd, 0x9b, 0x55, 0x44, 0x27, 0x59, + 0x6d, 0xda, 0xde, 0x1e, 0x0d, 0xb8, 0xa1, 0x34, 0x5c, 0xce, 0x5c, 0xcd, 0x28, 0xac, 0x02, 0x2c, + 0xb3, 0xd0, 0x68, 0x3a, 0xce, 0x4a, 0xa1, 0x63, 0x33, 0x6f, 0xdb, 0x73, 0x02, 0xaa, 0xb6, 0x70, + 0x1c, 0x3f, 0x0b, 0xfb, 0x1f, 0x4d, 0xcc, 0x7b, 0x35, 0x31, 0x41, 0x19, 0x71, 0x53, 0x1a, 0x39, + 0x91, 0xe0, 0x96, 0xde, 0xca, 0x04, 0x65, 0xc8, 0x4d, 0x6d, 0xe7, 0x24, 0xb6, 0x53, 0xe1, 0xd6, + 0xa3, 0xa1, 0x09, 0x4a, 0xb2, 0xc6, 0x3a, 0x2d, 0x60, 0x72, 0x93, 0xdb, 0x16, 0x16, 0xdc, 0x53, + 0xf8, 0x69, 0x2f, 0x09, 0x33, 0xc4, 0x82, 0x27, 0x8b, 0xad, 0x14, 0x7b, 0xee, 0x38, 0x31, 0xf9, + 0x1b, 0x30, 0xbd, 0xe5, 0xd3, 0x3b, 0xd5, 0x8d, 0x9a, 0x8c, 0x8f, 0x85, 0xca, 0xc5, 0xa9, 0xc5, + 0x9b, 0xa7, 0x6c, 0x3a, 0xd7, 0x55, 0x1a, 0x4c, 0xca, 0xc2, 0xc7, 0xad, 0xeb, 0x53, 0x6b, 0xd7, + 0xe9, 0xf8, 0x61, 0xb0, 0x41, 0x75, 0xdc, 0x62, 0x55, 0x19, 0x2b, 0x30, 0x93, 0x60, 0x43, 0xa6, + 0x00, 0x18, 0xd0, 0xda, 0x5a, 0xab, 0x2d, 0x6f, 0x16, 0x9e, 0x21, 0x05, 0x98, 0xc0, 0xdf, 0xcb, + 0x6b, 0xa5, 0xa5, 0xd5, 0xe5, 0x4a, 0x21, 0x43, 0x66, 0x60, 0x12, 0x21, 0x95, 0x6a, 0x8d, 0x83, + 0xb2, 0x3c, 0x24, 0xbf, 0x59, 0xe0, 0x4b, 0x37, 0x60, 0x0b, 0x00, 0xcf, 0x14, 0xe3, 0xef, 0x66, + 0xe1, 0xa2, 0x3c, 0x56, 0x68, 0xc0, 0x04, 0x47, 0xa7, 0xbd, 0xf7, 0x94, 0x9f, 0x0e, 0x77, 0xb4, + 0xd3, 0xe1, 0xa5, 0xd8, 0x49, 0x1d, 0x6b, 0x65, 0x9f, 0x23, 0xe2, 0xb7, 0xc7, 0xe0, 0xf9, 0xbe, + 0x54, 0xe4, 0x8b, 0xec, 0x34, 0x77, 0x68, 0x3b, 0xa8, 0x36, 0x9a, 0x74, 0xd3, 0x69, 0x51, 0xb7, + 0x1b, 0x08, 0x8f, 0x81, 0x17, 0x51, 0x9f, 0x87, 0x85, 0x96, 0xd3, 0x68, 0x52, 0x2b, 0xe0, 0xc5, + 0xda, 0x74, 0x4b, 0x52, 0x33, 0x96, 0x61, 0x82, 0xa8, 0x6a, 0x3b, 0xa0, 0xde, 0x23, 0xb4, 0x4a, + 0x0c, 0x59, 0x1e, 0x50, 0xda, 0xb1, 0x6c, 0x56, 0x6a, 0x39, 0xa2, 0x58, 0x67, 0x99, 0xa0, 0x26, + 0x77, 0x14, 0x96, 0x65, 0x76, 0xfb, 0x7f, 0x60, 0x3f, 0x16, 0x66, 0x52, 0x22, 0xde, 0x6a, 0xc8, + 0x92, 0xbb, 0xf3, 0xb5, 0xec, 0xc7, 0x66, 0x92, 0x84, 0x7c, 0x15, 0xce, 0x89, 0x03, 0x48, 0x04, + 0x6f, 0x91, 0x2d, 0xe6, 0xa1, 0x61, 0x5e, 0x39, 0x39, 0x2e, 0x5e, 0x90, 0x91, 0x6a, 0x65, 0xb8, + 0x9e, 0xb4, 0x56, 0xa7, 0x73, 0x21, 0x9b, 0xec, 0x40, 0x8e, 0x75, 0xc7, 0x03, 0xea, 0xfb, 0xd2, + 0x67, 0x53, 0xdc, 0x8c, 0xd5, 0xce, 0xb4, 0x5a, 0xbc, 0xdc, 0xec, 0x49, 0x49, 0x56, 0x60, 0x6a, + 0x9b, 0xee, 0xa8, 0xe3, 0x33, 0x12, 0x6e, 0x55, 0x85, 0x43, 0xba, 0xd3, 0x7b, 0x70, 0x62, 0x74, + 0xc4, 0xc1, 0xf7, 0x81, 0xc7, 0x47, 0xab, 0x8e, 0x1f, 0xd0, 0x36, 0xf5, 0x30, 0x28, 0xd8, 0x28, + 0x6e, 0x06, 0xf3, 0x91, 0x84, 0xac, 0x97, 0x2f, 0xbd, 0x70, 0x72, 0x5c, 0x7c, 0x9e, 0x3b, 0x3f, + 0x37, 0x05, 0xdc, 0x8a, 0xa5, 0x57, 0x4a, 0x72, 0x25, 0x5f, 0x87, 0x69, 0xd3, 0xed, 0x06, 0x4e, + 0x7b, 0xaf, 0x16, 0x78, 0x76, 0x40, 0xf7, 0xf8, 0x81, 0x14, 0x45, 0x1f, 0x8b, 0x95, 0x8a, 0xa7, + 0x65, 0x0e, 0xb4, 0x7c, 0x01, 0xd5, 0x4e, 0x04, 0x9d, 0x80, 0x7c, 0x0d, 0xa6, 0x78, 0xd8, 0x8e, + 0xb0, 0x82, 0x31, 0x2d, 0x35, 0x84, 0x5e, 0xf8, 0xf0, 0xa6, 0xb0, 0x6a, 0x41, 0x68, 0x5a, 0x05, + 0x31, 0x6e, 0xe4, 0xcb, 0xa2, 0xb3, 0x36, 0x9c, 0xf6, 0x5e, 0x38, 0x8d, 0x01, 0x7b, 0xfe, 0xf5, + 0xa8, 0x4b, 0x3a, 0xec, 0x73, 0xe5, 0x34, 0xee, 0x61, 0xa2, 0x97, 0xe4, 0x43, 0x02, 0x78, 0xbe, + 0xe4, 0xfb, 0x8e, 0x1f, 0x08, 0xbf, 0x9a, 0xe5, 0xc7, 0xb4, 0xde, 0x65, 0xc8, 0xec, 0x7a, 0x4b, + 0x3d, 0x6e, 0xd7, 0x3d, 0xbc, 0x74, 0xfd, 0xe4, 0xb8, 0xf8, 0xaa, 0x8d, 0x88, 0x96, 0x70, 0xc5, + 0xb1, 0xa8, 0x44, 0xb5, 0x0e, 0x39, 0xae, 0xd2, 0x86, 0xfe, 0x4c, 0xc9, 0xd7, 0xe0, 0x7c, 0xd9, + 0xf6, 0x69, 0xb5, 0xed, 0xd3, 0xb6, 0xef, 0x04, 0xce, 0x23, 0x2a, 0x3a, 0x15, 0x0f, 0xbf, 0x3c, + 0x26, 0xa2, 0x32, 0xea, 0xb6, 0xcf, 0x16, 0x66, 0x88, 0x62, 0x89, 0x41, 0x51, 0xaa, 0xe9, 0xc1, + 0x85, 0x98, 0x30, 0x55, 0xab, 0xad, 0x54, 0x1c, 0x3b, 0x5c, 0x57, 0x93, 0xd8, 0x5f, 0xaf, 0xa2, + 0x6a, 0xcf, 0xdf, 0xb7, 0x1a, 0x8e, 0x1d, 0x2e, 0xa8, 0x1e, 0x9d, 0x15, 0xe3, 0x60, 0x1c, 0x67, + 0xa0, 0x10, 0x1f, 0x4a, 0xf2, 0x25, 0x18, 0xe3, 0xf6, 0x6d, 0xd4, 0xdf, 0x17, 0x91, 0x27, 0xa4, + 0xb9, 0x54, 0x08, 0xd7, 0x89, 0x84, 0x3b, 0x1d, 0xb7, 0x9e, 0xa3, 0xaa, 0xb5, 0x0c, 0xba, 0xd3, + 0x49, 0x22, 0xd2, 0x80, 0x09, 0x3e, 0x5a, 0x14, 0x43, 0x0f, 0x0a, 0x33, 0xe7, 0x17, 0xd4, 0xd5, + 0x21, 0x8a, 0x62, 0xfc, 0xf1, 0xd5, 0x50, 0xcc, 0x09, 0x8e, 0xa0, 0x55, 0xa1, 0x71, 0x5d, 0x02, + 0xc8, 0x4b, 0x42, 0xe3, 0x22, 0x5c, 0xe8, 0xf1, 0xcd, 0xc6, 0x23, 0xb4, 0x24, 0xe8, 0x51, 0x23, + 0xf9, 0x12, 0xcc, 0x21, 0x61, 0xd9, 0x6d, 0xb7, 0x69, 0x3d, 0xc0, 0xed, 0x48, 0x6a, 0xdf, 0x73, + 0xdc, 0xd2, 0x85, 0xb7, 0xb7, 0x1e, 0x22, 0x58, 0x71, 0x25, 0x7c, 0x2a, 0x07, 0xe3, 0x67, 0xb3, + 0x30, 0x2f, 0x76, 0x38, 0x93, 0xd6, 0x5d, 0xaf, 0xf1, 0xf4, 0x9f, 0xa8, 0xcb, 0xda, 0x89, 0xfa, + 0x62, 0x18, 0xb6, 0x28, 0xad, 0x91, 0x7d, 0x0e, 0xd4, 0x5f, 0xcd, 0xc0, 0x73, 0xfd, 0x88, 0x58, + 0xef, 0x84, 0xa1, 0x16, 0xc7, 0x12, 0x21, 0x15, 0x3b, 0x30, 0x8b, 0x03, 0x5a, 0xde, 0xa7, 0xf5, + 0x03, 0x7f, 0xc5, 0xf5, 0x03, 0xf4, 0xb4, 0xc8, 0xf6, 0x78, 0xeb, 0x7e, 0x2d, 0xf5, 0xad, 0xfb, + 0x3c, 0x9f, 0x65, 0x75, 0xe4, 0xc1, 0x83, 0x41, 0x1e, 0xd0, 0x23, 0xdf, 0x4c, 0x63, 0x8d, 0x16, + 0xf3, 0xa5, 0x6e, 0xb0, 0xbf, 0xe1, 0xd1, 0x5d, 0xea, 0xd1, 0x76, 0x9d, 0x7e, 0xc2, 0x2c, 0xe6, + 0xf5, 0xc6, 0x0d, 0xa4, 0xc1, 0xf8, 0xdd, 0x49, 0x98, 0x4b, 0x23, 0x63, 0xfd, 0xa2, 0x5c, 0x9a, + 0xe3, 0x79, 0x32, 0xbf, 0x95, 0x81, 0x89, 0x1a, 0xad, 0xbb, 0xed, 0xc6, 0x1d, 0xb4, 0x28, 0x12, + 0xbd, 0x63, 0x73, 0xa1, 0x81, 0xc1, 0xad, 0xdd, 0x98, 0xa9, 0xd1, 0x77, 0x8e, 0x8b, 0x5f, 0x18, + 0xec, 0xae, 0x5a, 0x77, 0x31, 0x5c, 0x50, 0x80, 0x79, 0x1c, 0xc2, 0x2a, 0xf8, 0xd7, 0x98, 0x5a, + 0xb5, 0x64, 0x09, 0x26, 0xc5, 0x82, 0x75, 0xd5, 0x58, 0x9b, 0x3c, 0xb6, 0x93, 0x2c, 0x48, 0x28, + 0xaf, 0x35, 0x12, 0x72, 0x0b, 0x72, 0x5b, 0x8b, 0x77, 0xc4, 0x28, 0xc8, 0x5c, 0x18, 0x5b, 0x8b, + 0x77, 0x50, 0x21, 0xc6, 0x2e, 0x19, 0x93, 0xdd, 0x45, 0xcd, 0xcc, 0x67, 0x6b, 0xf1, 0x0e, 0xf9, + 0x9b, 0x70, 0xae, 0xe2, 0xf8, 0xa2, 0x0a, 0xee, 0xbd, 0xd1, 0x40, 0x9f, 0xc5, 0x91, 0x1e, 0xf3, + 0xf7, 0xb3, 0xa9, 0xf3, 0xf7, 0x85, 0x46, 0xc8, 0xc4, 0xe2, 0xae, 0x21, 0x8d, 0x78, 0x4c, 0xd1, + 0xf4, 0x7a, 0xc8, 0x07, 0x30, 0x85, 0xea, 0x6c, 0x74, 0x68, 0xc1, 0x68, 0xf0, 0xa3, 0x3d, 0x6a, + 0xfe, 0x74, 0x6a, 0xcd, 0x0b, 0x3c, 0xe2, 0x06, 0xba, 0xc5, 0x60, 0xe4, 0x78, 0xed, 0xde, 0xaf, + 0x71, 0x26, 0xf7, 0x60, 0x5a, 0x08, 0x60, 0xeb, 0xbb, 0x9b, 0xfb, 0xb4, 0x62, 0x1f, 0x09, 0x0b, + 0x1d, 0xbc, 0xd3, 0x09, 0xa9, 0xcd, 0x72, 0x77, 0xad, 0x60, 0x9f, 0x5a, 0x0d, 0x5b, 0x13, 0x55, + 0x62, 0x84, 0xe4, 0x9b, 0x30, 0xbe, 0xea, 0xd6, 0x99, 0xec, 0x8d, 0x7b, 0x03, 0x37, 0xda, 0x79, + 0x1f, 0x73, 0x31, 0x72, 0x70, 0x4c, 0xa0, 0xfa, 0xce, 0x71, 0xf1, 0xad, 0xb3, 0x4e, 0x1b, 0xa5, + 0x02, 0x53, 0xad, 0x8d, 0x94, 0x21, 0xbf, 0x4d, 0x77, 0x58, 0x6b, 0xe3, 0x79, 0xda, 0x24, 0x58, + 0xd8, 0xe4, 0x89, 0x5f, 0x9a, 0x4d, 0x9e, 0x80, 0x11, 0x0f, 0x66, 0xb0, 0x7f, 0x36, 0x6c, 0xdf, + 0x3f, 0x74, 0xbd, 0x06, 0x26, 0xe4, 0xe8, 0x65, 0x0f, 0xb4, 0x98, 0xda, 0xf9, 0xcf, 0xf1, 0xce, + 0xef, 0x28, 0x1c, 0x54, 0x11, 0x32, 0xc1, 0x9e, 0x7c, 0x1d, 0xa6, 0x44, 0xf4, 0x82, 0x07, 0x77, + 0x4a, 0xb8, 0x12, 0x26, 0x34, 0xcf, 0x4f, 0xbd, 0x90, 0xcb, 0xa9, 0x22, 0x18, 0x82, 0xd4, 0x41, + 0x59, 0xad, 0x5d, 0x5b, 0x57, 0xfb, 0xab, 0x24, 0x64, 0x03, 0xc6, 0x2b, 0x98, 0x2d, 0x18, 0xbd, + 0xd3, 0x84, 0x65, 0x78, 0x98, 0x68, 0x2a, 0x2a, 0xe1, 0xda, 0x18, 0x91, 0x58, 0x18, 0x7d, 0xdd, + 0x74, 0x6b, 0xdd, 0x10, 0x91, 0xdc, 0x86, 0x5c, 0xb5, 0xb2, 0x21, 0x0c, 0xc3, 0x67, 0xc2, 0x18, + 0x21, 0x1b, 0x32, 0x2d, 0x0f, 0x5a, 0xd0, 0x39, 0x0d, 0xcd, 0xac, 0xbc, 0x5a, 0xd9, 0x20, 0xbb, + 0x30, 0x89, 0x1d, 0xb0, 0x42, 0x6d, 0xde, 0xb7, 0xd3, 0x3d, 0xfa, 0xf6, 0x7a, 0x6a, 0xdf, 0xce, + 0xf3, 0xbe, 0xdd, 0x17, 0xd4, 0x5a, 0x9e, 0x11, 0x95, 0x2d, 0x13, 0x6a, 0x45, 0xee, 0x23, 0x99, + 0x1d, 0x63, 0x73, 0x15, 0x2d, 0x84, 0x84, 0x50, 0x2b, 0x53, 0x25, 0x85, 0xe9, 0x3a, 0x7a, 0xfa, + 0x9d, 0x24, 0xf9, 0x90, 0xcf, 0xc3, 0xd0, 0xfa, 0x41, 0x60, 0x0b, 0x13, 0x70, 0xd9, 0x8f, 0x0c, + 0x24, 0x9b, 0x8f, 0x7a, 0x48, 0xf7, 0x40, 0x8b, 0x3a, 0x87, 0x34, 0x6c, 0x28, 0x56, 0x6c, 0xaf, + 0x71, 0x68, 0x7b, 0xe8, 0x22, 0x3c, 0xab, 0xb1, 0x50, 0x4a, 0xf8, 0x50, 0xec, 0x0b, 0x40, 0xcc, + 0x6f, 0x58, 0x65, 0x41, 0xbe, 0x0b, 0x2e, 0xfa, 0xce, 0x5e, 0xdb, 0x0e, 0xba, 0x1e, 0xb5, 0xec, + 0xe6, 0x9e, 0xeb, 0x39, 0xc1, 0x7e, 0xcb, 0xf2, 0xbb, 0x4e, 0x40, 0xe7, 0xe7, 0xb4, 0x4c, 0xc9, + 0x35, 0x89, 0x57, 0x92, 0x68, 0x35, 0x86, 0x65, 0x5e, 0xf0, 0xd3, 0x0b, 0xc8, 0x97, 0x61, 0x52, + 0xdd, 0x92, 0xfd, 0xf9, 0x73, 0x97, 0x73, 0x57, 0xa7, 0xc2, 0xab, 0x47, 0x7c, 0x0b, 0x97, 0x11, + 0x86, 0x95, 0x33, 0xc2, 0xd7, 0x23, 0x0c, 0x2b, 0xbc, 0xc2, 0xdc, 0x83, 0xa4, 0x30, 0x6b, 0xce, + 0x88, 0x19, 0x2b, 0x7a, 0xf9, 0xc1, 0x9d, 0x92, 0x39, 0xba, 0x51, 0x7d, 0x58, 0x6b, 0xba, 0x81, + 0xf1, 0x5f, 0x64, 0x70, 0x13, 0x27, 0xaf, 0x62, 0x28, 0xa9, 0xf0, 0xfd, 0x0c, 0x35, 0xb8, 0x76, + 0x27, 0x16, 0x9e, 0x9e, 0xa3, 0x90, 0xd7, 0x60, 0xe4, 0x8e, 0x5d, 0x97, 0x61, 0x6c, 0x04, 0xf2, + 0x2e, 0x42, 0x54, 0x75, 0x2f, 0xc7, 0x61, 0x12, 0x26, 0x9f, 0xdc, 0xa5, 0x28, 0x09, 0x77, 0xb9, + 0x24, 0x1f, 0xec, 0x51, 0xc2, 0x14, 0x8b, 0x42, 0xc9, 0xd2, 0x1d, 0xb3, 0x8b, 0x4f, 0xe5, 0x60, + 0xfc, 0x59, 0x26, 0xda, 0x95, 0xc8, 0x2b, 0x30, 0x64, 0x6e, 0x84, 0xdf, 0xcf, 0xdd, 0x7e, 0x63, + 0x9f, 0x8f, 0x08, 0xe4, 0xcb, 0x70, 0x4e, 0xe1, 0x93, 0x30, 0xd2, 0x7f, 0x19, 0xbd, 0x52, 0x95, + 0x2f, 0x49, 0xb7, 0xd4, 0x4f, 0xe7, 0x81, 0xe2, 0x74, 0x54, 0x50, 0xa1, 0x6d, 0x87, 0xf3, 0x56, + 0x1a, 0xab, 0xf2, 0x6e, 0x20, 0x42, 0xbc, 0xb1, 0x69, 0x1c, 0xb8, 0x53, 0xaa, 0xf1, 0x5b, 0x19, + 0x6d, 0xb7, 0x09, 0xb3, 0x16, 0x67, 0x4e, 0xc9, 0x5a, 0xfc, 0x26, 0x40, 0xa9, 0x1b, 0xb8, 0xcb, + 0x6d, 0xcf, 0x6d, 0x72, 0x3d, 0x8a, 0xc8, 0xd0, 0x80, 0xda, 0x61, 0x8a, 0x60, 0xcd, 0x77, 0x2e, + 0x44, 0x4e, 0xf5, 0x67, 0xc8, 0x7d, 0x58, 0x7f, 0x06, 0xe3, 0x0f, 0x32, 0xda, 0x1a, 0x65, 0x72, + 0xa2, 0x98, 0x8a, 0xaa, 0xcd, 0x58, 0xc7, 0x79, 0x64, 0xf9, 0x4d, 0x57, 0x0b, 0x58, 0x21, 0xd0, + 0xc8, 0xbf, 0x9b, 0x81, 0xf3, 0xdc, 0x31, 0x60, 0xad, 0xdb, 0xda, 0xa1, 0xde, 0x43, 0xbb, 0xe9, + 0x34, 0xa2, 0x40, 0x7d, 0x91, 0x01, 0xa1, 0x52, 0x4d, 0x3a, 0x3e, 0xbf, 0xaa, 0x72, 0x47, 0x05, + 0xab, 0x8d, 0x85, 0xd6, 0xa3, 0xb0, 0x54, 0xbd, 0xaa, 0xa6, 0xd3, 0x1b, 0xbf, 0x96, 0x81, 0x17, + 0x4e, 0xad, 0x85, 0xdc, 0x80, 0x51, 0x99, 0x1a, 0x23, 0x83, 0x1d, 0x8f, 0x96, 0xb6, 0xc9, 0xb4, + 0x18, 0x12, 0x8b, 0x7c, 0x05, 0xce, 0xa9, 0xac, 0x36, 0x3d, 0xdb, 0x51, 0x13, 0x50, 0xa4, 0x7c, + 0x75, 0xc0, 0x50, 0xe2, 0xd2, 0x5a, 0x3a, 0x13, 0xe3, 0xff, 0xcd, 0x28, 0x79, 0xcc, 0x9f, 0x52, + 0x29, 0xfe, 0xb6, 0x26, 0xc5, 0xcb, 0x30, 0xa5, 0x61, 0xab, 0x58, 0x59, 0xea, 0xcd, 0x6b, 0x5a, + 0xb1, 0x18, 0x47, 0xc0, 0x0f, 0x65, 0x61, 0x7c, 0xcb, 0xa7, 0x1e, 0x7f, 0xca, 0xfd, 0x64, 0x05, + 0x6b, 0x0c, 0xdb, 0x35, 0x50, 0x38, 0xbd, 0x3f, 0xc9, 0xa0, 0x8a, 0x5f, 0xa5, 0x60, 0xbd, 0xa1, + 0xe4, 0x2e, 0xc4, 0xde, 0xc0, 0xac, 0x85, 0x08, 0xe5, 0xc1, 0xc5, 0x56, 0xf5, 0x34, 0xa6, 0x98, + 0xcb, 0x76, 0x95, 0x7c, 0x01, 0x86, 0xb7, 0x50, 0x61, 0xa9, 0x87, 0xd9, 0x08, 0xf9, 0x63, 0x21, + 0xdf, 0xa4, 0xbb, 0xbe, 0x1e, 0x79, 0x8e, 0x13, 0x92, 0x1a, 0x8c, 0x96, 0x3d, 0x8a, 0x59, 0xc9, + 0x87, 0x06, 0x77, 0x12, 0xaf, 0x73, 0x92, 0xb8, 0x93, 0xb8, 0xe0, 0x64, 0xfc, 0x4c, 0x16, 0x48, + 0xd4, 0x46, 0x4c, 0xc1, 0xe5, 0x3f, 0xb5, 0x83, 0xfe, 0x9e, 0x36, 0xe8, 0xcf, 0x27, 0x06, 0x9d, + 0x37, 0x6f, 0xa0, 0xb1, 0xff, 0x9d, 0x0c, 0x9c, 0x4f, 0x27, 0x24, 0x2f, 0xc2, 0xc8, 0xfa, 0xe6, + 0x86, 0x8c, 0xd4, 0x22, 0x9a, 0xe2, 0x76, 0x50, 0x5b, 0x60, 0x8a, 0x22, 0xf2, 0x3a, 0x8c, 0x7c, + 0xd1, 0x2c, 0xb3, 0x73, 0x48, 0x49, 0xf2, 0xf0, 0x0d, 0xcf, 0xaa, 0xeb, 0x47, 0x91, 0x40, 0x52, + 0xc7, 0x36, 0xf7, 0xc4, 0xc6, 0xf6, 0xc7, 0xb3, 0x30, 0x5d, 0xaa, 0xd7, 0xa9, 0xef, 0x33, 0x69, + 0x87, 0xfa, 0xc1, 0x53, 0x3b, 0xb0, 0xe9, 0x31, 0x58, 0xb4, 0xb6, 0x0d, 0x34, 0xaa, 0xbf, 0x97, + 0x81, 0x73, 0x92, 0xea, 0x91, 0x43, 0x0f, 0x37, 0xf7, 0x3d, 0xea, 0xef, 0xbb, 0xcd, 0xc6, 0xc0, + 0x99, 0x64, 0x98, 0xa0, 0x87, 0xe1, 0xe1, 0xd5, 0x77, 0xfd, 0x5d, 0x84, 0x68, 0x82, 0x1e, 0x0f, + 0x21, 0x7f, 0x03, 0x46, 0x4b, 0x9d, 0x8e, 0xe7, 0x3e, 0xe2, 0xcb, 0x5e, 0xc4, 0x96, 0xb4, 0x39, + 0x48, 0xf3, 0xb1, 0xe7, 0x20, 0xf6, 0x19, 0x15, 0xda, 0xe6, 0xc1, 0xfc, 0x26, 0xf9, 0x67, 0x34, + 0x68, 0x5b, 0x95, 0xc5, 0xb1, 0xdc, 0xa8, 0x01, 0xd9, 0xf0, 0xdc, 0x96, 0x1b, 0xd0, 0x06, 0x6f, + 0x0f, 0x86, 0x26, 0x38, 0x35, 0xa8, 0xd6, 0xa6, 0x13, 0x34, 0xb5, 0xa0, 0x5a, 0x01, 0x03, 0x98, + 0x1c, 0x6e, 0xfc, 0xdf, 0xc3, 0x30, 0xa1, 0xf6, 0x0e, 0x31, 0x78, 0x7a, 0x08, 0xd7, 0x53, 0xe3, + 0x63, 0xd8, 0x08, 0x31, 0x45, 0x49, 0x14, 0x5c, 0x26, 0x7b, 0x6a, 0x70, 0x99, 0x6d, 0x98, 0xdc, + 0xf0, 0x5c, 0x0c, 0x82, 0x89, 0xef, 0x95, 0x62, 0x2b, 0x9c, 0x55, 0xee, 0x9d, 0x6c, 0x20, 0xf1, + 0x45, 0x14, 0x25, 0xfb, 0x8e, 0xc0, 0xc6, 0xa4, 0x89, 0x9a, 0xd6, 0x45, 0xe3, 0xc3, 0x8d, 0x2d, + 0x6c, 0x5f, 0x44, 0xb2, 0x0d, 0x8d, 0x2d, 0x18, 0x44, 0x37, 0xb6, 0x60, 0x10, 0x75, 0xad, 0x0d, + 0x3f, 0xa9, 0xb5, 0x46, 0x7e, 0x26, 0x03, 0xe3, 0xa5, 0x76, 0x5b, 0x04, 0xad, 0x39, 0xc5, 0x5f, + 0xff, 0x2b, 0xc2, 0xde, 0xe2, 0xad, 0x0f, 0x65, 0x6f, 0x81, 0x72, 0x8b, 0x8f, 0x92, 0x6a, 0x54, + 0xa1, 0x7a, 0x5b, 0x53, 0xbe, 0x83, 0xbc, 0x05, 0x85, 0x70, 0x92, 0x57, 0xdb, 0x0d, 0xfa, 0x98, + 0xf2, 0xf4, 0x7a, 0x93, 0x22, 0xb2, 0xb6, 0x2a, 0x99, 0xc6, 0x11, 0xc9, 0x26, 0x80, 0x1d, 0xce, + 0xae, 0x58, 0x9e, 0xd0, 0xe4, 0xf4, 0x13, 0xd2, 0x33, 0xfe, 0xc6, 0x27, 0x2d, 0x55, 0x7a, 0x8e, + 0xf8, 0x90, 0x16, 0x4c, 0xf3, 0x24, 0x9d, 0xb5, 0xc0, 0xf6, 0x02, 0x4c, 0x46, 0x01, 0xa7, 0x8e, + 0xc3, 0x2b, 0x42, 0x7f, 0xf6, 0xac, 0x48, 0xfd, 0xe9, 0x33, 0x5a, 0x2b, 0x25, 0x33, 0x45, 0x9c, + 0x37, 0x8f, 0x63, 0x6e, 0x5e, 0x48, 0x7e, 0x2f, 0x9f, 0xf4, 0x3f, 0x9e, 0x81, 0xf3, 0xea, 0xa4, + 0xaf, 0x75, 0x77, 0x44, 0xf0, 0x50, 0x72, 0x1d, 0xc6, 0xc4, 0x9c, 0x0c, 0x2f, 0x51, 0xc9, 0x9c, + 0x1a, 0x11, 0x0a, 0x59, 0x66, 0xd3, 0x90, 0xf1, 0x10, 0x52, 0xf7, 0x6c, 0x6c, 0x9f, 0x62, 0x45, + 0x51, 0x02, 0x68, 0x0f, 0x7f, 0xeb, 0xf3, 0x93, 0x41, 0x8c, 0x77, 0x61, 0x46, 0x1f, 0x89, 0x1a, + 0x0d, 0xc8, 0x35, 0x18, 0x95, 0xc3, 0x97, 0x49, 0x1f, 0x3e, 0x59, 0x6e, 0x6c, 0x03, 0x49, 0xd0, + 0xfb, 0x68, 0x18, 0xc5, 0xee, 0xa7, 0xdc, 0x70, 0x4f, 0x3e, 0x4b, 0x26, 0x10, 0x97, 0x66, 0xc5, + 0xf7, 0x8d, 0x6b, 0x8e, 0x09, 0x18, 0x48, 0xf5, 0x9f, 0x4f, 0xc3, 0x6c, 0xca, 0x9e, 0x7b, 0x8a, + 0x4c, 0x54, 0xd4, 0x37, 0x88, 0xb1, 0x30, 0xdc, 0x87, 0xdc, 0x16, 0xde, 0x85, 0xe1, 0x53, 0xb7, + 0x03, 0xee, 0x96, 0x12, 0xdb, 0x05, 0x38, 0xd9, 0xc7, 0x22, 0x17, 0xa9, 0x11, 0x79, 0x86, 0x9f, + 0x58, 0x44, 0x9e, 0x25, 0x98, 0x14, 0xad, 0x12, 0xdb, 0x95, 0x62, 0x1e, 0xed, 0xf1, 0x02, 0x2b, + 0xb1, 0x6d, 0xe9, 0x24, 0x9c, 0x87, 0xef, 0x36, 0x1f, 0x51, 0xc1, 0x63, 0x54, 0xe5, 0x81, 0x05, + 0xa9, 0x3c, 0x14, 0x12, 0xf2, 0x1f, 0x63, 0x82, 0x40, 0x84, 0xa8, 0x7b, 0x56, 0xbe, 0xdf, 0x9e, + 0xd5, 0x78, 0x32, 0x7b, 0xd6, 0xf3, 0xf2, 0x1b, 0xd3, 0xf7, 0xae, 0x94, 0xcf, 0x22, 0xbf, 0x9c, + 0x81, 0x19, 0x1e, 0x16, 0x46, 0xfd, 0xd8, 0xbe, 0xa1, 0x3e, 0xea, 0x4f, 0xe6, 0x63, 0x9f, 0x13, + 0x89, 0xb1, 0xd2, 0xbf, 0x35, 0xf9, 0x51, 0xe4, 0xbb, 0x00, 0xc2, 0x15, 0xc5, 0x83, 0xc9, 0x8e, + 0x2f, 0x3e, 0x97, 0xb2, 0x0b, 0x84, 0x48, 0x51, 0x12, 0x8f, 0x20, 0xa4, 0xd3, 0xd2, 0x42, 0x86, + 0x50, 0xf2, 0x37, 0x61, 0x8e, 0xad, 0x97, 0x10, 0x22, 0x82, 0x58, 0xcd, 0x8f, 0x63, 0x2d, 0x9f, + 0xe9, 0x2d, 0x13, 0x5d, 0x4f, 0x23, 0xe3, 0xa1, 0x87, 0xa3, 0x0c, 0xdd, 0x81, 0x1a, 0xef, 0x22, + 0xb5, 0x22, 0x8c, 0x0d, 0x87, 0x5f, 0xcf, 0x13, 0x6d, 0xf4, 0xd8, 0xdf, 0x2e, 0xca, 0xb5, 0xc0, + 0xf7, 0x37, 0x5f, 0xf7, 0x52, 0x46, 0x10, 0xf9, 0x22, 0x90, 0x30, 0x9e, 0x0a, 0x87, 0x51, 0x99, + 0x84, 0x83, 0xab, 0x9b, 0xa3, 0xb8, 0x2c, 0x9e, 0x2c, 0x56, 0x27, 0x49, 0x92, 0x98, 0x50, 0x98, + 0x13, 0x8d, 0x66, 0x50, 0x99, 0xbd, 0xcf, 0x9f, 0x9f, 0xd2, 0x42, 0x84, 0x45, 0x25, 0x51, 0x2a, + 0x6f, 0x25, 0x05, 0xa0, 0xa6, 0x72, 0x4a, 0x63, 0x47, 0x6e, 0xc3, 0x18, 0xba, 0x0a, 0xaf, 0x48, + 0x73, 0x2f, 0x61, 0x7a, 0x82, 0x4e, 0xc5, 0xd6, 0xbe, 0x6e, 0xb4, 0x15, 0xa1, 0xb2, 0xeb, 0x40, + 0xc5, 0x3b, 0x32, 0xbb, 0x6d, 0x54, 0x0a, 0x0b, 0x7d, 0x47, 0xc3, 0x3b, 0xb2, 0xbc, 0xae, 0xee, + 0x4b, 0x8e, 0x48, 0xe4, 0xeb, 0x30, 0xfe, 0xc0, 0x7e, 0x2c, 0x75, 0xc2, 0x42, 0xf1, 0xdb, 0x6f, + 0x07, 0x32, 0x64, 0x6b, 0x5a, 0xf6, 0x63, 0xab, 0xd1, 0x8d, 0x07, 0x3e, 0xc6, 0x6d, 0x48, 0x65, + 0x49, 0xbe, 0x0a, 0xa0, 0x68, 0xaa, 0xc9, 0xa9, 0x15, 0xbc, 0x20, 0x03, 0xdf, 0xa5, 0x6a, 0xb0, + 0x91, 0xbf, 0xc2, 0x30, 0x26, 0x39, 0xcc, 0x7d, 0x7c, 0x92, 0xc3, 0xb9, 0x8f, 0x4f, 0x72, 0xe0, + 0x0f, 0x25, 0x7c, 0xec, 0x71, 0x07, 0x3f, 0x9a, 0x3f, 0x7f, 0x6a, 0x6d, 0xcf, 0x49, 0x63, 0x42, + 0x3c, 0x0a, 0x8e, 0x62, 0x55, 0xc4, 0xf8, 0x2d, 0xec, 0xc0, 0xc5, 0x9e, 0x8b, 0x33, 0x25, 0xb0, + 0xf2, 0x0d, 0x3d, 0xb0, 0xf2, 0xc5, 0x5e, 0x87, 0xb8, 0xaf, 0x67, 0x73, 0x99, 0x2d, 0xcc, 0xf5, + 0x96, 0x7f, 0xbe, 0x9d, 0x8d, 0x1d, 0xea, 0xe2, 0xea, 0xc2, 0x33, 0x89, 0xf5, 0x92, 0x7a, 0xb2, + 0x98, 0x3c, 0x9a, 0x1f, 0xfb, 0x4a, 0xec, 0x79, 0x76, 0xec, 0xab, 0x62, 0x03, 0x0a, 0x00, 0x1f, + 0xf5, 0x7c, 0x7f, 0x1b, 0xa6, 0x78, 0xbe, 0xd7, 0xfb, 0xf4, 0xe8, 0xd0, 0xf5, 0x1a, 0x3c, 0x47, + 0x92, 0x90, 0xf2, 0x13, 0xc9, 0xda, 0x63, 0xb8, 0xa4, 0x22, 0xfd, 0x5b, 0x87, 0xb1, 0xf6, 0x8b, + 0xa9, 0xfb, 0x24, 0x43, 0xe8, 0xe7, 0xfa, 0x4a, 0xde, 0x08, 0x45, 0x41, 0xea, 0xa9, 0x39, 0x5d, + 0x3c, 0x09, 0x4c, 0x91, 0x08, 0xa9, 0x67, 0xfc, 0xcb, 0x1c, 0x10, 0x5e, 0x53, 0xd9, 0xee, 0xd8, + 0xe8, 0xfd, 0xed, 0x60, 0x3c, 0xa7, 0x82, 0xc0, 0xb1, 0x77, 0x9a, 0x54, 0x0d, 0x86, 0x26, 0x0c, + 0x78, 0xc3, 0x32, 0x2b, 0x7e, 0x95, 0x4a, 0x10, 0xf6, 0xd8, 0x4c, 0xb3, 0x1f, 0x65, 0x33, 0xfd, + 0x3a, 0x3c, 0x5b, 0xea, 0x60, 0xe2, 0x68, 0x59, 0xcb, 0x1d, 0xd7, 0x93, 0x53, 0x57, 0xf3, 0x2b, + 0xb4, 0x43, 0xb4, 0xc4, 0x97, 0xf6, 0x63, 0xa1, 0x48, 0x42, 0x6c, 0x5e, 0x76, 0x02, 0x35, 0x4e, + 0x85, 0x94, 0x84, 0x3a, 0x58, 0x92, 0x22, 0x09, 0x71, 0x12, 0xc9, 0xc3, 0xf1, 0xa4, 0x24, 0x84, + 0x19, 0xd1, 0x22, 0x1e, 0x8e, 0x47, 0x7b, 0x48, 0x53, 0x21, 0x09, 0x79, 0x1b, 0xc6, 0x4b, 0xdd, + 0xc0, 0x15, 0x8c, 0x85, 0xe5, 0x79, 0x64, 0x23, 0x2e, 0x3e, 0x45, 0xbb, 0x5c, 0x45, 0xe8, 0xc6, + 0x9f, 0xe6, 0xe0, 0x62, 0x72, 0x78, 0x45, 0x69, 0xb8, 0x3e, 0x32, 0xa7, 0xac, 0x8f, 0xb4, 0xd9, + 0x90, 0x8d, 0xb2, 0x59, 0x3c, 0x89, 0xd9, 0xc0, 0xf3, 0x4f, 0x7f, 0xc8, 0xd9, 0x50, 0x83, 0x71, + 0xf5, 0x44, 0x1d, 0xfa, 0xb0, 0x27, 0xaa, 0xca, 0x85, 0x5c, 0x83, 0x61, 0x1e, 0x9e, 0x63, 0x38, + 0x7a, 0x9c, 0x8a, 0x47, 0xe6, 0xe0, 0x18, 0xe4, 0xdf, 0x81, 0xcb, 0x7c, 0x4f, 0x8a, 0x37, 0x76, + 0xe9, 0x48, 0x72, 0x14, 0x03, 0xb7, 0x78, 0x72, 0x5c, 0xbc, 0xce, 0x95, 0x31, 0x56, 0xa2, 0xdb, + 0xac, 0x9d, 0x23, 0x4b, 0x7e, 0x99, 0x52, 0xc9, 0xa9, 0xbc, 0x8d, 0x32, 0x5c, 0x14, 0xa5, 0x91, + 0x63, 0xb8, 0x2c, 0x64, 0x83, 0x7c, 0x10, 0xe9, 0xd3, 0x70, 0x90, 0x63, 0xaa, 0x32, 0x2c, 0xc7, + 0xcc, 0xd5, 0x4a, 0x56, 0xe1, 0xd7, 0xd3, 0xfc, 0x7a, 0x78, 0x64, 0x70, 0x0e, 0xd6, 0x5d, 0x7a, + 0xa4, 0xd6, 0x2e, 0x9b, 0xaa, 0xb5, 0x93, 0x6a, 0x9f, 0x5c, 0xaa, 0xda, 0xa7, 0x02, 0xd3, 0xb5, + 0xee, 0x8e, 0xac, 0x3b, 0xee, 0x13, 0xea, 0x77, 0x77, 0xd2, 0x7a, 0x25, 0x4e, 0x62, 0xfc, 0x70, + 0x16, 0x26, 0x36, 0x9a, 0xdd, 0x3d, 0xa7, 0x5d, 0xb1, 0x03, 0xfb, 0xa9, 0x55, 0x24, 0xbe, 0xa9, + 0x29, 0x12, 0x43, 0xf7, 0xb5, 0xb0, 0x61, 0x03, 0x69, 0x11, 0x7f, 0x3a, 0x03, 0xd3, 0x11, 0x09, + 0x3f, 0xac, 0x57, 0x60, 0x88, 0xfd, 0x10, 0xd7, 0xeb, 0xcb, 0x09, 0xc6, 0x3c, 0x95, 0x65, 0xf8, + 0x97, 0x50, 0xed, 0xe9, 0x79, 0xe2, 0x90, 0xc3, 0xc2, 0x67, 0x61, 0x2c, 0x62, 0x7b, 0x96, 0x14, + 0x96, 0xbf, 0x9e, 0x81, 0x42, 0xbc, 0x25, 0xe4, 0x3e, 0x8c, 0x32, 0x4e, 0x0e, 0x95, 0x37, 0xff, + 0x97, 0x7a, 0xb4, 0xf9, 0xba, 0x40, 0xe3, 0x9f, 0x87, 0x9d, 0x4f, 0x39, 0xc4, 0x94, 0x1c, 0x16, + 0x4c, 0x98, 0x50, 0xb1, 0x52, 0xbe, 0xee, 0x35, 0x5d, 0x42, 0x39, 0x9f, 0xde, 0x0f, 0x5a, 0xe2, + 0x4d, 0xed, 0xab, 0x85, 0xf0, 0x71, 0x45, 0x9b, 0x5c, 0xa9, 0xab, 0x0a, 0x27, 0xcd, 0x62, 0x94, + 0x13, 0x41, 0x9d, 0x67, 0x29, 0x13, 0x3a, 0xc4, 0x23, 0xaf, 0xc1, 0x08, 0xaf, 0x4f, 0x4d, 0x1a, + 0xd7, 0x41, 0x88, 0x2a, 0x89, 0x73, 0x1c, 0xe3, 0xef, 0xe5, 0xe0, 0x7c, 0xf4, 0x79, 0x5b, 0x9d, + 0x86, 0x1d, 0xd0, 0x0d, 0xdb, 0xb3, 0x5b, 0xfe, 0x29, 0x2b, 0xe0, 0x6a, 0xe2, 0xd3, 0x30, 0x5d, + 0x97, 0xfc, 0x34, 0xe5, 0x83, 0x8c, 0xd8, 0x07, 0xa1, 0x96, 0x95, 0x7f, 0x90, 0xfc, 0x0c, 0x72, + 0x1f, 0x72, 0x35, 0x1a, 0x88, 0xbd, 0xf7, 0x4a, 0xa2, 0x57, 0xd5, 0xef, 0xba, 0x5e, 0xa3, 0x01, + 0x1f, 0x44, 0x1e, 0x7b, 0x4a, 0x0b, 0x00, 0xc8, 0xb8, 0x90, 0x6d, 0x18, 0x59, 0x7e, 0xdc, 0xa1, + 0xf5, 0x40, 0x24, 0x60, 0xbd, 0xd6, 0x9f, 0x1f, 0xc7, 0x55, 0xf2, 0xaf, 0x52, 0x04, 0xa8, 0x9d, + 0xc5, 0x51, 0x16, 0x6e, 0x43, 0x5e, 0x56, 0x7e, 0x96, 0x99, 0xbb, 0xf0, 0x26, 0x8c, 0x2b, 0x95, + 0x9c, 0x69, 0xd2, 0xff, 0x02, 0xdb, 0x57, 0xdd, 0xa6, 0xcc, 0xd9, 0xba, 0x9c, 0x90, 0x15, 0x95, + 0x8c, 0x57, 0x5c, 0x56, 0xb4, 0x0e, 0x44, 0x51, 0x1f, 0xa1, 0xb1, 0x0a, 0xd3, 0xb5, 0x03, 0xa7, + 0x13, 0x05, 0xa3, 0xd5, 0x4e, 0x64, 0xcc, 0xaa, 0x23, 0x54, 0x03, 0xf1, 0x13, 0x39, 0x4e, 0x67, + 0xfc, 0x45, 0x06, 0x46, 0xd8, 0x5f, 0x0f, 0x6f, 0x3f, 0xa5, 0x5b, 0xe6, 0x2d, 0x6d, 0xcb, 0x9c, + 0x51, 0xe2, 0xc1, 0xe3, 0xc6, 0x71, 0xfb, 0x94, 0xcd, 0xf2, 0x58, 0x0c, 0x10, 0x47, 0x26, 0x77, + 0x61, 0x54, 0x18, 0x2d, 0x09, 0xfb, 0x72, 0x35, 0xc0, 0xbc, 0x34, 0x67, 0x0a, 0x75, 0x08, 0x6e, + 0x27, 0xae, 0x74, 0x91, 0xd4, 0x4c, 0xae, 0x97, 0x61, 0x81, 0xb5, 0x4c, 0xdf, 0x2e, 0x3a, 0x04, + 0xf2, 0xf0, 0xe8, 0x4a, 0x6e, 0xfe, 0x1e, 0xfe, 0xfb, 0x25, 0xf1, 0xde, 0x92, 0xeb, 0xc7, 0xe4, + 0xbc, 0x4c, 0x84, 0x9c, 0xfa, 0x14, 0xd3, 0x82, 0xf3, 0xb5, 0xda, 0x0a, 0x1a, 0x38, 0x6e, 0xb8, + 0x5e, 0x70, 0xc7, 0xf5, 0x0e, 0x6d, 0xb4, 0x5f, 0x46, 0x1d, 0xa2, 0x62, 0xe5, 0x90, 0x66, 0x76, + 0xf6, 0x4a, 0xaa, 0xd9, 0x59, 0x1f, 0x4b, 0x08, 0xa3, 0x0d, 0x17, 0x6a, 0xb5, 0x15, 0x1e, 0x9c, + 0xfc, 0x2f, 0xa3, 0xbe, 0x5f, 0xcf, 0xc0, 0x4c, 0xad, 0xb6, 0x12, 0xab, 0x6a, 0x55, 0x46, 0x45, + 0xcf, 0x68, 0x4f, 0xad, 0xe9, 0x1d, 0x81, 0xa3, 0x90, 0xe1, 0x12, 0x5e, 0x5d, 0x0b, 0x80, 0xc9, + 0x99, 0x90, 0x8d, 0x30, 0x0e, 0x7b, 0x56, 0xf3, 0x39, 0xe8, 0xd1, 0x50, 0xd4, 0xa1, 0x0b, 0x8f, + 0x3d, 0x56, 0xaa, 0xeb, 0xd0, 0x19, 0xc4, 0xf8, 0x6f, 0xcf, 0xf3, 0x48, 0xef, 0x72, 0xb6, 0xbc, + 0x03, 0x13, 0x82, 0x1e, 0x0d, 0xf3, 0x85, 0xd5, 0xc9, 0x45, 0xb6, 0x41, 0xee, 0x72, 0x38, 0x8f, + 0x00, 0xfc, 0x9d, 0xe3, 0xe2, 0x10, 0xeb, 0x1a, 0x53, 0x43, 0x27, 0xeb, 0x30, 0xf9, 0xc0, 0x7e, + 0xac, 0x28, 0x4c, 0xb8, 0xdb, 0xd5, 0x35, 0xb6, 0xab, 0xb4, 0xec, 0xc7, 0x03, 0x98, 0xf5, 0xe9, + 0xf4, 0xe4, 0x00, 0xa6, 0xf4, 0x36, 0x89, 0x19, 0x98, 0x1c, 0xb1, 0x9b, 0xa9, 0x23, 0x76, 0xb1, + 0xe3, 0x7a, 0x81, 0xb5, 0x1b, 0x92, 0x6b, 0x59, 0x0d, 0x62, 0xac, 0xc9, 0x3b, 0x30, 0xa3, 0x84, + 0x19, 0xbd, 0xe3, 0x7a, 0x2d, 0x5b, 0x5e, 0xb8, 0xf0, 0x15, 0x01, 0xad, 0x95, 0x76, 0x11, 0x6c, + 0x26, 0x31, 0xc9, 0x97, 0xd3, 0x5c, 0xd9, 0x86, 0x23, 0xdb, 0xc6, 0x14, 0x57, 0xb6, 0x5e, 0xb6, + 0x8d, 0x49, 0xa7, 0xb6, 0xbd, 0x7e, 0xb6, 0xcf, 0x79, 0xde, 0xfa, 0x81, 0x6c, 0x9b, 0xc3, 0x91, + 0xeb, 0x61, 0xe3, 0xbc, 0x08, 0xb9, 0xa5, 0x8d, 0x3b, 0xf8, 0xf6, 0x25, 0xcd, 0xb4, 0xda, 0xfb, + 0x76, 0xbb, 0x8e, 0x17, 0x21, 0xe1, 0x71, 0xa0, 0x1e, 0x94, 0x4b, 0x1b, 0x77, 0x88, 0x0d, 0xb3, + 0x98, 0x4b, 0x2e, 0xf8, 0xd2, 0xcd, 0x9b, 0xca, 0x50, 0xe5, 0xf1, 0xd3, 0x6e, 0x88, 0x4f, 0x2b, + 0x62, 0x26, 0xba, 0xc0, 0x7a, 0x7c, 0xf3, 0x66, 0xea, 0x80, 0x84, 0x1f, 0x96, 0xc6, 0x8b, 0x1d, + 0x58, 0x0f, 0xec, 0xc7, 0x91, 0xa3, 0x88, 0x2f, 0x9c, 0x82, 0x9f, 0x97, 0x53, 0x2b, 0x72, 0x32, + 0xd1, 0x0e, 0x2c, 0x9d, 0x88, 0xdd, 0x63, 0xa3, 0x09, 0xe6, 0x0b, 0x77, 0xaa, 0x05, 0xa9, 0x10, + 0x94, 0x9e, 0xe3, 0xea, 0x65, 0x4c, 0x41, 0x27, 0x5b, 0xe1, 0x6d, 0x9c, 0xdf, 0x66, 0x45, 0xf6, + 0xe5, 0x1b, 0xea, 0x6d, 0x9c, 0xab, 0xe1, 0xb4, 0x66, 0x4d, 0x87, 0x2a, 0x1c, 0xee, 0x39, 0x63, + 0xea, 0x5c, 0x92, 0x97, 0xfc, 0x89, 0xb3, 0x5f, 0xf2, 0x29, 0x0c, 0xad, 0xba, 0xf5, 0x03, 0x11, + 0x00, 0xf0, 0x8b, 0x6c, 0x17, 0x6e, 0xba, 0xf5, 0x83, 0x27, 0x67, 0xd3, 0x8d, 0xec, 0xc9, 0x1a, + 0xfb, 0x54, 0x36, 0x0b, 0x44, 0x9f, 0x08, 0x3b, 0xe1, 0xb9, 0xf0, 0x96, 0xab, 0x94, 0x71, 0x79, + 0x94, 0x4f, 0x1a, 0xd9, 0xb5, 0xa6, 0x4e, 0x4e, 0x28, 0x14, 0x2a, 0xd4, 0x3f, 0x08, 0xdc, 0x4e, + 0xb9, 0xe9, 0x74, 0x76, 0x5c, 0xdb, 0x93, 0xe1, 0xa2, 0x07, 0xde, 0x93, 0x1b, 0x9c, 0xde, 0xaa, + 0x4b, 0x06, 0x66, 0x82, 0x25, 0xf9, 0x32, 0x4c, 0xb1, 0xc9, 0xbd, 0xfc, 0x38, 0xa0, 0x6d, 0x3e, + 0xf2, 0x33, 0x28, 0xd1, 0xcd, 0x29, 0xf9, 0x51, 0xc2, 0x42, 0x3e, 0xa7, 0x70, 0xb1, 0xd3, 0x90, + 0x40, 0x0b, 0x9e, 0xa8, 0xb1, 0x22, 0x0d, 0x98, 0x7f, 0x60, 0x3f, 0x56, 0xf2, 0x3c, 0x2b, 0x93, + 0x94, 0xe0, 0x04, 0xbb, 0x7a, 0x72, 0x5c, 0x7c, 0x89, 0x4d, 0xb0, 0x28, 0x82, 0x79, 0x8f, 0xf9, + 0xda, 0x93, 0x13, 0xf9, 0x26, 0x5c, 0x10, 0xcd, 0xaa, 0x60, 0x6e, 0x32, 0xd7, 0x3b, 0xaa, 0xed, + 0xdb, 0xe8, 0x23, 0x36, 0xdb, 0xa3, 0xc3, 0x6e, 0xa4, 0x6f, 0x89, 0xb2, 0xc3, 0x1a, 0x92, 0x8f, + 0xe5, 0x73, 0x46, 0x66, 0xaf, 0x1a, 0xc8, 0x07, 0x30, 0xc5, 0x1f, 0xfc, 0x56, 0x5c, 0x3f, 0x40, + 0x65, 0xcd, 0xdc, 0xd9, 0x1c, 0x1f, 0xf8, 0x2b, 0x22, 0x77, 0x16, 0x8a, 0x29, 0x77, 0x62, 0x9c, + 0xc9, 0x5b, 0x30, 0xbe, 0xe1, 0xb4, 0x79, 0x78, 0xd3, 0xea, 0x06, 0x2a, 0xae, 0xc5, 0x09, 0xd4, + 0x71, 0xda, 0x96, 0xd4, 0x98, 0x74, 0xc2, 0xed, 0x42, 0xc5, 0x26, 0xdb, 0x30, 0x5e, 0xab, 0xad, + 0xdc, 0x71, 0x98, 0x5c, 0xd2, 0x91, 0x7a, 0xe8, 0xe4, 0x57, 0xbe, 0x98, 0xfa, 0x95, 0x93, 0xbe, + 0xbf, 0x6f, 0xed, 0x3a, 0x4d, 0x6a, 0xd5, 0xdd, 0xce, 0x91, 0xa9, 0x72, 0x4a, 0x71, 0x06, 0xb8, + 0xf0, 0x84, 0x9d, 0x01, 0xaa, 0x30, 0xad, 0x98, 0xe7, 0xa2, 0x69, 0xee, 0x7c, 0x14, 0x13, 0x4b, + 0x35, 0xfe, 0x8f, 0xbb, 0xbf, 0xc6, 0xe9, 0xa4, 0x17, 0xc0, 0xc5, 0xb3, 0x7a, 0x01, 0x38, 0x30, + 0xc3, 0x07, 0x43, 0xcc, 0x03, 0x1c, 0xe9, 0x85, 0x1e, 0x7d, 0x78, 0x2d, 0xb5, 0x0f, 0x67, 0xc5, + 0x48, 0xcb, 0x49, 0x86, 0x0f, 0xdc, 0x49, 0xae, 0x64, 0x17, 0x88, 0x00, 0xda, 0x81, 0xbd, 0x63, + 0xfb, 0x14, 0xeb, 0x7a, 0xb6, 0x47, 0x5d, 0x2f, 0xa5, 0xd6, 0x35, 0x25, 0xeb, 0xda, 0xe1, 0xd5, + 0xa4, 0x70, 0x24, 0x6d, 0x59, 0x8f, 0x9c, 0x5f, 0xd8, 0xb1, 0xcf, 0x69, 0x3a, 0xee, 0x24, 0x02, + 0x0f, 0x2f, 0x15, 0x9f, 0xb4, 0xf1, 0x7e, 0x4f, 0xe1, 0x4c, 0x1e, 0xc3, 0xf9, 0xe4, 0x57, 0x60, + 0x9d, 0xcf, 0x63, 0x9d, 0xcf, 0x6b, 0x75, 0xc6, 0x91, 0xf8, 0xbc, 0xd1, 0x9b, 0x15, 0xaf, 0xb5, + 0x07, 0x7f, 0xf2, 0x83, 0x19, 0xb8, 0xf0, 0xe0, 0x4e, 0x09, 0x33, 0x96, 0x3a, 0x3c, 0xda, 0x5d, + 0xe8, 0x36, 0x7c, 0x49, 0xbc, 0x83, 0xc4, 0xdf, 0x63, 0xa4, 0xc4, 0x81, 0x5b, 0x05, 0x13, 0xdd, + 0x5f, 0x6c, 0xed, 0xda, 0x3c, 0x11, 0xaa, 0x60, 0x91, 0xe2, 0x5b, 0xfc, 0x73, 0x7f, 0x5c, 0xcc, + 0x98, 0xbd, 0xaa, 0x22, 0x4d, 0x58, 0xd0, 0xbb, 0x45, 0xfa, 0x69, 0xec, 0xd3, 0x66, 0x73, 0xbe, + 0x88, 0x33, 0xfa, 0xb5, 0x93, 0xe3, 0xe2, 0xd5, 0x44, 0xef, 0x86, 0xbe, 0x1f, 0x0c, 0x53, 0x69, + 0x70, 0x1f, 0x7e, 0xa4, 0x95, 0x22, 0x74, 0xcf, 0x5f, 0xd6, 0xe2, 0x0b, 0x25, 0xca, 0x97, 0x5e, + 0x16, 0x12, 0xc9, 0xf3, 0x6c, 0xbd, 0xf7, 0x14, 0x10, 0xcd, 0x24, 0xe7, 0x7b, 0x43, 0xf9, 0xc9, + 0xc2, 0x54, 0x8a, 0x53, 0x84, 0xf1, 0xdb, 0xd9, 0xd8, 0xc1, 0x48, 0xaa, 0x30, 0x2a, 0xe6, 0x7b, + 0xcf, 0x4b, 0xc6, 0xf3, 0xa9, 0xb3, 0x7a, 0x54, 0x2c, 0x1d, 0x53, 0xd2, 0x93, 0x43, 0xc6, 0x0a, + 0x1b, 0x2d, 0x6e, 0xbc, 0x5f, 0xe5, 0xe7, 0x1e, 0x82, 0xb4, 0x13, 0xbe, 0x72, 0x76, 0x67, 0x3f, + 0xdd, 0x97, 0x14, 0x8f, 0x7a, 0x59, 0x1b, 0x39, 0xe0, 0xe9, 0xaa, 0x72, 0xa1, 0xbf, 0x98, 0x9e, + 0x9b, 0xea, 0x89, 0x55, 0xc8, 0x6a, 0x31, 0x7e, 0x2b, 0x03, 0x93, 0xda, 0xc9, 0x4a, 0x6e, 0x2b, + 0xee, 0x90, 0x51, 0x84, 0x00, 0x0d, 0x07, 0x37, 0xdb, 0xb8, 0xa3, 0xe4, 0x6d, 0xe1, 0xd9, 0x90, + 0xed, 0x4d, 0x87, 0x8b, 0x2d, 0xee, 0x1d, 0xdb, 0x5f, 0x3f, 0x1c, 0xe6, 0xda, 0x1c, 0xea, 0x91, + 0x6b, 0xf3, 0x1f, 0x16, 0x61, 0x4a, 0xbf, 0x11, 0x93, 0xd7, 0x60, 0x04, 0x75, 0xf3, 0x52, 0xbd, + 0x82, 0x6a, 0x21, 0x54, 0xdf, 0x6b, 0xee, 0x2e, 0x1c, 0x87, 0xbc, 0x0c, 0x10, 0x9a, 0x98, 0xcb, + 0x97, 0xa9, 0xe1, 0x93, 0xe3, 0x62, 0xe6, 0x75, 0x53, 0x29, 0x20, 0x5f, 0x03, 0x58, 0x73, 0x1b, + 0x34, 0x4c, 0xa0, 0xdc, 0xc7, 0xbe, 0xe3, 0x95, 0x44, 0x2a, 0x97, 0x73, 0x6d, 0xb7, 0x41, 0x93, + 0x79, 0x5b, 0x14, 0x8e, 0xe4, 0xf3, 0x30, 0x6c, 0x76, 0x9b, 0x54, 0xbe, 0x60, 0x8c, 0xcb, 0x13, + 0xae, 0xdb, 0xa4, 0x91, 0x9e, 0xc0, 0xeb, 0xc6, 0x4d, 0x17, 0x19, 0x80, 0xbc, 0xc7, 0x53, 0xbc, + 0x88, 0x38, 0xa4, 0xc3, 0xd1, 0x5b, 0x9d, 0x22, 0xf9, 0x24, 0x22, 0x91, 0x2a, 0x24, 0x64, 0x1d, + 0x46, 0xd5, 0x47, 0x26, 0xc5, 0xaf, 0x5e, 0x7d, 0x88, 0x54, 0x94, 0x0e, 0x22, 0xf3, 0x72, 0xfc, + 0xfd, 0x49, 0x72, 0x21, 0x6f, 0xc3, 0x18, 0x63, 0xcf, 0x76, 0x0e, 0x5f, 0xdc, 0x6a, 0xf0, 0x45, + 0x4e, 0xf9, 0x20, 0xb6, 0xfb, 0x68, 0xd1, 0x42, 0x43, 0x02, 0xf2, 0x65, 0xcc, 0x95, 0x2b, 0xba, + 0xba, 0xaf, 0xdd, 0xcf, 0x95, 0x44, 0x57, 0x63, 0xf2, 0xdc, 0x44, 0x4f, 0x47, 0xfc, 0xc8, 0x5e, + 0x18, 0xd6, 0x6d, 0x90, 0xb4, 0x3c, 0xaf, 0x26, 0x2a, 0x98, 0x97, 0x91, 0xca, 0x92, 0x89, 0xb0, + 0x35, 0xbe, 0xa4, 0x03, 0x85, 0x48, 0xa8, 0x14, 0x75, 0x41, 0xbf, 0xba, 0x5e, 0x4f, 0xd4, 0xa5, + 0x0e, 0x60, 0xa2, 0xba, 0x04, 0x77, 0xd2, 0x80, 0x29, 0x79, 0x40, 0x89, 0xfa, 0xc6, 0xfb, 0xd5, + 0xf7, 0x72, 0xa2, 0xbe, 0xd9, 0xc6, 0x4e, 0xb2, 0x9e, 0x18, 0x4f, 0xf2, 0x36, 0x4c, 0x4a, 0x08, + 0x4f, 0x4b, 0x3d, 0x11, 0xe5, 0xf5, 0x6d, 0xec, 0x24, 0x92, 0x51, 0xeb, 0xc8, 0x2a, 0x35, 0x9f, + 0x1d, 0x93, 0x1a, 0x75, 0x7c, 0x56, 0xe8, 0xc8, 0xe4, 0x7d, 0x18, 0xaf, 0xb6, 0x58, 0x43, 0xdc, + 0xb6, 0x1d, 0x50, 0xe1, 0x71, 0x29, 0x6d, 0x98, 0x94, 0x12, 0x65, 0xaa, 0xf2, 0x84, 0xdb, 0x51, + 0x91, 0x96, 0x70, 0x3b, 0x02, 0xb3, 0xce, 0xe3, 0xaf, 0x8a, 0x62, 0x0e, 0x4b, 0x6f, 0xcc, 0xe7, + 0x53, 0xec, 0x88, 0x14, 0xf6, 0x22, 0xe6, 0x24, 0x83, 0xca, 0x57, 0xbd, 0x58, 0xbc, 0x5f, 0x95, + 0x27, 0x79, 0x07, 0xc6, 0x45, 0xc6, 0xb2, 0x92, 0xb9, 0xe6, 0xcf, 0x17, 0xb0, 0xf1, 0x18, 0x45, + 0x42, 0x26, 0x37, 0xb3, 0x6c, 0x2f, 0x66, 0x30, 0x1b, 0xe1, 0x93, 0x2f, 0xc1, 0xdc, 0xb6, 0xd3, + 0x6e, 0xb8, 0x87, 0xbe, 0x38, 0xa6, 0xc4, 0x46, 0x37, 0x13, 0xb9, 0xab, 0x1d, 0xf2, 0xf2, 0x50, + 0x16, 0x4c, 0x6c, 0x7c, 0xa9, 0x1c, 0xc8, 0xf7, 0x24, 0x38, 0xf3, 0x19, 0x44, 0xfa, 0xcd, 0xa0, + 0xc5, 0xc4, 0x0c, 0x4a, 0x56, 0x1f, 0x9f, 0x4e, 0xa9, 0xd5, 0x10, 0x17, 0x88, 0x7e, 0xbe, 0xdf, + 0x73, 0x9d, 0xf6, 0xfc, 0x2c, 0xee, 0x85, 0xcf, 0xc6, 0xe3, 0x36, 0x20, 0x9e, 0x48, 0x5c, 0x6e, + 0x9c, 0x1c, 0x17, 0x2f, 0xc5, 0x65, 0xfe, 0x0f, 0x5c, 0xed, 0xb9, 0x24, 0x85, 0x35, 0x79, 0x1f, + 0x26, 0xd8, 0xff, 0xa1, 0x52, 0x62, 0x4e, 0xb3, 0x3c, 0x55, 0x30, 0x45, 0x3d, 0x38, 0x46, 0x98, + 0x52, 0x2d, 0x45, 0x5f, 0xa1, 0xb1, 0x22, 0x6f, 0x02, 0x30, 0xb1, 0x49, 0x6c, 0xc7, 0xe7, 0xa2, + 0xf0, 0xca, 0x28, 0x75, 0x25, 0x37, 0xe2, 0x08, 0x99, 0xbc, 0x0d, 0xe3, 0xec, 0x57, 0xad, 0xdb, + 0x70, 0xd9, 0xda, 0x38, 0x8f, 0xb4, 0xdc, 0xf9, 0x95, 0xd1, 0xfa, 0x1c, 0xae, 0x39, 0xbf, 0x46, + 0xe8, 0x64, 0x05, 0xa6, 0x31, 0x0c, 0xb6, 0x08, 0xc0, 0xea, 0x50, 0x7f, 0xfe, 0x82, 0x62, 0x0d, + 0xc1, 0x8a, 0x2c, 0x27, 0x2c, 0x53, 0xef, 0x32, 0x31, 0x32, 0xe2, 0xc3, 0x6c, 0xf2, 0x39, 0xd9, + 0x9f, 0x9f, 0xc7, 0x4e, 0x92, 0x12, 0x7c, 0x12, 0x83, 0xef, 0xc7, 0x6c, 0x44, 0x94, 0x8d, 0x4b, + 0x3e, 0x2a, 0xa9, 0x15, 0xa6, 0x71, 0x27, 0x26, 0x90, 0xbb, 0xe5, 0x8d, 0x78, 0x9c, 0xe8, 0x8b, + 0xd8, 0x02, 0x1c, 0xe6, 0xbd, 0x7a, 0x94, 0xa9, 0x3c, 0x25, 0x56, 0x74, 0x0a, 0x35, 0xf9, 0x6e, + 0x38, 0x27, 0x77, 0x10, 0x51, 0x24, 0xe6, 0xf5, 0xc2, 0x19, 0x77, 0xe2, 0xc6, 0x4e, 0x58, 0x75, + 0x62, 0x4a, 0xa7, 0x57, 0x41, 0x6c, 0x18, 0xc7, 0x61, 0x15, 0x35, 0x3e, 0xdb, 0xaf, 0xc6, 0xab, + 0x89, 0x1a, 0xcf, 0xe3, 0x44, 0x49, 0x56, 0xa6, 0xf2, 0x24, 0x4b, 0x30, 0x29, 0xd6, 0x91, 0x98, + 0x6d, 0xcf, 0x61, 0x6f, 0xa1, 0x12, 0x4b, 0xae, 0xc0, 0xc4, 0x84, 0xd3, 0x49, 0xd4, 0x1d, 0x99, + 0x3f, 0x26, 0x3d, 0xaf, 0xed, 0xc8, 0xf1, 0x37, 0x24, 0x1d, 0x99, 0xed, 0x48, 0x91, 0x14, 0xb3, + 0xfc, 0xb8, 0xe3, 0x09, 0x15, 0xd5, 0xa5, 0x28, 0xf3, 0x92, 0x22, 0xfc, 0x58, 0x34, 0xc4, 0x50, + 0xb7, 0x84, 0x34, 0x0e, 0x64, 0x0b, 0x66, 0xc3, 0x53, 0x5b, 0x61, 0x5c, 0x8c, 0x22, 0x11, 0x47, + 0x47, 0x7d, 0x3a, 0xdf, 0x34, 0x7a, 0x62, 0xc3, 0x05, 0xed, 0x9c, 0x56, 0x58, 0x5f, 0x46, 0xd6, + 0x98, 0x19, 0x5f, 0x3f, 0xe4, 0xd3, 0xd9, 0xf7, 0xe2, 0x43, 0x3e, 0x80, 0x85, 0xf8, 0xd9, 0xac, + 0xd4, 0xf2, 0x02, 0xd6, 0xf2, 0xea, 0xc9, 0x71, 0xf1, 0x4a, 0xe2, 0x78, 0x4f, 0xaf, 0xa8, 0x0f, + 0x37, 0xf2, 0x35, 0x98, 0xd7, 0xcf, 0x67, 0xa5, 0x26, 0x03, 0x6b, 0xc2, 0xa5, 0x13, 0x1e, 0xec, + 0xe9, 0x35, 0xf4, 0xe4, 0x41, 0x02, 0x28, 0xa6, 0xce, 0x6e, 0xa5, 0x9a, 0x17, 0xa3, 0x06, 0x25, + 0x56, 0x49, 0x7a, 0x75, 0xa7, 0xb1, 0x24, 0x87, 0x70, 0x29, 0xed, 0x98, 0x50, 0x2a, 0x7d, 0x29, + 0x54, 0x02, 0x7f, 0x2a, 0xfd, 0xc8, 0x49, 0xaf, 0xf9, 0x14, 0xb6, 0xe4, 0xcb, 0x70, 0x4e, 0x59, + 0x5f, 0x4a, 0x7d, 0x2f, 0x63, 0x7d, 0xe8, 0x6c, 0xae, 0x2e, 0xcc, 0xf4, 0x5a, 0xd2, 0x79, 0x90, + 0x16, 0xcc, 0xca, 0x86, 0xa3, 0xb6, 0x5d, 0x1c, 0x3d, 0x57, 0xb4, 0x5d, 0x35, 0x89, 0xb1, 0x74, + 0x59, 0xec, 0xaa, 0xf3, 0x8d, 0x1d, 0xab, 0x13, 0x11, 0xaa, 0x33, 0x3d, 0x85, 0x2f, 0x59, 0x81, + 0x91, 0xda, 0x46, 0xf5, 0xce, 0x9d, 0xe5, 0xf9, 0x57, 0xb0, 0x06, 0xe9, 0x99, 0xc6, 0x81, 0xda, + 0xa5, 0x49, 0x98, 0x2b, 0x76, 0x9c, 0xdd, 0x5d, 0xed, 0xc1, 0x8a, 0xa3, 0x92, 0xef, 0x41, 0x43, + 0x41, 0xb6, 0xa3, 0x96, 0x7c, 0xdf, 0xd9, 0xc3, 0xc8, 0xd6, 0xfe, 0xfc, 0xab, 0xda, 0x7b, 0xbf, + 0x8c, 0xfa, 0x5d, 0xc6, 0xa4, 0x68, 0x09, 0x74, 0x2e, 0x6d, 0xb2, 0xfb, 0xbf, 0xd8, 0xb9, 0x2d, + 0x3b, 0x62, 0xa5, 0x6e, 0xe2, 0xc9, 0x8a, 0x58, 0xbf, 0xed, 0x39, 0x81, 0xb5, 0xdf, 0xd5, 0x9a, + 0x3f, 0xff, 0x29, 0x2d, 0xca, 0x33, 0x4f, 0x15, 0xa7, 0xf4, 0xda, 0x4b, 0xa2, 0xc2, 0xe7, 0xf8, + 0x6d, 0xb9, 0x47, 0xcf, 0xcd, 0xec, 0xc5, 0xe8, 0x7c, 0xf2, 0x03, 0x19, 0x38, 0xbf, 0xed, 0x7a, + 0x07, 0x4d, 0xd7, 0x6e, 0xc8, 0x56, 0x89, 0x3d, 0xfc, 0xb5, 0x7e, 0x7b, 0xf8, 0x67, 0x12, 0x7b, + 0xb8, 0x71, 0x28, 0xd8, 0x58, 0x61, 0xd0, 0xf4, 0xc4, 0x7e, 0xde, 0xa3, 0x2a, 0xf2, 0x3d, 0x70, + 0x39, 0xbd, 0x44, 0x99, 0x94, 0xaf, 0xe3, 0xa4, 0xbc, 0x79, 0x72, 0x5c, 0x7c, 0xbd, 0x57, 0x4d, + 0xe9, 0x13, 0xf4, 0x54, 0xd6, 0xf7, 0x86, 0xf2, 0x57, 0x0b, 0xd7, 0xee, 0x0d, 0xe5, 0xaf, 0x15, + 0x5e, 0x35, 0x9f, 0xab, 0x95, 0x1e, 0xac, 0x56, 0x1b, 0xf2, 0x70, 0x95, 0x71, 0xdd, 0x39, 0x8d, + 0x79, 0xa5, 0x5f, 0x69, 0xc4, 0xd1, 0xf8, 0x3b, 0x19, 0x28, 0x9e, 0x32, 0x49, 0xd8, 0x79, 0x16, + 0x8d, 0x44, 0x8d, 0x06, 0x6a, 0x74, 0xf8, 0x68, 0xfc, 0x2c, 0xdd, 0x6c, 0x44, 0x27, 0x41, 0xb7, + 0x46, 0x91, 0x92, 0x44, 0xf1, 0x6e, 0x4d, 0xa6, 0x22, 0x91, 0x58, 0xc6, 0x2a, 0x14, 0xe2, 0x93, + 0x87, 0x7c, 0x0e, 0x26, 0xd5, 0x84, 0x08, 0x52, 0x95, 0xc0, 0x43, 0x99, 0x78, 0x7b, 0xda, 0x81, + 0xa8, 0x21, 0x1a, 0xbf, 0x90, 0x81, 0xd9, 0x94, 0x15, 0x46, 0xae, 0xc0, 0x10, 0x66, 0x2c, 0x53, + 0xac, 0x86, 0x62, 0x99, 0xca, 0xb0, 0x9c, 0x7c, 0x1a, 0x46, 0x2b, 0x6b, 0xb5, 0x5a, 0x69, 0x4d, + 0x2a, 0x23, 0xf8, 0x41, 0xdc, 0xf6, 0x2d, 0xdf, 0xd6, 0x8d, 0x0d, 0x04, 0x1a, 0x79, 0x1d, 0x46, + 0xaa, 0x1b, 0x48, 0xc0, 0x6d, 0x5f, 0xb1, 0xbd, 0x4e, 0x27, 0x8e, 0x2f, 0x90, 0x8c, 0x1f, 0xcd, + 0x00, 0x49, 0x6e, 0x17, 0xe4, 0x26, 0x8c, 0xab, 0x9b, 0x12, 0x6f, 0x2f, 0xbe, 0xc0, 0x2a, 0x0b, + 0xc7, 0x54, 0x71, 0x48, 0x05, 0x86, 0x31, 0xd7, 0x6c, 0x68, 0xe5, 0x90, 0xba, 0x2c, 0x2e, 0x24, + 0x96, 0xc5, 0x30, 0x66, 0xb2, 0x35, 0x39, 0xb1, 0xf1, 0x7b, 0x19, 0x20, 0xe9, 0xb6, 0x8b, 0x03, + 0x59, 0x59, 0xbd, 0xa1, 0x44, 0x47, 0x50, 0x73, 0x12, 0x85, 0x09, 0xe5, 0x54, 0x35, 0x40, 0x14, + 0x47, 0xe1, 0x8a, 0xa6, 0x76, 0xea, 0xed, 0x52, 0x7b, 0x0d, 0x86, 0x1f, 0x52, 0x6f, 0x47, 0x9a, + 0x75, 0xa3, 0x29, 0xe8, 0x23, 0x06, 0x50, 0xd5, 0x30, 0x88, 0x61, 0xfc, 0x69, 0x06, 0xe6, 0xd2, + 0xee, 0x28, 0xa7, 0x78, 0xbe, 0x1a, 0x31, 0xa7, 0x5d, 0xb4, 0xb0, 0xe2, 0x76, 0xa2, 0xa1, 0xab, + 0x6e, 0x11, 0x86, 0x59, 0x63, 0xe5, 0x08, 0xa3, 0x1a, 0x8c, 0xf5, 0x86, 0x6f, 0x72, 0x38, 0x43, + 0xe0, 0x71, 0x00, 0x87, 0x30, 0x84, 0x24, 0x22, 0xe0, 0xec, 0x36, 0x39, 0x9c, 0x21, 0x3c, 0x70, + 0x1b, 0x54, 0xaa, 0x87, 0x10, 0xa1, 0xc5, 0x00, 0x26, 0x87, 0x93, 0x2b, 0x30, 0xba, 0xde, 0x5e, + 0xa5, 0xf6, 0x23, 0x99, 0x17, 0x03, 0x2d, 0xc2, 0xdc, 0xb6, 0xd5, 0x64, 0x30, 0x53, 0x16, 0x1a, + 0x3f, 0x9d, 0x81, 0x99, 0xc4, 0xf5, 0xe8, 0x74, 0xe7, 0xde, 0xfe, 0x5e, 0x76, 0x83, 0xb4, 0x8f, + 0x7f, 0xfe, 0x50, 0xfa, 0xe7, 0x1b, 0xff, 0xfd, 0x08, 0x5c, 0xe8, 0xa1, 0xad, 0x8a, 0xbc, 0x80, + 0x33, 0xa7, 0x7a, 0x01, 0x7f, 0x05, 0x26, 0xcb, 0x4d, 0xdb, 0x69, 0xf9, 0x9b, 0x6e, 0xf4, 0xc5, + 0x91, 0x33, 0x11, 0x96, 0x09, 0x3f, 0x88, 0xd0, 0xeb, 0xe4, 0x62, 0x1d, 0x29, 0xac, 0xc0, 0x4d, + 0x0a, 0xcb, 0x1a, 0xb3, 0x84, 0x1f, 0x6e, 0xee, 0xaf, 0x88, 0x1f, 0xae, 0xee, 0x19, 0x36, 0xf4, + 0x44, 0x3d, 0xc3, 0xd2, 0x6d, 0xbe, 0x87, 0x3f, 0x8a, 0x07, 0x40, 0x19, 0x26, 0xb9, 0x49, 0x5c, + 0xc9, 0xe7, 0x83, 0x34, 0x92, 0x30, 0xa3, 0xb3, 0xfd, 0xe4, 0x58, 0x68, 0x34, 0x64, 0x45, 0xf7, + 0x62, 0x1a, 0xc5, 0x37, 0xe3, 0x2b, 0xbd, 0xbd, 0x94, 0x34, 0x5b, 0x11, 0xcd, 0x5b, 0xe9, 0x9b, + 0x30, 0x97, 0x76, 0xdd, 0x9d, 0xcf, 0x6b, 0xd6, 0xb6, 0x3d, 0xad, 0xb4, 0x07, 0xbf, 0x34, 0x1f, + 0xa4, 0x5e, 0x9a, 0xa5, 0x77, 0xf9, 0x98, 0x16, 0x36, 0xba, 0xc7, 0x5a, 0xe0, 0xb8, 0xfd, 0x7d, + 0xd0, 0x8d, 0xaf, 0xc0, 0xf3, 0x7d, 0xc9, 0xc9, 0x5b, 0x5a, 0x14, 0xa3, 0x57, 0x92, 0x51, 0x8c, + 0xbe, 0x73, 0x5c, 0x9c, 0xd1, 0x3c, 0x43, 0x1f, 0x84, 0x0a, 0x7f, 0xe3, 0xa7, 0xb3, 0xba, 0x4f, + 0xf3, 0x5f, 0xc5, 0x85, 0x7a, 0x0d, 0x86, 0xb7, 0xf7, 0xa9, 0x27, 0x8f, 0x07, 0xfc, 0x90, 0x43, + 0x06, 0x50, 0x3f, 0x04, 0x31, 0xc8, 0x1d, 0x98, 0xda, 0xe0, 0x13, 0x57, 0xce, 0xc6, 0xa1, 0x48, + 0xe7, 0xd2, 0x11, 0x9a, 0xc1, 0x94, 0xe9, 0x18, 0xa3, 0x32, 0xee, 0xc6, 0x3a, 0x5d, 0xc4, 0x60, + 0xe2, 0x9e, 0x51, 0x5c, 0x80, 0x98, 0x8a, 0xbc, 0xcd, 0xa2, 0xcd, 0xd6, 0x8c, 0x41, 0x8d, 0x5d, + 0xb8, 0xd4, 0x97, 0x11, 0x3b, 0xb7, 0xa1, 0x13, 0xfe, 0x8a, 0x59, 0x5e, 0xf7, 0x25, 0x35, 0x15, + 0x3a, 0xe3, 0x9b, 0x30, 0xa1, 0xf6, 0x32, 0x1e, 0x41, 0xec, 0xb7, 0x98, 0x15, 0xfc, 0x08, 0x62, + 0x00, 0x93, 0xc3, 0xa3, 0xb7, 0x9c, 0x6c, 0xfa, 0x5b, 0x4e, 0x34, 0xfc, 0xb9, 0xd3, 0x86, 0x9f, + 0x55, 0x8e, 0x3b, 0x9c, 0x52, 0x39, 0xfe, 0x56, 0x2b, 0xc7, 0x20, 0x4b, 0x26, 0x87, 0x3f, 0xd1, + 0xca, 0x7f, 0x57, 0x26, 0x52, 0x43, 0xc7, 0x2b, 0xb9, 0xdc, 0x33, 0x51, 0x36, 0xb4, 0xb4, 0xd5, + 0x1b, 0x61, 0x46, 0x32, 0x45, 0xf6, 0x34, 0x99, 0xe2, 0x2c, 0x13, 0x11, 0xe5, 0x5e, 0x3e, 0xa4, + 0x43, 0x91, 0x1c, 0x68, 0x27, 0xac, 0x5d, 0x24, 0x96, 0xf1, 0x73, 0x19, 0x38, 0x97, 0xaa, 0x33, + 0x67, 0xb5, 0x72, 0xe5, 0xbc, 0xb2, 0x0e, 0xe3, 0x9a, 0x79, 0x8e, 0x71, 0x96, 0x08, 0x1b, 0x83, + 0xb7, 0xc5, 0x78, 0x01, 0xc6, 0xc2, 0x17, 0x5b, 0x32, 0x27, 0x87, 0x0e, 0xed, 0x22, 0xe5, 0xc3, + 0x5f, 0x0d, 0x80, 0x7d, 0xc1, 0x13, 0x35, 0xad, 0x36, 0x7e, 0x37, 0xcb, 0x93, 0xec, 0x3e, 0xb5, + 0xe1, 0x72, 0xd3, 0xed, 0xa1, 0x59, 0x93, 0x7a, 0x07, 0xc9, 0x25, 0xcb, 0x30, 0x52, 0x0b, 0xec, + 0xa0, 0x2b, 0x03, 0x83, 0xcc, 0xaa, 0x64, 0x58, 0xf0, 0x70, 0x31, 0x0a, 0x0d, 0xe1, 0x23, 0x44, + 0xd3, 0x12, 0x20, 0x44, 0x31, 0xab, 0xfe, 0xc3, 0x0c, 0x4c, 0xa8, 0xc4, 0xe4, 0x7d, 0x98, 0x92, + 0x21, 0x40, 0x79, 0xb8, 0x14, 0xf1, 0xbc, 0x2c, 0x4d, 0xc1, 0x64, 0x08, 0x50, 0x35, 0xbc, 0x8a, + 0x86, 0xaf, 0x6e, 0xd5, 0x1d, 0x15, 0x99, 0x34, 0x80, 0xb4, 0x76, 0x6d, 0xeb, 0x90, 0xda, 0x07, + 0xd4, 0x0f, 0x2c, 0x6e, 0xb2, 0x23, 0x5e, 0xa1, 0x25, 0xfb, 0x07, 0x77, 0x4a, 0xdc, 0x5a, 0x87, + 0x8d, 0x84, 0x88, 0xe5, 0x9a, 0xa0, 0x51, 0x9f, 0xd6, 0x5a, 0xbb, 0xf6, 0x36, 0x2f, 0xe4, 0x74, + 0xc6, 0x9f, 0x8d, 0xf0, 0xe9, 0x26, 0x62, 0x06, 0xef, 0xc0, 0xd4, 0x7a, 0xb5, 0x52, 0x56, 0x14, + 0xed, 0x7a, 0xca, 0xa9, 0xe5, 0xc7, 0x01, 0xf5, 0xda, 0x76, 0x53, 0xde, 0x77, 0xa3, 0x23, 0xc8, + 0x75, 0x1a, 0xf5, 0x74, 0x25, 0x7c, 0x8c, 0x23, 0xab, 0x83, 0xdf, 0xac, 0xc3, 0x3a, 0xb2, 0x03, + 0xd6, 0xe1, 0xdb, 0xad, 0x66, 0x8f, 0x3a, 0x74, 0x8e, 0x64, 0x1f, 0xaf, 0xbe, 0xfb, 0xdd, 0x1d, + 0xa5, 0x96, 0x5c, 0xff, 0x5a, 0x5e, 0x14, 0xb5, 0x3c, 0x2b, 0xd4, 0x2a, 0xa9, 0xf5, 0x24, 0xb8, + 0x46, 0xfb, 0xc4, 0xd0, 0xa9, 0xfb, 0xc4, 0xdf, 0xca, 0xc0, 0x08, 0x17, 0x5f, 0xc5, 0x34, 0xee, + 0x21, 0x20, 0x6f, 0x3f, 0x19, 0x01, 0xb9, 0x80, 0xe7, 0x84, 0x36, 0xa1, 0x79, 0x19, 0xa9, 0xc4, + 0xd6, 0x85, 0xf4, 0x06, 0xc0, 0x27, 0x33, 0x5e, 0x72, 0xfa, 0xb2, 0x20, 0xd5, 0x28, 0x58, 0xc7, + 0xe8, 0xa9, 0x1e, 0xda, 0x32, 0xc0, 0xc9, 0xa8, 0x08, 0xd6, 0xa1, 0x87, 0xe8, 0x58, 0x85, 0x31, + 0x11, 0x02, 0x64, 0xe9, 0x48, 0x3c, 0x8c, 0x17, 0x34, 0xd3, 0xa6, 0xc6, 0xd2, 0x51, 0x24, 0x9a, + 0x8b, 0x20, 0x22, 0xd6, 0xce, 0x91, 0x96, 0xb3, 0x58, 0x22, 0x92, 0x75, 0x9e, 0xcb, 0x93, 0xc7, + 0x54, 0xd6, 0xd3, 0x28, 0x84, 0x70, 0x11, 0x5c, 0x4c, 0xc6, 0x11, 0x48, 0x09, 0xa1, 0x1c, 0xf1, + 0x20, 0xab, 0x50, 0x40, 0x73, 0x38, 0xda, 0xe0, 0xab, 0xa6, 0x5a, 0xe1, 0x61, 0x26, 0x84, 0x49, + 0x73, 0xc0, 0xcb, 0xc4, 0x72, 0x8b, 0xf9, 0x5f, 0x26, 0x28, 0x8d, 0x9f, 0xca, 0x42, 0x21, 0x3e, + 0xfb, 0xc8, 0xdb, 0x30, 0x1e, 0xc6, 0xb4, 0x0e, 0x3d, 0xc0, 0xf1, 0x81, 0x2c, 0x0a, 0x82, 0xad, + 0x67, 0x80, 0x54, 0xd0, 0xc9, 0x22, 0xe4, 0xd9, 0x22, 0x8e, 0x67, 0x4b, 0xee, 0x0a, 0x98, 0xea, + 0x91, 0x25, 0xf1, 0x48, 0x0d, 0x66, 0xd9, 0xa2, 0xa9, 0x39, 0xed, 0xbd, 0x26, 0x5d, 0x75, 0xf7, + 0xdc, 0x6e, 0x10, 0x25, 0x44, 0xe4, 0x17, 0x18, 0xbb, 0xd5, 0xd4, 0x8a, 0xf5, 0x74, 0x88, 0x29, + 0xd4, 0x4a, 0x2e, 0xf7, 0xa1, 0x01, 0x72, 0xb9, 0x2b, 0x3b, 0xeb, 0x1f, 0x67, 0x61, 0x5c, 0x99, + 0x7e, 0xe4, 0x1a, 0xe4, 0xab, 0xfe, 0xaa, 0x5b, 0x3f, 0x08, 0x83, 0x55, 0x4e, 0x9e, 0x1c, 0x17, + 0xc7, 0x1c, 0xdf, 0x6a, 0x22, 0xd0, 0x0c, 0x8b, 0xc9, 0x12, 0x4c, 0xf2, 0xbf, 0x64, 0x72, 0x92, + 0x6c, 0xa4, 0x5b, 0xe3, 0xc8, 0x32, 0x2d, 0x89, 0xba, 0xd9, 0x6a, 0x24, 0xe4, 0xab, 0x00, 0x1c, + 0x80, 0xe1, 0x0d, 0x72, 0x83, 0x07, 0x66, 0x10, 0x15, 0xa4, 0x04, 0x36, 0x50, 0x18, 0x92, 0xaf, + 0xf3, 0x90, 0xd9, 0x72, 0xb9, 0x0c, 0x0d, 0x1e, 0x59, 0x82, 0xf1, 0xb7, 0xd2, 0x03, 0xdc, 0xa8, + 0x2c, 0x45, 0x3e, 0xa1, 0x05, 0x93, 0xd6, 0xdd, 0x47, 0xd4, 0x3b, 0x2a, 0x05, 0x88, 0xa8, 0x60, + 0x18, 0xff, 0x4b, 0x46, 0x59, 0x64, 0x64, 0x0d, 0xf3, 0x81, 0xf3, 0x09, 0x24, 0x4c, 0xca, 0xc2, + 0x2b, 0x86, 0x84, 0x9b, 0x74, 0x77, 0xe9, 0x59, 0x61, 0xdd, 0x36, 0x1b, 0x4e, 0xc3, 0x58, 0x9e, + 0x70, 0x0e, 0x24, 0x5f, 0x80, 0x21, 0xec, 0xba, 0xec, 0xa9, 0x4d, 0x93, 0xa7, 0xfc, 0x10, 0xeb, + 0x33, 0x6c, 0x08, 0x52, 0x92, 0x4f, 0x0b, 0xc7, 0x6d, 0xde, 0xf9, 0x53, 0xca, 0x51, 0xcd, 0xbe, + 0x23, 0x3c, 0xde, 0xa3, 0x18, 0x47, 0xca, 0xec, 0xf9, 0x3b, 0x59, 0x28, 0xc4, 0x97, 0x36, 0x79, + 0x0f, 0x26, 0xe4, 0xf1, 0xbb, 0x62, 0x8b, 0xcc, 0x1a, 0x13, 0x22, 0xb3, 0x85, 0x3c, 0x83, 0xf7, + 0x6d, 0xd5, 0x04, 0xcd, 0xd4, 0x08, 0x98, 0x2c, 0xb4, 0x29, 0x62, 0x0e, 0x2a, 0x8b, 0x2a, 0x70, + 0x83, 0x4e, 0x2c, 0x52, 0xb3, 0x44, 0x23, 0x6f, 0x40, 0xee, 0xc1, 0x9d, 0x92, 0x70, 0xf0, 0x2b, + 0xc4, 0x0f, 0x69, 0x6e, 0x29, 0xab, 0xdb, 0xed, 0x32, 0x7c, 0xb2, 0xaa, 0x04, 0x35, 0x1f, 0xd1, + 0xcc, 0x0d, 0x25, 0x38, 0x6c, 0xdc, 0xe9, 0xd1, 0xcd, 0xef, 0x0d, 0xe5, 0x73, 0x85, 0x21, 0x11, + 0xa6, 0xf7, 0x9f, 0xe7, 0x60, 0x2c, 0xac, 0x9f, 0x10, 0xd5, 0x6d, 0x9a, 0xbb, 0x48, 0x93, 0x8b, + 0x90, 0x97, 0xd2, 0x9d, 0xf0, 0xf3, 0x1b, 0xf5, 0x85, 0x64, 0x37, 0x0f, 0x52, 0x8c, 0xe3, 0xbb, + 0x82, 0x29, 0x7f, 0x92, 0x9b, 0x10, 0xca, 0x68, 0xbd, 0x84, 0xb9, 0x21, 0x36, 0x60, 0x66, 0x88, + 0x46, 0xa6, 0x20, 0xeb, 0xf0, 0xd0, 0x6f, 0x63, 0x66, 0xd6, 0x69, 0x90, 0xf7, 0x20, 0x6f, 0x37, + 0x1a, 0xb4, 0x61, 0xd9, 0xd2, 0x36, 0xab, 0xdf, 0xa4, 0xc9, 0x33, 0x6e, 0xfc, 0xcc, 0x40, 0xaa, + 0x52, 0x40, 0x4a, 0x30, 0xd6, 0xb4, 0xb9, 0xb5, 0x67, 0x63, 0x80, 0x03, 0x28, 0xe2, 0x90, 0x67, + 0x64, 0x5b, 0x3e, 0x6d, 0x90, 0x57, 0x60, 0x88, 0x8d, 0xa6, 0x38, 0x71, 0xa4, 0x50, 0xc9, 0x06, + 0x93, 0x77, 0xd8, 0xca, 0x33, 0x26, 0x22, 0x90, 0x97, 0x20, 0xd7, 0x5d, 0xdc, 0x15, 0x67, 0x49, + 0x21, 0x4a, 0x30, 0x10, 0xa2, 0xb1, 0x62, 0x72, 0x0b, 0xf2, 0x87, 0x7a, 0x6c, 0xfa, 0x73, 0xb1, + 0x61, 0x0c, 0xf1, 0x43, 0x44, 0xf2, 0x0a, 0xe4, 0x7c, 0xdf, 0x15, 0x06, 0x4d, 0xb3, 0xa1, 0x95, + 0xe9, 0x7a, 0x38, 0x6a, 0x8c, 0xbb, 0xef, 0xbb, 0x4b, 0x79, 0x18, 0xe1, 0x07, 0x8c, 0x71, 0x09, + 0x20, 0xfa, 0xc6, 0xa4, 0xdf, 0xa6, 0xf1, 0x55, 0x18, 0x0b, 0xbf, 0x8d, 0x3c, 0x0f, 0x70, 0x40, + 0x8f, 0xac, 0x7d, 0xbb, 0xdd, 0x68, 0x72, 0xe9, 0x74, 0xc2, 0x1c, 0x3b, 0xa0, 0x47, 0x2b, 0x08, + 0x20, 0x17, 0x60, 0xb4, 0xc3, 0x86, 0x5f, 0xcc, 0xf1, 0x09, 0x73, 0xa4, 0xd3, 0xdd, 0x61, 0x53, + 0x79, 0x1e, 0x46, 0x51, 0xcf, 0x2a, 0x56, 0xe4, 0xa4, 0x29, 0x7f, 0x1a, 0x7f, 0x9e, 0xc3, 0x14, + 0x4e, 0x4a, 0x83, 0xc8, 0x8b, 0x30, 0x59, 0xf7, 0x28, 0x9e, 0x65, 0x36, 0x93, 0xd0, 0x44, 0x3d, + 0x13, 0x11, 0xb0, 0xda, 0x20, 0x57, 0x60, 0xba, 0xd3, 0xdd, 0x69, 0x3a, 0x75, 0x56, 0x9b, 0x55, + 0xdf, 0x11, 0x39, 0x27, 0x26, 0xcc, 0x49, 0x0e, 0xbe, 0x4f, 0x8f, 0xca, 0x3b, 0x18, 0xdb, 0xb0, + 0xa0, 0x86, 0xa6, 0x0e, 0xc2, 0xe4, 0xfa, 0xe6, 0xb4, 0x02, 0x47, 0xdb, 0xcc, 0xf3, 0x30, 0x62, + 0xdb, 0x7b, 0x5d, 0x87, 0xc7, 0x20, 0x9b, 0x30, 0xc5, 0x2f, 0xf2, 0x29, 0x98, 0x89, 0xa2, 0xa5, + 0xcb, 0x66, 0x0c, 0x63, 0x33, 0x0a, 0x61, 0x41, 0x99, 0xc3, 0xc9, 0xeb, 0x40, 0xd4, 0xfa, 0xdc, + 0x9d, 0x0f, 0x68, 0x9d, 0xcf, 0xc9, 0x09, 0x73, 0x46, 0x29, 0x59, 0xc7, 0x02, 0xf2, 0x02, 0x4c, + 0x78, 0xd4, 0x47, 0xe9, 0x10, 0xbb, 0x0d, 0x33, 0x1c, 0x9a, 0xe3, 0x12, 0xc6, 0xfa, 0xee, 0x2a, + 0x14, 0x94, 0xee, 0xc0, 0xe8, 0xdf, 0x3c, 0xdd, 0x82, 0x39, 0x15, 0xc1, 0xcd, 0x4e, 0xb5, 0x41, + 0xbe, 0x04, 0x0b, 0x0a, 0x26, 0x4f, 0xb6, 0x68, 0xd1, 0xa6, 0xb3, 0xe7, 0xec, 0x34, 0xa9, 0x98, + 0x6f, 0xc9, 0x59, 0x1d, 0x5e, 0x21, 0xcd, 0xf9, 0x88, 0x9a, 0xa7, 0x61, 0x5c, 0x16, 0xb4, 0x64, + 0x15, 0xe6, 0x62, 0x9c, 0x69, 0xc3, 0xea, 0x76, 0x7a, 0x06, 0xfd, 0x8b, 0x78, 0x12, 0x9d, 0x27, + 0x6d, 0x6c, 0x75, 0x8c, 0x6f, 0xc2, 0x84, 0x3a, 0x27, 0x59, 0x27, 0xa8, 0x72, 0x89, 0x98, 0x7d, + 0xe3, 0x21, 0xac, 0xca, 0xee, 0x85, 0x53, 0x11, 0x0a, 0x0e, 0x22, 0xdf, 0x5e, 0x26, 0x43, 0x28, + 0x0e, 0xe1, 0x0b, 0x30, 0xd1, 0x70, 0xfc, 0x4e, 0xd3, 0x3e, 0xb2, 0xa2, 0x2c, 0xe2, 0xe6, 0xb8, + 0x80, 0xa1, 0xe2, 0x67, 0x09, 0x66, 0x12, 0xfb, 0xa0, 0x22, 0x69, 0xf0, 0x7d, 0xbd, 0xbf, 0xa4, + 0x61, 0xb4, 0x61, 0x42, 0x3d, 0xd7, 0x4e, 0x49, 0x8e, 0x72, 0x1e, 0xc3, 0xf0, 0xf0, 0x4d, 0x7f, + 0xe4, 0xe4, 0xb8, 0x98, 0x75, 0x1a, 0x18, 0x7c, 0xe7, 0x2a, 0xe4, 0xa5, 0xc4, 0x26, 0x04, 0x25, + 0x7c, 0x4c, 0x90, 0x4f, 0x93, 0x66, 0x58, 0x6a, 0xbc, 0x02, 0xa3, 0xe2, 0xe8, 0xea, 0xff, 0x84, + 0x60, 0x7c, 0x2b, 0x0b, 0xd3, 0x26, 0x65, 0x1b, 0x2b, 0xe5, 0x19, 0x91, 0x9e, 0xda, 0x2b, 0x7a, + 0x7a, 0xb8, 0x58, 0xad, 0x6d, 0x7d, 0x72, 0x11, 0xfd, 0x4a, 0x06, 0x66, 0x53, 0x70, 0x3f, 0x54, + 0x2e, 0xde, 0xdb, 0x30, 0x56, 0x71, 0xec, 0x66, 0xa9, 0xd1, 0x08, 0x63, 0xf2, 0xa0, 0x9c, 0x8f, + 0x09, 0xbb, 0x6c, 0x06, 0x55, 0x85, 0x98, 0x10, 0x95, 0xbc, 0x2a, 0x26, 0x45, 0x94, 0xc9, 0x1e, + 0x27, 0xc5, 0x77, 0x8e, 0x8b, 0xc0, 0xbf, 0x69, 0x33, 0x9c, 0x22, 0x18, 0xc2, 0x99, 0x03, 0x23, + 0xbf, 0xaa, 0xa7, 0x76, 0xe8, 0xd2, 0x43, 0x38, 0xc7, 0x9b, 0x37, 0x50, 0x3a, 0xa2, 0x1f, 0xcb, + 0xc2, 0xf9, 0x74, 0xc2, 0x0f, 0x9b, 0x56, 0x19, 0x13, 0x41, 0x29, 0x61, 0xe7, 0x31, 0xad, 0x32, + 0xcf, 0x1a, 0x85, 0xf8, 0x11, 0x02, 0xd9, 0x85, 0xc9, 0x55, 0xdb, 0x0f, 0x56, 0xa8, 0xed, 0x05, + 0x3b, 0xd4, 0x0e, 0x06, 0x90, 0xe4, 0xa5, 0x35, 0xc5, 0x3c, 0x0a, 0x13, 0xfb, 0x92, 0x32, 0x26, + 0x6b, 0xeb, 0x6c, 0xc3, 0x89, 0x32, 0x34, 0xc0, 0x44, 0xf9, 0x06, 0x4c, 0xd7, 0x68, 0xcb, 0xee, + 0xec, 0xbb, 0x9e, 0x8c, 0x97, 0x70, 0x1d, 0x26, 0x43, 0x50, 0xea, 0x6c, 0xd1, 0x8b, 0x35, 0x7c, + 0xa5, 0x23, 0xa2, 0xad, 0x44, 0x2f, 0x36, 0xfe, 0x6e, 0x16, 0x2e, 0x94, 0xea, 0xc2, 0x34, 0x54, + 0x14, 0x48, 0x0b, 0xf6, 0x8f, 0xb9, 0x6e, 0x72, 0x03, 0xc6, 0x1e, 0xd8, 0x8f, 0x57, 0xa9, 0xed, + 0x53, 0x5f, 0x24, 0xb5, 0xe4, 0x62, 0xaf, 0xfd, 0x38, 0x7a, 0xfc, 0x31, 0x23, 0x1c, 0x55, 0x8d, + 0x30, 0xf4, 0x11, 0xd5, 0x08, 0x06, 0x8c, 0xac, 0xb8, 0xcd, 0x86, 0x38, 0xeb, 0xc5, 0x8b, 0xf3, + 0x3e, 0x42, 0x4c, 0x51, 0x62, 0xfc, 0x69, 0x06, 0xa6, 0xc2, 0x2f, 0xc6, 0x4f, 0xf8, 0xd8, 0xbb, + 0xe4, 0x0a, 0x8c, 0x62, 0x45, 0x61, 0xf6, 0x7d, 0x3c, 0x34, 0x9a, 0x14, 0x53, 0x13, 0x36, 0x4c, + 0x59, 0xa8, 0xf6, 0xc4, 0xf0, 0x47, 0xeb, 0x09, 0xe3, 0x1f, 0xe1, 0x63, 0xb6, 0xda, 0x4a, 0x76, + 0x12, 0x29, 0x1f, 0x92, 0x19, 0xf0, 0x43, 0xb2, 0x4f, 0x6c, 0x48, 0x72, 0x3d, 0x87, 0xe4, 0x87, + 0xb2, 0x30, 0x1e, 0x7e, 0xec, 0x27, 0x2c, 0xf7, 0x41, 0xd8, 0xae, 0x81, 0x62, 0x1c, 0xd5, 0x94, + 0xbd, 0x42, 0x84, 0x12, 0xfa, 0x02, 0x8c, 0x88, 0xc5, 0x94, 0x89, 0x59, 0x72, 0xc7, 0x46, 0x77, + 0x69, 0x4a, 0xb0, 0x1e, 0xc1, 0x01, 0xf5, 0x4d, 0x41, 0x87, 0x41, 0xa4, 0xb6, 0xe9, 0x8e, 0xb0, + 0x6d, 0x78, 0x6a, 0xcf, 0xa8, 0xf4, 0x20, 0x52, 0x51, 0xc3, 0x06, 0x3a, 0x9d, 0xfe, 0x59, 0x1e, + 0x0a, 0x71, 0x92, 0xd3, 0xb3, 0x4b, 0x6c, 0x74, 0x77, 0xf8, 0x55, 0x85, 0x67, 0x97, 0xe8, 0x74, + 0x77, 0x4c, 0x06, 0x43, 0xd3, 0x27, 0xcf, 0x79, 0x84, 0xad, 0x9e, 0x10, 0xa6, 0x4f, 0x9e, 0xf3, + 0x48, 0x33, 0x7d, 0xf2, 0x9c, 0x47, 0xa8, 0x48, 0x58, 0xad, 0x61, 0x80, 0x05, 0xbc, 0xa7, 0x08, + 0x45, 0x42, 0xd3, 0x8f, 0x67, 0x8a, 0x93, 0x68, 0xec, 0xa8, 0x5c, 0xa2, 0xb6, 0x27, 0x32, 0x21, + 0x88, 0xed, 0x0c, 0x8f, 0xca, 0x1d, 0x04, 0x5b, 0x01, 0x83, 0x9b, 0x2a, 0x12, 0x69, 0x02, 0x51, + 0x7e, 0xca, 0x05, 0x7c, 0xfa, 0xdd, 0x5a, 0x5a, 0x61, 0xce, 0xa9, 0xac, 0x2d, 0x75, 0x35, 0xa7, + 0xf0, 0x7d, 0x92, 0xda, 0xdf, 0x0d, 0x11, 0xde, 0x15, 0x15, 0x48, 0xf9, 0x53, 0x99, 0xc9, 0xc0, + 0x30, 0xc0, 0xc3, 0xbf, 0x86, 0x6a, 0xa4, 0x88, 0x09, 0x79, 0x17, 0xc6, 0xd5, 0xb0, 0x19, 0x3c, + 0xb8, 0xc3, 0x73, 0x3c, 0x9e, 0x66, 0x8f, 0xec, 0xc2, 0x2a, 0x01, 0xd9, 0x81, 0x0b, 0x65, 0xb7, + 0xed, 0x77, 0x5b, 0x32, 0x72, 0x67, 0x14, 0x91, 0x1c, 0x70, 0x28, 0xd0, 0x07, 0xbf, 0x2e, 0x50, + 0x44, 0x94, 0x06, 0xe9, 0x26, 0xa3, 0x5f, 0x40, 0x7a, 0x31, 0x22, 0x9b, 0x30, 0x8e, 0x1a, 0x54, + 0x61, 0xf2, 0x38, 0xae, 0x6f, 0x1b, 0x51, 0x49, 0x85, 0x2d, 0x0c, 0x1e, 0x35, 0xce, 0x6e, 0x35, + 0xa5, 0x97, 0x86, 0xaa, 0x09, 0x56, 0x90, 0xc9, 0x57, 0x61, 0x8a, 0x5f, 0xd1, 0xb6, 0xe9, 0x0e, + 0x9f, 0x3b, 0x13, 0x9a, 0x26, 0x42, 0x2f, 0xe4, 0x8f, 0xf9, 0x42, 0x6f, 0x7d, 0x48, 0x77, 0xf8, + 0xd8, 0x6b, 0x3e, 0x52, 0x1a, 0x3e, 0xd9, 0x82, 0xd9, 0x15, 0xdb, 0xe7, 0x40, 0x25, 0xfe, 0xc1, + 0x24, 0x6a, 0x68, 0xd1, 0x76, 0x7d, 0xdf, 0xf6, 0xa5, 0x22, 0x3c, 0x35, 0xde, 0x41, 0x1a, 0x3d, + 0xf9, 0x56, 0x06, 0xe6, 0x35, 0x3d, 0xb9, 0xb0, 0x33, 0x6b, 0xd1, 0x76, 0x80, 0xce, 0x50, 0x53, + 0x8b, 0x45, 0x29, 0x94, 0xf6, 0x40, 0xe3, 0x43, 0x12, 0x53, 0xc5, 0x7b, 0x51, 0xb9, 0x6a, 0x14, + 0xde, 0x8b, 0x87, 0x58, 0xa8, 0xb8, 0xa6, 0xa7, 0xf5, 0x85, 0x1a, 0x5b, 0xd7, 0x12, 0xcd, 0xb8, + 0x1d, 0xef, 0x6f, 0xa1, 0xe8, 0xca, 0x84, 0x8a, 0xae, 0x39, 0x18, 0xc6, 0x5e, 0x95, 0x51, 0xb4, + 0xf0, 0x87, 0xf1, 0x69, 0x75, 0x1f, 0x12, 0x62, 0x61, 0xdf, 0x7d, 0xc8, 0xf8, 0x1f, 0x47, 0x60, + 0x3a, 0x36, 0x2d, 0xc4, 0x3d, 0x35, 0x93, 0xb8, 0xa7, 0xd6, 0x00, 0xb8, 0xaa, 0x77, 0x40, 0x9d, + 0xac, 0x74, 0xc4, 0x1c, 0x17, 0x6e, 0xd4, 0xe1, 0x9a, 0x52, 0xd8, 0x30, 0xa6, 0x7c, 0xc5, 0x0e, + 0xa8, 0x23, 0x0f, 0x99, 0xf2, 0x45, 0xaf, 0x30, 0x8d, 0xd8, 0x90, 0x22, 0x0c, 0x63, 0xfc, 0x5c, + 0xd5, 0x0f, 0xd6, 0x61, 0x00, 0x93, 0xc3, 0xc9, 0x8b, 0x30, 0xc2, 0x84, 0xa8, 0x6a, 0x45, 0x6c, + 0x82, 0x78, 0xb6, 0x30, 0x29, 0x8b, 0x49, 0x2c, 0xa2, 0x88, 0xdc, 0x86, 0x09, 0xfe, 0x97, 0x08, + 0xb3, 0x33, 0xa2, 0x1b, 0x3f, 0x5a, 0x4e, 0x43, 0x46, 0xda, 0xd1, 0xf0, 0xd8, 0xed, 0xa2, 0xd6, + 0x45, 0xb5, 0x4e, 0xb5, 0x22, 0x42, 0xba, 0xe3, 0xed, 0xc2, 0xe7, 0x40, 0x56, 0x45, 0x84, 0xc0, + 0x64, 0x19, 0xe1, 0x8d, 0x92, 0xc7, 0x3b, 0x25, 0xca, 0x32, 0xdc, 0x0b, 0xc5, 0x14, 0x25, 0xe4, + 0x1a, 0x7f, 0x89, 0x41, 0xb1, 0x90, 0x67, 0xc6, 0xc4, 0x77, 0x0b, 0x54, 0x4c, 0xa0, 0x6c, 0x18, + 0x16, 0xb3, 0xca, 0xd9, 0xdf, 0xcb, 0x2d, 0xdb, 0x69, 0x8a, 0x6d, 0x05, 0x2b, 0x47, 0x5c, 0xca, + 0xa0, 0x66, 0x84, 0x40, 0xde, 0x86, 0x29, 0xf6, 0xa3, 0xec, 0xb6, 0x5a, 0x6e, 0x1b, 0xd9, 0x8f, + 0x47, 0x81, 0xf4, 0x90, 0xa4, 0x8e, 0x45, 0xbc, 0x96, 0x18, 0x2e, 0x3b, 0x4f, 0xf0, 0x95, 0xb7, + 0xcb, 0xdf, 0x88, 0x26, 0xa2, 0xf3, 0x04, 0x49, 0x7d, 0x0e, 0x37, 0x55, 0x24, 0xf2, 0x26, 0x4c, + 0xb2, 0x9f, 0x77, 0x9d, 0x47, 0x94, 0x57, 0x38, 0x19, 0x99, 0x37, 0x20, 0xd5, 0x1e, 0x2b, 0xe1, + 0xf5, 0xe9, 0x98, 0xe4, 0x8b, 0x70, 0x0e, 0x39, 0xd5, 0xdd, 0x0e, 0x6d, 0x94, 0x76, 0x77, 0x9d, + 0xa6, 0xc3, 0xad, 0xd1, 0x78, 0x40, 0x19, 0xd4, 0xc1, 0xf3, 0x8a, 0x11, 0xc3, 0xb2, 0x23, 0x14, + 0x33, 0x9d, 0x92, 0x6c, 0x43, 0xa1, 0xdc, 0xf5, 0x03, 0xb7, 0x55, 0x0a, 0x02, 0xcf, 0xd9, 0xe9, + 0x06, 0xd4, 0x9f, 0x9f, 0xd6, 0xc2, 0xae, 0xb0, 0xc5, 0x11, 0x16, 0x72, 0x7d, 0x50, 0x1d, 0x29, + 0x2c, 0x3b, 0x24, 0x31, 0x13, 0x4c, 0x8c, 0x7f, 0x91, 0x81, 0x49, 0x8d, 0x94, 0xbc, 0x01, 0x13, + 0x77, 0x3c, 0x87, 0xb6, 0x1b, 0xcd, 0x23, 0xe5, 0xa2, 0x8a, 0xb7, 0x98, 0x5d, 0x01, 0xe7, 0xad, + 0xd6, 0xd0, 0x42, 0x3d, 0x4f, 0x36, 0xd5, 0x54, 0xf4, 0x06, 0x77, 0xc7, 0x16, 0x13, 0x34, 0x17, + 0xc5, 0x81, 0xc2, 0x09, 0x2a, 0x66, 0xa7, 0x82, 0x42, 0xde, 0x81, 0x11, 0xfe, 0x1e, 0x2c, 0xec, + 0x16, 0x2f, 0xa6, 0x35, 0x93, 0xbb, 0xfe, 0xe3, 0x44, 0x44, 0xa3, 0x1f, 0xdf, 0x14, 0x44, 0xc6, + 0xcf, 0x64, 0x80, 0x24, 0x51, 0x4f, 0xd1, 0x7b, 0x9d, 0x6a, 0x4c, 0xf4, 0x85, 0x70, 0x35, 0xe6, + 0x34, 0x9d, 0x39, 0xab, 0x89, 0x17, 0xf0, 0x8e, 0x17, 0xab, 0x4e, 0x55, 0xc4, 0xf1, 0x62, 0xe3, + 0x07, 0xb3, 0x00, 0x11, 0x36, 0xf9, 0x1c, 0x4f, 0x84, 0xf6, 0xc5, 0xae, 0xdd, 0x74, 0x76, 0x1d, + 0x3d, 0x6e, 0x2f, 0x32, 0xf9, 0x86, 0x2c, 0x31, 0x75, 0x44, 0xf2, 0x1e, 0x4c, 0xd7, 0x36, 0x74, + 0x5a, 0xc5, 0x2c, 0xde, 0xef, 0x58, 0x31, 0xf2, 0x38, 0x36, 0xda, 0x27, 0xab, 0xa3, 0xc1, 0xed, + 0x93, 0xf9, 0x40, 0x88, 0x12, 0xb6, 0xb1, 0xd4, 0x36, 0x84, 0xe5, 0x7f, 0x23, 0x7c, 0xd5, 0xc4, + 0xaf, 0xf3, 0x3b, 0x56, 0x47, 0xb8, 0x04, 0xb0, 0x7d, 0x42, 0xc3, 0x8b, 0x3a, 0x72, 0xb8, 0x87, + 0x7b, 0xff, 0xcf, 0xa2, 0xda, 0xaf, 0xe5, 0x06, 0x54, 0x68, 0x3b, 0x9e, 0xda, 0x7b, 0x4f, 0x64, + 0x4c, 0x30, 0xac, 0x79, 0x2d, 0x6b, 0xad, 0x13, 0x06, 0x33, 0xb7, 0xa2, 0x4b, 0x0a, 0x37, 0x2b, + 0x48, 0xb1, 0xb1, 0xf9, 0x07, 0x19, 0x38, 0x97, 0x4a, 0x4b, 0xae, 0x03, 0x44, 0x3a, 0x25, 0xd1, + 0x4b, 0xb8, 0x63, 0x46, 0xd1, 0x8f, 0x4c, 0x05, 0x83, 0x7c, 0x25, 0xae, 0x0d, 0x3a, 0xfd, 0x20, + 0x5c, 0x90, 0x41, 0x07, 0x75, 0x6d, 0x50, 0x8a, 0x0e, 0xc8, 0xf8, 0x95, 0x1c, 0xcc, 0x28, 0xc1, + 0x95, 0xf8, 0xb7, 0x9e, 0x62, 0x2f, 0x7e, 0x00, 0x13, 0xac, 0x35, 0x4e, 0x5d, 0xb8, 0xdd, 0x70, + 0xc3, 0x97, 0x57, 0x13, 0x7e, 0xa7, 0x82, 0xdb, 0x75, 0x15, 0x99, 0x87, 0x02, 0xc5, 0xad, 0x13, + 0x1f, 0x24, 0xea, 0x49, 0x97, 0x1b, 0x8d, 0x39, 0xf1, 0x61, 0xb2, 0x72, 0xd4, 0xb6, 0x5b, 0x61, + 0x6d, 0xdc, 0x00, 0xe6, 0x53, 0x3d, 0x6b, 0xd3, 0xb0, 0x79, 0x75, 0x91, 0x87, 0x16, 0x2f, 0x4b, + 0x09, 0x0e, 0xa0, 0x51, 0x2d, 0xbc, 0x07, 0x33, 0x89, 0x8f, 0x3e, 0x53, 0x54, 0xd2, 0x6d, 0x20, + 0xc9, 0xef, 0x48, 0xe1, 0xf0, 0x29, 0x3d, 0xe6, 0xed, 0xb9, 0xf0, 0xf1, 0xba, 0xd5, 0xb2, 0xdb, + 0x0d, 0x6e, 0x4e, 0xb3, 0xa8, 0xc6, 0x2c, 0xfd, 0xd9, 0xac, 0xea, 0xfb, 0xfb, 0xb4, 0xaf, 0xba, + 0x2f, 0x68, 0xb7, 0xe1, 0x4b, 0xbd, 0xc6, 0x74, 0x20, 0xad, 0xc3, 0xb7, 0x73, 0x70, 0xa1, 0x07, + 0x25, 0x39, 0x8a, 0x4f, 0x22, 0xae, 0x85, 0xb8, 0xd9, 0xbf, 0xc2, 0x27, 0x31, 0x95, 0xc8, 0xe7, + 0x78, 0xf4, 0x8f, 0xba, 0xdb, 0xde, 0x75, 0xf6, 0xc4, 0xfd, 0x1b, 0xd5, 0xf8, 0x07, 0x21, 0x34, + 0x1e, 0xf6, 0x83, 0x43, 0xc9, 0x7b, 0x30, 0x8c, 0x8e, 0xdf, 0xb1, 0xf0, 0x8e, 0x0c, 0x03, 0xe1, + 0x4a, 0x80, 0x52, 0xf6, 0x53, 0x0b, 0x50, 0xca, 0x00, 0xe4, 0xb3, 0x90, 0x2b, 0x6d, 0xd7, 0xc4, + 0xb8, 0x4c, 0xa9, 0xe4, 0xdb, 0xb5, 0x28, 0x7d, 0x8b, 0xad, 0xe5, 0x59, 0x61, 0x14, 0x8c, 0xf0, + 0x6e, 0x79, 0x43, 0x8c, 0x8a, 0x4a, 0x78, 0xb7, 0xbc, 0x11, 0x11, 0xee, 0xd5, 0xb5, 0x60, 0x59, + 0x77, 0xcb, 0x1b, 0x1f, 0xdf, 0xb4, 0xff, 0xf7, 0xb2, 0x3c, 0x64, 0x09, 0x6f, 0xd8, 0x7b, 0x30, + 0xa1, 0xc5, 0x24, 0xcf, 0x44, 0xf2, 0x58, 0x18, 0x3f, 0x3e, 0x66, 0x31, 0xa4, 0x11, 0xc8, 0x44, + 0x48, 0xec, 0x37, 0x4a, 0xbc, 0xaa, 0xb1, 0x4d, 0xc8, 0x01, 0x65, 0xe2, 0x78, 0x22, 0xa4, 0x90, + 0x84, 0xdc, 0x82, 0xfc, 0x26, 0x6d, 0xdb, 0xed, 0x20, 0x54, 0x88, 0xa2, 0x71, 0x71, 0x80, 0x30, + 0x5d, 0x6a, 0x08, 0x11, 0xd1, 0x10, 0xb6, 0xbb, 0xe3, 0xd7, 0x3d, 0x07, 0x43, 0x1b, 0x85, 0x67, + 0x31, 0x37, 0x84, 0x55, 0x4a, 0x74, 0x06, 0x31, 0x22, 0xe3, 0x67, 0x33, 0x30, 0x2a, 0x06, 0x92, + 0x27, 0xb0, 0xdb, 0x8b, 0xce, 0x12, 0xe1, 0x3c, 0xb0, 0xe7, 0xc4, 0x9d, 0x07, 0xf6, 0x78, 0xfc, + 0xa0, 0x31, 0xe1, 0x58, 0x17, 0x3e, 0x0d, 0xe2, 0x6c, 0x94, 0x6e, 0x9f, 0x7a, 0x7e, 0xb2, 0x10, + 0x75, 0x50, 0x87, 0x2c, 0xe3, 0xef, 0x89, 0x2f, 0xbb, 0x5b, 0xde, 0x20, 0x8b, 0x90, 0x5f, 0x75, + 0x79, 0x28, 0x2c, 0x35, 0x1b, 0x71, 0x53, 0xc0, 0xd4, 0x0e, 0x92, 0x78, 0xec, 0xfb, 0x36, 0x3c, + 0x57, 0xdc, 0x65, 0x94, 0xef, 0xeb, 0x70, 0x60, 0xec, 0xfb, 0x42, 0xd4, 0x81, 0xbf, 0x8f, 0xa6, + 0x6c, 0x12, 0x0f, 0x6f, 0x61, 0x86, 0x98, 0x7b, 0xaa, 0xa3, 0x9b, 0x28, 0x92, 0x3b, 0xc5, 0x42, + 0xaf, 0x9d, 0xe2, 0xe1, 0x2d, 0x33, 0x85, 0x0a, 0xdf, 0xd5, 0x22, 0x70, 0x8d, 0x7a, 0x8f, 0x9e, + 0xe2, 0x5d, 0x3a, 0xfd, 0x5d, 0x2d, 0xde, 0xbc, 0x81, 0x36, 0xe9, 0x3f, 0xcc, 0xc2, 0xf9, 0x74, + 0x42, 0xb5, 0x2d, 0x99, 0x3e, 0x6d, 0xb9, 0x0a, 0xf9, 0x15, 0xd7, 0x0f, 0x14, 0x23, 0x41, 0x54, + 0xff, 0xef, 0x0b, 0x98, 0x19, 0x96, 0xb2, 0x3b, 0x37, 0xfb, 0x3b, 0x5c, 0x9e, 0xc8, 0x0f, 0x03, + 0x75, 0xb0, 0x3b, 0x37, 0x2f, 0x22, 0x77, 0x21, 0x6f, 0x0a, 0x47, 0xab, 0x58, 0xd7, 0x48, 0x70, + 0x28, 0x4d, 0x11, 0x4f, 0x40, 0xb4, 0xd0, 0xf0, 0x02, 0x46, 0x4a, 0x30, 0x2a, 0x46, 0x3f, 0xf6, + 0x74, 0x9c, 0x32, 0x65, 0xf4, 0x6c, 0x0d, 0x92, 0x8e, 0xed, 0x28, 0xf8, 0x08, 0x58, 0xad, 0x48, + 0x9f, 0x29, 0xdc, 0x51, 0xf8, 0x23, 0xa1, 0x6e, 0x8f, 0x19, 0x22, 0x1a, 0xdf, 0xca, 0x02, 0x48, + 0xad, 0xcd, 0x53, 0x3b, 0xc3, 0x3e, 0xab, 0xcd, 0x30, 0xc5, 0xde, 0x68, 0xf0, 0x84, 0xcb, 0xeb, + 0x68, 0xce, 0x33, 0x78, 0xba, 0xe5, 0x22, 0x0c, 0x6f, 0x46, 0x0a, 0x2d, 0xe1, 0x92, 0x82, 0xea, + 0x68, 0x0e, 0x37, 0x76, 0x60, 0xee, 0x2e, 0x0d, 0x22, 0xf5, 0x96, 0x7c, 0x7a, 0xec, 0xcf, 0xf6, + 0x35, 0x18, 0x13, 0xf8, 0xe1, 0xfe, 0xc5, 0x75, 0x31, 0x22, 0xf6, 0x0d, 0xea, 0x62, 0x24, 0x02, + 0xdb, 0x8d, 0x2a, 0xb4, 0x49, 0x03, 0xfa, 0xf1, 0x56, 0x53, 0x03, 0xc2, 0x9b, 0x82, 0x2d, 0x1b, + 0xac, 0x86, 0x53, 0xfb, 0xe7, 0x21, 0x9c, 0x0b, 0xbf, 0xfd, 0x49, 0xf2, 0xbd, 0xc1, 0xae, 0x94, + 0x22, 0xd1, 0x41, 0xc4, 0xb1, 0x8f, 0xed, 0xc9, 0x63, 0x58, 0x90, 0x04, 0xdb, 0x4e, 0x68, 0x38, + 0x39, 0x10, 0x2d, 0x79, 0x1b, 0xc6, 0x15, 0x1a, 0x11, 0xa8, 0x1f, 0xd5, 0xd4, 0x87, 0x4e, 0xb0, + 0x6f, 0xf9, 0x1c, 0xae, 0xaa, 0xa9, 0x15, 0x74, 0xe3, 0xcb, 0xf0, 0x6c, 0xe8, 0x36, 0x94, 0x52, + 0x75, 0x8c, 0x79, 0xe6, 0x6c, 0xcc, 0xd7, 0xa2, 0x66, 0x55, 0xdb, 0xa1, 0x67, 0xb4, 0xe4, 0x4d, + 0xd4, 0x66, 0x89, 0xc6, 0x3c, 0x97, 0xf0, 0xb5, 0x56, 0x5c, 0xaa, 0x8d, 0xb7, 0x94, 0x8f, 0x4d, + 0x61, 0xa8, 0x11, 0x67, 0xe2, 0xc4, 0xdf, 0xca, 0xc2, 0xf4, 0x7a, 0xb5, 0x52, 0x0e, 0xad, 0x8f, + 0x3e, 0x61, 0xe9, 0xa0, 0xb5, 0xb6, 0xf5, 0xde, 0x6f, 0x8c, 0x2d, 0x98, 0x8d, 0x75, 0x03, 0x8a, + 0x0e, 0xef, 0x72, 0x87, 0x93, 0x10, 0x2c, 0xc5, 0x86, 0xf3, 0x69, 0xec, 0x1f, 0xde, 0x32, 0x63, + 0xd8, 0xc6, 0x7f, 0x09, 0x31, 0xbe, 0x62, 0x0b, 0x7b, 0x0d, 0xc6, 0xaa, 0xbe, 0xdf, 0xa5, 0xde, + 0x96, 0xb9, 0xaa, 0xaa, 0x0a, 0x1c, 0x04, 0x5a, 0x5d, 0xaf, 0x69, 0x46, 0x08, 0xe4, 0x1a, 0xe4, + 0x45, 0x90, 0x74, 0xb9, 0x27, 0xa0, 0xd6, 0x36, 0x8c, 0xb1, 0x6e, 0x86, 0xc5, 0xe4, 0x0d, 0x98, + 0xe0, 0x7f, 0xf3, 0xd9, 0x26, 0x3a, 0x1c, 0x95, 0x83, 0x02, 0x9d, 0xcf, 0x4e, 0x53, 0x43, 0x23, + 0xaf, 0x42, 0xae, 0x54, 0x36, 0x85, 0x3a, 0x48, 0xc8, 0x8d, 0x9e, 0xc5, 0x75, 0x76, 0xda, 0x25, + 0xa2, 0x6c, 0x32, 0xe9, 0x4f, 0x06, 0x9b, 0x10, 0x9a, 0x6c, 0x9c, 0x01, 0x52, 0xdb, 0x14, 0x3b, + 0xcc, 0x10, 0x46, 0x6e, 0xc0, 0x68, 0x85, 0x9b, 0xcc, 0x09, 0x3d, 0x36, 0xcf, 0x75, 0xc8, 0x41, + 0x5a, 0x70, 0x05, 0x0e, 0x22, 0xd7, 0x64, 0x86, 0xb6, 0x7c, 0xe4, 0xb7, 0xd2, 0x23, 0x0d, 0xdb, + 0x6b, 0x30, 0x22, 0x42, 0x89, 0x8f, 0x29, 0xb9, 0x5b, 0xe2, 0x21, 0xc4, 0x05, 0x4e, 0xd2, 0x81, + 0x15, 0x9e, 0xa4, 0x03, 0xeb, 0x0e, 0x5c, 0xb8, 0x8b, 0xda, 0x1b, 0x3d, 0x20, 0xd6, 0x96, 0x59, + 0x15, 0xfa, 0x70, 0x7c, 0x06, 0xe2, 0x0a, 0x9e, 0x78, 0x4c, 0x2d, 0xab, 0xeb, 0xa9, 0xa9, 0x7b, + 0x7b, 0x31, 0x22, 0x5f, 0x82, 0xb9, 0xb4, 0x22, 0xa1, 0x35, 0xc7, 0xd0, 0x4f, 0xe9, 0x15, 0xa8, + 0xa1, 0x9f, 0xd2, 0x38, 0x90, 0x55, 0x28, 0x70, 0x78, 0xa9, 0xd1, 0x72, 0xda, 0x5c, 0xf3, 0xcf, + 0xb5, 0xea, 0xe8, 0x48, 0x22, 0xb8, 0xda, 0xac, 0x90, 0xbf, 0x00, 0x68, 0xae, 0x47, 0x31, 0x4a, + 0xf2, 0x13, 0x19, 0x76, 0x9b, 0xe3, 0x81, 0xb7, 0xb7, 0xcc, 0x55, 0x5f, 0x84, 0x0d, 0x3c, 0x1f, + 0x79, 0x15, 0xd5, 0x02, 0xcf, 0x69, 0xef, 0x09, 0xb7, 0xa2, 0x4d, 0xe1, 0x56, 0xf4, 0xf6, 0x87, + 0x72, 0x2b, 0xe2, 0xac, 0xfc, 0x93, 0xe3, 0xe2, 0x84, 0x27, 0xea, 0xc4, 0x55, 0xa4, 0x7d, 0x01, + 0xeb, 0x3a, 0xf4, 0xad, 0xdd, 0x6a, 0xf3, 0xb0, 0xbf, 0xb4, 0xc1, 0x1b, 0x39, 0x8d, 0x3b, 0x38, + 0x76, 0x1d, 0xe6, 0x04, 0xb1, 0xba, 0x21, 0x42, 0xa2, 0xa1, 0xa9, 0x1c, 0xd8, 0xc5, 0x53, 0xba, + 0xae, 0x70, 0x6f, 0xdc, 0x42, 0x74, 0xf1, 0x94, 0x7e, 0x2e, 0x16, 0x4e, 0x23, 0x75, 0xf2, 0x68, + 0x24, 0xe4, 0x06, 0x8c, 0x3c, 0xb0, 0x1f, 0x97, 0xf6, 0xa8, 0xc8, 0xed, 0x39, 0x29, 0xb7, 0x3f, + 0x04, 0x2e, 0xe5, 0xff, 0x88, 0xfb, 0x3a, 0x3c, 0x63, 0x0a, 0x34, 0xf2, 0xbd, 0x19, 0x38, 0xcf, + 0x97, 0xb1, 0x6c, 0x65, 0x8d, 0x06, 0x01, 0xeb, 0x07, 0x11, 0x3f, 0xf0, 0x72, 0x64, 0xb0, 0x9d, + 0x8e, 0x87, 0x9e, 0xf7, 0x86, 0xd8, 0x19, 0xc2, 0x8e, 0xf3, 0x45, 0xa9, 0x16, 0x88, 0x39, 0x95, + 0x9e, 0x6c, 0xc2, 0xf8, 0x83, 0x3b, 0xa5, 0xb0, 0x5a, 0x1e, 0x9d, 0xbd, 0x98, 0xb6, 0x3b, 0x2a, + 0x68, 0x69, 0x9e, 0x06, 0x2a, 0x1b, 0xe1, 0x1d, 0xf0, 0x59, 0xd9, 0x1f, 0xe4, 0x75, 0xd5, 0x15, + 0x35, 0x87, 0xd2, 0xf3, 0x68, 0xcb, 0x7e, 0x6c, 0xd9, 0x7b, 0x54, 0x7b, 0x25, 0x17, 0xda, 0xeb, + 0x9f, 0xce, 0xc0, 0xc5, 0x9e, 0x4d, 0x26, 0xb7, 0xe1, 0x82, 0xcd, 0x1d, 0xac, 0xad, 0xfd, 0x20, + 0xe8, 0xf8, 0x96, 0xbc, 0x62, 0x08, 0xe7, 0x55, 0xf3, 0x9c, 0x28, 0x5e, 0x61, 0xa5, 0xf2, 0xd6, + 0xe1, 0x93, 0xf7, 0xe0, 0x39, 0xa7, 0xed, 0xd3, 0x7a, 0xd7, 0xa3, 0x96, 0x64, 0x50, 0x77, 0x1a, + 0x9e, 0xe5, 0xd9, 0xed, 0x3d, 0xe9, 0x89, 0x6b, 0x5e, 0x94, 0x38, 0xc2, 0x89, 0xbb, 0xec, 0x34, + 0x3c, 0x13, 0x11, 0x8c, 0x7f, 0x91, 0x81, 0xf9, 0x5e, 0x5d, 0x42, 0xe6, 0x61, 0x94, 0x2a, 0x79, + 0x5a, 0xf2, 0xa6, 0xfc, 0x49, 0x9e, 0x85, 0x68, 0xa7, 0x17, 0xa7, 0x7f, 0xbe, 0x2e, 0x72, 0x66, + 0xa0, 0x69, 0xbb, 0xba, 0xaf, 0x0b, 0x03, 0xe5, 0x89, 0xba, 0xba, 0xbb, 0x3f, 0x0f, 0x10, 0x6d, + 0xe7, 0x5c, 0x31, 0x61, 0x8e, 0xd9, 0x75, 0x8f, 0xaf, 0x3c, 0x72, 0x1e, 0x46, 0xf8, 0x76, 0x29, + 0xfc, 0x1f, 0xc4, 0x2f, 0x76, 0x6e, 0x8b, 0x4e, 0xc6, 0x7d, 0x3e, 0xb7, 0x34, 0xa1, 0x75, 0xf6, + 0x48, 0x0b, 0x07, 0xc7, 0xf8, 0xc9, 0x49, 0x2e, 0x42, 0x94, 0xba, 0xc1, 0xbe, 0x14, 0x3a, 0x16, + 0xd3, 0xfc, 0xc5, 0xb8, 0x2d, 0xa5, 0x62, 0x97, 0xad, 0x7b, 0x89, 0xc9, 0xb7, 0x9f, 0x6c, 0xea, + 0xdb, 0xcf, 0x6b, 0x30, 0x56, 0xde, 0xa7, 0xf5, 0x83, 0xd0, 0x09, 0x27, 0x2f, 0x94, 0xeb, 0x0c, + 0xc8, 0x43, 0xa2, 0x47, 0x08, 0xe4, 0x06, 0x00, 0xba, 0xa9, 0x72, 0x89, 0x54, 0x49, 0x6b, 0x82, + 0x5e, 0xad, 0xc2, 0x3c, 0x45, 0x41, 0x41, 0xf6, 0x35, 0xf3, 0x8e, 0x6a, 0xcf, 0xc2, 0xd9, 0xfb, + 0xde, 0xae, 0x40, 0x8f, 0x10, 0x58, 0xf3, 0x94, 0x7d, 0x45, 0x9c, 0x82, 0x85, 0xc4, 0xe6, 0xa3, + 0x22, 0x91, 0xeb, 0x30, 0xb6, 0x21, 0x1d, 0x09, 0xf0, 0x10, 0x9c, 0x40, 0x0a, 0x88, 0x9c, 0x0e, + 0xe6, 0x33, 0x66, 0x84, 0x42, 0x3e, 0x0b, 0xa3, 0x65, 0xea, 0x05, 0x9b, 0x9b, 0xab, 0x68, 0x74, + 0xc2, 0xb3, 0x7f, 0xe4, 0x31, 0x53, 0x43, 0x10, 0x34, 0xbf, 0x73, 0x5c, 0x9c, 0x0c, 0x9c, 0x16, + 0x0d, 0xa3, 0x9a, 0x9b, 0x12, 0x9b, 0x2c, 0x41, 0x81, 0x3f, 0x8b, 0x47, 0x77, 0x0f, 0x3c, 0x19, + 0xf3, 0xfc, 0x9c, 0x16, 0x6f, 0xe8, 0x87, 0x74, 0x27, 0xcc, 0x53, 0x91, 0xc0, 0x27, 0xcb, 0x32, + 0xbd, 0x8b, 0xda, 0x4c, 0x88, 0x94, 0x61, 0xf1, 0x1d, 0x83, 0xb5, 0x36, 0x49, 0x41, 0x4a, 0x30, + 0x59, 0x76, 0x5b, 0x1d, 0x3b, 0x70, 0x30, 0x0f, 0xe6, 0x91, 0x38, 0x04, 0x51, 0xa1, 0x57, 0x57, + 0x0b, 0xb4, 0x13, 0x55, 0x2d, 0x20, 0x77, 0x60, 0xca, 0x74, 0xbb, 0x6c, 0x98, 0xe4, 0x2d, 0x9c, + 0x9f, 0x73, 0x68, 0x1a, 0xe2, 0xb1, 0x12, 0x76, 0x2c, 0x8b, 0x2b, 0xb7, 0x16, 0x01, 0x56, 0xa3, + 0x22, 0x6b, 0x29, 0xcf, 0x21, 0xea, 0xe1, 0xa6, 0x66, 0xab, 0x48, 0x30, 0x4b, 0x79, 0x49, 0xb9, + 0x05, 0xe3, 0xb5, 0xda, 0xfa, 0x26, 0xf5, 0x83, 0x3b, 0x4d, 0xf7, 0x10, 0xcf, 0xb6, 0xbc, 0x48, + 0xae, 0xe6, 0xbb, 0x56, 0x40, 0xfd, 0xc0, 0xda, 0x6d, 0xba, 0x87, 0xa6, 0x8a, 0x45, 0xbe, 0xc6, + 0xfa, 0x43, 0x91, 0x04, 0x45, 0xac, 0xdb, 0x7e, 0xc2, 0x2a, 0x9e, 0x20, 0xd1, 0xa2, 0x61, 0x22, + 0xab, 0xde, 0x59, 0x0a, 0x3a, 0xfa, 0x94, 0x79, 0xee, 0xe3, 0xa3, 0x52, 0xa3, 0xe1, 0x51, 0xdf, + 0x17, 0x87, 0x10, 0xf7, 0x29, 0x43, 0x65, 0x83, 0xcd, 0x0b, 0x34, 0x9f, 0x32, 0x85, 0x80, 0xfc, + 0x70, 0x06, 0xce, 0xa9, 0xde, 0x26, 0xb8, 0x5c, 0xd0, 0xcc, 0x85, 0x1f, 0x49, 0xaf, 0x5f, 0x97, + 0x87, 0xf0, 0x75, 0x05, 0xed, 0xfa, 0xa3, 0x9b, 0xd7, 0x4b, 0xd1, 0xcf, 0x9a, 0x24, 0xc2, 0xb8, + 0x7d, 0xc5, 0x54, 0x7e, 0x5a, 0x6e, 0xa2, 0x39, 0x3b, 0x85, 0x98, 0x94, 0x99, 0xa4, 0xc6, 0x66, + 0x14, 0x1a, 0x4e, 0x55, 0x37, 0xf0, 0x4c, 0x13, 0x1a, 0x55, 0x31, 0xff, 0xb8, 0x89, 0x95, 0xd3, + 0xd1, 0x05, 0x32, 0x85, 0x86, 0x54, 0x61, 0x9a, 0x03, 0xd8, 0xb6, 0xc0, 0xd3, 0x3c, 0xcd, 0x46, + 0x89, 0x26, 0x04, 0x1b, 0x7c, 0xeb, 0xc7, 0x54, 0x4f, 0x6a, 0x70, 0xd6, 0x18, 0x1d, 0x79, 0x0f, + 0xa6, 0x30, 0x86, 0x7e, 0xb4, 0x5e, 0xe7, 0x70, 0x15, 0x63, 0x8c, 0x59, 0x51, 0x12, 0xf3, 0xbc, + 0x9b, 0xf0, 0xfd, 0xfd, 0x68, 0x45, 0xbf, 0x07, 0x53, 0x68, 0xab, 0x13, 0x31, 0x38, 0x17, 0x31, + 0x10, 0x25, 0x71, 0x06, 0x41, 0xd3, 0x8f, 0x18, 0xfc, 0x54, 0x06, 0x2e, 0xb2, 0x8a, 0xd2, 0x47, + 0xe8, 0xfc, 0x87, 0x19, 0x21, 0x8c, 0xba, 0xd9, 0x93, 0xa7, 0x2a, 0x8e, 0xfa, 0xfe, 0x7e, 0x1a, + 0x07, 0xfc, 0x28, 0xf6, 0xf1, 0xe9, 0x1f, 0x75, 0xe1, 0x43, 0x7f, 0x54, 0x4f, 0x9e, 0xea, 0x47, + 0x05, 0x4d, 0x3f, 0x8d, 0x03, 0x5e, 0x6b, 0x6b, 0xa5, 0x07, 0xab, 0xd1, 0xdd, 0xec, 0x93, 0xe5, + 0xb6, 0xa2, 0xb5, 0xad, 0x8f, 0xdb, 0xca, 0x16, 0xf7, 0xa2, 0x56, 0xba, 0x41, 0x5e, 0x6b, 0x35, + 0x70, 0xfc, 0x5a, 0x1b, 0xa3, 0x31, 0x63, 0xd8, 0xc6, 0x2f, 0x41, 0x8c, 0xaf, 0x30, 0x55, 0x35, + 0x60, 0x84, 0xdf, 0x5a, 0x45, 0x27, 0xa3, 0xcd, 0x02, 0xbf, 0xd3, 0x9a, 0xa2, 0x84, 0x5c, 0x84, + 0x5c, 0xad, 0xb6, 0x2e, 0x3a, 0x19, 0x0d, 0x56, 0x7d, 0xdf, 0x35, 0x19, 0x8c, 0x8d, 0x10, 0x5a, + 0xa1, 0x2a, 0x39, 0x09, 0xd8, 0x79, 0x67, 0x22, 0x94, 0xf5, 0xb7, 0xbc, 0x43, 0x0e, 0x45, 0xfd, + 0x2d, 0xee, 0x90, 0xd1, 0xcd, 0xb1, 0x0c, 0xf3, 0x25, 0xdf, 0xa7, 0x1e, 0x9b, 0x10, 0xc2, 0xb8, + 0xd1, 0x13, 0xf7, 0x1c, 0x71, 0xb0, 0x63, 0xa5, 0x76, 0xdd, 0x37, 0x7b, 0x22, 0x92, 0xab, 0x90, + 0x2f, 0x75, 0x1b, 0x0e, 0x6d, 0xd7, 0xb5, 0xb0, 0x6c, 0xb6, 0x80, 0x99, 0x61, 0x29, 0xf9, 0x22, + 0x9c, 0x8b, 0x45, 0x60, 0x14, 0x3d, 0x30, 0x1a, 0xed, 0xbd, 0xf2, 0x1e, 0x16, 0x19, 0x64, 0xf0, + 0x2e, 0x49, 0xa7, 0x24, 0x25, 0x28, 0x2c, 0xa3, 0x9b, 0x56, 0x85, 0xf2, 0xb7, 0x21, 0xd7, 0xe3, + 0xfe, 0x79, 0xfc, 0xd6, 0x2c, 0xe2, 0x4c, 0x36, 0xc2, 0x42, 0x33, 0x81, 0x4e, 0xee, 0xc3, 0x6c, + 0x1c, 0xc6, 0x4e, 0x70, 0x7e, 0x41, 0xc6, 0xfd, 0x26, 0xc1, 0x05, 0xcf, 0xf0, 0x34, 0x2a, 0xb2, + 0x03, 0x33, 0x91, 0x41, 0x92, 0x7e, 0x6d, 0x96, 0x76, 0xce, 0x61, 0xb9, 0xbc, 0x3a, 0x3f, 0x2b, + 0x26, 0xe3, 0x6c, 0x64, 0xdc, 0x14, 0x5e, 0x9f, 0xcd, 0x24, 0x3b, 0xd2, 0x80, 0xa9, 0x9a, 0xb3, + 0xd7, 0x76, 0xda, 0x7b, 0xf7, 0xe9, 0xd1, 0x86, 0xed, 0x78, 0xc2, 0xe2, 0x54, 0xda, 0x93, 0x97, + 0xfc, 0xa3, 0x56, 0x8b, 0x06, 0x1e, 0x6e, 0x84, 0xac, 0x1c, 0x7d, 0xd0, 0xd9, 0x75, 0x68, 0xc1, + 0xe7, 0x74, 0xe8, 0xb6, 0xd9, 0xb1, 0x1d, 0x4d, 0x08, 0xd0, 0x79, 0x6a, 0xaa, 0x8b, 0x89, 0x01, + 0x55, 0x17, 0x4d, 0x98, 0x59, 0x6e, 0xd7, 0xbd, 0x23, 0x7c, 0xa2, 0x93, 0x1f, 0x37, 0x79, 0xca, + 0xc7, 0xbd, 0x24, 0x3e, 0xee, 0x39, 0x5b, 0xce, 0xb0, 0xb4, 0xcf, 0x4b, 0x32, 0x26, 0x35, 0x98, + 0xc1, 0x8b, 0x43, 0xb5, 0xb2, 0x51, 0x6d, 0x3b, 0x81, 0x63, 0x07, 0xb4, 0x21, 0x84, 0x8b, 0x30, + 0x93, 0x0b, 0xbf, 0xa2, 0x3a, 0x8d, 0x8e, 0xe5, 0x48, 0x14, 0x95, 0x69, 0x82, 0xbe, 0xdf, 0x3d, + 0x71, 0xfa, 0x2f, 0xe9, 0x9e, 0x58, 0x85, 0xe9, 0x78, 0x28, 0x87, 0x42, 0x74, 0x0e, 0xfb, 0x58, + 0xc4, 0x8e, 0x73, 0xb7, 0x8b, 0xc2, 0xa4, 0x96, 0x3c, 0x35, 0x16, 0xc4, 0x21, 0x76, 0xe5, 0x9c, + 0xd1, 0xae, 0x9c, 0xda, 0xae, 0x74, 0x86, 0x2b, 0x27, 0xd9, 0x00, 0xb8, 0xe3, 0x7a, 0x75, 0x5a, + 0x42, 0xff, 0x68, 0xa2, 0xe5, 0xbb, 0x62, 0x4c, 0xa3, 0x42, 0xbe, 0x7e, 0x76, 0xd9, 0x6f, 0x2b, + 0xee, 0xe6, 0xae, 0xf0, 0x30, 0x7e, 0x24, 0x0b, 0xf3, 0xbd, 0x3e, 0xa7, 0xcf, 0x75, 0xef, 0x53, + 0x90, 0x5c, 0xe1, 0xe2, 0xda, 0x57, 0xa0, 0xf1, 0x75, 0xbe, 0x08, 0xe9, 0x0b, 0x59, 0x5c, 0x03, + 0x67, 0xe3, 0x04, 0x5b, 0x5e, 0x93, 0xdc, 0x86, 0x71, 0xe5, 0xe3, 0x71, 0x2f, 0xed, 0xd5, 0x54, + 0x13, 0x76, 0xc3, 0xbf, 0xd9, 0x35, 0x91, 0xef, 0x5b, 0xf2, 0x9a, 0xc8, 0x7f, 0x91, 0x02, 0x77, + 0x11, 0x1f, 0xe1, 0x56, 0x00, 0xbe, 0xef, 0x12, 0x02, 0xb8, 0x6f, 0xf3, 0x2d, 0xd0, 0xc4, 0xbf, + 0x8d, 0xdf, 0x98, 0xe0, 0x27, 0xb2, 0x7a, 0x4b, 0xec, 0x65, 0x1f, 0x1c, 0xbb, 0x3d, 0x66, 0xcf, + 0x72, 0x7b, 0xcc, 0x9d, 0x7e, 0x7b, 0x1c, 0x3a, 0xed, 0xf6, 0x18, 0xbb, 0xde, 0x0d, 0x9f, 0xf9, + 0x7a, 0x37, 0x72, 0xa6, 0xeb, 0xdd, 0xe8, 0x99, 0xae, 0x77, 0xda, 0x4d, 0x35, 0x7f, 0xda, 0x4d, + 0xf5, 0xaf, 0x2f, 0x83, 0x4f, 0xeb, 0x65, 0x30, 0x4d, 0xc4, 0x3b, 0xd3, 0x65, 0xf0, 0x87, 0x7a, + 0xde, 0xe5, 0x0a, 0x1f, 0x46, 0x28, 0x7f, 0x71, 0x80, 0xbb, 0xdc, 0xa0, 0x37, 0xb9, 0x99, 0x27, + 0x73, 0x93, 0x23, 0x4f, 0xec, 0x26, 0x37, 0xfb, 0x51, 0x6f, 0x72, 0x73, 0x4f, 0xf2, 0x26, 0x77, + 0xee, 0xaf, 0xe2, 0x4d, 0xee, 0xfc, 0xbf, 0x9d, 0x9b, 0xdc, 0xdf, 0x80, 0x42, 0x5c, 0xb8, 0x3c, + 0x3d, 0xea, 0xf1, 0x13, 0x0b, 0x39, 0xc9, 0x44, 0xdf, 0xb8, 0x70, 0x47, 0x6e, 0x00, 0x6c, 0x78, + 0xce, 0x23, 0x3b, 0xa0, 0xf7, 0xa5, 0xf5, 0x9b, 0x88, 0xd8, 0xcd, 0xa1, 0x6c, 0xe4, 0x4d, 0x05, + 0x25, 0xbc, 0xd7, 0x64, 0xd3, 0xee, 0x35, 0xc6, 0x0f, 0x67, 0x61, 0x86, 0xc7, 0x6d, 0x7b, 0xfa, + 0x1f, 0x61, 0xdf, 0xd5, 0x6e, 0xab, 0xcf, 0x45, 0x39, 0x02, 0xd4, 0xd6, 0xf5, 0x79, 0x86, 0xfd, + 0x2a, 0x9c, 0x4b, 0x74, 0x05, 0xde, 0x58, 0x2b, 0x32, 0x62, 0x5e, 0xe2, 0xce, 0x3a, 0x9f, 0x5e, + 0xc9, 0xc3, 0x5b, 0x66, 0x82, 0xc2, 0xf8, 0xf3, 0xa1, 0x04, 0x7f, 0xf1, 0x20, 0xab, 0x3e, 0xb1, + 0x66, 0xce, 0xf6, 0xc4, 0x9a, 0x1d, 0xec, 0x89, 0x35, 0x26, 0x54, 0xe4, 0x06, 0x11, 0x2a, 0xbe, + 0x08, 0x93, 0x9b, 0xd4, 0x6e, 0xf9, 0x9b, 0xae, 0x48, 0x38, 0xc5, 0x7d, 0x2d, 0x64, 0x40, 0x3c, + 0x56, 0x26, 0x2f, 0x5c, 0xa1, 0xcd, 0x68, 0xc0, 0x08, 0xd8, 0x31, 0xc8, 0x33, 0x50, 0x99, 0x3a, + 0x07, 0xf5, 0x16, 0x3d, 0xdc, 0xe7, 0x16, 0x5d, 0x83, 0x09, 0x41, 0x17, 0x85, 0x7a, 0x8e, 0xae, + 0x7b, 0xac, 0x08, 0xe1, 0xb2, 0xf6, 0x30, 0x1b, 0x7e, 0x58, 0x3b, 0xbf, 0xe9, 0x69, 0x4c, 0x58, + 0x17, 0x2c, 0xb7, 0x1b, 0x1d, 0xd7, 0x69, 0x63, 0x17, 0x8c, 0x46, 0x5d, 0x40, 0x05, 0x98, 0x77, + 0x81, 0x82, 0x44, 0xde, 0x86, 0xa9, 0xd2, 0x46, 0x55, 0x25, 0xcb, 0x47, 0xaf, 0xbc, 0x76, 0xc7, + 0xb1, 0x34, 0xd2, 0x18, 0x6e, 0xbf, 0x9b, 0xcf, 0xd8, 0x5f, 0xce, 0xcd, 0xc7, 0xf8, 0xa7, 0x93, + 0x72, 0x79, 0x7f, 0xbc, 0x0f, 0x24, 0xfa, 0x93, 0x47, 0xee, 0x8c, 0x4f, 0x1e, 0x43, 0xa7, 0x09, + 0x92, 0x9a, 0x7c, 0x3b, 0x7c, 0x26, 0xf9, 0x76, 0xe4, 0x23, 0x3f, 0x5f, 0x8c, 0x9e, 0x51, 0x62, + 0x8d, 0xad, 0xb5, 0xfc, 0x20, 0x6b, 0x2d, 0x55, 0xca, 0x1d, 0xfb, 0xe8, 0x52, 0x2e, 0x9c, 0x59, + 0xca, 0xad, 0x45, 0xbe, 0xcb, 0xe3, 0xa7, 0xba, 0x84, 0x3c, 0x2f, 0xb4, 0x02, 0x33, 0xe9, 0x51, + 0xf8, 0x42, 0x2f, 0xe6, 0x4f, 0x94, 0xe8, 0xfc, 0xf5, 0x74, 0xd1, 0xb9, 0xff, 0x79, 0x73, 0x26, + 0xe1, 0xf9, 0x87, 0x9f, 0xac, 0xf0, 0xfc, 0x64, 0x1f, 0x42, 0xfe, 0x5a, 0x7c, 0xfe, 0x6b, 0xf1, + 0x79, 0x30, 0xf1, 0x99, 0xac, 0x03, 0xb1, 0xbb, 0xc1, 0x3e, 0x6d, 0x07, 0x4e, 0x1d, 0xa3, 0xd2, + 0xb2, 0x21, 0xc6, 0x57, 0x19, 0xb1, 0x5e, 0x93, 0xa5, 0xea, 0x7a, 0xd5, 0x4a, 0xd1, 0xcf, 0xdb, + 0xc3, 0xf5, 0xba, 0x6d, 0x7b, 0x6d, 0xd4, 0x63, 0xdd, 0x80, 0x51, 0x19, 0xd7, 0x34, 0x13, 0xa9, + 0xa8, 0x93, 0x01, 0x4d, 0x25, 0x16, 0x59, 0x84, 0xbc, 0x24, 0x56, 0x13, 0xed, 0x1c, 0x0a, 0x98, + 0x16, 0x32, 0x52, 0xc0, 0x8c, 0xff, 0x68, 0x48, 0x9e, 0x09, 0xec, 0x13, 0x36, 0x6c, 0xcf, 0x6e, + 0x61, 0x0e, 0xbe, 0x70, 0xc9, 0x2a, 0xb7, 0x81, 0xd8, 0x2a, 0x8f, 0xf9, 0x0a, 0xe8, 0x24, 0x1f, + 0x2a, 0x30, 0x6d, 0x94, 0xe6, 0x38, 0x37, 0x40, 0x9a, 0xe3, 0x37, 0xb5, 0x1c, 0xc1, 0x43, 0x51, + 0x52, 0x4a, 0xb6, 0x4f, 0xf6, 0xcf, 0x0e, 0x7c, 0x5b, 0x4d, 0xe6, 0x3b, 0x1c, 0x85, 0x09, 0x43, + 0xca, 0x3e, 0x69, 0x7c, 0xc3, 0xeb, 0xcd, 0xc8, 0x59, 0x42, 0x3e, 0x8f, 0xfe, 0x5b, 0x0d, 0xf9, + 0xbc, 0x0c, 0x20, 0xce, 0xee, 0xc8, 0xde, 0xe1, 0x65, 0xdc, 0x4e, 0x84, 0xdd, 0x73, 0x10, 0x34, + 0x7b, 0xe4, 0x04, 0x51, 0x08, 0x8d, 0x3f, 0x20, 0x30, 0x53, 0xab, 0xad, 0x57, 0x1c, 0x7b, 0xaf, + 0xed, 0xfa, 0x81, 0x53, 0xaf, 0xb6, 0x77, 0x5d, 0x26, 0xdb, 0x87, 0xe7, 0x8b, 0x12, 0xac, 0x37, + 0x3a, 0x5b, 0xc2, 0x62, 0x76, 0x77, 0x5c, 0xf6, 0x3c, 0xa9, 0x70, 0xe5, 0x77, 0x47, 0xca, 0x00, + 0x26, 0x87, 0x33, 0xf1, 0xb9, 0xd6, 0xc5, 0x50, 0x19, 0xc2, 0x08, 0x05, 0xc5, 0x67, 0x9f, 0x83, + 0x4c, 0x59, 0x46, 0x68, 0x72, 0xc2, 0x8a, 0xeb, 0xd4, 0x05, 0x2d, 0x70, 0x74, 0x54, 0xcc, 0x57, + 0xa3, 0x90, 0x6e, 0x70, 0x1f, 0xee, 0x20, 0x5c, 0x35, 0xb1, 0x4b, 0xac, 0x81, 0x23, 0x38, 0xa7, + 0x39, 0x51, 0x0f, 0xfa, 0x3a, 0xf3, 0xaa, 0x10, 0xd7, 0x0d, 0x8c, 0xd9, 0x91, 0xf2, 0x44, 0xa3, + 0x26, 0xd5, 0x4b, 0xad, 0x81, 0x1d, 0x90, 0xcf, 0xa7, 0x96, 0x84, 0xab, 0x7b, 0x5c, 0x0b, 0xde, + 0xad, 0x6c, 0x1a, 0x3c, 0x7d, 0x60, 0xaf, 0xaa, 0xad, 0x94, 0xad, 0xa0, 0x7f, 0x4d, 0xe4, 0x37, + 0x33, 0x70, 0x41, 0xc3, 0x08, 0xf7, 0x3f, 0x3f, 0x8c, 0x2f, 0x92, 0x3a, 0xaf, 0x3f, 0x78, 0x32, + 0xf3, 0xfa, 0x45, 0xbd, 0x2d, 0xd1, 0x0e, 0xad, 0xb6, 0xa1, 0xd7, 0x17, 0x92, 0x47, 0x30, 0x83, + 0x45, 0xf2, 0xa5, 0x88, 0xcd, 0x59, 0xf1, 0xc0, 0x34, 0x17, 0x7d, 0x36, 0x0f, 0x0c, 0x80, 0x29, + 0xe0, 0x17, 0xbf, 0x7d, 0x5c, 0x9c, 0xd4, 0xd0, 0x65, 0x38, 0x6c, 0x2b, 0x7a, 0x6e, 0x72, 0xda, + 0xbb, 0xae, 0x96, 0xdf, 0x3f, 0x5e, 0x05, 0xf9, 0xaf, 0x33, 0xfc, 0x7d, 0x82, 0x37, 0xe3, 0x8e, + 0xe7, 0xb6, 0xc2, 0x72, 0x69, 0xab, 0xd9, 0xa3, 0xdb, 0x9a, 0x4f, 0xa6, 0xdb, 0x5e, 0xc6, 0x4f, + 0xe6, 0x7b, 0x82, 0xb5, 0xeb, 0xb9, 0xad, 0xe8, 0xf3, 0xd5, 0x8e, 0xeb, 0xf9, 0x91, 0xe4, 0xfb, + 0x32, 0x70, 0x51, 0x53, 0x93, 0xaa, 0xb9, 0x49, 0x44, 0xf8, 0x85, 0xd9, 0x30, 0x30, 0x4b, 0x54, + 0xb4, 0x74, 0x5d, 0xcc, 0xff, 0x2b, 0xf8, 0x05, 0x4a, 0x1c, 0x50, 0x86, 0x64, 0xb5, 0x38, 0x96, + 0xf2, 0x09, 0xbd, 0x6b, 0x21, 0x0e, 0xcc, 0xa0, 0xd9, 0x8e, 0x66, 0x53, 0x3c, 0xd7, 0xdb, 0xa6, + 0x38, 0xcc, 0x3a, 0x84, 0x19, 0x09, 0x7a, 0x1b, 0x16, 0x27, 0xb9, 0x92, 0xef, 0x81, 0x8b, 0x09, + 0x60, 0xb8, 0xda, 0xce, 0xf5, 0x5c, 0x6d, 0x9f, 0x3a, 0x39, 0x2e, 0xbe, 0x92, 0x56, 0x5b, 0xda, + 0x4a, 0xeb, 0x5d, 0x03, 0xb1, 0x01, 0xa2, 0x42, 0x21, 0xcf, 0xa4, 0x4f, 0xd0, 0x4f, 0x89, 0xf9, + 0xa1, 0xe0, 0xb3, 0xbd, 0x5c, 0xf9, 0x06, 0xf5, 0xc8, 0x8b, 0x90, 0x08, 0x85, 0x09, 0x25, 0x1b, + 0xc3, 0x91, 0xb0, 0x1e, 0xe9, 0x51, 0xc9, 0xb7, 0x8f, 0x8b, 0x1a, 0x36, 0xbb, 0x61, 0xa9, 0x69, + 0x1e, 0x34, 0xf1, 0x51, 0x45, 0x24, 0xbf, 0x9e, 0x81, 0x39, 0x06, 0x88, 0x26, 0x95, 0x68, 0xd4, + 0x7c, 0xbf, 0x59, 0xbf, 0xff, 0x64, 0x66, 0xfd, 0x0b, 0xf8, 0x8d, 0xea, 0xac, 0x4f, 0x74, 0x49, + 0xea, 0xc7, 0xe1, 0x6c, 0xd7, 0x2c, 0xc4, 0xb4, 0xd9, 0x7e, 0x71, 0x80, 0xd9, 0xce, 0x07, 0xe0, + 0xf4, 0xd9, 0xde, 0xb3, 0x16, 0xb2, 0x09, 0x13, 0xe2, 0x72, 0xc5, 0x3b, 0xec, 0x92, 0x16, 0x17, + 0x5a, 0x2d, 0xe2, 0x37, 0x5e, 0x91, 0xac, 0x22, 0xd1, 0x42, 0x8d, 0x0b, 0x69, 0xc3, 0x2c, 0xff, + 0xad, 0x2b, 0xbb, 0x8a, 0x3d, 0x95, 0x5d, 0x57, 0x45, 0x8b, 0x2e, 0x0b, 0xfe, 0x31, 0x9d, 0x97, + 0x1a, 0xcf, 0x29, 0x85, 0x31, 0xe9, 0x00, 0xd1, 0xc0, 0x7c, 0xd1, 0x5e, 0xee, 0xaf, 0xe2, 0x7a, + 0x45, 0xd4, 0x59, 0x8c, 0xd7, 0x19, 0x5f, 0xb9, 0x29, 0xbc, 0x89, 0x0d, 0xd3, 0x02, 0xea, 0x1e, + 0x50, 0xbe, 0xc3, 0xbf, 0xa0, 0x45, 0xd4, 0x8a, 0x95, 0xf2, 0x5b, 0x99, 0xac, 0x09, 0x23, 0x9e, + 0xc5, 0x36, 0xf4, 0x38, 0x3f, 0xb2, 0x0e, 0x33, 0xa5, 0x4e, 0xa7, 0xe9, 0xd0, 0x06, 0xb6, 0xd2, + 0xec, 0xb2, 0x36, 0x19, 0x51, 0xbe, 0x37, 0x9b, 0x17, 0x8a, 0xab, 0xa2, 0xd7, 0x8d, 0x6d, 0x37, + 0x09, 0x5a, 0xe3, 0x87, 0x32, 0x89, 0x8f, 0x26, 0xaf, 0xc1, 0x18, 0xfe, 0x50, 0x82, 0xb4, 0xa0, + 0xce, 0x88, 0x7f, 0x22, 0x6a, 0xa3, 0x22, 0x04, 0x26, 0x2c, 0xa9, 0x81, 0x1a, 0x73, 0x5c, 0x58, + 0x12, 0x8a, 0x8a, 0x48, 0x35, 0x51, 0x94, 0xbe, 0x1e, 0xb9, 0x48, 0xe8, 0x42, 0x5f, 0x0f, 0xe1, + 0xe1, 0x61, 0xfc, 0xe3, 0xac, 0x3e, 0xed, 0xc8, 0x55, 0x45, 0x6e, 0x57, 0x42, 0x45, 0x4a, 0xb9, + 0x5d, 0x91, 0xd6, 0xff, 0x41, 0x06, 0x66, 0xd7, 0x95, 0x44, 0xa1, 0x9b, 0x2e, 0x8e, 0x4b, 0xff, + 0xd4, 0x99, 0x4f, 0x2a, 0x05, 0xa0, 0x9a, 0xa1, 0x94, 0xcd, 0x14, 0x9c, 0x32, 0x66, 0xda, 0xf7, + 0xa0, 0xf7, 0x1c, 0x7e, 0x98, 0x92, 0x89, 0x91, 0xa3, 0x73, 0xf8, 0x19, 0x53, 0x57, 0x18, 0x3f, + 0x96, 0x85, 0x71, 0x65, 0xc5, 0x90, 0xcf, 0xc0, 0x84, 0x5a, 0xad, 0xaa, 0x70, 0x54, 0xbf, 0xd2, + 0xd4, 0xb0, 0x50, 0xe3, 0x48, 0xed, 0x96, 0xa6, 0x71, 0x64, 0xeb, 0x02, 0xa1, 0x67, 0xbc, 0x09, + 0xbd, 0x97, 0x72, 0x13, 0xc2, 0x59, 0xae, 0x68, 0x8c, 0xfa, 0xde, 0x87, 0xde, 0x4e, 0xde, 0x87, + 0x50, 0x79, 0xa5, 0xd0, 0xf7, 0xbe, 0x15, 0x19, 0x3f, 0x99, 0x81, 0x42, 0x7c, 0x4d, 0x7f, 0x2c, + 0xbd, 0x72, 0x86, 0xd7, 0xa5, 0x1f, 0xcd, 0x86, 0x99, 0x5b, 0xa4, 0x0b, 0xf1, 0xd3, 0x6a, 0xa6, + 0xf8, 0x8e, 0xf6, 0xf0, 0xf3, 0xac, 0x1e, 0x0d, 0x4f, 0x0d, 0xbe, 0x91, 0x1e, 0x02, 0x73, 0xe8, + 0xe7, 0x7e, 0xb1, 0xf8, 0x8c, 0xf1, 0x3e, 0xcc, 0xc5, 0xbb, 0x03, 0x1f, 0x7f, 0x4a, 0x30, 0xad, + 0xc3, 0xe3, 0x79, 0x9f, 0xe2, 0x54, 0x66, 0x1c, 0xdf, 0xf8, 0xa3, 0x6c, 0x9c, 0xb7, 0x30, 0x59, + 0x64, 0x7b, 0x94, 0x6a, 0x88, 0x23, 0xf6, 0x28, 0x0e, 0x32, 0x65, 0xd9, 0x59, 0xf2, 0xad, 0x85, + 0x8e, 0xb0, 0xb9, 0x74, 0x47, 0x58, 0x72, 0x3b, 0x66, 0xa5, 0xad, 0x44, 0x6d, 0x3a, 0xa4, 0x3b, + 0x56, 0x64, 0xa9, 0x1d, 0x33, 0xce, 0x2e, 0xc3, 0x9c, 0x16, 0x82, 0x5c, 0xd2, 0x0f, 0x47, 0xba, + 0xfe, 0x00, 0x0b, 0x38, 0x71, 0x2a, 0x32, 0x59, 0x81, 0x51, 0xf6, 0x99, 0x0f, 0xec, 0x8e, 0x78, + 0xd3, 0x21, 0xa1, 0x5b, 0x7c, 0x33, 0xbc, 0x1f, 0x2a, 0x9e, 0xf1, 0x4d, 0xca, 0x24, 0x04, 0x75, + 0x62, 0x09, 0x44, 0xe3, 0x5f, 0x65, 0xd8, 0xfa, 0xaf, 0x1f, 0x7c, 0xc2, 0x92, 0xb6, 0xb1, 0x26, + 0xf5, 0xb1, 0xa8, 0xfd, 0x93, 0x2c, 0xcf, 0xc5, 0x23, 0xa6, 0xcf, 0x9b, 0x30, 0xb2, 0x69, 0x7b, + 0x7b, 0x22, 0x65, 0xb6, 0xce, 0x85, 0x17, 0x44, 0x31, 0xa5, 0x02, 0xfc, 0x6d, 0x0a, 0x02, 0x55, + 0x75, 0x96, 0x1d, 0x48, 0x75, 0xa6, 0xbc, 0x0b, 0xe4, 0x9e, 0xd8, 0xbb, 0xc0, 0x77, 0x85, 0x69, + 0x77, 0x4a, 0xc1, 0x00, 0x11, 0xae, 0x2f, 0xc7, 0xb3, 0x5c, 0x25, 0x62, 0x91, 0x47, 0xec, 0xc8, + 0x6d, 0x35, 0x6f, 0x96, 0xe2, 0x5b, 0x7a, 0x4a, 0x86, 0x2c, 0xe3, 0x4f, 0x72, 0xbc, 0x8f, 0x45, + 0x47, 0x5d, 0xd1, 0xfc, 0xce, 0x71, 0x9d, 0xc4, 0xf4, 0x94, 0xdc, 0x03, 0xfd, 0x0a, 0x0c, 0xb1, + 0xb9, 0x29, 0x7a, 0x13, 0xf1, 0xd8, 0xfc, 0x55, 0xf1, 0x58, 0x39, 0x5b, 0xcb, 0x78, 0x26, 0xa9, + 0x09, 0x11, 0xf1, 0xd8, 0x52, 0xd7, 0x32, 0x62, 0x90, 0xab, 0x30, 0xb4, 0xe6, 0x36, 0x64, 0x24, + 0xf5, 0x39, 0x8c, 0x3e, 0xa2, 0x65, 0x5c, 0x9d, 0xcf, 0x98, 0x88, 0xc1, 0xda, 0x1a, 0xe6, 0x9f, + 0x50, 0xdb, 0xda, 0xda, 0xb5, 0x93, 0x89, 0xee, 0x94, 0xa4, 0x37, 0xcb, 0x30, 0xb5, 0xed, 0xb4, + 0x1b, 0xee, 0xa1, 0x5f, 0xa1, 0xfe, 0x41, 0xe0, 0x76, 0x84, 0xbd, 0x31, 0x6a, 0xf7, 0x0f, 0x79, + 0x89, 0xd5, 0xe0, 0x45, 0xea, 0xb3, 0x8c, 0x4e, 0x44, 0x96, 0x60, 0x52, 0x8b, 0xe0, 0x2a, 0x1e, + 0x57, 0x51, 0x1b, 0xaa, 0xc7, 0x7f, 0x55, 0xb5, 0xa1, 0x1a, 0x09, 0x3b, 0xcf, 0xc5, 0xf7, 0x2b, + 0x4f, 0xac, 0x89, 0x6f, 0x17, 0x38, 0xe4, 0x16, 0xe4, 0x79, 0x98, 0x8f, 0x6a, 0x45, 0x7d, 0x26, + 0xf3, 0x11, 0x16, 0x0b, 0x93, 0x23, 0x11, 0x95, 0xb0, 0x0e, 0x9f, 0x86, 0x82, 0xd8, 0x92, 0xa2, + 0x5c, 0xed, 0xcf, 0xc1, 0x50, 0xb9, 0x5a, 0x31, 0xd5, 0x6d, 0xa4, 0xee, 0x34, 0x3c, 0x13, 0xa1, + 0xe8, 0xd5, 0xb7, 0x46, 0x83, 0x43, 0xd7, 0x3b, 0x30, 0xa9, 0x1f, 0x78, 0x0e, 0xcf, 0xa7, 0x89, + 0x0b, 0xf1, 0x33, 0xe4, 0x6d, 0x18, 0x46, 0xc3, 0xd7, 0xd8, 0xc9, 0x10, 0xaf, 0x63, 0x69, 0x52, + 0x4c, 0xe0, 0x61, 0xb4, 0xa2, 0x35, 0x39, 0x11, 0x79, 0x13, 0x86, 0x2a, 0xb4, 0x7d, 0x14, 0x4b, + 0xf5, 0x97, 0x20, 0x0e, 0x37, 0x84, 0x06, 0x6d, 0x1f, 0x99, 0x48, 0x62, 0xfc, 0x64, 0x16, 0xce, + 0xa5, 0x7c, 0xd6, 0xc3, 0xcf, 0x3c, 0xa5, 0xbb, 0xe2, 0x92, 0xb6, 0x2b, 0xca, 0xf7, 0xf1, 0x9e, + 0x1d, 0x9f, 0xba, 0x49, 0xfe, 0x7c, 0x06, 0x2e, 0xe8, 0x13, 0x54, 0x58, 0xba, 0x3f, 0xbc, 0x45, + 0xde, 0x82, 0x91, 0x15, 0x6a, 0x37, 0xa8, 0xcc, 0xeb, 0x75, 0x2e, 0x0c, 0xc8, 0xc7, 0x63, 0x18, + 0xf0, 0x42, 0xce, 0x36, 0xf2, 0x78, 0xe5, 0x50, 0x52, 0x11, 0x1f, 0xc7, 0xc5, 0x77, 0x43, 0xc6, + 0x13, 0x49, 0xab, 0xaa, 0x8f, 0x95, 0xc9, 0xb7, 0x33, 0xf0, 0x6c, 0x1f, 0x1a, 0x36, 0x70, 0x6c, + 0xe8, 0xd5, 0x81, 0xc3, 0x13, 0x15, 0xa1, 0xe4, 0x5d, 0x98, 0xde, 0x14, 0xe2, 0xbf, 0x1c, 0x8e, + 0x6c, 0xb4, 0x5e, 0xe4, 0xcd, 0xc0, 0x92, 0xe3, 0x12, 0x47, 0xd6, 0x02, 0xdd, 0xe4, 0xfa, 0x06, + 0xba, 0x51, 0xe3, 0xc6, 0x0c, 0x0d, 0x1a, 0x37, 0xe6, 0x7d, 0x98, 0xd3, 0xdb, 0x26, 0xc2, 0xf7, + 0x46, 0x51, 0x73, 0x32, 0xbd, 0xa3, 0xe6, 0xf4, 0x0d, 0x12, 0x6a, 0xfc, 0x58, 0x06, 0x0a, 0x3a, + 0xef, 0x8f, 0x3a, 0x9e, 0xef, 0x68, 0xe3, 0xf9, 0x6c, 0xfa, 0x78, 0xf6, 0x1e, 0xc8, 0xff, 0x2b, + 0x13, 0x6f, 0xec, 0x40, 0x23, 0x68, 0xc0, 0x48, 0xc5, 0x6d, 0xd9, 0x4e, 0x5b, 0x4d, 0xfd, 0xdf, + 0x40, 0x88, 0x29, 0x4a, 0x06, 0x0b, 0x32, 0x74, 0x19, 0x86, 0xd7, 0xdc, 0x76, 0xa9, 0x22, 0x4c, + 0x8a, 0x91, 0x4f, 0xdb, 0x6d, 0x5b, 0x76, 0xc3, 0xe4, 0x05, 0x64, 0x15, 0xa0, 0x56, 0xf7, 0x28, + 0x6d, 0xd7, 0x9c, 0xef, 0xa6, 0x31, 0x49, 0x83, 0xf5, 0x50, 0xb3, 0x8b, 0x1b, 0x0b, 0x7f, 0x3a, + 0x45, 0x44, 0xcb, 0x77, 0xbe, 0x5b, 0xdd, 0x6f, 0x15, 0x7a, 0x5c, 0x57, 0x22, 0x0e, 0x5b, 0x6c, + 0x1c, 0x6e, 0x7e, 0x1c, 0xeb, 0x2a, 0xb5, 0x2a, 0xec, 0xe1, 0x9b, 0xa9, 0xc3, 0xf1, 0x87, 0x19, + 0x78, 0xb6, 0x0f, 0xcd, 0x13, 0x18, 0x95, 0xbf, 0xec, 0x0e, 0xa7, 0x00, 0x11, 0x11, 0x66, 0x52, + 0x76, 0x1a, 0x01, 0xcf, 0xd5, 0x37, 0x29, 0x32, 0x29, 0x33, 0x80, 0x96, 0x49, 0x99, 0x01, 0xd8, + 0x59, 0xba, 0x42, 0x9d, 0xbd, 0x7d, 0x6e, 0x1e, 0x36, 0xc9, 0xf7, 0x86, 0x7d, 0x84, 0xa8, 0x67, + 0x29, 0xc7, 0x31, 0xfe, 0xf5, 0x30, 0x5c, 0x34, 0xe9, 0x9e, 0xc3, 0xee, 0x25, 0x5b, 0xbe, 0xd3, + 0xde, 0xd3, 0xe2, 0xee, 0x18, 0xb1, 0x95, 0x2b, 0x92, 0x54, 0x30, 0x48, 0x38, 0x13, 0xaf, 0x41, + 0x9e, 0x89, 0x21, 0xca, 0xe2, 0xc5, 0x37, 0x2e, 0x26, 0xac, 0x88, 0xc0, 0xce, 0xb2, 0x98, 0xbc, + 0x2a, 0xc4, 0x24, 0x25, 0x8d, 0x10, 0x13, 0x93, 0xbe, 0x73, 0x5c, 0x84, 0xda, 0x91, 0x1f, 0x50, + 0xbc, 0x22, 0x0b, 0x51, 0x29, 0xbc, 0xcb, 0x0c, 0xf5, 0xb8, 0xcb, 0x3c, 0x80, 0xb9, 0x52, 0x83, + 0x9f, 0x8e, 0x76, 0x73, 0xc3, 0x73, 0xda, 0x75, 0xa7, 0x63, 0x37, 0xe5, 0xfd, 0x1c, 0x7b, 0xd9, + 0x0e, 0xcb, 0xad, 0x4e, 0x88, 0x60, 0xa6, 0x92, 0xb1, 0x66, 0x54, 0xd6, 0x6a, 0x18, 0x9e, 0x46, + 0x3c, 0x5f, 0x62, 0x33, 0x1a, 0x6d, 0x1f, 0x5b, 0xe1, 0x9b, 0x61, 0x31, 0xde, 0xa2, 0xd0, 0x20, + 0x60, 0x73, 0xb5, 0x16, 0xb9, 0x54, 0xf3, 0x2c, 0x07, 0xdc, 0xb0, 0x20, 0x68, 0xfa, 0x68, 0x8a, + 0xa9, 0xe1, 0x45, 0x74, 0xb5, 0xda, 0x0a, 0xa3, 0xcb, 0x27, 0xe8, 0x7c, 0x7f, 0x5f, 0xa5, 0xe3, + 0x78, 0xe4, 0x06, 0x9b, 0x0a, 0x2d, 0x37, 0xa0, 0x38, 0x85, 0xc7, 0xa2, 0x3b, 0x97, 0x87, 0x50, + 0x7e, 0xe7, 0x52, 0x50, 0xc8, 0xdb, 0x30, 0xbb, 0x5c, 0x5e, 0x94, 0x4a, 0xe7, 0x8a, 0x5b, 0xef, + 0xa2, 0x21, 0x00, 0x60, 0x7d, 0x38, 0x86, 0xb4, 0xbe, 0xc8, 0x76, 0x93, 0x34, 0x34, 0x72, 0x05, + 0x46, 0xab, 0x15, 0xde, 0xf7, 0xe3, 0x6a, 0x2a, 0x2f, 0x61, 0x99, 0x25, 0x0b, 0xc9, 0x7a, 0x74, + 0x29, 0x98, 0x38, 0x55, 0x7a, 0xbf, 0x38, 0xc0, 0x85, 0xe0, 0x4d, 0x98, 0x5c, 0x72, 0x83, 0x6a, + 0xdb, 0x0f, 0xec, 0x76, 0x9d, 0x56, 0x2b, 0x6a, 0x5c, 0xed, 0x1d, 0x37, 0xb0, 0x1c, 0x51, 0xc2, + 0xbe, 0x5c, 0xc7, 0x24, 0x9f, 0x43, 0xd2, 0xbb, 0xb4, 0x4d, 0xbd, 0x28, 0x9e, 0xf6, 0x30, 0xef, + 0x5b, 0x46, 0xba, 0x17, 0x96, 0x98, 0x3a, 0xa2, 0x48, 0x33, 0xc6, 0x93, 0x83, 0x96, 0xdd, 0x06, + 0xf5, 0xf9, 0x6e, 0xf1, 0x09, 0x4a, 0x33, 0xa6, 0xb4, 0xad, 0xcf, 0x0e, 0xfa, 0xef, 0x63, 0x9a, + 0xb1, 0x04, 0x2e, 0xf9, 0x1c, 0x0c, 0xe3, 0x4f, 0x21, 0xdd, 0xce, 0xa6, 0xb0, 0x8d, 0x24, 0xdb, + 0x3a, 0xc3, 0x34, 0x39, 0x01, 0xa9, 0xc2, 0xa8, 0xb8, 0x58, 0x9d, 0x25, 0x59, 0x8e, 0xb8, 0xa1, + 0xf1, 0x99, 0x21, 0xe8, 0x8d, 0x06, 0x4c, 0xa8, 0x15, 0xb2, 0x15, 0xb1, 0x62, 0xfb, 0xfb, 0xb4, + 0xc1, 0x7e, 0x89, 0x3c, 0x77, 0xb8, 0x22, 0xf6, 0x11, 0x6a, 0xb1, 0xef, 0x30, 0x15, 0x14, 0x76, + 0xa6, 0x56, 0xfd, 0x2d, 0x5f, 0x7c, 0x8a, 0x50, 0xb5, 0x38, 0xa8, 0xb6, 0x6b, 0x98, 0xa2, 0xc8, + 0xf8, 0x2e, 0x98, 0x5b, 0xeb, 0x36, 0x9b, 0xf6, 0x4e, 0x93, 0xca, 0x3c, 0x28, 0x98, 0x70, 0x7c, + 0x09, 0x86, 0x6b, 0x4a, 0x0a, 0xf3, 0x30, 0x17, 0xa5, 0x82, 0x83, 0x46, 0xb0, 0x19, 0x0c, 0x15, + 0x14, 0x4b, 0x5e, 0xce, 0x49, 0x8d, 0xdf, 0xcf, 0xc0, 0x9c, 0x34, 0x17, 0xf0, 0xec, 0xfa, 0x41, + 0x98, 0xc7, 0xfe, 0x8a, 0x36, 0xd7, 0x70, 0xc2, 0xc6, 0xa6, 0x11, 0x9f, 0x75, 0xf7, 0xe4, 0x47, + 0xe8, 0x02, 0x4b, 0xda, 0x07, 0x9f, 0xf6, 0x31, 0xe4, 0x6d, 0x18, 0x17, 0xc7, 0xa3, 0x12, 0xe0, + 0x12, 0xa3, 0x88, 0x89, 0xeb, 0x5e, 0xdc, 0x78, 0x45, 0x45, 0x47, 0x59, 0x4c, 0x6f, 0xca, 0x47, + 0x95, 0x01, 0xd2, 0x65, 0x31, 0xbd, 0x8e, 0x3e, 0x53, 0xf7, 0xb7, 0xc7, 0xe3, 0x7d, 0x2b, 0xe6, + 0xee, 0x6d, 0x35, 0xa4, 0x5d, 0x26, 0xba, 0x19, 0x47, 0x21, 0xed, 0xd4, 0x9b, 0x71, 0x88, 0x1a, + 0x8e, 0x49, 0xf6, 0x94, 0x31, 0x79, 0x57, 0x8e, 0x49, 0xae, 0xf7, 0xc4, 0x98, 0xed, 0x33, 0x0e, + 0xb5, 0x68, 0x85, 0x0c, 0x0d, 0xa4, 0x56, 0x79, 0x06, 0x63, 0xf7, 0x73, 0x92, 0xf8, 0x2e, 0x2a, + 0x38, 0xa9, 0xba, 0x9a, 0xe1, 0xc1, 0x99, 0x9e, 0xb2, 0x35, 0x7f, 0x1e, 0x26, 0x4a, 0x41, 0x60, + 0xd7, 0xf7, 0x69, 0xa3, 0xc2, 0xb6, 0x27, 0x25, 0xfa, 0x96, 0x2d, 0xe0, 0xea, 0x1b, 0x9b, 0x8a, + 0xcb, 0xa3, 0xc9, 0xda, 0xbe, 0x30, 0xa6, 0x0d, 0xa3, 0xc9, 0x32, 0x88, 0x1e, 0x4d, 0x96, 0x41, + 0xc8, 0x0d, 0x18, 0xad, 0xb6, 0x1f, 0x39, 0xac, 0x4f, 0x78, 0x00, 0x2e, 0xd4, 0x4d, 0x39, 0x1c, + 0xa4, 0x6e, 0xae, 0x02, 0x8b, 0xbc, 0xa9, 0x5c, 0x6a, 0xc6, 0x22, 0x05, 0x06, 0x57, 0x79, 0x85, + 0x11, 0x76, 0xd4, 0x0b, 0x4b, 0x78, 0xcb, 0xb9, 0x0d, 0xa3, 0x52, 0x93, 0x09, 0x91, 0xd2, 0x42, + 0x50, 0x26, 0x03, 0x56, 0x48, 0x64, 0xcc, 0x49, 0xae, 0xe4, 0xeb, 0x1b, 0x57, 0x72, 0x92, 0x2b, + 0xf9, 0xfa, 0xb4, 0x9c, 0xe4, 0x4a, 0xe6, 0xbe, 0x50, 0x09, 0x34, 0x71, 0xaa, 0x12, 0xe8, 0x21, + 0x4c, 0x6c, 0xd8, 0x5e, 0xe0, 0x30, 0x19, 0xa5, 0x1d, 0xf8, 0xf3, 0x93, 0x9a, 0xde, 0x54, 0x29, + 0x5a, 0xba, 0x24, 0xf3, 0x62, 0x77, 0x14, 0x7c, 0x3d, 0x81, 0x73, 0x04, 0x4f, 0x37, 0xa5, 0x9d, + 0xfa, 0x28, 0xa6, 0xb4, 0xd8, 0xa9, 0xa8, 0x2b, 0x9b, 0x8e, 0x34, 0x32, 0x78, 0x69, 0x89, 0x29, + 0xcc, 0x42, 0x44, 0xf2, 0x15, 0x98, 0x60, 0x7f, 0x6f, 0xb8, 0x4d, 0xa7, 0xee, 0x50, 0x7f, 0xbe, + 0x80, 0x8d, 0xbb, 0x94, 0xba, 0xfa, 0x11, 0xe9, 0xa8, 0x46, 0x03, 0xbe, 0x80, 0x91, 0x71, 0x5c, + 0x09, 0xae, 0x71, 0x23, 0xef, 0xc1, 0x04, 0x9b, 0x7d, 0x3b, 0xb6, 0xcf, 0x45, 0xd3, 0x99, 0xc8, + 0x18, 0xba, 0x21, 0xe0, 0x89, 0x80, 0xce, 0x2a, 0x01, 0x3b, 0xe6, 0x4b, 0x1d, 0xbe, 0x41, 0x12, + 0x65, 0xb6, 0x77, 0x12, 0x9b, 0xa3, 0x44, 0x23, 0x5f, 0x80, 0x89, 0x52, 0xa7, 0x13, 0xed, 0x38, + 0xb3, 0x8a, 0x22, 0xac, 0xd3, 0xb1, 0x52, 0x77, 0x1d, 0x8d, 0x22, 0xbe, 0x31, 0xcf, 0x9d, 0x69, + 0x63, 0x26, 0xaf, 0x87, 0xd2, 0xfa, 0xb9, 0x48, 0xab, 0x2b, 0x2e, 0x8e, 0x9a, 0xe8, 0xcf, 0x05, + 0xf7, 0x32, 0x4c, 0x72, 0x35, 0xa7, 0x94, 0x66, 0xce, 0x27, 0x56, 0x4f, 0x8a, 0x50, 0xa3, 0xd3, + 0x90, 0x65, 0x98, 0xe2, 0xde, 0xde, 0x4d, 0x11, 0x69, 0x7b, 0xfe, 0x02, 0xae, 0x5a, 0xe4, 0xc2, + 0x9d, 0xc4, 0x9b, 0x98, 0x80, 0xc5, 0xd6, 0xb8, 0xc4, 0x88, 0x8c, 0x3f, 0xcd, 0xc0, 0x85, 0x1e, + 0x23, 0x1e, 0xc6, 0x61, 0xce, 0xf4, 0x8f, 0xc3, 0xcc, 0x76, 0x0e, 0x5d, 0x2b, 0x82, 0xed, 0x17, + 0x52, 0x96, 0x3a, 0x5e, 0x52, 0xde, 0x72, 0x81, 0x88, 0x1c, 0x47, 0xa2, 0xea, 0x7b, 0x2e, 0xaa, + 0x66, 0x73, 0xc9, 0x43, 0x48, 0xe0, 0xf1, 0x8f, 0x5a, 0x32, 0x4e, 0x8e, 0x8b, 0x97, 0x44, 0x0a, + 0xa5, 0x70, 0x58, 0x3f, 0x70, 0xb5, 0x15, 0x9c, 0xc2, 0xda, 0x38, 0xce, 0xc0, 0xb8, 0xb2, 0x0e, + 0xc9, 0x65, 0xc5, 0x0b, 0xb9, 0xc0, 0x93, 0x70, 0x29, 0x1c, 0xb2, 0xfc, 0x24, 0xc2, 0x45, 0x95, + 0x3d, 0x5d, 0x01, 0xfd, 0x80, 0x89, 0x42, 0x4a, 0xac, 0xea, 0x96, 0xa6, 0x2d, 0x36, 0xb1, 0x1c, + 0xd3, 0xf9, 0xdb, 0x7e, 0x50, 0xaa, 0x07, 0xce, 0x23, 0x3a, 0xc0, 0xa1, 0x13, 0xa5, 0xf3, 0xb7, + 0xfd, 0xc0, 0xb2, 0x91, 0x2c, 0x91, 0xce, 0x3f, 0x64, 0x68, 0x7c, 0x7f, 0x06, 0x60, 0xab, 0x5a, + 0xc6, 0x60, 0xf3, 0x1f, 0x55, 0x28, 0x48, 0x0f, 0xe0, 0x2b, 0xb9, 0xf7, 0x11, 0x07, 0xfe, 0xa7, + 0x0c, 0x4c, 0xe9, 0x68, 0xe4, 0x5d, 0x98, 0xae, 0xd5, 0x3d, 0xb7, 0xd9, 0xdc, 0xb1, 0xeb, 0x07, + 0xab, 0x4e, 0x9b, 0xf2, 0xd0, 0xa9, 0xc3, 0xfc, 0x2c, 0xf2, 0xc3, 0x22, 0xab, 0xc9, 0xca, 0xcc, + 0x38, 0x32, 0xf9, 0x81, 0x0c, 0x4c, 0xd6, 0xf6, 0xdd, 0xc3, 0x30, 0xda, 0xa9, 0x18, 0x90, 0xaf, + 0xb2, 0xb5, 0xed, 0xef, 0xbb, 0x87, 0x51, 0x06, 0x4f, 0xcd, 0x56, 0xf4, 0x9d, 0xc1, 0x9e, 0xf1, + 0xeb, 0x2e, 0xde, 0x64, 0x02, 0xff, 0xba, 0x56, 0x89, 0xa9, 0xd7, 0x69, 0xfc, 0x45, 0x06, 0xc6, + 0xf1, 0xce, 0xd3, 0x6c, 0xa2, 0xcc, 0xf5, 0x49, 0x4a, 0x07, 0x19, 0xb6, 0xab, 0xcf, 0xc0, 0xbe, + 0x01, 0xd3, 0x31, 0x34, 0x62, 0xc0, 0x48, 0x0d, 0x03, 0x0c, 0xa8, 0x0a, 0x0a, 0x1e, 0x72, 0xc0, + 0x14, 0x25, 0xc6, 0xb2, 0x42, 0xf6, 0xf0, 0x26, 0x3e, 0xeb, 0x2e, 0x02, 0x38, 0x12, 0x24, 0x6f, + 0x36, 0x24, 0xfe, 0x25, 0x0f, 0x6f, 0x9a, 0x0a, 0x96, 0xb1, 0x06, 0x23, 0x35, 0xd7, 0x0b, 0x96, + 0x8e, 0xf8, 0x65, 0xa2, 0x42, 0xfd, 0xba, 0xfa, 0x6e, 0xeb, 0xe0, 0x5b, 0x49, 0xdd, 0x14, 0x45, + 0xa4, 0x08, 0xc3, 0x77, 0x1c, 0xda, 0x6c, 0xa8, 0xf6, 0xbc, 0xbb, 0x0c, 0x60, 0x72, 0x38, 0xbb, + 0x70, 0x9d, 0x8f, 0x72, 0xb2, 0x44, 0x86, 0xc3, 0x1f, 0x75, 0xdd, 0x94, 0xb5, 0xfe, 0x7d, 0x21, + 0xcc, 0x83, 0x90, 0xac, 0xa9, 0x4f, 0x57, 0xff, 0xe3, 0x0c, 0x2c, 0xf4, 0x26, 0x51, 0x6d, 0x91, + 0x33, 0x7d, 0x6c, 0x91, 0x5f, 0x8e, 0xbf, 0x33, 0x22, 0x9a, 0x78, 0x67, 0x8c, 0x5e, 0x17, 0x2b, + 0x68, 0x0a, 0x5e, 0xa7, 0x32, 0x11, 0xcb, 0xe5, 0x3e, 0xdf, 0x8c, 0x88, 0x7c, 0x98, 0x03, 0xa4, + 0x31, 0x05, 0xad, 0xf1, 0x5b, 0x43, 0x70, 0xb1, 0x27, 0x05, 0x59, 0x51, 0xd2, 0x3b, 0x4d, 0x85, + 0x89, 0x65, 0x7a, 0xe2, 0x5f, 0xc7, 0x7f, 0xd1, 0xda, 0x2f, 0xee, 0xed, 0xb6, 0x1e, 0xa6, 0xf5, + 0xc9, 0x22, 0xaf, 0x4f, 0x9d, 0xca, 0x8b, 0xa3, 0x23, 0x33, 0x48, 0x66, 0xf8, 0x41, 0xbf, 0x48, + 0x1a, 0xd8, 0x4e, 0xd3, 0x57, 0x97, 0x5d, 0x83, 0x83, 0x4c, 0x59, 0x16, 0x19, 0x88, 0x0f, 0xa5, + 0x1b, 0x88, 0x1b, 0xff, 0x3a, 0x03, 0x63, 0xe1, 0x67, 0x93, 0x05, 0x38, 0xbf, 0x69, 0x96, 0xca, + 0xcb, 0xd6, 0xe6, 0xfb, 0x1b, 0xcb, 0xd6, 0xd6, 0x5a, 0x6d, 0x63, 0xb9, 0x5c, 0xbd, 0x53, 0x5d, + 0xae, 0x14, 0x9e, 0x21, 0x33, 0x30, 0xb9, 0xb5, 0x76, 0x7f, 0x6d, 0x7d, 0x7b, 0xcd, 0x5a, 0x36, + 0xcd, 0x75, 0xb3, 0x90, 0x21, 0x93, 0x30, 0x66, 0x2e, 0x95, 0xca, 0xd6, 0xda, 0x7a, 0x65, 0xb9, + 0x90, 0x25, 0x05, 0x98, 0x28, 0xaf, 0xaf, 0xad, 0x2d, 0x97, 0x37, 0xab, 0x0f, 0xab, 0x9b, 0xef, + 0x17, 0x72, 0x84, 0xc0, 0x14, 0x22, 0x6c, 0x98, 0xd5, 0xb5, 0x72, 0x75, 0xa3, 0xb4, 0x5a, 0x18, + 0x62, 0x30, 0x86, 0xaf, 0xc0, 0x86, 0x43, 0x46, 0xf7, 0xb7, 0x96, 0x96, 0x0b, 0x23, 0x0c, 0x85, + 0xfd, 0xa5, 0xa0, 0x8c, 0xb2, 0xea, 0x11, 0xa5, 0x52, 0xda, 0x2c, 0x2d, 0x95, 0x6a, 0xcb, 0x85, + 0x3c, 0xb9, 0x00, 0xb3, 0x1a, 0xc8, 0x5a, 0x5d, 0xbf, 0x5b, 0x5d, 0x2b, 0x8c, 0x91, 0x39, 0x28, + 0x84, 0xb0, 0xca, 0x92, 0xb5, 0x55, 0x5b, 0x36, 0x0b, 0x10, 0x87, 0xae, 0x95, 0x1e, 0x2c, 0x17, + 0xc6, 0x8d, 0x77, 0xb8, 0x1f, 0x22, 0xef, 0x6a, 0x72, 0x1e, 0x48, 0x6d, 0xb3, 0xb4, 0xb9, 0x55, + 0x8b, 0x35, 0x7e, 0x1c, 0x46, 0x6b, 0x5b, 0xe5, 0xf2, 0x72, 0xad, 0x56, 0xc8, 0x10, 0x80, 0x91, + 0x3b, 0xa5, 0xea, 0xea, 0x72, 0xa5, 0x90, 0x35, 0x7e, 0x22, 0x03, 0x33, 0x52, 0x02, 0x94, 0x8f, + 0x46, 0x1f, 0x71, 0x2d, 0xbe, 0xab, 0x5d, 0x6c, 0xa5, 0x93, 0x58, 0xac, 0x92, 0x3e, 0xcb, 0xf0, + 0xe7, 0x33, 0x70, 0x2e, 0x15, 0x9b, 0xbc, 0x0f, 0x05, 0xf9, 0x05, 0x0f, 0xec, 0xa0, 0xbe, 0x1f, + 0xed, 0x63, 0x97, 0x62, 0xb5, 0xc4, 0xd0, 0xb8, 0x5a, 0x33, 0x4a, 0x38, 0x9d, 0x60, 0x33, 0x78, + 0x3a, 0x04, 0xe3, 0xe7, 0x32, 0x70, 0xa1, 0x47, 0x35, 0xa4, 0x0c, 0x23, 0x61, 0x62, 0x9c, 0x3e, + 0x06, 0x6f, 0x73, 0xdf, 0x3e, 0x2e, 0x0a, 0x44, 0xcc, 0xd0, 0x8b, 0x7f, 0x99, 0x23, 0x61, 0xa6, + 0x1b, 0x4c, 0x37, 0xc3, 0xbb, 0xef, 0x62, 0xac, 0xe7, 0x45, 0x4d, 0xa5, 0xed, 0xda, 0xd2, 0xb8, + 0xe8, 0xbb, 0x9c, 0x7d, 0xe8, 0x63, 0xbe, 0x19, 0xe3, 0xa7, 0x33, 0x4c, 0xb8, 0x8b, 0x23, 0x32, + 0x99, 0xb7, 0xe4, 0xfb, 0xdd, 0x16, 0x35, 0xdd, 0x26, 0x2d, 0x99, 0x6b, 0xe2, 0xd8, 0x40, 0x69, + 0xd5, 0xc6, 0x02, 0xbc, 0x56, 0x58, 0xb6, 0xd7, 0xd6, 0x5e, 0xab, 0x55, 0x1a, 0xf2, 0x26, 0xc0, + 0xf2, 0xe3, 0x80, 0x7a, 0x6d, 0xbb, 0x19, 0xc6, 0x88, 0xe1, 0x91, 0xad, 0x04, 0x54, 0x97, 0xb7, + 0x15, 0x64, 0xe3, 0x6f, 0x65, 0x60, 0x42, 0x5c, 0x9a, 0x4a, 0x4d, 0xea, 0x05, 0x1f, 0x6d, 0x7a, + 0xbd, 0xa9, 0x4d, 0xaf, 0xd0, 0xbf, 0x43, 0xe1, 0xcf, 0x8a, 0x53, 0x67, 0xd6, 0x3f, 0xcb, 0x40, + 0x21, 0x8e, 0x48, 0xde, 0x85, 0x7c, 0x8d, 0x3e, 0xa2, 0x9e, 0x13, 0x1c, 0x89, 0x8d, 0x52, 0xa6, + 0x10, 0xe4, 0x38, 0xa2, 0x8c, 0xcf, 0x07, 0x5f, 0xfc, 0x32, 0x43, 0x9a, 0x41, 0xf7, 0x7b, 0x45, + 0xed, 0x91, 0x7b, 0x52, 0x6a, 0x0f, 0xe3, 0x7f, 0xcb, 0xc2, 0x85, 0xbb, 0x34, 0x50, 0xdb, 0x14, + 0x9a, 0x17, 0x7c, 0x7a, 0xb0, 0x76, 0x29, 0x2d, 0x99, 0x87, 0x51, 0x2c, 0x92, 0xe3, 0x6b, 0xca, + 0x9f, 0x64, 0x29, 0x9c, 0xd7, 0x39, 0x2d, 0x47, 0x59, 0x8f, 0xba, 0xaf, 0x2b, 0x59, 0x8b, 0xc2, + 0x69, 0x7d, 0x05, 0xa6, 0x30, 0x2c, 0x7f, 0x97, 0x2d, 0x07, 0xda, 0x10, 0xea, 0x9f, 0xbc, 0x19, + 0x83, 0x92, 0x57, 0xa1, 0xc0, 0x20, 0xa5, 0xfa, 0x41, 0xdb, 0x3d, 0x6c, 0xd2, 0xc6, 0x1e, 0x6d, + 0xe0, 0xb1, 0x9e, 0x37, 0x13, 0x70, 0xc9, 0x73, 0xab, 0xcd, 0xaf, 0x6e, 0xb4, 0x81, 0x3a, 0x1a, + 0xc1, 0x33, 0x82, 0x2e, 0xbc, 0x09, 0xe3, 0x1f, 0x32, 0x03, 0x99, 0xf1, 0xbf, 0x66, 0x60, 0x0e, + 0x1b, 0xa7, 0x54, 0x2c, 0xb3, 0xc3, 0xca, 0xde, 0x52, 0x92, 0xf2, 0xd8, 0x0c, 0xa4, 0x2f, 0x85, + 0xb0, 0x17, 0x23, 0x9d, 0x50, 0x76, 0x00, 0x9d, 0x50, 0xed, 0x2c, 0x99, 0xf0, 0x07, 0x54, 0x69, + 0xdd, 0x1b, 0xca, 0xe7, 0x0a, 0x43, 0xd1, 0x90, 0x1b, 0x3f, 0x90, 0x85, 0x51, 0x93, 0x62, 0x8a, + 0x70, 0x72, 0x05, 0x46, 0xd7, 0xdc, 0x80, 0xfa, 0x0f, 0xb4, 0x7c, 0xf0, 0x6d, 0x06, 0xb2, 0x5a, + 0x0d, 0x53, 0x16, 0xb2, 0x09, 0xbf, 0xe1, 0xb9, 0x8d, 0x6e, 0x3d, 0x50, 0x27, 0x7c, 0x87, 0x83, + 0x4c, 0x59, 0x46, 0x5e, 0x83, 0x31, 0xc1, 0x39, 0x7c, 0xd4, 0x45, 0xdb, 0x65, 0x8f, 0x86, 0x29, + 0xe6, 0x23, 0x04, 0x94, 0x69, 0xb9, 0x80, 0x31, 0xa4, 0xc8, 0xb4, 0x09, 0x99, 0x41, 0x8a, 0xea, + 0xc3, 0x7d, 0x44, 0xf5, 0x4f, 0xc3, 0x48, 0xc9, 0xf7, 0x69, 0x20, 0xa3, 0x28, 0x4c, 0x84, 0x61, + 0xe3, 0x7c, 0x1a, 0x70, 0xc6, 0x36, 0x96, 0x9b, 0x02, 0xcf, 0xf8, 0x57, 0x59, 0x18, 0xc6, 0x3f, + 0xf1, 0xc9, 0xd4, 0xab, 0xef, 0x6b, 0x4f, 0xa6, 0x5e, 0x7d, 0xdf, 0x44, 0x28, 0xb9, 0x89, 0x9a, + 0x0a, 0x99, 0x3f, 0x4a, 0xb4, 0x1e, 0x55, 0xf0, 0x8d, 0x08, 0x6c, 0xaa, 0x38, 0xe1, 0x0b, 0x7f, + 0x2e, 0x35, 0x76, 0xca, 0x79, 0xc8, 0xae, 0xd7, 0x44, 0x8b, 0x31, 0x22, 0x97, 0xeb, 0x9b, 0xd9, + 0xf5, 0x1a, 0xf6, 0xc6, 0x4a, 0x69, 0xf1, 0x8d, 0xdb, 0xa2, 0xa1, 0xbc, 0x37, 0xf6, 0xed, 0xc5, + 0x37, 0x6e, 0x9b, 0xa2, 0x84, 0xf5, 0x2f, 0x7e, 0x33, 0x3e, 0xbc, 0x72, 0x9f, 0x7f, 0xec, 0x5f, + 0x6c, 0x1b, 0x3e, 0xb2, 0x9a, 0x11, 0x02, 0x59, 0x84, 0x71, 0x11, 0x6b, 0x02, 0xf1, 0x95, 0x58, + 0x10, 0x22, 0x16, 0x05, 0xa7, 0x50, 0x91, 0xf8, 0x13, 0x9c, 0x18, 0x20, 0x99, 0xe5, 0x56, 0x3c, + 0xc1, 0xc9, 0x21, 0xf4, 0x4d, 0x05, 0x85, 0x7d, 0x12, 0x7f, 0xc3, 0x8b, 0x7c, 0xf9, 0xa7, 0x94, + 0xa0, 0x05, 0x98, 0x66, 0x21, 0x44, 0x30, 0x7e, 0x39, 0x0b, 0xf9, 0x8d, 0x66, 0x77, 0xcf, 0x69, + 0x3f, 0xbc, 0x49, 0x08, 0xe0, 0x35, 0x4e, 0xe6, 0xe1, 0x60, 0x7f, 0x93, 0x8b, 0x90, 0x97, 0x37, + 0x37, 0xb9, 0x21, 0xf9, 0xe2, 0xd6, 0x36, 0x0f, 0x72, 0xdc, 0x45, 0xe8, 0x35, 0xf9, 0x93, 0xdc, + 0x84, 0xf0, 0xfe, 0xd5, 0xeb, 0xa2, 0x36, 0xc4, 0x16, 0x8b, 0x19, 0xa2, 0x91, 0xd7, 0x01, 0x0f, + 0x09, 0x71, 0x79, 0x90, 0x0a, 0x6d, 0xfe, 0x69, 0x42, 0x4e, 0xe1, 0x24, 0x88, 0x46, 0x6e, 0x81, + 0x98, 0x98, 0x22, 0x9b, 0xfa, 0x39, 0x9d, 0x80, 0xe7, 0xa7, 0x94, 0x24, 0x02, 0x95, 0xbc, 0x0d, + 0xe3, 0x75, 0x8f, 0xe2, 0xab, 0xa3, 0xdd, 0x8c, 0x92, 0xa4, 0xab, 0x94, 0xe5, 0xa8, 0xfc, 0xe1, + 0x4d, 0x53, 0x45, 0x37, 0x7e, 0x39, 0x0f, 0x13, 0xea, 0xf7, 0x10, 0x13, 0x66, 0xfd, 0x26, 0xbb, + 0xbb, 0x0b, 0x63, 0xb3, 0x0e, 0x16, 0x8a, 0xe3, 0xf4, 0xb2, 0xfe, 0x41, 0x0c, 0x8f, 0x5b, 0x9e, + 0xc9, 0x20, 0x19, 0x2b, 0xcf, 0x98, 0x33, 0x7e, 0x04, 0xe6, 0x78, 0xa4, 0x04, 0x79, 0xb7, 0xe3, + 0xef, 0xd1, 0xb6, 0x23, 0xdf, 0x5b, 0x5e, 0xd4, 0x18, 0xad, 0x8b, 0xc2, 0x04, 0xaf, 0x90, 0x8c, + 0xbc, 0x01, 0x23, 0x6e, 0x87, 0xb6, 0x6d, 0x47, 0x9c, 0x71, 0xcf, 0xc6, 0x18, 0xd0, 0x76, 0xa9, + 0xaa, 0x10, 0x0a, 0x64, 0x72, 0x03, 0x86, 0xdc, 0x83, 0x70, 0xbc, 0x2e, 0xea, 0x44, 0x07, 0x81, + 0xad, 0x90, 0x20, 0x22, 0x23, 0xf8, 0xc0, 0x6e, 0xed, 0x8a, 0x11, 0xd3, 0x09, 0xee, 0xd9, 0xad, + 0x5d, 0x95, 0x80, 0x21, 0x92, 0xf7, 0x00, 0x3a, 0xf6, 0x1e, 0xf5, 0xac, 0x46, 0x37, 0x38, 0x12, + 0xe3, 0x76, 0x49, 0x23, 0xdb, 0x60, 0xc5, 0x95, 0x6e, 0x70, 0xa4, 0xd0, 0x8e, 0x75, 0x24, 0x90, + 0x94, 0x00, 0x5a, 0x76, 0x10, 0x50, 0xaf, 0xe5, 0x0a, 0x6b, 0xbf, 0x28, 0x08, 0x22, 0x67, 0xf0, + 0x20, 0x2c, 0x56, 0x38, 0x28, 0x44, 0xf8, 0xd1, 0x8e, 0x67, 0x8b, 0x9c, 0xf6, 0xb1, 0x8f, 0x76, + 0x3c, 0xad, 0x95, 0x0c, 0x91, 0x7c, 0x0e, 0x46, 0x1b, 0x8e, 0x5f, 0x77, 0xbd, 0x86, 0x88, 0x9e, + 0xf2, 0x9c, 0x46, 0x53, 0xe1, 0x65, 0x0a, 0x99, 0x44, 0x67, 0x5f, 0x2b, 0x82, 0xa0, 0xae, 0xb9, + 0x87, 0xa8, 0xe6, 0x8f, 0x7f, 0x6d, 0x2d, 0x2c, 0x56, 0xbf, 0x36, 0x22, 0x62, 0x43, 0xb9, 0xe7, + 0x04, 0x4d, 0x7b, 0x47, 0xbc, 0x73, 0xeb, 0x43, 0x79, 0x17, 0x8b, 0xd4, 0xa1, 0xe4, 0xc8, 0xe4, + 0x4d, 0xc8, 0xd3, 0x76, 0xe0, 0xd9, 0x96, 0xd3, 0x10, 0x4e, 0x95, 0xfa, 0x47, 0xb3, 0x03, 0xd8, + 0xae, 0x56, 0xd4, 0x8f, 0x46, 0xfc, 0x6a, 0x83, 0xf5, 0x8f, 0x5f, 0x77, 0x5a, 0xc2, 0x17, 0x52, + 0xef, 0x9f, 0x5a, 0xb9, 0xfa, 0x40, 0xed, 0x1f, 0x86, 0x48, 0xde, 0x85, 0x51, 0xb6, 0x7e, 0x1b, + 0xee, 0x9e, 0x08, 0x48, 0x61, 0xe8, 0xfd, 0xc3, 0xcb, 0x12, 0xd3, 0x55, 0x12, 0xb1, 0x85, 0x6c, + 0x1f, 0xfa, 0x96, 0x53, 0x17, 0x41, 0x26, 0xf4, 0xe5, 0x58, 0xda, 0xae, 0x55, 0xcb, 0x0a, 0xd9, + 0xb0, 0x7d, 0xe8, 0x57, 0xeb, 0x64, 0x11, 0x86, 0x31, 0x45, 0x85, 0x08, 0x84, 0xa9, 0xd3, 0x60, + 0x72, 0x0a, 0x95, 0x06, 0x51, 0xd9, 0x40, 0xb6, 0x7c, 0x74, 0x2f, 0x11, 0x89, 0x22, 0xf4, 0x3e, + 0x79, 0x50, 0x43, 0x9f, 0x13, 0xf5, 0x13, 0x05, 0x3a, 0xb9, 0x04, 0x10, 0xbd, 0xe2, 0xf3, 0x37, + 0x17, 0x53, 0x81, 0x7c, 0x7e, 0xe8, 0xff, 0xfc, 0xc5, 0x62, 0x66, 0x09, 0x20, 0x2f, 0x23, 0xe4, + 0x18, 0xab, 0x70, 0xb1, 0xe7, 0xba, 0x27, 0xd7, 0xa0, 0xb0, 0x6b, 0x0b, 0xad, 0x5f, 0x7d, 0xdf, + 0x6e, 0xb7, 0x69, 0x53, 0xec, 0xb8, 0xd3, 0x12, 0x5e, 0xe6, 0x60, 0xce, 0xd9, 0x78, 0x0f, 0xe6, + 0xd2, 0x06, 0x9c, 0xbc, 0x00, 0x13, 0x6a, 0x30, 0x20, 0xc1, 0x64, 0xdc, 0xee, 0x38, 0x32, 0x1c, + 0x90, 0x60, 0xf0, 0x9b, 0x19, 0x78, 0xae, 0xdf, 0xf6, 0x41, 0x16, 0x20, 0xdf, 0xf1, 0x1c, 0x17, + 0xc5, 0x54, 0x91, 0x6d, 0x41, 0xfe, 0xc6, 0x44, 0x0a, 0x28, 0x4f, 0x05, 0xf6, 0x9e, 0x70, 0xf0, + 0x30, 0xc7, 0x10, 0xb2, 0x69, 0xff, 0xff, 0xec, 0x3d, 0x4b, 0x8c, 0x1b, 0xc9, 0x75, 0x6a, 0x92, + 0x33, 0xc3, 0x79, 0x9c, 0x4f, 0x4f, 0xe9, 0x33, 0xb3, 0xfa, 0xae, 0x7a, 0x25, 0x59, 0xe2, 0x7a, + 0xd7, 0x96, 0x36, 0xeb, 0xdd, 0xb5, 0xbd, 0xb6, 0x7b, 0x38, 0x3d, 0x43, 0x4a, 0xfc, 0xb9, 0x9b, + 0x1c, 0x59, 0x96, 0xed, 0x76, 0x8b, 0xec, 0x99, 0x69, 0x9b, 0xc3, 0xa6, 0xd9, 0xe4, 0xca, 0x32, + 0x02, 0xc4, 0x46, 0x00, 0x1b, 0xc8, 0xcf, 0x89, 0x93, 0x20, 0x8b, 0x5c, 0x7c, 0x88, 0x11, 0xe4, + 0x90, 0x6b, 0x90, 0x20, 0xc9, 0xc5, 0x37, 0x03, 0x86, 0x01, 0x03, 0xb9, 0x39, 0xc1, 0x22, 0x59, + 0x20, 0x01, 0xf2, 0xb9, 0x05, 0xc9, 0xc1, 0xa7, 0xa0, 0x5e, 0x55, 0x75, 0x57, 0x7f, 0x48, 0x8d, + 0xbc, 0xeb, 0x24, 0x06, 0x7c, 0x9a, 0xe1, 0xab, 0xf7, 0x5e, 0xd7, 0xbf, 0x5e, 0xbd, 0x7a, 0x9f, + 0xc3, 0x80, 0xbc, 0x08, 0x1b, 0x7d, 0xf7, 0xc0, 0x99, 0x0e, 0x26, 0x76, 0xd0, 0x3b, 0x72, 0xfb, + 0xe8, 0x82, 0x85, 0x86, 0x7b, 0xa6, 0xca, 0x0b, 0x2c, 0x01, 0x4f, 0xd5, 0x78, 0x61, 0x46, 0x8d, + 0xef, 0x16, 0x8a, 0x8a, 0x9a, 0x33, 0xd1, 0x52, 0x4a, 0xfb, 0x7a, 0x0e, 0xb6, 0x66, 0xad, 0x17, + 0xf2, 0x66, 0x56, 0x1f, 0xb0, 0x87, 0x0b, 0x19, 0x2e, 0x3f, 0x5c, 0x48, 0x5f, 0x23, 0x77, 0x20, + 0x74, 0xa0, 0x7a, 0x5a, 0x30, 0x04, 0x01, 0xa3, 0x34, 0x23, 0x27, 0x08, 0x1e, 0xd3, 0x2d, 0x21, + 0x2f, 0x05, 0xd4, 0xe5, 0x30, 0x99, 0x46, 0xc0, 0xc8, 0x6b, 0x00, 0xbd, 0x81, 0x1f, 0xb8, 0x68, + 0x1f, 0xc0, 0x65, 0x0d, 0x66, 0x16, 0x1e, 0x42, 0xe5, 0x07, 0x61, 0x84, 0x56, 0xfc, 0xbe, 0xcb, + 0x07, 0xd0, 0x81, 0xcd, 0x19, 0x1b, 0x24, 0x1d, 0x9e, 0x28, 0x3b, 0xbd, 0xc8, 0x75, 0x35, 0x0d, + 0x73, 0xd4, 0x27, 0x7b, 0x3c, 0x37, 0x6b, 0x8e, 0x3c, 0x01, 0x92, 0xde, 0x05, 0x29, 0x77, 0x6e, + 0xdc, 0x3c, 0x1d, 0x87, 0xdc, 0x19, 0xa4, 0x3b, 0x1e, 0x90, 0x2b, 0x50, 0x12, 0xb9, 0x2c, 0xa9, + 0x2c, 0xcf, 0x98, 0x03, 0x07, 0xdd, 0x73, 0x71, 0xf2, 0x60, 0xc4, 0x54, 0x74, 0x93, 0xe3, 0x52, + 0xc2, 0x32, 0x42, 0x3a, 0x4f, 0x46, 0xa2, 0x75, 0x17, 0xc5, 0xfc, 0x8e, 0x9f, 0x4d, 0xbc, 0xf4, + 0x0f, 0x15, 0x31, 0xfc, 0xe9, 0xcd, 0xfd, 0x69, 0xf5, 0x23, 0x80, 0x5e, 0x4a, 0xbc, 0x62, 0xf8, + 0x3f, 0x95, 0x5a, 0xc4, 0xaa, 0xe3, 0x52, 0x0b, 0xff, 0x49, 0x6e, 0xc0, 0xfa, 0x98, 0xd9, 0xb1, + 0x4e, 0x7c, 0xde, 0x9f, 0x2c, 0x6f, 0xc8, 0x2a, 0x03, 0x77, 0x7c, 0xec, 0x53, 0x5e, 0xaf, 0xbb, + 0x61, 0x87, 0x49, 0x67, 0x1d, 0x79, 0x19, 0x96, 0xe9, 0x59, 0x87, 0x91, 0x76, 0x12, 0xee, 0x11, + 0x88, 0x87, 0x92, 0x83, 0x59, 0xfc, 0x12, 0xff, 0x9f, 0xf3, 0x7a, 0x3b, 0x27, 0x98, 0xc9, 0x27, + 0x2d, 0xd9, 0x84, 0x25, 0x7f, 0x7c, 0x28, 0x35, 0x6d, 0xd1, 0x1f, 0x1f, 0xd2, 0x76, 0xdd, 0x04, + 0x95, 0x79, 0xeb, 0xb0, 0xa8, 0x09, 0xc1, 0x93, 0x21, 0xbb, 0x8a, 0x17, 0xcd, 0x35, 0x06, 0xc7, + 0x84, 0xfd, 0x4f, 0x86, 0x3d, 0x8a, 0x19, 0x04, 0xbe, 0x2d, 0x07, 0xd8, 0xe2, 0xcd, 0x5e, 0x0b, + 0x02, 0x3f, 0x8a, 0xb4, 0xd5, 0x27, 0xdb, 0xb0, 0x4a, 0xf9, 0x84, 0x61, 0xbe, 0xb8, 0x20, 0x70, + 0x29, 0x2d, 0x08, 0x3c, 0x19, 0xf6, 0x44, 0x15, 0xcd, 0x95, 0x40, 0xfa, 0x45, 0xee, 0x81, 0x2a, + 0x49, 0x4c, 0xe8, 0xbe, 0x99, 0xb0, 0xa9, 0x8e, 0xd8, 0x48, 0x92, 0x56, 0x6d, 0x78, 0xe0, 0x9b, + 0xeb, 0xbd, 0x38, 0x80, 0x77, 0xcd, 0x77, 0x15, 0xb1, 0x97, 0x66, 0x10, 0x11, 0x0d, 0x56, 0x8f, + 0x9c, 0xc0, 0x0e, 0x82, 0x63, 0x66, 0x23, 0xc6, 0x03, 0x0b, 0x97, 0x8e, 0x9c, 0xc0, 0x0a, 0x8e, + 0x45, 0xe2, 0x92, 0xb3, 0x14, 0xc7, 0x77, 0xa6, 0x93, 0x23, 0x5b, 0x96, 0xff, 0x58, 0x8f, 0x9d, + 0x3e, 0x72, 0x82, 0x16, 0x2d, 0x93, 0x78, 0x93, 0x6b, 0xb0, 0x86, 0x7c, 0x7b, 0x9e, 0x60, 0x8c, + 0x91, 0x2f, 0xcc, 0x15, 0xca, 0xb8, 0xe7, 0x31, 0xce, 0xbc, 0x86, 0xff, 0x9a, 0x83, 0x73, 0xd9, + 0xbd, 0x83, 0xd3, 0x93, 0xf6, 0x29, 0xfa, 0xe8, 0xf1, 0xba, 0x2d, 0x53, 0x08, 0x8b, 0x5a, 0x92, + 0x35, 0x38, 0xb9, 0xcc, 0xc1, 0x29, 0xc3, 0x06, 0x32, 0xe2, 0x92, 0xe6, 0xc0, 0x0b, 0x26, 0x3c, + 0x18, 0x87, 0xb9, 0x4e, 0x0b, 0xd8, 0x7e, 0x5e, 0xa7, 0x60, 0x72, 0x1d, 0xd6, 0xc4, 0x8e, 0xec, + 0x3f, 0x1e, 0xd2, 0x0f, 0xb3, 0xed, 0x78, 0x95, 0x43, 0x5b, 0x08, 0x24, 0x67, 0x61, 0xd1, 0x19, + 0x8d, 0xe8, 0x27, 0xd9, 0x2e, 0xbc, 0xe0, 0x8c, 0x46, 0x2c, 0xb9, 0x0e, 0x7a, 0x24, 0xda, 0x07, + 0x68, 0x25, 0xc4, 0x4d, 0x12, 0xcd, 0x15, 0x04, 0x32, 0xcb, 0xa1, 0x80, 0xae, 0x7b, 0x4a, 0x2b, + 0x50, 0x96, 0x10, 0x05, 0x9c, 0x51, 0x88, 0xf0, 0x1c, 0x14, 0xc5, 0x7b, 0x35, 0x73, 0xac, 0x30, + 0x97, 0x1c, 0xfe, 0x56, 0xfd, 0x2a, 0x6c, 0xf6, 0xbd, 0x00, 0x27, 0x2f, 0x6b, 0xd2, 0x68, 0xc4, + 0x7d, 0x20, 0x59, 0x90, 0x5e, 0xf3, 0x0c, 0x2f, 0xa6, 0x3d, 0xa9, 0x8f, 0x46, 0xcc, 0x13, 0x92, + 0xf7, 0xf5, 0xeb, 0xb0, 0xce, 0x25, 0x2e, 0x7e, 0x44, 0x62, 0x5d, 0xf8, 0x02, 0xa6, 0x57, 0x21, + 0x9e, 0xce, 0x08, 0x38, 0xa8, 0xd6, 0x17, 0x94, 0xff, 0xa0, 0xc0, 0xd9, 0x4c, 0x91, 0x8d, 0x7c, + 0x11, 0x98, 0xcb, 0xd7, 0xc4, 0xb7, 0xc7, 0x6e, 0xcf, 0x1b, 0x79, 0x18, 0x43, 0x83, 0xa9, 0x34, + 0xef, 0xcc, 0x13, 0xf6, 0xd0, 0x7d, 0xac, 0xe3, 0x9b, 0x21, 0x11, 0xd3, 0xb5, 0xa8, 0xe3, 0x04, + 0xf8, 0xfc, 0x43, 0x38, 0x9b, 0x89, 0x9a, 0xa1, 0x03, 0xf9, 0x60, 0x3c, 0x99, 0xb4, 0x78, 0xa4, + 0x4a, 0x34, 0x5a, 0xd2, 0x8d, 0xf0, 0xe6, 0x7d, 0x3f, 0x6c, 0x5e, 0x42, 0xb8, 0x23, 0x46, 0x72, + 0x5d, 0x67, 0xdd, 0x4f, 0x04, 0xd1, 0xec, 0xa5, 0xfd, 0x10, 0xce, 0xf2, 0xc9, 0x77, 0x38, 0x76, + 0x46, 0x47, 0x11, 0x3b, 0x56, 0xd1, 0x0f, 0x64, 0xb1, 0x63, 0xb3, 0x72, 0x8f, 0xe2, 0x87, 0x5c, + 0x4f, 0x3b, 0x69, 0x20, 0x6f, 0xc3, 0x37, 0x72, 0x62, 0xa9, 0x67, 0x54, 0x27, 0x63, 0x5a, 0x2b, + 0x59, 0xd3, 0xfa, 0xe4, 0x6b, 0xaa, 0x09, 0x44, 0xde, 0xac, 0x98, 0xd6, 0x93, 0x1b, 0x54, 0x09, + 0x39, 0x9d, 0x57, 0x44, 0xda, 0x1a, 0x2c, 0x96, 0xcc, 0x73, 0xa3, 0x97, 0x04, 0x91, 0x0b, 0xb0, + 0x1c, 0xe6, 0xcb, 0xe6, 0x07, 0x47, 0x91, 0x01, 0x6a, 0x7d, 0xf2, 0x3c, 0xac, 0x30, 0x91, 0x3c, + 0xb6, 0xe6, 0x00, 0x61, 0x3a, 0x5d, 0x78, 0xa2, 0x0f, 0x14, 0x78, 0xfe, 0x69, 0x7d, 0x48, 0xee, + 0xc3, 0x39, 0x34, 0xeb, 0x08, 0xfc, 0x70, 0x18, 0xec, 0x9e, 0xd3, 0x3b, 0x72, 0xf9, 0xac, 0xd5, + 0x32, 0x07, 0x63, 0x34, 0xb2, 0xac, 0x96, 0x34, 0x0e, 0xa3, 0x91, 0x15, 0xf8, 0xe2, 0x77, 0x85, + 0x92, 0xf3, 0x3a, 0xf4, 0xe1, 0xc2, 0x1c, 0x4a, 0x69, 0xe3, 0x50, 0xe4, 0x8d, 0xe3, 0x26, 0xa8, + 0x07, 0x6e, 0x9f, 0xca, 0xc4, 0x6e, 0x1f, 0xab, 0xf6, 0xd6, 0x1d, 0x96, 0x21, 0xde, 0x5c, 0x0b, + 0xe1, 0x56, 0xe0, 0xef, 0xdf, 0xe1, 0x5f, 0x39, 0x16, 0x47, 0x9e, 0x7c, 0xad, 0x20, 0x2f, 0xc3, + 0xe9, 0x44, 0x7c, 0x92, 0xc8, 0xe1, 0xdd, 0xdc, 0xa0, 0x45, 0xf1, 0x68, 0x56, 0x57, 0x61, 0x45, + 0xcc, 0x8a, 0x71, 0xe8, 0x07, 0x67, 0x96, 0x38, 0x8c, 0xae, 0x3a, 0xfe, 0xb9, 0xa9, 0x68, 0x54, + 0xe6, 0x8d, 0xe4, 0x04, 0xb2, 0x34, 0x79, 0x09, 0x48, 0x28, 0xb7, 0x87, 0x1b, 0x05, 0xff, 0xe0, + 0x86, 0x28, 0x09, 0x57, 0x38, 0xff, 0xec, 0xdf, 0xe6, 0xe0, 0x74, 0xc6, 0x55, 0x86, 0x5e, 0x02, + 0xbc, 0xe1, 0xc4, 0x3d, 0x64, 0x57, 0x08, 0xb9, 0x91, 0xeb, 0x12, 0x9c, 0xeb, 0xa7, 0x16, 0x59, + 0x06, 0x74, 0xfe, 0x2d, 0xfe, 0x8b, 0x6e, 0x1e, 0xce, 0x58, 0xa8, 0x5e, 0xe8, 0xbf, 0xa4, 0x06, + 0x1b, 0x98, 0xd6, 0x21, 0xf0, 0x7c, 0xcc, 0x0e, 0x81, 0x42, 0x48, 0x21, 0x76, 0xd9, 0xc1, 0x5a, + 0xb4, 0x25, 0x24, 0x2a, 0x85, 0x98, 0xea, 0x28, 0x01, 0x21, 0x1f, 0x83, 0xf3, 0xd2, 0x59, 0x63, + 0x27, 0x56, 0x1e, 0x5a, 0xba, 0x9b, 0x9b, 0x4e, 0x78, 0xea, 0xec, 0xc4, 0xd6, 0xe0, 0x36, 0x5c, + 0xc6, 0x41, 0xf4, 0xfa, 0x23, 0x3b, 0x95, 0x07, 0x04, 0x9b, 0xca, 0x02, 0xe7, 0x9f, 0xa7, 0x58, + 0xb5, 0xfe, 0x28, 0x91, 0x12, 0x84, 0xb6, 0x9a, 0x77, 0xdf, 0x43, 0x38, 0x9b, 0x59, 0x63, 0x7a, + 0xc0, 0xa0, 0x21, 0x55, 0x24, 0x1b, 0x2d, 0xd1, 0xdf, 0x54, 0x38, 0xba, 0x0a, 0x2b, 0x8f, 0x5c, + 0x67, 0xec, 0x8e, 0xf9, 0xc9, 0xcd, 0xa7, 0x04, 0x83, 0xc9, 0x07, 0x77, 0x3f, 0x3e, 0x34, 0x5c, + 0x67, 0x44, 0x1a, 0x70, 0x9a, 0x9d, 0x80, 0xde, 0x31, 0x0a, 0x83, 0x5c, 0xcf, 0xa4, 0xc4, 0xc4, + 0x21, 0x24, 0xc1, 0xa3, 0xa9, 0x86, 0x58, 0x8c, 0xda, 0xdc, 0x38, 0x4c, 0x82, 0xe8, 0x8a, 0x3e, + 0x97, 0x8d, 0x4d, 0xb6, 0xa1, 0xc4, 0x98, 0xb3, 0x6b, 0x01, 0x7b, 0x20, 0xb8, 0x3a, 0xf7, 0x0b, + 0x15, 0xb4, 0x2f, 0x0e, 0xc2, 0xff, 0xe9, 0x79, 0x8d, 0x6f, 0xb1, 0xf6, 0xb1, 0xfc, 0xfe, 0x61, + 0xae, 0x20, 0x90, 0xbf, 0x7b, 0x68, 0x7f, 0xa7, 0x88, 0xa6, 0xc6, 0x2e, 0xc7, 0x74, 0x6a, 0x05, + 0xee, 0x50, 0xbc, 0x01, 0x2d, 0x9b, 0xfc, 0xd7, 0x33, 0x4e, 0x75, 0xf2, 0x1a, 0xac, 0x50, 0xb6, + 0x87, 0xd3, 0x21, 0x9b, 0x72, 0xf9, 0x58, 0x5c, 0x9e, 0x06, 0x2b, 0xa2, 0xc3, 0x56, 0x3d, 0x65, + 0x96, 0x8e, 0xa3, 0x9f, 0x54, 0x5a, 0x0e, 0x8e, 0x27, 0x23, 0x79, 0xa2, 0x0a, 0x45, 0xa1, 0xd5, + 0xe8, 0xb4, 0x39, 0x49, 0x91, 0xe2, 0x44, 0xd2, 0xf2, 0xf6, 0x22, 0x53, 0x15, 0x6a, 0x2f, 0x42, + 0x49, 0xe2, 0x4d, 0x1b, 0xc3, 0x3c, 0x67, 0x44, 0x63, 0xd8, 0x2f, 0x3e, 0xd8, 0x8f, 0xa0, 0x28, + 0x58, 0xd2, 0x6b, 0xc1, 0x91, 0x1f, 0x88, 0x45, 0x8e, 0xff, 0x53, 0x18, 0xed, 0x65, 0x6c, 0xe4, + 0x82, 0x89, 0xff, 0xe3, 0x59, 0x32, 0x71, 0xe8, 0x7d, 0x60, 0x10, 0xd8, 0x23, 0xb4, 0xc0, 0x0a, + 0x85, 0x67, 0x0a, 0xef, 0x0c, 0x02, 0x66, 0x97, 0xc5, 0xbf, 0xf1, 0x57, 0xe1, 0x21, 0x9c, 0xd0, + 0x26, 0xcc, 0xda, 0x33, 0x63, 0x47, 0x46, 0x2e, 0x7d, 0x64, 0xb0, 0x78, 0x2b, 0x9c, 0x92, 0x7d, + 0x19, 0x10, 0x86, 0x47, 0x86, 0xb4, 0x33, 0x14, 0x62, 0x3b, 0x83, 0x74, 0x27, 0x8f, 0x46, 0x8f, + 0x9d, 0x38, 0xe2, 0x4e, 0x9e, 0xdc, 0xa7, 0xfe, 0x34, 0x27, 0x54, 0x04, 0xdb, 0xbe, 0x3f, 0x09, + 0x26, 0x63, 0x67, 0x14, 0x53, 0x85, 0x92, 0x63, 0x78, 0x0e, 0x25, 0xe8, 0x3b, 0x98, 0x42, 0xc3, + 0x1f, 0x8b, 0x10, 0x1f, 0xe1, 0xcc, 0x2d, 0xdd, 0xf9, 0x50, 0x5c, 0xc6, 0xd7, 0x29, 0xb6, 0x2e, + 0x23, 0xd3, 0x09, 0x2b, 0x71, 0xad, 0x9e, 0x32, 0x37, 0x19, 0xcf, 0x14, 0x16, 0xa9, 0x66, 0x2c, + 0xe2, 0xa4, 0x2e, 0x74, 0x3b, 0x5a, 0xd1, 0x71, 0xae, 0xf2, 0x5a, 0x27, 0x9f, 0x80, 0x65, 0xaf, + 0x2f, 0x67, 0x8a, 0x4c, 0x6a, 0xe1, 0x6a, 0x7d, 0x16, 0xad, 0x3a, 0xe2, 0x41, 0xe7, 0x9c, 0xc7, + 0xa1, 0xdb, 0xab, 0x31, 0xa5, 0xb1, 0xb6, 0x2d, 0x6e, 0xa3, 0x69, 0x32, 0xb2, 0x06, 0xb9, 0x70, + 0x84, 0x73, 0x5e, 0x9f, 0x2d, 0xaf, 0x28, 0x5e, 0xb6, 0xc9, 0x7f, 0x69, 0xbf, 0x0a, 0x37, 0x4f, + 0xda, 0x47, 0x74, 0x29, 0xce, 0xe8, 0xf0, 0x65, 0x16, 0xaa, 0x32, 0xde, 0x6f, 0x57, 0x41, 0x0e, + 0xf7, 0xeb, 0x89, 0xcd, 0x4f, 0xc0, 0xba, 0x63, 0x4f, 0xfb, 0xcb, 0x3c, 0xac, 0xc5, 0xd5, 0xe4, + 0xe4, 0x45, 0x28, 0x48, 0x3b, 0xd0, 0x66, 0x86, 0x2e, 0x1d, 0xf7, 0x1d, 0x44, 0x3a, 0xd1, 0x8e, + 0x43, 0xee, 0xc2, 0x1a, 0x1a, 0xee, 0xa1, 0xe8, 0x39, 0xf1, 0xf8, 0xe3, 0xcb, 0xfc, 0xf7, 0xb3, + 0xe2, 0x0f, 0xde, 0xb9, 0x72, 0x0a, 0x9f, 0xca, 0x56, 0x28, 0x2d, 0x95, 0xfe, 0x68, 0xa1, 0xa4, + 0x05, 0x2d, 0xcc, 0xd6, 0x82, 0xf2, 0xa6, 0xcc, 0xd0, 0x82, 0x2e, 0xcc, 0xd1, 0x82, 0x46, 0x94, + 0xb2, 0x16, 0x14, 0x75, 0xe1, 0x4b, 0xb3, 0x74, 0xe1, 0x11, 0x0d, 0xd3, 0x85, 0x47, 0x5a, 0xcc, + 0xe2, 0x4c, 0x2d, 0x66, 0x44, 0xc3, 0xb5, 0x98, 0xd7, 0x78, 0x1f, 0x8d, 0x9d, 0xc7, 0x36, 0x76, + 0x1e, 0x3f, 0x16, 0xb1, 0xf5, 0xa6, 0xf3, 0x18, 0x8d, 0x6b, 0xb6, 0x97, 0x41, 0x58, 0xe4, 0x68, + 0xbf, 0xaf, 0x24, 0x34, 0x81, 0x62, 0xfc, 0xae, 0xc3, 0x1a, 0x3b, 0xac, 0x78, 0x38, 0x53, 0x76, + 0x5a, 0xad, 0x9a, 0xab, 0x02, 0xca, 0xee, 0x9b, 0x1f, 0x80, 0xf5, 0x10, 0x8d, 0x5f, 0xb9, 0xd0, + 0x53, 0xcf, 0x0c, 0xa9, 0x79, 0xd8, 0x99, 0x17, 0x61, 0x23, 0x44, 0xe4, 0xda, 0x1c, 0x76, 0xdd, + 0x5c, 0x35, 0x55, 0x51, 0xd0, 0xe6, 0x70, 0xed, 0x30, 0x79, 0xf3, 0xf8, 0x39, 0xd5, 0x4a, 0xfb, + 0x7e, 0x3e, 0xa6, 0x25, 0x11, 0x9f, 0xa1, 0xa7, 0x68, 0xe0, 0xdb, 0xbc, 0x93, 0xf8, 0x5e, 0x74, + 0x75, 0xc6, 0x98, 0x71, 0x9b, 0x26, 0xcb, 0x6a, 0x99, 0x10, 0x04, 0xbe, 0x30, 0x71, 0xb2, 0x99, + 0x44, 0xcd, 0xce, 0x7d, 0x9c, 0xb3, 0x82, 0x1d, 0xdb, 0x78, 0xca, 0xf3, 0xd9, 0x89, 0x6b, 0x2a, + 0x9d, 0xb2, 0x28, 0x59, 0x87, 0xbf, 0xc4, 0x07, 0xba, 0x80, 0x4a, 0xc5, 0x20, 0xce, 0x3c, 0x9f, + 0x71, 0x77, 0x4a, 0x31, 0xc7, 0x5e, 0x42, 0xce, 0xea, 0x54, 0xfc, 0x2b, 0xd8, 0x1a, 0xb0, 0x82, + 0x3a, 0x0a, 0xc1, 0xb0, 0x90, 0xa1, 0x82, 0x4f, 0x37, 0xbe, 0x52, 0x6b, 0x98, 0x25, 0x4a, 0x27, + 0xd8, 0x1c, 0xc1, 0x73, 0xb2, 0x66, 0x21, 0x5e, 0xc9, 0x05, 0x11, 0xc5, 0x77, 0x6e, 0x0f, 0x44, + 0x0a, 0x08, 0xac, 0xea, 0x39, 0x27, 0x0e, 0xe0, 0x68, 0xda, 0x11, 0x9c, 0x9f, 0x3d, 0x24, 0x73, + 0x32, 0x44, 0x45, 0x07, 0x68, 0x4e, 0x3e, 0x40, 0x65, 0x3d, 0x43, 0x3e, 0xa6, 0x67, 0xd0, 0xfe, + 0x24, 0x0f, 0x2f, 0x9c, 0x60, 0xb8, 0xe6, 0x7c, 0xf3, 0x53, 0x71, 0xf1, 0x2c, 0x17, 0xbb, 0x19, + 0x52, 0xa6, 0x7c, 0x83, 0xa4, 0xb7, 0xd4, 0x6c, 0xe1, 0xec, 0x8b, 0xb0, 0xce, 0x76, 0x41, 0x66, + 0x96, 0x78, 0x30, 0x1d, 0x9c, 0x60, 0x1b, 0xbc, 0x20, 0x7c, 0xa8, 0x12, 0xa4, 0xb8, 0x33, 0xe2, + 0x8e, 0x61, 0x85, 0x30, 0xd2, 0x81, 0x12, 0xa2, 0x1d, 0x38, 0xde, 0xe0, 0x44, 0xce, 0x3c, 0xc2, + 0x43, 0x4b, 0x26, 0x63, 0xd6, 0xd4, 0x14, 0xb0, 0x8b, 0xbf, 0xc9, 0x0d, 0x58, 0x1f, 0x4e, 0x8f, + 0xa9, 0xe0, 0xc1, 0xe6, 0x02, 0xb7, 0xfe, 0x58, 0x30, 0x57, 0x87, 0xd3, 0x63, 0x7d, 0x34, 0xc2, + 0x21, 0x45, 0x33, 0x91, 0x0d, 0x8a, 0xc7, 0x56, 0xad, 0xc0, 0x5c, 0x44, 0x4c, 0xca, 0x80, 0xad, + 0x5b, 0x8e, 0x7b, 0x06, 0x98, 0xd1, 0x20, 0xcf, 0x90, 0xc5, 0x7e, 0x68, 0xff, 0x9d, 0x13, 0xf7, + 0xdd, 0xd9, 0xf3, 0xfe, 0x97, 0x43, 0x94, 0x31, 0x44, 0x37, 0x41, 0xa5, 0x5d, 0x1f, 0x6d, 0x2a, + 0xe1, 0x18, 0xad, 0x0d, 0xa7, 0xc7, 0x61, 0xdf, 0xc9, 0x1d, 0xbf, 0x28, 0x77, 0xfc, 0x6b, 0xe2, + 0x3e, 0x9c, 0xb9, 0x3d, 0xcc, 0xee, 0x72, 0xed, 0x3f, 0xf2, 0x70, 0xe3, 0x64, 0x9b, 0xc0, 0x2f, + 0xc7, 0x2d, 0x63, 0xdc, 0x12, 0xaa, 0xd3, 0x85, 0x94, 0xea, 0x34, 0x63, 0xed, 0x2d, 0x66, 0xad, + 0xbd, 0x94, 0xa2, 0x76, 0x29, 0x43, 0x51, 0x9b, 0xb9, 0x40, 0x8b, 0x4f, 0x59, 0xa0, 0xcb, 0xf2, + 0x3c, 0xf9, 0x97, 0x50, 0x81, 0x11, 0xbf, 0x0f, 0x3c, 0x84, 0xd3, 0xe2, 0x3e, 0xc0, 0x4e, 0x8e, + 0x48, 0xff, 0x5e, 0xba, 0x73, 0x2b, 0xeb, 0x26, 0x80, 0x68, 0x19, 0xd2, 0xfa, 0x06, 0xbf, 0x03, + 0x44, 0xe5, 0xff, 0x7f, 0xa4, 0x7f, 0xf2, 0x00, 0xce, 0x61, 0x7c, 0xf9, 0x9e, 0xfc, 0x72, 0x60, + 0x8f, 0xdd, 0x03, 0x3e, 0x1f, 0xae, 0xa6, 0x64, 0x65, 0xaf, 0x27, 0x55, 0xc7, 0x74, 0x0f, 0xaa, + 0xa7, 0xcc, 0x33, 0x41, 0x06, 0x3c, 0x79, 0xb1, 0xf8, 0x73, 0x05, 0xb4, 0xa7, 0xf7, 0x17, 0x2a, + 0xaa, 0x92, 0x1d, 0xbe, 0x6c, 0x96, 0x1c, 0xa9, 0xf7, 0x5e, 0x80, 0xd5, 0xb1, 0x7b, 0x30, 0x76, + 0x83, 0xa3, 0x98, 0x06, 0x64, 0x85, 0x03, 0x45, 0xc7, 0x88, 0xa0, 0x94, 0xcf, 0x24, 0x99, 0x0b, + 0x22, 0x6d, 0x37, 0xbc, 0x2f, 0x66, 0x8e, 0x03, 0x9d, 0x4d, 0x72, 0x05, 0xd9, 0x8f, 0xbb, 0x85, + 0x62, 0x4e, 0xcd, 0x9b, 0x3c, 0x74, 0xe6, 0x81, 0x37, 0x70, 0xb5, 0xbf, 0x56, 0x84, 0x44, 0x90, + 0xd5, 0x79, 0xe4, 0xa1, 0x64, 0xcc, 0x9b, 0x4f, 0x89, 0x21, 0x59, 0x24, 0xb2, 0xdd, 0x23, 0x0f, + 0xcf, 0x88, 0x80, 0x58, 0x78, 0x46, 0x84, 0xbc, 0x07, 0x8b, 0x44, 0x7e, 0x6b, 0x7e, 0x43, 0x58, + 0x04, 0xd1, 0x3d, 0x6f, 0xff, 0x36, 0xb9, 0x05, 0x4b, 0xcc, 0x08, 0x48, 0x54, 0x77, 0x3d, 0x56, + 0xdd, 0xfd, 0xdb, 0xa6, 0x28, 0xd7, 0xde, 0x0e, 0xdf, 0xb5, 0x52, 0x8d, 0xd8, 0xbf, 0x4d, 0x5e, + 0x3b, 0x99, 0x71, 0x6e, 0x51, 0x18, 0xe7, 0x86, 0x86, 0xb9, 0xaf, 0xc7, 0x0c, 0x73, 0xaf, 0xcd, + 0xef, 0x2d, 0xfe, 0x1a, 0xc9, 0xc2, 0x11, 0x46, 0x61, 0xaa, 0x7e, 0x92, 0x83, 0x4b, 0x73, 0x29, + 0xc8, 0x45, 0x28, 0xea, 0xed, 0x5a, 0x27, 0x1a, 0x5f, 0xba, 0x66, 0x04, 0x84, 0xec, 0xc1, 0xf2, + 0xb6, 0x13, 0x78, 0x3d, 0x3a, 0x8d, 0x33, 0x9f, 0x07, 0x52, 0x6c, 0x43, 0xf4, 0xea, 0x29, 0x33, + 0xa2, 0x25, 0x36, 0x6c, 0xe0, 0x5a, 0x88, 0xa5, 0x9e, 0xca, 0x67, 0xe8, 0x1a, 0x52, 0x0c, 0x53, + 0x64, 0x74, 0x9f, 0x49, 0x01, 0xc9, 0x23, 0x20, 0x96, 0x55, 0xad, 0xb8, 0xe3, 0x09, 0xbf, 0x83, + 0x4f, 0xbc, 0xd0, 0xd2, 0xf3, 0xc3, 0x4f, 0xe9, 0xbb, 0x14, 0x5d, 0xf5, 0x94, 0x99, 0xc1, 0x2d, + 0xb9, 0xcc, 0xdf, 0x12, 0xf2, 0xce, 0xec, 0x4e, 0x78, 0x86, 0x50, 0xaf, 0x37, 0xa1, 0xd8, 0x16, + 0xb6, 0x08, 0x92, 0xc5, 0xbc, 0xb0, 0x3b, 0x30, 0xc3, 0x52, 0xed, 0xb7, 0x14, 0xa1, 0x74, 0x78, + 0x7a, 0x67, 0x49, 0x99, 0xc1, 0xfa, 0xf3, 0x33, 0x83, 0xf5, 0x7f, 0xc6, 0xcc, 0x60, 0x9a, 0x07, + 0xb7, 0x4e, 0xdc, 0xb1, 0xe4, 0xe3, 0xa0, 0x62, 0x12, 0x25, 0x47, 0x1a, 0x24, 0xb6, 0xbe, 0x36, + 0xc2, 0xd8, 0xdf, 0x55, 0x9e, 0xa9, 0xce, 0x5c, 0xef, 0xc5, 0xa9, 0xb5, 0x3f, 0xe3, 0x31, 0xdf, + 0x6b, 0xfd, 0x76, 0x42, 0xd1, 0xfc, 0x5e, 0x9d, 0x2c, 0x8c, 0xd8, 0x62, 0x7b, 0x41, 0x4a, 0x62, + 0x99, 0xfe, 0xd6, 0x6c, 0x5f, 0x0b, 0x69, 0xe5, 0xfd, 0x51, 0x1e, 0x2e, 0xce, 0x23, 0xcf, 0x4c, + 0x93, 0xad, 0x3c, 0x5b, 0x9a, 0xec, 0x5b, 0x50, 0x64, 0xb0, 0xd0, 0x83, 0x00, 0xc7, 0x96, 0x93, + 0xd2, 0xb1, 0x15, 0xc5, 0xe4, 0x05, 0x58, 0xd4, 0x2b, 0x56, 0x94, 0xb9, 0x0d, 0x4d, 0x7d, 0x9d, + 0x5e, 0x80, 0x46, 0xa4, 0xbc, 0x88, 0x7c, 0x21, 0x9d, 0xac, 0x90, 0xa7, 0x6c, 0xbb, 0x20, 0x75, + 0x48, 0x2a, 0x1d, 0x03, 0xd6, 0x37, 0x4a, 0x1f, 0xc0, 0x23, 0x72, 0x9b, 0xe9, 0xc4, 0x87, 0x1a, + 0x2c, 0xb6, 0xc7, 0x6e, 0xe0, 0x4e, 0x64, 0x33, 0xdc, 0x11, 0x42, 0x4c, 0x5e, 0xc2, 0x8d, 0x64, + 0x9d, 0x27, 0x2c, 0x26, 0xc2, 0xa2, 0x1c, 0xa7, 0x06, 0xad, 0x6a, 0x29, 0xd8, 0x94, 0x50, 0x28, + 0x41, 0xdd, 0x99, 0x0e, 0x7b, 0x47, 0x5d, 0xb3, 0xce, 0x25, 0x27, 0x46, 0x30, 0x40, 0x28, 0x6d, + 0x60, 0x60, 0x4a, 0x28, 0xda, 0xb7, 0x14, 0x38, 0x93, 0xd5, 0x0e, 0x72, 0x11, 0x0a, 0xc3, 0xcc, + 0xbc, 0x8c, 0x43, 0xe6, 0xca, 0x5d, 0xa2, 0x7f, 0xed, 0x03, 0x7f, 0x7c, 0xec, 0x4c, 0x64, 0x63, + 0x65, 0x09, 0x6c, 0x02, 0xfd, 0xb1, 0x8b, 0xff, 0x93, 0x2b, 0xe2, 0xc8, 0xc9, 0xa7, 0x32, 0x39, + 0xe2, 0x1f, 0x4d, 0x07, 0xa8, 0xf5, 0xdb, 0xad, 0x11, 0x4b, 0x07, 0xf0, 0x0a, 0x14, 0x68, 0xb5, + 0x12, 0xb3, 0x97, 0xce, 0x1f, 0xbd, 0x51, 0xe7, 0x48, 0xac, 0x56, 0x81, 0x73, 0x3c, 0x30, 0x11, + 0x59, 0xbb, 0x0f, 0x6b, 0x71, 0x0c, 0x62, 0xc4, 0x23, 0xc2, 0x96, 0xee, 0xa8, 0x9c, 0xd3, 0xb6, + 0xef, 0x33, 0x87, 0x99, 0xed, 0xe7, 0x7e, 0xf2, 0xce, 0x15, 0xa0, 0x3f, 0x19, 0x4d, 0x56, 0xc4, + 0x58, 0xed, 0xdb, 0x39, 0x38, 0x13, 0xf9, 0xe8, 0x8b, 0x35, 0xf4, 0x0b, 0xeb, 0x30, 0xaa, 0xc7, + 0x1c, 0x1a, 0x85, 0xdc, 0x98, 0x6e, 0xe0, 0x1c, 0x3f, 0xaa, 0x3d, 0xd8, 0x9a, 0x85, 0x4f, 0x5e, + 0x84, 0x65, 0x0c, 0xeb, 0x34, 0x72, 0x7a, 0xae, 0xbc, 0xcd, 0x0e, 0x05, 0xd0, 0x8c, 0xca, 0xb5, + 0x1f, 0x29, 0x70, 0x9e, 0xbb, 0x79, 0x34, 0x1c, 0x6f, 0x88, 0xaf, 0x04, 0x3d, 0xf7, 0xfd, 0x71, + 0x78, 0xde, 0x8b, 0xed, 0x63, 0xd7, 0xe3, 0xde, 0x3c, 0xa9, 0xaf, 0xcd, 0x6e, 0x2d, 0xb9, 0x85, + 0xa1, 0xca, 0xf8, 0x2b, 0x7a, 0x81, 0x05, 0x98, 0x18, 0x52, 0x80, 0x1c, 0x60, 0x02, 0x31, 0xb4, + 0x5f, 0x83, 0xcb, 0xf3, 0x3f, 0x40, 0x3e, 0x0f, 0xab, 0x98, 0x7b, 0xab, 0x3b, 0x3a, 0x1c, 0x3b, + 0x7d, 0x57, 0x68, 0xf6, 0x84, 0x36, 0x56, 0x2e, 0x63, 0x91, 0xd7, 0x78, 0xc0, 0x83, 0x43, 0xcc, + 0xea, 0xc5, 0x89, 0x62, 0xbe, 0x54, 0x32, 0x37, 0xed, 0xeb, 0x0a, 0x90, 0x34, 0x0f, 0xf2, 0x11, + 0x58, 0xe9, 0x76, 0x2a, 0xd6, 0xc4, 0x19, 0x4f, 0xaa, 0xfe, 0x74, 0xcc, 0xc3, 0x9e, 0x31, 0xff, + 0xf7, 0x49, 0xcf, 0x66, 0xef, 0x41, 0x47, 0xfe, 0x74, 0x6c, 0xc6, 0xf0, 0x30, 0xc7, 0x93, 0xeb, + 0x7e, 0xb9, 0xef, 0x3c, 0x89, 0xe7, 0x78, 0xe2, 0xb0, 0x58, 0x8e, 0x27, 0x0e, 0xd3, 0xbe, 0xa7, + 0xc0, 0x05, 0x61, 0x1c, 0xd9, 0xcf, 0xa8, 0x4b, 0x05, 0xa3, 0xbc, 0x8c, 0x45, 0x9c, 0xdd, 0x79, + 0x12, 0xfa, 0x86, 0x08, 0x84, 0x84, 0x15, 0x44, 0x51, 0x9d, 0xd1, 0x92, 0x4f, 0x41, 0xc1, 0x9a, + 0xf8, 0xa3, 0x13, 0x44, 0x42, 0x52, 0xc3, 0x11, 0x9d, 0xf8, 0x23, 0x64, 0x81, 0x94, 0x9a, 0x0b, + 0x67, 0xe4, 0xca, 0x89, 0x1a, 0x93, 0x06, 0x2c, 0xf1, 0x90, 0x77, 0x09, 0xbb, 0x83, 0x39, 0x6d, + 0xda, 0x5e, 0x17, 0xe1, 0x96, 0x78, 0x9c, 0x57, 0x53, 0xf0, 0xd0, 0x7e, 0x47, 0x81, 0x12, 0x15, + 0x6c, 0xf0, 0x52, 0xfa, 0x5e, 0xa7, 0x74, 0x5c, 0x0e, 0x16, 0x66, 0x34, 0x21, 0xfb, 0x13, 0x9d, + 0xc6, 0xaf, 0xc2, 0x7a, 0x82, 0x80, 0x68, 0x18, 0x68, 0x63, 0xe0, 0xf5, 0x1c, 0x96, 0x32, 0x86, + 0x99, 0xa0, 0xc4, 0x60, 0xda, 0x6f, 0x28, 0x70, 0xa6, 0xf5, 0xe5, 0x89, 0xc3, 0x9e, 0x6d, 0xcd, + 0xe9, 0x40, 0xac, 0x77, 0x2a, 0xac, 0x09, 0x2b, 0x5b, 0x16, 0x04, 0x80, 0x09, 0x6b, 0x1c, 0x66, + 0x86, 0xa5, 0xa4, 0x0a, 0x45, 0x7e, 0xbe, 0x04, 0x3c, 0x3c, 0xeb, 0x65, 0x49, 0x37, 0x12, 0x31, + 0xe6, 0x48, 0xb4, 0x25, 0xb8, 0x85, 0x71, 0x1a, 0x33, 0xa4, 0xd6, 0xfe, 0x53, 0x81, 0xcd, 0x19, + 0x34, 0xe4, 0x4d, 0x58, 0x40, 0x07, 0x45, 0x3e, 0x7a, 0x17, 0x67, 0x7c, 0x62, 0xd2, 0x3b, 0xda, + 0xbf, 0xcd, 0x0e, 0xa2, 0x63, 0xfa, 0xc3, 0x64, 0x54, 0xe4, 0x21, 0x2c, 0xeb, 0xfd, 0x3e, 0xbf, + 0x9d, 0xe5, 0x62, 0xb7, 0xb3, 0x19, 0x5f, 0x7c, 0x39, 0xc4, 0x67, 0xb7, 0x33, 0xe6, 0x2a, 0xd3, + 0xef, 0xdb, 0xdc, 0xf9, 0x32, 0xe2, 0x77, 0xfe, 0xe3, 0xb0, 0x16, 0x47, 0x7e, 0x26, 0x7f, 0xb1, + 0xb7, 0x15, 0x50, 0xe3, 0x75, 0xf8, 0xf9, 0x04, 0x8a, 0xca, 0x1a, 0xe6, 0xa7, 0x4c, 0xaa, 0xdf, + 0xcb, 0xc1, 0xd9, 0xcc, 0x1e, 0x26, 0x2f, 0xc1, 0xa2, 0x3e, 0x1a, 0xd5, 0x76, 0xf8, 0xac, 0xe2, + 0x12, 0x12, 0x2a, 0xbd, 0x63, 0x97, 0x57, 0x86, 0x44, 0x5e, 0x81, 0x22, 0xb3, 0x0e, 0xd8, 0x11, + 0x1b, 0x0e, 0x46, 0xbe, 0xe1, 0xa6, 0x0b, 0xf1, 0x40, 0xa9, 0x02, 0x91, 0xec, 0xc2, 0x1a, 0x8f, + 0x19, 0x63, 0xba, 0x87, 0xee, 0x57, 0xc3, 0x88, 0xfd, 0x98, 0x54, 0x40, 0x68, 0xd2, 0xed, 0x31, + 0x2b, 0x93, 0xa3, 0xa6, 0xc4, 0xa9, 0x48, 0x1d, 0x54, 0xe4, 0x29, 0x73, 0x62, 0xd1, 0x5a, 0x31, + 0x8a, 0x0f, 0xab, 0xc4, 0x0c, 0x5e, 0x29, 0xca, 0x70, 0xb8, 0xf4, 0x20, 0xf0, 0x0e, 0x87, 0xc7, + 0xee, 0x70, 0xf2, 0xf3, 0x1b, 0xae, 0xe8, 0x1b, 0x27, 0x1a, 0xae, 0x3f, 0x28, 0xb0, 0xc5, 0x9c, + 0x24, 0xa3, 0x12, 0x8d, 0x14, 0xa0, 0x1b, 0x25, 0x1a, 0x7a, 0x3f, 0xe3, 0x51, 0x51, 0x76, 0x60, + 0x89, 0x45, 0xab, 0x11, 0x2b, 0xe3, 0x52, 0x66, 0x15, 0x18, 0xce, 0xfe, 0x6d, 0x26, 0xbe, 0x30, + 0x4f, 0xc9, 0xc0, 0x14, 0xa4, 0x64, 0x1f, 0x4a, 0x95, 0x81, 0xeb, 0x0c, 0xa7, 0xa3, 0xce, 0xc9, + 0x5e, 0x50, 0xb7, 0x78, 0x5b, 0x56, 0x7a, 0x8c, 0x0c, 0x5f, 0x5e, 0x71, 0x27, 0x97, 0x19, 0x91, + 0x4e, 0xe8, 0x3c, 0x55, 0x40, 0xc5, 0xeb, 0x87, 0xe7, 0xf4, 0x4f, 0x12, 0x88, 0x74, 0x71, 0xcf, + 0x40, 0xee, 0x5d, 0x65, 0xc3, 0x5a, 0xdd, 0x09, 0x26, 0x9d, 0xb1, 0x33, 0x0c, 0x30, 0xca, 0xe5, + 0x09, 0xa2, 0x80, 0x5d, 0x10, 0x19, 0x9c, 0x51, 0x65, 0x3a, 0x09, 0x49, 0x99, 0x42, 0x36, 0xce, + 0x8e, 0xca, 0x4b, 0xbb, 0xde, 0xd0, 0x19, 0x78, 0x5f, 0x13, 0x3e, 0xa6, 0x4c, 0x5e, 0x3a, 0x10, + 0x40, 0x33, 0x2a, 0xd7, 0x3e, 0x97, 0x1a, 0x37, 0x56, 0xcb, 0x12, 0x2c, 0xf1, 0x08, 0x04, 0xcc, + 0x23, 0xbf, 0x6d, 0x34, 0x77, 0x6a, 0xcd, 0x3d, 0x55, 0x21, 0x6b, 0x00, 0x6d, 0xb3, 0x55, 0x31, + 0x2c, 0x8b, 0xfe, 0xce, 0xd1, 0xdf, 0xdc, 0x5d, 0x7f, 0xb7, 0x5b, 0x57, 0xf3, 0x92, 0xc7, 0x7e, + 0x41, 0xfb, 0xa1, 0x02, 0xe7, 0xb2, 0x87, 0x92, 0x74, 0x00, 0x63, 0x36, 0xf0, 0xb7, 0xf4, 0x8f, + 0xcc, 0x1d, 0xf7, 0x4c, 0x70, 0x32, 0xf6, 0xc3, 0x84, 0xc5, 0x14, 0xc8, 0x89, 0xb7, 0x2f, 0xe6, + 0xa4, 0xe8, 0xf5, 0xcd, 0x9c, 0xd7, 0xd7, 0x2a, 0xb0, 0x35, 0x8b, 0x47, 0xbc, 0xa9, 0xeb, 0x50, + 0xd2, 0xdb, 0xed, 0x7a, 0xad, 0xa2, 0x77, 0x6a, 0xad, 0xa6, 0xaa, 0x90, 0x65, 0x58, 0xd8, 0x33, + 0x5b, 0xdd, 0xb6, 0x9a, 0xd3, 0xbe, 0xa3, 0xc0, 0x6a, 0x2d, 0xb2, 0x3a, 0x7b, 0xaf, 0x8b, 0xef, + 0xa3, 0xb1, 0xc5, 0xb7, 0x15, 0x46, 0x37, 0x09, 0x3f, 0x70, 0xa2, 0x95, 0xf7, 0x6e, 0x0e, 0x36, + 0x52, 0x34, 0xc4, 0x82, 0x25, 0xfd, 0xbe, 0xd5, 0xaa, 0xed, 0x54, 0x78, 0xcd, 0xae, 0x44, 0xe6, + 0x52, 0x98, 0xef, 0x2a, 0xf5, 0x15, 0xe6, 0x11, 0xfc, 0x38, 0xb0, 0x7d, 0xaf, 0x2f, 0x25, 0xbf, + 0xad, 0x9e, 0x32, 0x05, 0x27, 0x3c, 0xc9, 0xbe, 0x36, 0x1d, 0xbb, 0xc8, 0x36, 0x17, 0xd3, 0xeb, + 0x86, 0xf0, 0x34, 0x63, 0xf4, 0xdf, 0x70, 0x68, 0x79, 0x9a, 0x75, 0xc4, 0x8f, 0x34, 0x61, 0x71, + 0xcf, 0x9b, 0x54, 0xa7, 0x8f, 0xf8, 0xfa, 0xbd, 0x1c, 0x65, 0x3f, 0xaa, 0x4e, 0x1f, 0xa5, 0xd9, + 0xa2, 0xca, 0x92, 0x45, 0xef, 0x89, 0xb1, 0xe4, 0x5c, 0x92, 0x4e, 0x8c, 0x85, 0x67, 0x72, 0x62, + 0xdc, 0x5e, 0x85, 0x12, 0xbf, 0x43, 0xe1, 0xf5, 0xe4, 0xfb, 0x0a, 0x6c, 0xcd, 0xea, 0x39, 0x7a, + 0x2d, 0x8b, 0x07, 0x2b, 0x38, 0x17, 0xa6, 0xc7, 0x88, 0x47, 0x29, 0x10, 0x68, 0xe4, 0x93, 0x50, + 0xaa, 0x05, 0xc1, 0xd4, 0x1d, 0x5b, 0xaf, 0x74, 0xcd, 0x1a, 0x9f, 0xae, 0x97, 0xfe, 0xed, 0x9d, + 0x2b, 0x9b, 0xe8, 0xf3, 0x31, 0xb6, 0x83, 0x57, 0xec, 0xe9, 0xd8, 0x8b, 0xa5, 0x12, 0x90, 0x29, + 0xa8, 0x14, 0xed, 0x4c, 0xfb, 0x9e, 0x2b, 0xee, 0x10, 0xc2, 0xa1, 0x9b, 0xc3, 0xe4, 0x33, 0x4d, + 0xc0, 0xb4, 0x6f, 0x2a, 0x70, 0x7e, 0xf6, 0x30, 0xd1, 0x73, 0xb2, 0xc3, 0x4c, 0xaa, 0x84, 0x4b, + 0x35, 0x9e, 0x93, 0xa1, 0xdd, 0x95, 0xcc, 0x53, 0x20, 0x52, 0xa2, 0x30, 0x35, 0x7e, 0x2e, 0x95, + 0x0f, 0x3b, 0x4e, 0x24, 0x10, 0xb5, 0x07, 0xb0, 0x39, 0x63, 0x50, 0xc9, 0x27, 0x32, 0x93, 0xee, + 0xa0, 0x9b, 0x92, 0x9c, 0x74, 0x27, 0x96, 0xbd, 0x4d, 0x82, 0x6b, 0xff, 0x9e, 0x83, 0x73, 0x74, + 0x75, 0x0d, 0xdc, 0x20, 0xd0, 0xa3, 0xfc, 0xb4, 0x74, 0x57, 0x7c, 0x0d, 0x16, 0x8f, 0x9e, 0x4d, + 0x55, 0xcc, 0xd0, 0x09, 0x01, 0x3c, 0xb1, 0x84, 0x73, 0x0c, 0xfd, 0x9f, 0x5c, 0x05, 0x39, 0xb9, + 0x79, 0x1e, 0xc3, 0x9b, 0xe6, 0xb6, 0x14, 0x73, 0x79, 0x14, 0xe6, 0x21, 0x7e, 0x1d, 0x16, 0x50, + 0x9f, 0xc2, 0xcf, 0x0e, 0x21, 0xf3, 0x67, 0xd7, 0x0e, 0xb5, 0x2d, 0x26, 0x23, 0x20, 0x1f, 0x02, + 0x88, 0x32, 0x43, 0xf0, 0xc3, 0x41, 0xe8, 0x19, 0xc2, 0xe4, 0x10, 0xe6, 0xf2, 0xf1, 0x81, 0xc3, + 0xd3, 0x2d, 0x94, 0x61, 0x43, 0xf4, 0xf8, 0x48, 0x44, 0x45, 0xe4, 0xaf, 0x98, 0xeb, 0xac, 0xa0, + 0x36, 0x12, 0x91, 0x11, 0xaf, 0xa5, 0x12, 0x34, 0x63, 0x70, 0xe4, 0x44, 0x16, 0xe6, 0x6b, 0xa9, + 0x2c, 0xcc, 0x45, 0x86, 0x25, 0xa7, 0x5a, 0xd6, 0xfe, 0x39, 0x07, 0xcb, 0xf7, 0xa9, 0x54, 0x86, + 0xba, 0x86, 0xf9, 0xba, 0x8b, 0x3b, 0x50, 0xaa, 0xfb, 0x0e, 0x7f, 0x2e, 0xe2, 0x3e, 0x25, 0xcc, + 0xa7, 0x7b, 0xe0, 0x3b, 0xe2, 0xe5, 0x29, 0x30, 0x65, 0xa4, 0xa7, 0xf8, 0xa3, 0xdf, 0x85, 0x45, + 0xf6, 0x7c, 0xc7, 0xd5, 0x68, 0x42, 0x2e, 0x0f, 0x6b, 0xf4, 0x32, 0x2b, 0x96, 0x5e, 0x38, 0xd8, + 0x13, 0xa0, 0x2c, 0x24, 0xf2, 0x18, 0xaf, 0x92, 0x66, 0x65, 0xe1, 0x64, 0x9a, 0x15, 0x29, 0x96, + 0xdd, 0xe2, 0x49, 0x62, 0xd9, 0x9d, 0x7f, 0x03, 0x4a, 0x52, 0x7d, 0x9e, 0x49, 0x4c, 0xff, 0x46, + 0x0e, 0x56, 0xb1, 0x55, 0xa1, 0x2d, 0xcf, 0x2f, 0xa6, 0x9e, 0xe8, 0xa3, 0x31, 0x3d, 0xd1, 0x96, + 0x3c, 0x5e, 0xac, 0x65, 0x73, 0x14, 0x44, 0x77, 0x61, 0x23, 0x85, 0x48, 0x5e, 0x85, 0x05, 0x5a, + 0x7d, 0x71, 0xaf, 0x56, 0x93, 0x33, 0x20, 0x8a, 0x7b, 0x4c, 0x1b, 0x1e, 0x98, 0x0c, 0x5b, 0xfb, + 0x2f, 0x05, 0x56, 0x78, 0xda, 0x91, 0xe1, 0x81, 0xff, 0xd4, 0xee, 0xbc, 0x91, 0xec, 0x4e, 0x16, + 0x5d, 0x85, 0x77, 0xe7, 0xff, 0x76, 0x27, 0xbe, 0x11, 0xeb, 0xc4, 0xcd, 0x30, 0x0a, 0xa2, 0x68, + 0xce, 0x9c, 0x3e, 0xfc, 0x1b, 0x8c, 0x0b, 0x1c, 0x47, 0x24, 0x5f, 0x80, 0xe5, 0xa6, 0xfb, 0x38, + 0x76, 0x3d, 0xbd, 0x31, 0x83, 0xe9, 0xcb, 0x21, 0x22, 0x5b, 0x53, 0x78, 0xb2, 0x0f, 0xdd, 0xc7, + 0x76, 0xea, 0xe5, 0x30, 0x62, 0x49, 0x6f, 0xa8, 0x71, 0xb2, 0x67, 0x99, 0xfa, 0xdc, 0xc1, 0x15, + 0x03, 0x06, 0x7d, 0x2b, 0x0f, 0x10, 0xf9, 0x06, 0xd2, 0x05, 0x18, 0x33, 0x9a, 0x10, 0x9a, 0x7d, + 0x04, 0xc9, 0x73, 0x5c, 0xd8, 0x52, 0xdc, 0xe0, 0x1a, 0xe8, 0xdc, 0xec, 0x28, 0x95, 0xa8, 0x8b, + 0xae, 0x70, 0x67, 0xb4, 0xbe, 0x3b, 0x70, 0xd8, 0xde, 0x9e, 0xdf, 0xbe, 0x86, 0x41, 0x89, 0x43, + 0xe8, 0x8c, 0x74, 0xd3, 0xe8, 0xb2, 0xb6, 0x43, 0x11, 0x52, 0xfe, 0xb6, 0x85, 0x67, 0xf3, 0xb7, + 0x6d, 0xc3, 0xb2, 0x37, 0x7c, 0xcb, 0x1d, 0x4e, 0xfc, 0xf1, 0x13, 0x54, 0xbb, 0x47, 0xfa, 0x3c, + 0xda, 0x05, 0x35, 0x51, 0xc6, 0xc6, 0x01, 0xcf, 0xdc, 0x10, 0x5f, 0x1e, 0x86, 0x10, 0x18, 0xfa, + 0x0b, 0x2f, 0xa8, 0x8b, 0x77, 0x0b, 0xc5, 0x45, 0x75, 0xe9, 0x6e, 0xa1, 0x58, 0x54, 0x97, 0xef, + 0x16, 0x8a, 0xcb, 0x2a, 0x98, 0xd2, 0x9b, 0x59, 0xf8, 0x26, 0x26, 0x3d, 0x63, 0xc5, 0x9f, 0xa8, + 0xb4, 0x9f, 0xe6, 0x80, 0xa4, 0xab, 0x41, 0x3e, 0x0a, 0x25, 0xb6, 0xc1, 0xda, 0xe3, 0xe0, 0x2b, + 0xdc, 0xdd, 0x80, 0x85, 0x5d, 0x92, 0xc0, 0x72, 0xd8, 0x25, 0x06, 0x36, 0x83, 0xaf, 0x0c, 0xc8, + 0xe7, 0xe1, 0x34, 0x76, 0xef, 0xc8, 0x1d, 0x7b, 0x7e, 0xdf, 0xc6, 0x18, 0xb9, 0xce, 0x80, 0xa7, + 0x86, 0x7c, 0x09, 0x73, 0x18, 0xa7, 0x8b, 0x67, 0x0c, 0x03, 0xba, 0x00, 0xb6, 0x11, 0xb3, 0xcd, + 0x10, 0x49, 0x07, 0x54, 0x99, 0xfe, 0x60, 0x3a, 0x18, 0xf0, 0x91, 0x2d, 0xd3, 0x1b, 0x7d, 0xb2, + 0x6c, 0x06, 0xe3, 0xb5, 0x88, 0xf1, 0xee, 0x74, 0x30, 0x20, 0xaf, 0x01, 0xf8, 0x43, 0xfb, 0xd8, + 0x0b, 0x02, 0xf6, 0x98, 0x13, 0x7a, 0x2b, 0x47, 0x50, 0x79, 0x30, 0xfc, 0x61, 0x83, 0x01, 0xc9, + 0xaf, 0x00, 0x46, 0x6b, 0xc0, 0x30, 0x26, 0xcc, 0x1a, 0x89, 0x67, 0x6f, 0x11, 0xc0, 0xb8, 0x73, + 0xf4, 0xa1, 0x6b, 0x79, 0x5f, 0x13, 0xae, 0x1e, 0x9f, 0x85, 0x0d, 0x6e, 0x3c, 0x7c, 0xdf, 0x9b, + 0x1c, 0xf1, 0xab, 0xc4, 0x7b, 0xb9, 0x87, 0x48, 0x77, 0x89, 0xbf, 0x2f, 0x00, 0xe8, 0xf7, 0x2d, + 0x11, 0x21, 0xec, 0x16, 0x2c, 0xd0, 0x0b, 0x92, 0x50, 0xb4, 0xa0, 0x9a, 0x1a, 0xf9, 0xca, 0x6a, + 0x6a, 0xc4, 0xa0, 0xab, 0xd1, 0x44, 0xa3, 0x7a, 0xa1, 0x64, 0xc1, 0xd5, 0xc8, 0xec, 0xec, 0x63, + 0x11, 0x9a, 0x39, 0x16, 0xa9, 0x03, 0x44, 0x31, 0xbb, 0xb8, 0xc8, 0xbf, 0x11, 0x05, 0xbf, 0xe1, + 0x05, 0x3c, 0x4b, 0x44, 0x14, 0xf7, 0x4b, 0x9e, 0x3e, 0x11, 0x1a, 0xb9, 0x07, 0x85, 0x8e, 0x13, + 0xfa, 0xe2, 0xce, 0x88, 0x64, 0xf6, 0x3c, 0x4f, 0xdd, 0x19, 0x45, 0x33, 0x5b, 0x9b, 0x38, 0xb1, + 0x0c, 0xc7, 0xc8, 0x84, 0x18, 0xb0, 0xc8, 0xd3, 0xb2, 0xcf, 0x88, 0x80, 0xc9, 0xb3, 0xb2, 0xf3, + 0xb8, 0xd7, 0x08, 0x94, 0x65, 0x0a, 0x9e, 0x80, 0xfd, 0x0e, 0xe4, 0x2d, 0xab, 0xc1, 0xe3, 0x77, + 0xac, 0x46, 0xd7, 0x2f, 0xcb, 0x6a, 0xb0, 0x77, 0xdf, 0x20, 0x38, 0x96, 0xc8, 0x28, 0x32, 0xf9, + 0x18, 0x94, 0x24, 0xa1, 0x98, 0x47, 0xbe, 0xc1, 0x3e, 0x90, 0xbc, 0x9d, 0xe4, 0x4d, 0x43, 0xc2, + 0x26, 0x75, 0x50, 0xef, 0x4d, 0x1f, 0xb9, 0xfa, 0x68, 0x84, 0x6e, 0x90, 0x6f, 0xb9, 0x63, 0x26, + 0xb6, 0x15, 0xa3, 0x90, 0xd1, 0xe8, 0x23, 0xd1, 0x17, 0xa5, 0xb2, 0xb2, 0x29, 0x49, 0x49, 0xda, + 0xb0, 0x61, 0xb9, 0x93, 0xe9, 0x88, 0xd9, 0xd7, 0xec, 0xfa, 0x63, 0x7a, 0xbf, 0x61, 0x71, 0x72, + 0x30, 0xba, 0x6e, 0x40, 0x0b, 0x85, 0x51, 0xd3, 0x81, 0x3f, 0x4e, 0xdc, 0x75, 0xd2, 0xc4, 0x9a, + 0x2b, 0x0f, 0x39, 0x3d, 0x55, 0xe3, 0xb7, 0x26, 0x3c, 0x55, 0xc5, 0xad, 0x29, 0xba, 0x2b, 0x7d, + 0x28, 0x23, 0x96, 0x1b, 0xbe, 0x0c, 0x4a, 0xb1, 0xdc, 0x62, 0x11, 0xdc, 0xbe, 0x57, 0x90, 0xc2, + 0x89, 0xf2, 0xb1, 0x78, 0x13, 0xe0, 0xae, 0xef, 0x0d, 0x1b, 0xee, 0xe4, 0xc8, 0xef, 0x4b, 0x21, + 0xe5, 0x4a, 0x5f, 0xf2, 0xbd, 0xa1, 0x7d, 0x8c, 0xe0, 0x9f, 0xbe, 0x73, 0x45, 0x42, 0x32, 0xa5, + 0xff, 0xc9, 0x07, 0x61, 0x99, 0xfe, 0xea, 0x44, 0x56, 0x42, 0x4c, 0x27, 0x8b, 0xd4, 0x2c, 0xe9, + 0x46, 0x84, 0x40, 0xde, 0xc0, 0x34, 0x33, 0xde, 0x68, 0x22, 0x09, 0xaf, 0x22, 0xa7, 0x8c, 0x37, + 0x9a, 0x24, 0x23, 0x44, 0x4b, 0xc8, 0xa4, 0x1a, 0x56, 0x5d, 0x64, 0x86, 0xe2, 0xd9, 0x6c, 0x50, + 0xf1, 0xc8, 0xe7, 0x9a, 0x2d, 0x42, 0xd3, 0xca, 0x29, 0x7f, 0x13, 0x64, 0x58, 0x09, 0xab, 0xba, + 0xc3, 0x5e, 0x8a, 0xb8, 0x50, 0xcb, 0x2a, 0x11, 0x1c, 0xf5, 0xed, 0x1e, 0x82, 0x63, 0x95, 0x08, + 0x91, 0xc9, 0x36, 0xac, 0x33, 0x19, 0x3f, 0xcc, 0x30, 0xc9, 0x45, 0x5c, 0xdc, 0xdb, 0xa2, 0x14, + 0x94, 0xf2, 0xe7, 0x13, 0x04, 0x64, 0x17, 0x16, 0xf0, 0xae, 0xc9, 0x5d, 0x03, 0x2e, 0xc8, 0x6a, + 0x82, 0xe4, 0x3a, 0xc2, 0x7d, 0x05, 0x15, 0x04, 0xf2, 0xbe, 0x82, 0xa8, 0xe4, 0x33, 0x00, 0xc6, + 0x70, 0xec, 0x0f, 0x06, 0x18, 0x3c, 0xb9, 0x88, 0x57, 0xa9, 0x4b, 0xf1, 0xf5, 0x88, 0x5c, 0x22, + 0x24, 0x1e, 0xe8, 0x0f, 0x7f, 0xdb, 0x89, 0x10, 0xcb, 0x12, 0x2f, 0xad, 0x06, 0x8b, 0x6c, 0x31, + 0x62, 0x20, 0x72, 0x9e, 0x5a, 0x45, 0x0a, 0x63, 0xcd, 0x02, 0x91, 0x73, 0x78, 0x3a, 0x10, 0xb9, + 0x44, 0xa0, 0xdd, 0x83, 0x33, 0x59, 0x0d, 0x8b, 0xdd, 0x8e, 0x95, 0x93, 0xde, 0x8e, 0xbf, 0x9b, + 0x87, 0x15, 0xe4, 0x26, 0x76, 0x61, 0x1d, 0x56, 0xad, 0xe9, 0xa3, 0x30, 0x4a, 0x97, 0xd8, 0x8d, + 0xb1, 0x7e, 0x81, 0x5c, 0x20, 0xbf, 0xe1, 0xc5, 0x28, 0x88, 0x01, 0x6b, 0xe2, 0x24, 0xd8, 0x13, + 0x9e, 0x03, 0x61, 0x0c, 0x70, 0x11, 0x69, 0x32, 0x9d, 0x61, 0x37, 0x41, 0x14, 0x9d, 0x07, 0xf9, + 0x67, 0x39, 0x0f, 0x0a, 0x27, 0x3a, 0x0f, 0x1e, 0xc2, 0x8a, 0xf8, 0x1a, 0xee, 0xe4, 0x0b, 0xef, + 0x6d, 0x27, 0x8f, 0x31, 0x23, 0xf5, 0x70, 0x47, 0x5f, 0x9c, 0xbb, 0xa3, 0xe3, 0xc3, 0xa8, 0x58, + 0x65, 0x23, 0x84, 0xa5, 0x37, 0x76, 0x4c, 0x41, 0xb9, 0x57, 0x69, 0xff, 0x0c, 0xa7, 0xe4, 0xab, + 0xb0, 0x5c, 0xf7, 0xc5, 0x9b, 0x98, 0xf4, 0x18, 0x31, 0x10, 0x40, 0x59, 0x5c, 0x08, 0x31, 0xc3, + 0xd3, 0x2d, 0xff, 0x7e, 0x9c, 0x6e, 0x6f, 0x00, 0x70, 0x97, 0x94, 0x28, 0x75, 0x1c, 0x2e, 0x19, + 0x11, 0xa1, 0x24, 0xfe, 0x26, 0x22, 0x21, 0xd3, 0xdd, 0x89, 0x9b, 0xdb, 0xe8, 0xbd, 0x9e, 0x3f, + 0x1d, 0x4e, 0x62, 0xb9, 0x96, 0x85, 0x07, 0xab, 0xc3, 0xcb, 0xe4, 0xed, 0x21, 0x41, 0xf6, 0xfe, + 0x0e, 0x08, 0xf9, 0x74, 0x68, 0xfc, 0xb8, 0x34, 0xaf, 0x87, 0xb4, 0x54, 0x0f, 0xcd, 0x34, 0x79, + 0xd4, 0x7e, 0xa8, 0xc8, 0x09, 0x18, 0x7e, 0x86, 0xa1, 0x7e, 0x1d, 0x20, 0x34, 0x4a, 0x10, 0x63, + 0xcd, 0xee, 0x4b, 0x21, 0x54, 0xee, 0xe5, 0x08, 0x57, 0x6a, 0x4d, 0xfe, 0xfd, 0x6a, 0x4d, 0x07, + 0x4a, 0xad, 0x2f, 0x4f, 0x9c, 0xc8, 0x8a, 0x05, 0xac, 0x50, 0x92, 0xc5, 0x9d, 0x29, 0xbf, 0x7d, + 0x1d, 0xcf, 0x86, 0x48, 0x0e, 0x9e, 0x21, 0x02, 0x4b, 0x84, 0xda, 0x5f, 0x28, 0xb0, 0x2e, 0xbb, + 0xdd, 0x3f, 0x19, 0xf6, 0xc8, 0x27, 0x58, 0x3c, 0x58, 0x25, 0x76, 0x65, 0x91, 0x90, 0xe8, 0x96, + 0xfb, 0x64, 0xd8, 0x63, 0x02, 0x90, 0xf3, 0x58, 0xae, 0x2c, 0x25, 0x24, 0x8f, 0x60, 0xa5, 0xed, + 0x0f, 0x06, 0x54, 0xac, 0x19, 0xbf, 0xc5, 0x2f, 0x00, 0x94, 0x51, 0xf2, 0x69, 0x44, 0x54, 0x68, + 0xfb, 0x05, 0x7e, 0xcf, 0xdd, 0x1c, 0xd1, 0xfd, 0xde, 0xe3, 0x74, 0x11, 0xdb, 0xb7, 0xd1, 0x4f, + 0x4e, 0xe6, 0xa9, 0xfd, 0x58, 0x01, 0x92, 0xae, 0x92, 0xbc, 0x65, 0x29, 0xff, 0x07, 0x22, 0x6c, + 0x42, 0xf4, 0x2b, 0x3c, 0x8b, 0xe8, 0x57, 0xfe, 0x5d, 0x05, 0xd6, 0x6b, 0x7a, 0x83, 0xa7, 0x64, + 0x60, 0x2f, 0x38, 0x57, 0xe1, 0x52, 0x4d, 0x6f, 0xd8, 0xed, 0x56, 0xbd, 0x56, 0x79, 0x60, 0x67, + 0x46, 0x5a, 0xbe, 0x04, 0xcf, 0xa5, 0x51, 0xa2, 0x97, 0x9e, 0x8b, 0xb0, 0x95, 0x2e, 0x16, 0xd1, + 0x98, 0xb3, 0x89, 0x45, 0xe0, 0xe6, 0x7c, 0xf9, 0x93, 0xb0, 0x2e, 0x22, 0x0f, 0x77, 0xea, 0x16, + 0xe6, 0x36, 0x58, 0x87, 0xd2, 0xbe, 0x61, 0xd6, 0x76, 0x1f, 0xd8, 0xbb, 0xdd, 0x7a, 0x5d, 0x3d, + 0x45, 0x56, 0x61, 0x99, 0x03, 0x2a, 0xba, 0xaa, 0x90, 0x15, 0x28, 0xd6, 0x9a, 0x96, 0x51, 0xe9, + 0x9a, 0x86, 0x9a, 0x2b, 0x7f, 0x12, 0xd6, 0xda, 0x63, 0xef, 0x2d, 0x67, 0xe2, 0xde, 0x73, 0x9f, + 0xe0, 0x43, 0xcd, 0x12, 0xe4, 0x4d, 0xfd, 0xbe, 0x7a, 0x8a, 0x00, 0x2c, 0xb6, 0xef, 0x55, 0xac, + 0xdb, 0xb7, 0x55, 0x85, 0x94, 0x60, 0x69, 0xaf, 0xd2, 0xb6, 0xef, 0x35, 0x2c, 0x35, 0x47, 0x7f, + 0xe8, 0xf7, 0x2d, 0xfc, 0x91, 0x2f, 0x7f, 0x18, 0x36, 0x50, 0x20, 0xa9, 0x7b, 0xc1, 0xc4, 0x1d, + 0xba, 0x63, 0xac, 0xc3, 0x0a, 0x14, 0x2d, 0x97, 0xee, 0x24, 0x13, 0x97, 0x55, 0xa0, 0x31, 0x1d, + 0x4c, 0xbc, 0xd1, 0xc0, 0xfd, 0xaa, 0xaa, 0x94, 0xdf, 0x80, 0x75, 0xd3, 0x9f, 0x4e, 0xbc, 0xe1, + 0xa1, 0x35, 0xa1, 0x18, 0x87, 0x4f, 0xc8, 0x59, 0xd8, 0xe8, 0x36, 0xf5, 0xc6, 0x76, 0x6d, 0xaf, + 0xdb, 0xea, 0x5a, 0x76, 0x43, 0xef, 0x54, 0xaa, 0xec, 0x99, 0xa8, 0xd1, 0xb2, 0x3a, 0xb6, 0x69, + 0x54, 0x8c, 0x66, 0x47, 0x55, 0xca, 0xdf, 0x46, 0xdd, 0x4a, 0xcf, 0x1f, 0xf6, 0x77, 0x9d, 0xde, + 0xc4, 0x1f, 0x63, 0x85, 0x35, 0xb8, 0x6c, 0x19, 0x95, 0x56, 0x73, 0xc7, 0xde, 0xd5, 0x2b, 0x9d, + 0x96, 0x99, 0x15, 0xea, 0xfb, 0x3c, 0x9c, 0xcb, 0xc0, 0x69, 0x75, 0xda, 0xaa, 0x42, 0xae, 0xc0, + 0x85, 0x8c, 0xb2, 0xfb, 0xc6, 0xb6, 0xde, 0xed, 0x54, 0x9b, 0x6a, 0x6e, 0x06, 0xb1, 0x65, 0xb5, + 0xd4, 0x7c, 0xf9, 0x37, 0x15, 0x58, 0xeb, 0x06, 0xdc, 0xe4, 0xbc, 0x8b, 0xde, 0xa6, 0xcf, 0xc3, + 0xc5, 0xae, 0x65, 0x98, 0x76, 0xa7, 0x75, 0xcf, 0x68, 0xda, 0x5d, 0x4b, 0xdf, 0x4b, 0xd6, 0xe6, + 0x0a, 0x5c, 0x90, 0x30, 0x4c, 0xa3, 0xd2, 0xda, 0x37, 0x4c, 0xbb, 0xad, 0x5b, 0xd6, 0xfd, 0x96, + 0xb9, 0xa3, 0x2a, 0xf4, 0x8b, 0x19, 0x08, 0x8d, 0x5d, 0x9d, 0xd5, 0x26, 0x56, 0xd6, 0x34, 0xee, + 0xeb, 0x75, 0x7b, 0xbb, 0xd5, 0x51, 0xf3, 0xe5, 0x06, 0x3d, 0xdf, 0x31, 0xe0, 0x2e, 0xb3, 0x2c, + 0x2c, 0x42, 0xa1, 0xd9, 0x6a, 0x1a, 0xc9, 0xc7, 0xc5, 0x15, 0x28, 0xea, 0xed, 0xb6, 0xd9, 0xda, + 0xc7, 0x29, 0x06, 0xb0, 0xb8, 0x63, 0x34, 0x69, 0xcd, 0xf2, 0xb4, 0xa4, 0x6d, 0xb6, 0x1a, 0xad, + 0x8e, 0xb1, 0xa3, 0x16, 0xca, 0xa6, 0x58, 0xc2, 0x82, 0x69, 0xcf, 0x67, 0x2f, 0x79, 0x3b, 0xc6, + 0xae, 0xde, 0xad, 0x77, 0xf8, 0x10, 0x3d, 0xb0, 0x4d, 0xe3, 0xd3, 0x5d, 0xc3, 0xea, 0x58, 0xaa, + 0x42, 0x54, 0x58, 0x69, 0x1a, 0xc6, 0x8e, 0x65, 0x9b, 0xc6, 0x7e, 0xcd, 0xb8, 0xaf, 0xe6, 0x28, + 0x4f, 0xf6, 0x3f, 0xfd, 0x42, 0xf9, 0x7b, 0x0a, 0x10, 0x16, 0xac, 0x58, 0x64, 0xc0, 0xc1, 0x19, + 0x73, 0x19, 0xce, 0x57, 0xe9, 0x50, 0x63, 0xd3, 0x1a, 0xad, 0x9d, 0x64, 0x97, 0x9d, 0x03, 0x92, + 0x28, 0x6f, 0xed, 0xee, 0xaa, 0x0a, 0xb9, 0x00, 0xa7, 0x13, 0xf0, 0x1d, 0xb3, 0xd5, 0x56, 0x73, + 0xe7, 0x73, 0x45, 0x85, 0x6c, 0xa6, 0x0a, 0xef, 0x19, 0x46, 0x5b, 0xcd, 0xd3, 0x21, 0x4a, 0x14, + 0x88, 0x25, 0xc1, 0xc8, 0x0b, 0xe5, 0x6f, 0x2a, 0x70, 0x8e, 0x55, 0x53, 0xac, 0xaf, 0xb0, 0xaa, + 0x17, 0x61, 0x8b, 0x87, 0x60, 0xcf, 0xaa, 0xe8, 0x19, 0x50, 0x63, 0xa5, 0xac, 0x9a, 0x67, 0x61, + 0x23, 0x06, 0xc5, 0x7a, 0xe4, 0xe8, 0xee, 0x11, 0x03, 0x6f, 0x1b, 0x56, 0xc7, 0x36, 0x76, 0x77, + 0x5b, 0x66, 0x87, 0x55, 0x24, 0x5f, 0xd6, 0x60, 0xa3, 0xe2, 0x8e, 0x27, 0xf4, 0xea, 0x35, 0x0c, + 0x3c, 0x7f, 0x88, 0x55, 0x58, 0x85, 0x65, 0xe3, 0x33, 0x1d, 0xa3, 0x69, 0xd5, 0x5a, 0x4d, 0xf5, + 0x54, 0xf9, 0x62, 0x02, 0x47, 0xac, 0x63, 0xcb, 0xaa, 0xaa, 0xa7, 0xca, 0x0e, 0xac, 0x0a, 0xc3, + 0x6b, 0x36, 0x2b, 0x2e, 0xc3, 0x79, 0x31, 0xd7, 0x70, 0x47, 0x49, 0x36, 0x61, 0x0b, 0xce, 0xa4, + 0xcb, 0x8d, 0x8e, 0xaa, 0xd0, 0x51, 0x48, 0x94, 0x50, 0x78, 0xae, 0xfc, 0xeb, 0x0a, 0xac, 0x86, + 0x8f, 0x26, 0xa8, 0xa6, 0xbd, 0x02, 0x17, 0x1a, 0xbb, 0xba, 0xbd, 0x63, 0xec, 0xd7, 0x2a, 0x86, + 0x7d, 0xaf, 0xd6, 0xdc, 0x49, 0x7c, 0xe4, 0x39, 0x38, 0x9b, 0x81, 0x80, 0x5f, 0xd9, 0x82, 0x33, + 0xc9, 0xa2, 0x0e, 0x5d, 0xaa, 0x39, 0xda, 0xf5, 0xc9, 0x92, 0x70, 0x9d, 0xe6, 0xcb, 0xfb, 0xb0, + 0x66, 0xe9, 0x8d, 0xfa, 0xae, 0x3f, 0xee, 0xb9, 0xfa, 0x74, 0x72, 0x34, 0x24, 0x17, 0x60, 0x73, + 0xb7, 0x65, 0x56, 0x0c, 0x1b, 0x51, 0x12, 0x35, 0x38, 0x0d, 0xeb, 0x72, 0xe1, 0x03, 0x83, 0x4e, + 0x5f, 0x02, 0x6b, 0x32, 0xb0, 0xd9, 0x52, 0x73, 0xe5, 0xcf, 0xc1, 0x4a, 0x2c, 0x11, 0xde, 0x26, + 0x9c, 0x96, 0x7f, 0xb7, 0xdd, 0x61, 0xdf, 0x1b, 0x1e, 0xaa, 0xa7, 0x92, 0x05, 0xe6, 0x74, 0x38, + 0xa4, 0x05, 0xb8, 0x9e, 0xe5, 0x82, 0x8e, 0x3b, 0x3e, 0xf6, 0x86, 0xce, 0xc4, 0xed, 0xab, 0xb9, + 0xf2, 0xcb, 0xb0, 0x1a, 0x0b, 0xbf, 0x4d, 0x07, 0xae, 0xde, 0xe2, 0x1b, 0x70, 0xc3, 0xd8, 0xa9, + 0x75, 0x1b, 0xea, 0x02, 0x5d, 0xc9, 0xd5, 0xda, 0x5e, 0x55, 0x85, 0xf2, 0x77, 0x14, 0x7a, 0xcf, + 0xc0, 0xa4, 0x3a, 0x8d, 0x5d, 0x5d, 0x0c, 0x35, 0x9d, 0x66, 0x2c, 0xa8, 0xbf, 0x61, 0x59, 0xec, + 0x4d, 0xfd, 0x22, 0x6c, 0xf1, 0x1f, 0xb6, 0xde, 0xdc, 0xb1, 0xab, 0xba, 0xb9, 0x73, 0x5f, 0x37, + 0xe9, 0xdc, 0x7b, 0xa0, 0xe6, 0x70, 0x41, 0x49, 0x10, 0xbb, 0xd3, 0xea, 0x56, 0xaa, 0x6a, 0x9e, + 0xce, 0xdf, 0x18, 0xbc, 0x5d, 0x6b, 0xaa, 0x05, 0x5c, 0x9e, 0x29, 0x6c, 0x64, 0x4b, 0xcb, 0x17, + 0xca, 0xef, 0x2a, 0xb0, 0x69, 0x79, 0x87, 0x43, 0x67, 0x32, 0x1d, 0xbb, 0xfa, 0xe0, 0xd0, 0x1f, + 0x7b, 0x93, 0xa3, 0x63, 0x6b, 0xea, 0x4d, 0x5c, 0x72, 0x0b, 0xae, 0x5b, 0xb5, 0xbd, 0xa6, 0xde, + 0xa1, 0xcb, 0x4b, 0xaf, 0xef, 0xb5, 0xcc, 0x5a, 0xa7, 0xda, 0xb0, 0xad, 0x6e, 0x2d, 0x35, 0xf3, + 0xae, 0xc1, 0xf3, 0xb3, 0x51, 0xeb, 0xc6, 0x9e, 0x5e, 0x79, 0xa0, 0x2a, 0xf3, 0x19, 0x6e, 0xeb, + 0x75, 0xbd, 0x59, 0x31, 0x76, 0xec, 0xfd, 0xdb, 0x6a, 0x8e, 0x5c, 0x87, 0xab, 0xb3, 0x51, 0x77, + 0x6b, 0x6d, 0x8b, 0xa2, 0xe5, 0xe7, 0x7f, 0xb7, 0x6a, 0x35, 0x28, 0x56, 0xa1, 0xfc, 0xc7, 0x0a, + 0x6c, 0xcd, 0x8a, 0xc1, 0x44, 0x6e, 0x80, 0x66, 0x34, 0x3b, 0xa6, 0x5e, 0xdb, 0xb1, 0x2b, 0xa6, + 0xb1, 0x63, 0x34, 0x3b, 0x35, 0xbd, 0x6e, 0xd9, 0x56, 0xab, 0x4b, 0x67, 0x53, 0x64, 0xfa, 0xf0, + 0x02, 0x5c, 0x99, 0x83, 0xd7, 0xaa, 0xed, 0x54, 0x54, 0x85, 0xdc, 0x86, 0x97, 0xe6, 0x20, 0x59, + 0x0f, 0xac, 0x8e, 0xd1, 0x90, 0x4b, 0xd4, 0x5c, 0xb9, 0x02, 0xe7, 0x67, 0x07, 0x69, 0xa1, 0xdb, + 0x74, 0xbc, 0xa7, 0x8b, 0x50, 0xd8, 0xa1, 0x27, 0x43, 0x2c, 0xf7, 0x43, 0xd9, 0x03, 0x35, 0x19, + 0x67, 0x21, 0x65, 0xa3, 0x62, 0x76, 0x9b, 0x4d, 0x76, 0x8c, 0xac, 0x43, 0xa9, 0xd5, 0xa9, 0x1a, + 0x26, 0xcf, 0x9e, 0x81, 0xe9, 0x32, 0xba, 0x4d, 0xba, 0x70, 0x5a, 0x66, 0xed, 0xb3, 0x78, 0x9e, + 0x6c, 0xc1, 0x19, 0xab, 0xae, 0x57, 0xee, 0xd9, 0xcd, 0x56, 0xc7, 0xae, 0x35, 0xed, 0x4a, 0x55, + 0x6f, 0x36, 0x8d, 0xba, 0x0a, 0xd8, 0x99, 0xb3, 0x7c, 0x2b, 0xc9, 0x07, 0xe1, 0x66, 0xeb, 0x5e, + 0x47, 0xb7, 0xdb, 0xf5, 0xee, 0x5e, 0xad, 0x69, 0x5b, 0x0f, 0x9a, 0x15, 0x21, 0xfb, 0x54, 0xd2, + 0x5b, 0xee, 0x4d, 0xb8, 0x36, 0x17, 0x3b, 0xca, 0x73, 0x71, 0x03, 0xb4, 0xb9, 0x98, 0xbc, 0x21, + 0xe5, 0x1f, 0x29, 0x70, 0x61, 0xce, 0x1b, 0x32, 0x79, 0x09, 0x6e, 0x55, 0x0d, 0x7d, 0xa7, 0x6e, + 0x58, 0x16, 0x6e, 0x14, 0x74, 0x18, 0x98, 0x2d, 0x4b, 0xe6, 0x86, 0x7a, 0x0b, 0xae, 0xcf, 0x47, + 0x8f, 0x8e, 0xe6, 0x9b, 0x70, 0x6d, 0x3e, 0x2a, 0x3f, 0xaa, 0x73, 0xa4, 0x0c, 0x37, 0xe6, 0x63, + 0x86, 0x47, 0x7c, 0xbe, 0xfc, 0xdb, 0x0a, 0x9c, 0xcb, 0x56, 0xe4, 0xd0, 0xba, 0xd5, 0x9a, 0x56, + 0x47, 0xaf, 0xd7, 0xed, 0xb6, 0x6e, 0xea, 0x0d, 0xdb, 0x68, 0x9a, 0xad, 0x7a, 0x3d, 0xeb, 0x68, + 0xbb, 0x06, 0xcf, 0xcf, 0x46, 0xb5, 0x2a, 0x66, 0xad, 0x4d, 0x77, 0x6f, 0x0d, 0x2e, 0xcf, 0xc6, + 0x32, 0x6a, 0x15, 0x43, 0xcd, 0x6d, 0xbf, 0xf9, 0x83, 0x7f, 0xba, 0x7c, 0xea, 0x07, 0xef, 0x5e, + 0x56, 0x7e, 0xfc, 0xee, 0x65, 0xe5, 0x1f, 0xdf, 0xbd, 0xac, 0x7c, 0xf6, 0xc5, 0x93, 0xa5, 0x88, + 0x42, 0xb9, 0xff, 0xd1, 0x22, 0xde, 0x50, 0x5e, 0xf9, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xed, + 0xbf, 0x06, 0x52, 0xe8, 0xbd, 0x01, 0x00, } func (this *PluginSpecV1) Equal(that interface{}) bool { @@ -27291,6 +27534,18 @@ func (m *ServerSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.GitHub != nil { + { + size, err := m.GitHub.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x7a + } if m.CloudMetadata != nil { { size, err := m.CloudMetadata.MarshalToSizedBuffer(dAtA[:i]) @@ -27504,6 +27759,47 @@ func (m *CloudMetadata) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *GitHubServerMetadata) 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 *GitHubServerMetadata) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GitHubServerMetadata) 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.Integration) > 0 { + i -= len(m.Integration) + copy(dAtA[i:], m.Integration) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Integration))) + i-- + dAtA[i] = 0x12 + } + if len(m.Organization) > 0 { + i -= len(m.Organization) + copy(dAtA[i:], m.Organization) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Organization))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *AppServerV3) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -28855,12 +29151,12 @@ func (m *ProvisionTokenV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x1a } - n68, err68 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err68 != nil { - return 0, err68 + n69, err69 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err69 != nil { + return 0, err69 } - i -= n68 - i = encodeVarintTypes(dAtA, i, uint64(n68)) + i -= n69 + i = encodeVarintTypes(dAtA, i, uint64(n69)) i-- dAtA[i] = 0x12 if len(m.Roles) > 0 { @@ -31360,20 +31656,20 @@ func (m *AuthPreferenceSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if len(m.SecondFactors) > 0 { - dAtA104 := make([]byte, len(m.SecondFactors)*10) - var j103 int + dAtA105 := make([]byte, len(m.SecondFactors)*10) + var j104 int for _, num := range m.SecondFactors { for num >= 1<<7 { - dAtA104[j103] = uint8(uint64(num)&0x7f | 0x80) + dAtA105[j104] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j103++ + j104++ } - dAtA104[j103] = uint8(num) - j103++ + dAtA105[j104] = uint8(num) + j104++ } - i -= j103 - copy(dAtA[i:], dAtA104[:j103]) - i = encodeVarintTypes(dAtA, i, uint64(j103)) + i -= j104 + copy(dAtA[i:], dAtA105[:j104]) + i = encodeVarintTypes(dAtA, i, uint64(j104)) i-- dAtA[i] = 0x1 i-- @@ -31994,12 +32290,12 @@ func (m *UserTokenSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n120, err120 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err120 != nil { - return 0, err120 + n121, err121 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err121 != nil { + return 0, err121 } - i -= n120 - i = encodeVarintTypes(dAtA, i, uint64(n120)) + i -= n121 + i = encodeVarintTypes(dAtA, i, uint64(n121)) i-- dAtA[i] = 0x22 if m.Usage != 0 { @@ -32116,12 +32412,12 @@ func (m *UserTokenSecretsSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n123, err123 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err123 != nil { - return 0, err123 + n124, err124 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err124 != nil { + return 0, err124 } - i -= n123 - i = encodeVarintTypes(dAtA, i, uint64(n123)) + i -= n124 + i = encodeVarintTypes(dAtA, i, uint64(n124)) i-- dAtA[i] = 0x1a if len(m.QRCode) > 0 { @@ -32326,12 +32622,12 @@ func (m *AccessReview) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if m.AssumeStartTime != nil { - n126, err126 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.AssumeStartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.AssumeStartTime):]) - if err126 != nil { - return 0, err126 + n127, err127 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.AssumeStartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.AssumeStartTime):]) + if err127 != nil { + return 0, err127 } - i -= n126 - i = encodeVarintTypes(dAtA, i, uint64(n126)) + i -= n127 + i = encodeVarintTypes(dAtA, i, uint64(n127)) i-- dAtA[i] = 0x52 } @@ -32348,20 +32644,20 @@ func (m *AccessReview) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x4a } if len(m.ThresholdIndexes) > 0 { - dAtA129 := make([]byte, len(m.ThresholdIndexes)*10) - var j128 int + dAtA130 := make([]byte, len(m.ThresholdIndexes)*10) + var j129 int for _, num := range m.ThresholdIndexes { for num >= 1<<7 { - dAtA129[j128] = uint8(uint64(num)&0x7f | 0x80) + dAtA130[j129] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j128++ + j129++ } - dAtA129[j128] = uint8(num) - j128++ + dAtA130[j129] = uint8(num) + j129++ } - i -= j128 - copy(dAtA[i:], dAtA129[:j128]) - i = encodeVarintTypes(dAtA, i, uint64(j128)) + i -= j129 + copy(dAtA[i:], dAtA130[:j129]) + i = encodeVarintTypes(dAtA, i, uint64(j129)) i-- dAtA[i] = 0x3a } @@ -32375,12 +32671,12 @@ func (m *AccessReview) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x32 - n131, err131 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err131 != nil { - return 0, err131 + n132, err132 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err132 != nil { + return 0, err132 } - i -= n131 - i = encodeVarintTypes(dAtA, i, uint64(n131)) + i -= n132 + i = encodeVarintTypes(dAtA, i, uint64(n132)) i-- dAtA[i] = 0x2a if len(m.Reason) > 0 { @@ -32483,20 +32779,20 @@ func (m *ThresholdIndexSet) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Indexes) > 0 { - dAtA134 := make([]byte, len(m.Indexes)*10) - var j133 int + dAtA135 := make([]byte, len(m.Indexes)*10) + var j134 int for _, num := range m.Indexes { for num >= 1<<7 { - dAtA134[j133] = uint8(uint64(num)&0x7f | 0x80) + dAtA135[j134] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j133++ + j134++ } - dAtA134[j133] = uint8(num) - j133++ + dAtA135[j134] = uint8(num) + j134++ } - i -= j133 - copy(dAtA[i:], dAtA134[:j133]) - i = encodeVarintTypes(dAtA, i, uint64(j133)) + i -= j134 + copy(dAtA[i:], dAtA135[:j134]) + i = encodeVarintTypes(dAtA, i, uint64(j134)) i-- dAtA[i] = 0xa } @@ -32569,24 +32865,24 @@ func (m *AccessRequestSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if m.ResourceExpiry != nil { - n135, err135 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.ResourceExpiry, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.ResourceExpiry):]) - if err135 != nil { - return 0, err135 + n136, err136 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.ResourceExpiry, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.ResourceExpiry):]) + if err136 != nil { + return 0, err136 } - i -= n135 - i = encodeVarintTypes(dAtA, i, uint64(n135)) + i -= n136 + i = encodeVarintTypes(dAtA, i, uint64(n136)) i-- dAtA[i] = 0x1 i-- dAtA[i] = 0xb2 } if m.AssumeStartTime != nil { - n136, err136 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.AssumeStartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.AssumeStartTime):]) - if err136 != nil { - return 0, err136 + n137, err137 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.AssumeStartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.AssumeStartTime):]) + if err137 != nil { + return 0, err137 } - i -= n136 - i = encodeVarintTypes(dAtA, i, uint64(n136)) + i -= n137 + i = encodeVarintTypes(dAtA, i, uint64(n137)) i-- dAtA[i] = 0x1 i-- @@ -32606,22 +32902,22 @@ func (m *AccessRequestSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0xa2 } - n138, err138 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.SessionTTL, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.SessionTTL):]) - if err138 != nil { - return 0, err138 + n139, err139 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.SessionTTL, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.SessionTTL):]) + if err139 != nil { + return 0, err139 } - i -= n138 - i = encodeVarintTypes(dAtA, i, uint64(n138)) + i -= n139 + i = encodeVarintTypes(dAtA, i, uint64(n139)) i-- dAtA[i] = 0x1 i-- dAtA[i] = 0x92 - n139, err139 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.MaxDuration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.MaxDuration):]) - if err139 != nil { - return 0, err139 + n140, err140 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.MaxDuration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.MaxDuration):]) + if err140 != nil { + return 0, err140 } - i -= n139 - i = encodeVarintTypes(dAtA, i, uint64(n139)) + i -= n140 + i = encodeVarintTypes(dAtA, i, uint64(n140)) i-- dAtA[i] = 0x1 i-- @@ -32754,21 +33050,21 @@ func (m *AccessRequestSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x32 } - n143, err143 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err143 != nil { - return 0, err143 - } - i -= n143 - i = encodeVarintTypes(dAtA, i, uint64(n143)) - i-- - dAtA[i] = 0x2a - n144, err144 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + n144, err144 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) if err144 != nil { return 0, err144 } i -= n144 i = encodeVarintTypes(dAtA, i, uint64(n144)) i-- + dAtA[i] = 0x2a + n145, err145 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err145 != nil { + return 0, err145 + } + i -= n145 + i = encodeVarintTypes(dAtA, i, uint64(n145)) + i-- dAtA[i] = 0x22 if m.State != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.State)) @@ -33764,12 +34060,12 @@ func (m *RoleOptions) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0xfa } - n158, err158 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.MFAVerificationInterval, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.MFAVerificationInterval):]) - if err158 != nil { - return 0, err158 + n159, err159 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.MFAVerificationInterval, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.MFAVerificationInterval):]) + if err159 != nil { + return 0, err159 } - i -= n158 - i = encodeVarintTypes(dAtA, i, uint64(n158)) + i -= n159 + i = encodeVarintTypes(dAtA, i, uint64(n159)) i-- dAtA[i] = 0x1 i-- @@ -34200,6 +34496,22 @@ func (m *RoleConditions) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x2 i-- dAtA[i] = 0xe2 + if len(m.GitHubPermissions) > 0 { + for iNdEx := len(m.GitHubPermissions) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.GitHubPermissions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2 + i-- + dAtA[i] = 0xda + } + } if len(m.AccountAssignments) > 0 { for iNdEx := len(m.AccountAssignments) - 1; iNdEx >= 0; iNdEx-- { { @@ -34690,6 +35002,42 @@ func (m *IdentityCenterAccountAssignment) MarshalToSizedBuffer(dAtA []byte) (int return len(dAtA) - i, nil } +func (m *GitHubPermission) 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 *GitHubPermission) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GitHubPermission) 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.Organizations) > 0 { + for iNdEx := len(m.Organizations) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Organizations[iNdEx]) + copy(dAtA[i:], m.Organizations[iNdEx]) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Organizations[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func (m *SPIFFERoleCondition) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -35731,12 +36079,12 @@ func (m *UserSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x42 - n189, err189 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err189 != nil { - return 0, err189 + n190, err190 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err190 != nil { + return 0, err190 } - i -= n189 - i = encodeVarintTypes(dAtA, i, uint64(n189)) + i -= n190 + i = encodeVarintTypes(dAtA, i, uint64(n190)) i-- dAtA[i] = 0x3a { @@ -35837,6 +36185,13 @@ func (m *ExternalIdentity) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.UserID) > 0 { + i -= len(m.UserID) + copy(dAtA[i:], m.UserID) + i = encodeVarintTypes(dAtA, i, uint64(len(m.UserID))) + i-- + dAtA[i] = 0x22 + } if len(m.SAMLSingleLogoutURL) > 0 { i -= len(m.SAMLSingleLogoutURL) copy(dAtA[i:], m.SAMLSingleLogoutURL) @@ -35885,21 +36240,21 @@ func (m *LoginStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n192, err192 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockExpires):]) - if err192 != nil { - return 0, err192 - } - i -= n192 - i = encodeVarintTypes(dAtA, i, uint64(n192)) - i-- - dAtA[i] = 0x22 - n193, err193 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockedTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockedTime):]) + n193, err193 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockExpires):]) if err193 != nil { return 0, err193 } i -= n193 i = encodeVarintTypes(dAtA, i, uint64(n193)) i-- + dAtA[i] = 0x22 + n194, err194 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockedTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockedTime):]) + if err194 != nil { + return 0, err194 + } + i -= n194 + i = encodeVarintTypes(dAtA, i, uint64(n194)) + i-- dAtA[i] = 0x1a if len(m.LockedMessage) > 0 { i -= len(m.LockedMessage) @@ -35955,12 +36310,12 @@ func (m *CreatedBy) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x1a - n195, err195 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) - if err195 != nil { - return 0, err195 + n196, err196 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) + if err196 != nil { + return 0, err196 } - i -= n195 - i = encodeVarintTypes(dAtA, i, uint64(n195)) + i -= n196 + i = encodeVarintTypes(dAtA, i, uint64(n196)) i-- dAtA[i] = 0x12 if m.Connector != nil { @@ -36078,21 +36433,21 @@ func (m *MFADevice) MarshalToSizedBuffer(dAtA []byte) (int, error) { } } } - n198, err198 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUsed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUsed):]) - if err198 != nil { - return 0, err198 - } - i -= n198 - i = encodeVarintTypes(dAtA, i, uint64(n198)) - i-- - dAtA[i] = 0x3a - n199, err199 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.AddedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.AddedAt):]) + n199, err199 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUsed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUsed):]) if err199 != nil { return 0, err199 } i -= n199 i = encodeVarintTypes(dAtA, i, uint64(n199)) i-- + dAtA[i] = 0x3a + n200, err200 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.AddedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.AddedAt):]) + if err200 != nil { + return 0, err200 + } + i -= n200 + i = encodeVarintTypes(dAtA, i, uint64(n200)) + i-- dAtA[i] = 0x32 if len(m.Id) > 0 { i -= len(m.Id) @@ -36788,12 +37143,12 @@ func (m *TunnelConnectionSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x22 } - n211, err211 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) - if err211 != nil { - return 0, err211 + n212, err212 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) + if err212 != nil { + return 0, err212 } - i -= n211 - i = encodeVarintTypes(dAtA, i, uint64(n211)) + i -= n212 + i = encodeVarintTypes(dAtA, i, uint64(n212)) i-- dAtA[i] = 0x1a if len(m.ProxyName) > 0 { @@ -36885,12 +37240,12 @@ func (m *AcquireSemaphoreRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x2a } - n212, err212 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err212 != nil { - return 0, err212 + n213, err213 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err213 != nil { + return 0, err213 } - i -= n212 - i = encodeVarintTypes(dAtA, i, uint64(n212)) + i -= n213 + i = encodeVarintTypes(dAtA, i, uint64(n213)) i-- dAtA[i] = 0x22 if m.MaxLeases != 0 { @@ -36939,12 +37294,12 @@ func (m *SemaphoreLease) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n213, err213 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err213 != nil { - return 0, err213 + n214, err214 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err214 != nil { + return 0, err214 } - i -= n213 - i = encodeVarintTypes(dAtA, i, uint64(n213)) + i -= n214 + i = encodeVarintTypes(dAtA, i, uint64(n214)) i-- dAtA[i] = 0x2a if len(m.LeaseID) > 0 { @@ -37002,12 +37357,12 @@ func (m *SemaphoreLeaseRef) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x1a } - n214, err214 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err214 != nil { - return 0, err214 + n215, err215 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err215 != nil { + return 0, err215 } - i -= n214 - i = encodeVarintTypes(dAtA, i, uint64(n214)) + i -= n215 + i = encodeVarintTypes(dAtA, i, uint64(n215)) i-- dAtA[i] = 0x12 if len(m.LeaseID) > 0 { @@ -37279,29 +37634,29 @@ func (m *WebSessionSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x48 } - n221, err221 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LoginTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LoginTime):]) - if err221 != nil { - return 0, err221 - } - i -= n221 - i = encodeVarintTypes(dAtA, i, uint64(n221)) - i-- - dAtA[i] = 0x42 - n222, err222 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + n222, err222 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LoginTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LoginTime):]) if err222 != nil { return 0, err222 } i -= n222 i = encodeVarintTypes(dAtA, i, uint64(n222)) i-- - dAtA[i] = 0x3a - n223, err223 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.BearerTokenExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.BearerTokenExpires):]) + dAtA[i] = 0x42 + n223, err223 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) if err223 != nil { return 0, err223 } i -= n223 i = encodeVarintTypes(dAtA, i, uint64(n223)) i-- + dAtA[i] = 0x3a + n224, err224 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.BearerTokenExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.BearerTokenExpires):]) + if err224 != nil { + return 0, err224 + } + i -= n224 + i = encodeVarintTypes(dAtA, i, uint64(n224)) + i-- dAtA[i] = 0x32 if len(m.BearerToken) > 0 { i -= len(m.BearerToken) @@ -37533,21 +37888,21 @@ func (m *SAMLSessionData) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x22 } - n224, err224 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.ExpireTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.ExpireTime):]) - if err224 != nil { - return 0, err224 - } - i -= n224 - i = encodeVarintTypes(dAtA, i, uint64(n224)) - i-- - dAtA[i] = 0x1a - n225, err225 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CreateTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CreateTime):]) + n225, err225 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.ExpireTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.ExpireTime):]) if err225 != nil { return 0, err225 } i -= n225 i = encodeVarintTypes(dAtA, i, uint64(n225)) i-- + dAtA[i] = 0x1a + n226, err226 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CreateTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CreateTime):]) + if err226 != nil { + return 0, err226 + } + i -= n226 + i = encodeVarintTypes(dAtA, i, uint64(n226)) + i-- dAtA[i] = 0x12 if len(m.ID) > 0 { i -= len(m.ID) @@ -37828,12 +38183,12 @@ func (m *RemoteClusterStatusV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n229, err229 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) - if err229 != nil { - return 0, err229 + n230, err230 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) + if err230 != nil { + return 0, err230 } - i -= n229 - i = encodeVarintTypes(dAtA, i, uint64(n229)) + i -= n230 + i = encodeVarintTypes(dAtA, i, uint64(n230)) i-- dAtA[i] = 0x12 if len(m.Connection) > 0 { @@ -40487,6 +40842,15 @@ func (m *GithubAuthRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.AuthenticatedUser) > 0 { + i -= len(m.AuthenticatedUser) + copy(dAtA[i:], m.AuthenticatedUser) + i = encodeVarintTypes(dAtA, i, uint64(len(m.AuthenticatedUser))) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xba + } if m.TlsAttestationStatement != nil { { size, err := m.TlsAttestationStatement.MarshalToSizedBuffer(dAtA[:i]) @@ -40602,12 +40966,12 @@ func (m *GithubAuthRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x62 } if m.Expires != nil { - n270, err270 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) - if err270 != nil { - return 0, err270 + n271, err271 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) + if err271 != nil { + return 0, err271 } - i -= n270 - i = encodeVarintTypes(dAtA, i, uint64(n270)) + i -= n271 + i = encodeVarintTypes(dAtA, i, uint64(n271)) i-- dAtA[i] = 0x5a } @@ -41183,6 +41547,13 @@ func (m *GithubClaims) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.UserID) > 0 { + i -= len(m.UserID) + copy(dAtA[i:], m.UserID) + i = encodeVarintTypes(dAtA, i, uint64(len(m.UserID))) + i-- + dAtA[i] = 0x22 + } if len(m.Teams) > 0 { for iNdEx := len(m.Teams) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.Teams[iNdEx]) @@ -41619,21 +41990,21 @@ func (m *LockSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x2a } - n288, err288 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CreatedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CreatedAt):]) - if err288 != nil { - return 0, err288 + n289, err289 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CreatedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CreatedAt):]) + if err289 != nil { + return 0, err289 } - i -= n288 - i = encodeVarintTypes(dAtA, i, uint64(n288)) + i -= n289 + i = encodeVarintTypes(dAtA, i, uint64(n289)) i-- dAtA[i] = 0x22 if m.Expires != nil { - n289, err289 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) - if err289 != nil { - return 0, err289 + n290, err290 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) + if err290 != nil { + return 0, err290 } - i -= n289 - i = encodeVarintTypes(dAtA, i, uint64(n289)) + i -= n290 + i = encodeVarintTypes(dAtA, i, uint64(n290)) i-- dAtA[i] = 0x1a } @@ -42350,12 +42721,12 @@ func (m *RegisterUsingTokenRequest) MarshalToSizedBuffer(dAtA []byte) (int, erro dAtA[i] = 0x6a } if m.Expires != nil { - n301, err301 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) - if err301 != nil { - return 0, err301 + n302, err302 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) + if err302 != nil { + return 0, err302 } - i -= n301 - i = encodeVarintTypes(dAtA, i, uint64(n301)) + i -= n302 + i = encodeVarintTypes(dAtA, i, uint64(n302)) i-- dAtA[i] = 0x62 } @@ -42535,12 +42906,12 @@ func (m *RecoveryCodesSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n304, err304 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err304 != nil { - return 0, err304 + n305, err305 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err305 != nil { + return 0, err305 } - i -= n304 - i = encodeVarintTypes(dAtA, i, uint64(n304)) + i -= n305 + i = encodeVarintTypes(dAtA, i, uint64(n305)) i-- dAtA[i] = 0x12 if len(m.Codes) > 0 { @@ -42920,21 +43291,21 @@ func (m *SessionTrackerSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x32 } - n308, err308 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err308 != nil { - return 0, err308 - } - i -= n308 - i = encodeVarintTypes(dAtA, i, uint64(n308)) - i-- - dAtA[i] = 0x2a - n309, err309 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + n309, err309 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) if err309 != nil { return 0, err309 } i -= n309 i = encodeVarintTypes(dAtA, i, uint64(n309)) i-- + dAtA[i] = 0x2a + n310, err310 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err310 != nil { + return 0, err310 + } + i -= n310 + i = encodeVarintTypes(dAtA, i, uint64(n310)) + i-- dAtA[i] = 0x22 if m.State != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.State)) @@ -43037,12 +43408,12 @@ func (m *Participant) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n310, err310 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastActive, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastActive):]) - if err310 != nil { - return 0, err310 + n311, err311 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastActive, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastActive):]) + if err311 != nil { + return 0, err311 } - i -= n310 - i = encodeVarintTypes(dAtA, i, uint64(n310)) + i -= n311 + i = encodeVarintTypes(dAtA, i, uint64(n311)) i-- dAtA[i] = 0x22 if len(m.Mode) > 0 { @@ -43754,12 +44125,12 @@ func (m *ClusterAlertSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n323, err323 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err323 != nil { - return 0, err323 + n324, err324 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err324 != nil { + return 0, err324 } - i -= n323 - i = encodeVarintTypes(dAtA, i, uint64(n323)) + i -= n324 + i = encodeVarintTypes(dAtA, i, uint64(n324)) i-- dAtA[i] = 0x1a if len(m.Message) > 0 { @@ -43889,12 +44260,12 @@ func (m *AlertAcknowledgement) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n324, err324 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err324 != nil { - return 0, err324 + n325, err325 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err325 != nil { + return 0, err325 } - i -= n324 - i = encodeVarintTypes(dAtA, i, uint64(n324)) + i -= n325 + i = encodeVarintTypes(dAtA, i, uint64(n325)) i-- dAtA[i] = 0x22 if len(m.Reason) > 0 { @@ -46221,12 +46592,12 @@ func (m *PluginStatusV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x32 } - n359, err359 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastSyncTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastSyncTime):]) - if err359 != nil { - return 0, err359 + n360, err360 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastSyncTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastSyncTime):]) + if err360 != nil { + return 0, err360 } - i -= n359 - i = encodeVarintTypes(dAtA, i, uint64(n359)) + i -= n360 + i = encodeVarintTypes(dAtA, i, uint64(n360)) i-- dAtA[i] = 0x1a if len(m.ErrorMessage) > 0 { @@ -46587,22 +46958,22 @@ func (m *PluginOktaStatusDetailsAppGroupSync) MarshalToSizedBuffer(dAtA []byte) dAtA[i] = 0x28 } if m.LastFailed != nil { - n369, err369 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) - if err369 != nil { - return 0, err369 + n370, err370 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) + if err370 != nil { + return 0, err370 } - i -= n369 - i = encodeVarintTypes(dAtA, i, uint64(n369)) + i -= n370 + i = encodeVarintTypes(dAtA, i, uint64(n370)) i-- dAtA[i] = 0x22 } if m.LastSuccessful != nil { - n370, err370 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) - if err370 != nil { - return 0, err370 + n371, err371 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) + if err371 != nil { + return 0, err371 } - i -= n370 - i = encodeVarintTypes(dAtA, i, uint64(n370)) + i -= n371 + i = encodeVarintTypes(dAtA, i, uint64(n371)) i-- dAtA[i] = 0x1a } @@ -46661,22 +47032,22 @@ func (m *PluginOktaStatusDetailsUsersSync) MarshalToSizedBuffer(dAtA []byte) (in dAtA[i] = 0x28 } if m.LastFailed != nil { - n371, err371 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) - if err371 != nil { - return 0, err371 + n372, err372 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) + if err372 != nil { + return 0, err372 } - i -= n371 - i = encodeVarintTypes(dAtA, i, uint64(n371)) + i -= n372 + i = encodeVarintTypes(dAtA, i, uint64(n372)) i-- dAtA[i] = 0x22 } if m.LastSuccessful != nil { - n372, err372 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) - if err372 != nil { - return 0, err372 + n373, err373 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) + if err373 != nil { + return 0, err373 } - i -= n372 - i = encodeVarintTypes(dAtA, i, uint64(n372)) + i -= n373 + i = encodeVarintTypes(dAtA, i, uint64(n373)) i-- dAtA[i] = 0x1a } @@ -46795,22 +47166,22 @@ func (m *PluginOktaStatusDetailsAccessListsSync) MarshalToSizedBuffer(dAtA []byt } } if m.LastFailed != nil { - n373, err373 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) - if err373 != nil { - return 0, err373 + n374, err374 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) + if err374 != nil { + return 0, err374 } - i -= n373 - i = encodeVarintTypes(dAtA, i, uint64(n373)) + i -= n374 + i = encodeVarintTypes(dAtA, i, uint64(n374)) i-- dAtA[i] = 0x22 } if m.LastSuccessful != nil { - n374, err374 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) - if err374 != nil { - return 0, err374 + n375, err375 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) + if err375 != nil { + return 0, err375 } - i -= n374 - i = encodeVarintTypes(dAtA, i, uint64(n374)) + i -= n375 + i = encodeVarintTypes(dAtA, i, uint64(n375)) i-- dAtA[i] = 0x1a } @@ -46976,12 +47347,12 @@ func (m *PluginOAuth2AccessTokenCredentials) MarshalToSizedBuffer(dAtA []byte) ( i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n379, err379 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err379 != nil { - return 0, err379 + n380, err380 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err380 != nil { + return 0, err380 } - i -= n379 - i = encodeVarintTypes(dAtA, i, uint64(n379)) + i -= n380 + i = encodeVarintTypes(dAtA, i, uint64(n380)) i-- dAtA[i] = 0x1a if len(m.RefreshToken) > 0 { @@ -47263,6 +47634,27 @@ func (m *PluginStaticCredentialsSpecV1_OAuthClientSecret) MarshalToSizedBuffer(d } return len(dAtA) - i, nil } +func (m *PluginStaticCredentialsSpecV1_SSHCertAuthorities) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PluginStaticCredentialsSpecV1_SSHCertAuthorities) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.SSHCertAuthorities != nil { + { + size, err := m.SSHCertAuthorities.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + return len(dAtA) - i, nil +} func (m *PluginStaticCredentialsBasicAuth) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -47345,6 +47737,47 @@ func (m *PluginStaticCredentialsOAuthClientSecret) MarshalToSizedBuffer(dAtA []b return len(dAtA) - i, nil } +func (m *PluginStaticCredentialsSSHCertAuthorities) 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 *PluginStaticCredentialsSSHCertAuthorities) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PluginStaticCredentialsSSHCertAuthorities) 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.CertAuthorities) > 0 { + for iNdEx := len(m.CertAuthorities) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.CertAuthorities[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func (m *SAMLIdPServiceProviderV1) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -47861,20 +48294,20 @@ func (m *ScheduledAgentUpgradeWindow) MarshalToSizedBuffer(dAtA []byte) (int, er i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n393, err393 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Stop, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Stop):]) - if err393 != nil { - return 0, err393 + n395, err395 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Stop, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Stop):]) + if err395 != nil { + return 0, err395 } - i -= n393 - i = encodeVarintTypes(dAtA, i, uint64(n393)) + i -= n395 + i = encodeVarintTypes(dAtA, i, uint64(n395)) i-- dAtA[i] = 0x12 - n394, err394 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Start):]) - if err394 != nil { - return 0, err394 + n396, err396 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Start):]) + if err396 != nil { + return 0, err396 } - i -= n394 - i = encodeVarintTypes(dAtA, i, uint64(n394)) + i -= n396 + i = encodeVarintTypes(dAtA, i, uint64(n396)) i-- dAtA[i] = 0xa return len(dAtA) - i, nil @@ -48301,12 +48734,12 @@ func (m *OktaAssignmentSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x30 } - n401, err401 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastTransition, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastTransition):]) - if err401 != nil { - return 0, err401 + n403, err403 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastTransition, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastTransition):]) + if err403 != nil { + return 0, err403 } - i -= n401 - i = encodeVarintTypes(dAtA, i, uint64(n401)) + i -= n403 + i = encodeVarintTypes(dAtA, i, uint64(n403)) i-- dAtA[i] = 0x2a if m.Status != 0 { @@ -48314,12 +48747,12 @@ func (m *OktaAssignmentSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x20 } - n402, err402 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CleanupTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CleanupTime):]) - if err402 != nil { - return 0, err402 + n404, err404 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CleanupTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CleanupTime):]) + if err404 != nil { + return 0, err404 } - i -= n402 - i = encodeVarintTypes(dAtA, i, uint64(n402)) + i -= n404 + i = encodeVarintTypes(dAtA, i, uint64(n404)) i-- dAtA[i] = 0x1a if len(m.Targets) > 0 { @@ -48456,6 +48889,18 @@ func (m *IntegrationSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.Credentials != nil { + { + size, err := m.Credentials.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } if m.SubKindSpec != nil { { size := m.SubKindSpec.Size() @@ -48510,6 +48955,27 @@ func (m *IntegrationSpecV1_AzureOIDC) MarshalToSizedBuffer(dAtA []byte) (int, er } return len(dAtA) - i, nil } +func (m *IntegrationSpecV1_GitHub) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *IntegrationSpecV1_GitHub) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.GitHub != nil { + { + size, err := m.GitHub.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + return len(dAtA) - i, nil +} func (m *AWSOIDCIntegrationSpecV1) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -48599,6 +49065,40 @@ func (m *AzureOIDCIntegrationSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, err return len(dAtA) - i, nil } +func (m *GitHubIntegrationSpecV1) 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 *GitHubIntegrationSpecV1) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GitHubIntegrationSpecV1) 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.Organization) > 0 { + i -= len(m.Organization) + copy(dAtA[i:], m.Organization) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Organization))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *HeadlessAuthentication) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -49762,12 +50262,12 @@ func (m *AccessGraphSync) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n425, err425 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.PollInterval, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.PollInterval):]) - if err425 != nil { - return 0, err425 + n429, err429 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.PollInterval, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.PollInterval):]) + if err429 != nil { + return 0, err429 } - i -= n425 - i = encodeVarintTypes(dAtA, i, uint64(n425)) + i -= n429 + i = encodeVarintTypes(dAtA, i, uint64(n429)) i-- dAtA[i] = 0x12 if len(m.AWS) > 0 { @@ -50890,6 +51390,10 @@ func (m *ServerSpecV2) Size() (n int) { l = m.CloudMetadata.Size() n += 1 + l + sovTypes(uint64(l)) } + if m.GitHub != nil { + l = m.GitHub.Size() + n += 1 + l + sovTypes(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -50948,6 +51452,26 @@ func (m *CloudMetadata) Size() (n int) { return n } +func (m *GitHubServerMetadata) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Organization) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Integration) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *AppServerV3) Size() (n int) { if m == nil { return 0 @@ -54124,6 +54648,12 @@ func (m *RoleConditions) Size() (n int) { n += 2 + l + sovTypes(uint64(l)) } } + if len(m.GitHubPermissions) > 0 { + for _, e := range m.GitHubPermissions { + l = e.Size() + n += 2 + l + sovTypes(uint64(l)) + } + } l = m.WorkloadIdentityLabels.Size() n += 2 + l + sovTypes(uint64(l)) l = len(m.WorkloadIdentityLabelsExpression) @@ -54156,6 +54686,24 @@ func (m *IdentityCenterAccountAssignment) Size() (n int) { return n } +func (m *GitHubPermission) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Organizations) > 0 { + for _, s := range m.Organizations { + l = len(s) + n += 1 + l + sovTypes(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *SPIFFERoleCondition) Size() (n int) { if m == nil { return 0 @@ -54715,6 +55263,10 @@ func (m *ExternalIdentity) Size() (n int) { if l > 0 { n += 1 + l + sovTypes(uint64(l)) } + l = len(m.UserID) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -56897,6 +57449,10 @@ func (m *GithubAuthRequest) Size() (n int) { l = m.TlsAttestationStatement.Size() n += 2 + l + sovTypes(uint64(l)) } + l = len(m.AuthenticatedUser) + if l > 0 { + n += 2 + l + sovTypes(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -57115,6 +57671,10 @@ func (m *GithubClaims) Size() (n int) { n += 1 + l + sovTypes(uint64(l)) } } + l = len(m.UserID) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -59945,6 +60505,18 @@ func (m *PluginStaticCredentialsSpecV1_OAuthClientSecret) Size() (n int) { } return n } +func (m *PluginStaticCredentialsSpecV1_SSHCertAuthorities) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SSHCertAuthorities != nil { + l = m.SSHCertAuthorities.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} func (m *PluginStaticCredentialsBasicAuth) Size() (n int) { if m == nil { return 0 @@ -59985,6 +60557,24 @@ func (m *PluginStaticCredentialsOAuthClientSecret) Size() (n int) { return n } +func (m *PluginStaticCredentialsSSHCertAuthorities) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.CertAuthorities) > 0 { + for _, e := range m.CertAuthorities { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *SAMLIdPServiceProviderV1) Size() (n int) { if m == nil { return 0 @@ -60460,6 +61050,10 @@ func (m *IntegrationSpecV1) Size() (n int) { if m.SubKindSpec != nil { n += m.SubKindSpec.Size() } + if m.Credentials != nil { + l = m.Credentials.Size() + n += 1 + l + sovTypes(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -60490,6 +61084,18 @@ func (m *IntegrationSpecV1_AzureOIDC) Size() (n int) { } return n } +func (m *IntegrationSpecV1_GitHub) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.GitHub != nil { + l = m.GitHub.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} func (m *AWSOIDCIntegrationSpecV1) Size() (n int) { if m == nil { return 0 @@ -60534,6 +61140,22 @@ func (m *AzureOIDCIntegrationSpecV1) Size() (n int) { return n } +func (m *GitHubIntegrationSpecV1) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Organization) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *HeadlessAuthentication) Size() (n int) { if m == nil { return 0 @@ -68610,6 +69232,42 @@ func (m *ServerSpecV2) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 15: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GitHub", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.GitHub == nil { + m.GitHub = &GitHubServerMetadata{} + } + if err := m.GitHub.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -68962,6 +69620,121 @@ func (m *CloudMetadata) Unmarshal(dAtA []byte) error { } return nil } +func (m *GitHubServerMetadata) 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 ErrIntOverflowTypes + } + 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: GitHubServerMetadata: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GitHubServerMetadata: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Organization", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + 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 ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Organization = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Integration", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + 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 ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Integration = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + 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 *AppServerV3) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -89406,11 +90179,75 @@ func (m *RoleConditions) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ClusterLabelsExpression = string(dAtA[iNdEx:postIndex]) + m.ClusterLabelsExpression = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 33: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field KubernetesLabelsExpression", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + 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 ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.KubernetesLabelsExpression = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 34: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DatabaseLabelsExpression", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + 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 ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DatabaseLabelsExpression = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 33: + case 35: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KubernetesLabelsExpression", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field DatabaseServiceLabelsExpression", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -89438,11 +90275,11 @@ func (m *RoleConditions) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.KubernetesLabelsExpression = string(dAtA[iNdEx:postIndex]) + m.DatabaseServiceLabelsExpression = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 34: + case 36: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DatabaseLabelsExpression", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field WindowsDesktopLabelsExpression", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -89470,11 +90307,11 @@ func (m *RoleConditions) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.DatabaseLabelsExpression = string(dAtA[iNdEx:postIndex]) + m.WindowsDesktopLabelsExpression = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 35: + case 37: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DatabaseServiceLabelsExpression", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field GroupLabelsExpression", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -89502,13 +90339,13 @@ func (m *RoleConditions) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.DatabaseServiceLabelsExpression = string(dAtA[iNdEx:postIndex]) + m.GroupLabelsExpression = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 36: + case 38: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WindowsDesktopLabelsExpression", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field DatabasePermissions", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -89518,59 +90355,29 @@ func (m *RoleConditions) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.WindowsDesktopLabelsExpression = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 37: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GroupLabelsExpression", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - 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 ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF + m.DatabasePermissions = append(m.DatabasePermissions, DatabasePermission{}) + if err := m.DatabasePermissions[len(m.DatabasePermissions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - m.GroupLabelsExpression = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 38: + case 39: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DatabasePermissions", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SPIFFE", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -89597,14 +90404,14 @@ func (m *RoleConditions) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.DatabasePermissions = append(m.DatabasePermissions, DatabasePermission{}) - if err := m.DatabasePermissions[len(m.DatabasePermissions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.SPIFFE = append(m.SPIFFE, &SPIFFERoleCondition{}) + if err := m.SPIFFE[len(m.SPIFFE)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 39: + case 42: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SPIFFE", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AccountAssignments", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -89631,14 +90438,14 @@ func (m *RoleConditions) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.SPIFFE = append(m.SPIFFE, &SPIFFERoleCondition{}) - if err := m.SPIFFE[len(m.SPIFFE)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.AccountAssignments = append(m.AccountAssignments, IdentityCenterAccountAssignment{}) + if err := m.AccountAssignments[len(m.AccountAssignments)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 42: + case 43: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AccountAssignments", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field GitHubPermissions", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -89665,8 +90472,8 @@ func (m *RoleConditions) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.AccountAssignments = append(m.AccountAssignments, IdentityCenterAccountAssignment{}) - if err := m.AccountAssignments[len(m.AccountAssignments)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.GitHubPermissions = append(m.GitHubPermissions, GitHubPermission{}) + if err := m.GitHubPermissions[len(m.GitHubPermissions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -89872,6 +90679,89 @@ func (m *IdentityCenterAccountAssignment) Unmarshal(dAtA []byte) error { } return nil } +func (m *GitHubPermission) 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 ErrIntOverflowTypes + } + 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: GitHubPermission: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GitHubPermission: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Organizations", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + 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 ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Organizations = append(m.Organizations, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + 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 *SPIFFERoleCondition) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -93111,6 +94001,38 @@ func (m *ExternalIdentity) Unmarshal(dAtA []byte) error { } m.SAMLSingleLogoutURL = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + 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 ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UserID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -107871,6 +108793,38 @@ func (m *GithubAuthRequest) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 23: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AuthenticatedUser", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + 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 ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AuthenticatedUser = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -109306,6 +110260,38 @@ func (m *GithubClaims) Unmarshal(dAtA []byte) error { } m.Teams = append(m.Teams, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + 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 ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UserID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -125595,6 +126581,41 @@ func (m *PluginStaticCredentialsSpecV1) Unmarshal(dAtA []byte) error { } m.Credentials = &PluginStaticCredentialsSpecV1_OAuthClientSecret{v} iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SSHCertAuthorities", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &PluginStaticCredentialsSSHCertAuthorities{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Credentials = &PluginStaticCredentialsSpecV1_SSHCertAuthorities{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -125847,6 +126868,91 @@ func (m *PluginStaticCredentialsOAuthClientSecret) Unmarshal(dAtA []byte) error } return nil } +func (m *PluginStaticCredentialsSSHCertAuthorities) 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 ErrIntOverflowTypes + } + 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: PluginStaticCredentialsSSHCertAuthorities: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PluginStaticCredentialsSSHCertAuthorities: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CertAuthorities", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CertAuthorities = append(m.CertAuthorities, &SSHKeyPair{}) + if err := m.CertAuthorities[len(m.CertAuthorities)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + 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 *SAMLIdPServiceProviderV1) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -128854,6 +129960,77 @@ func (m *IntegrationSpecV1) Unmarshal(dAtA []byte) error { } m.SubKindSpec = &IntegrationSpecV1_AzureOIDC{v} iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GitHub", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &GitHubIntegrationSpecV1{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.SubKindSpec = &IntegrationSpecV1_GitHub{v} + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Credentials", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Credentials == nil { + m.Credentials = &PluginCredentialsV1{} + } + if err := m.Credentials.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -129138,6 +130315,89 @@ func (m *AzureOIDCIntegrationSpecV1) Unmarshal(dAtA []byte) error { } return nil } +func (m *GitHubIntegrationSpecV1) 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 ErrIntOverflowTypes + } + 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: GitHubIntegrationSpecV1: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GitHubIntegrationSpecV1: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Organization", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + 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 ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Organization = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + 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 *HeadlessAuthentication) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/api/types/user.go b/api/types/user.go index 490e26435d2b1..f87fe1958606f 100644 --- a/api/types/user.go +++ b/api/types/user.go @@ -61,6 +61,8 @@ type User interface { GetSAMLIdentities() []ExternalIdentity // GetGithubIdentities returns a list of connected Github identities GetGithubIdentities() []ExternalIdentity + // SetGithubIdentities sets the list of connected GitHub identities + SetGithubIdentities([]ExternalIdentity) // Get local authentication secrets (may be nil). GetLocalAuth() *LocalAuthSecrets // Set local authentication secrets (use nil to delete). @@ -432,6 +434,11 @@ func (u *UserV2) GetGithubIdentities() []ExternalIdentity { return u.Spec.GithubIdentities } +// SetGithubIdentities sets the list of connected GitHub identities +func (u *UserV2) SetGithubIdentities(identities []ExternalIdentity) { + u.Spec.GithubIdentities = identities +} + // GetLocalAuth gets local authentication secrets (may be nil). func (u *UserV2) GetLocalAuth() *LocalAuthSecrets { return u.Spec.LocalAuth diff --git a/api/types/userloginstate/convert/v1/user_login_state.go b/api/types/userloginstate/convert/v1/user_login_state.go index 4bf45f5b9ec72..91c423ab10ed2 100644 --- a/api/types/userloginstate/convert/v1/user_login_state.go +++ b/api/types/userloginstate/convert/v1/user_login_state.go @@ -38,6 +38,7 @@ func FromProto(msg *userloginstatev1.UserLoginState) (*userloginstate.UserLoginS Roles: msg.Spec.Roles, Traits: traitv1.FromProto(msg.Spec.Traits), UserType: types.UserType(msg.Spec.UserType), + GitHubIdentity: externalIdentityFromProto(msg.Spec.GitHubIdentity), }) return uls, trace.Wrap(err) @@ -53,6 +54,27 @@ func ToProto(uls *userloginstate.UserLoginState) *userloginstatev1.UserLoginStat Roles: uls.GetRoles(), Traits: traitv1.ToProto(uls.GetTraits()), UserType: string(uls.Spec.UserType), + GitHubIdentity: externalIdentityToProto(uls.Spec.GitHubIdentity), }, } } + +func externalIdentityFromProto(identity *userloginstatev1.ExternalIdentity) *userloginstate.ExternalIdentity { + if identity != nil { + return &userloginstate.ExternalIdentity{ + UserID: identity.UserId, + Username: identity.Username, + } + } + return nil +} + +func externalIdentityToProto(identity *userloginstate.ExternalIdentity) *userloginstatev1.ExternalIdentity { + if identity != nil { + return &userloginstatev1.ExternalIdentity{ + UserId: identity.UserID, + Username: identity.Username, + } + } + return nil +} diff --git a/api/types/userloginstate/convert/v1/user_login_state_test.go b/api/types/userloginstate/convert/v1/user_login_state_test.go index e6997bec07178..63cf331401af0 100644 --- a/api/types/userloginstate/convert/v1/user_login_state_test.go +++ b/api/types/userloginstate/convert/v1/user_login_state_test.go @@ -67,6 +67,13 @@ func TestFromProtoNils(t *testing.T) { fromProto, err := FromProto(uls) require.NoError(t, err) require.Equal(t, types.UserTypeLocal, fromProto.GetUserType()) + + // GitHub identity is nil + uls = ToProto(newUserLoginState(t, "user-login-state")) + uls.Spec.GitHubIdentity = nil + + _, err = FromProto(uls) + require.NoError(t, err) } func newUserLoginState(t *testing.T, name string) *userloginstate.UserLoginState { @@ -87,6 +94,10 @@ func newUserLoginState(t *testing.T, name string) *userloginstate.UserLoginState "key2": []string{"value2"}, }, UserType: types.UserTypeSSO, + GitHubIdentity: &userloginstate.ExternalIdentity{ + Username: "my-github-username", + UserID: "1234567", + }, }, ) require.NoError(t, err) diff --git a/api/types/userloginstate/user_login_state.go b/api/types/userloginstate/user_login_state.go index c704856eb392e..e566d8fb4314d 100644 --- a/api/types/userloginstate/user_login_state.go +++ b/api/types/userloginstate/user_login_state.go @@ -55,6 +55,18 @@ type Spec struct { // UserType is the type of user that this state represents. UserType types.UserType `json:"user_type" yaml:"user_type"` + + // GitHubIdentity is user's attached GitHub identity + GitHubIdentity *ExternalIdentity `json:"github_identity,omitempty" yaml:"github_identity"` +} + +// ExternalIdentity defines an external identity attached to this user state. +type ExternalIdentity struct { + // UserId is the unique identifier of the external identity such as GitHub + // user ID. + UserID string + // Username is the username of the external identity. + Username string } // New creates a new user login state. @@ -123,3 +135,14 @@ func (u *UserLoginState) IsBot() bool { func (u *UserLoginState) GetMetadata() types.Metadata { return legacy.FromHeaderMetadata(u.Metadata) } + +// GetGithubIdentities returns a list of connected Github identities +func (u *UserLoginState) GetGithubIdentities() []types.ExternalIdentity { + if u.Spec.GitHubIdentity == nil { + return nil + } + return []types.ExternalIdentity{{ + UserID: u.Spec.GitHubIdentity.UserID, + Username: u.Spec.GitHubIdentity.Username, + }} +} diff --git a/constants.go b/constants.go index b716880b622d5..605d84c87d3da 100644 --- a/constants.go +++ b/constants.go @@ -283,6 +283,9 @@ const ( // ComponentUpdater represents the agent updater. ComponentUpdater = "updater" + // ComponentForwardingGit represents the SSH proxy that forwards Git commands. + ComponentForwardingGit = "git:forward" + // VerboseLogsEnvVar forces all logs to be verbose (down to DEBUG level) VerboseLogsEnvVar = "TELEPORT_DEBUG" @@ -509,6 +512,12 @@ const ( // from which this certificate is accepted for authentication. // See: https://cvsweb.openbsd.org/src/usr.bin/ssh/PROTOCOL.certkeys?annotate=HEAD. CertCriticalOptionSourceAddress = "source-address" + // CertExtensionGitHubUserID indicates the GitHub user ID identified by the + // GitHub connector. + CertExtensionGitHubUserID = "github-id@goteleport.com" + // CertExtensionGitHubUsername indicates the GitHub username identified by + // the GitHub connector. + CertExtensionGitHubUsername = "github-login@goteleport.com" ) // Note: when adding new providers to this list, consider updating the help message for --provider flag diff --git a/docs/pages/reference/operator-resources/resources-teleport-dev-openssheiceserversv2.mdx b/docs/pages/reference/operator-resources/resources-teleport-dev-openssheiceserversv2.mdx index 53706ecb2f089..4f87f08676fda 100644 --- a/docs/pages/reference/operator-resources/resources-teleport-dev-openssheiceserversv2.mdx +++ b/docs/pages/reference/operator-resources/resources-teleport-dev-openssheiceserversv2.mdx @@ -28,6 +28,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |---|---|---| |addr|string|Addr is a host:port address where this server can be reached.| |cloud_metadata|[object](#speccloud_metadata)|CloudMetadata contains info about the cloud instance the server is running on, if any.| +|github|[object](#specgithub)|GitHub contains info about GitHub proxies where each server represents a GitHub organization.| |hostname|string|Hostname is server hostname| |peer_addr|string|PeerAddr is the address a proxy server is reachable at by its peer proxies.| |proxy_ids|[]string|ProxyIDs is a list of proxy IDs this server is expected to be connected to.| @@ -53,6 +54,13 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |subnet_id|string|SubnetID is the Subnet ID in use by the instance.| |vpc_id|string|VPCID is the AWS VPC ID where the Instance is running.| +### spec.github + +|Field|Type|Description| +|---|---|---| +|integration|string|Integration is the integration that is associated with this Server.| +|organization|string|Organization specifies the name of the organization for the GitHub integration.| + ### spec.rotation |Field|Type|Description| diff --git a/docs/pages/reference/operator-resources/resources-teleport-dev-opensshserversv2.mdx b/docs/pages/reference/operator-resources/resources-teleport-dev-opensshserversv2.mdx index bd43ce2d31d0b..3961366039613 100644 --- a/docs/pages/reference/operator-resources/resources-teleport-dev-opensshserversv2.mdx +++ b/docs/pages/reference/operator-resources/resources-teleport-dev-opensshserversv2.mdx @@ -28,6 +28,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |---|---|---| |addr|string|Addr is a host:port address where this server can be reached.| |cloud_metadata|[object](#speccloud_metadata)|CloudMetadata contains info about the cloud instance the server is running on, if any.| +|github|[object](#specgithub)|GitHub contains info about GitHub proxies where each server represents a GitHub organization.| |hostname|string|Hostname is server hostname| |peer_addr|string|PeerAddr is the address a proxy server is reachable at by its peer proxies.| |proxy_ids|[]string|ProxyIDs is a list of proxy IDs this server is expected to be connected to.| @@ -53,6 +54,13 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |subnet_id|string|SubnetID is the Subnet ID in use by the instance.| |vpc_id|string|VPCID is the AWS VPC ID where the Instance is running.| +### spec.github + +|Field|Type|Description| +|---|---|---| +|integration|string|Integration is the integration that is associated with this Server.| +|organization|string|Organization specifies the name of the organization for the GitHub integration.| + ### spec.rotation |Field|Type|Description| diff --git a/docs/pages/reference/operator-resources/resources-teleport-dev-roles.mdx b/docs/pages/reference/operator-resources/resources-teleport-dev-roles.mdx index 1957f1349ec59..ed405c4443473 100644 --- a/docs/pages/reference/operator-resources/resources-teleport-dev-roles.mdx +++ b/docs/pages/reference/operator-resources/resources-teleport-dev-roles.mdx @@ -51,6 +51,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |db_users|[]string|DatabaseUsers is a list of databases users this role is allowed to connect as.| |desktop_groups|[]string|DesktopGroups is a list of groups for created desktop users to be added to| |gcp_service_accounts|[]string|GCPServiceAccounts is a list of GCP service accounts this role is allowed to assume.| +|github_permissions|[][object](#specallowgithub_permissions-items)|GitHubPermissions defines GitHub integration related permissions.| |group_labels|object|GroupLabels is a map of labels used as part of the RBAC system.| |group_labels_expression|string|GroupLabelsExpression is a predicate expression used to allow/deny access to user groups.| |host_groups|[]string|HostGroups is a list of groups for created users to be added to| @@ -90,6 +91,12 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |match|object|Match is a list of object labels that must be matched for the permission to be granted.| |permissions|[]string|Permission is the list of string representations of the permission to be given, e.g. SELECT, INSERT, UPDATE, ...| +### spec.allow.github_permissions items + +|Field|Type|Description| +|---|---|---| +|orgs|[]string|| + ### spec.allow.impersonate |Field|Type|Description| @@ -225,6 +232,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |db_users|[]string|DatabaseUsers is a list of databases users this role is allowed to connect as.| |desktop_groups|[]string|DesktopGroups is a list of groups for created desktop users to be added to| |gcp_service_accounts|[]string|GCPServiceAccounts is a list of GCP service accounts this role is allowed to assume.| +|github_permissions|[][object](#specdenygithub_permissions-items)|GitHubPermissions defines GitHub integration related permissions.| |group_labels|object|GroupLabels is a map of labels used as part of the RBAC system.| |group_labels_expression|string|GroupLabelsExpression is a predicate expression used to allow/deny access to user groups.| |host_groups|[]string|HostGroups is a list of groups for created users to be added to| @@ -264,6 +272,12 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |match|object|Match is a list of object labels that must be matched for the permission to be granted.| |permissions|[]string|Permission is the list of string representations of the permission to be given, e.g. SELECT, INSERT, UPDATE, ...| +### spec.deny.github_permissions items + +|Field|Type|Description| +|---|---|---| +|orgs|[]string|| + ### spec.deny.impersonate |Field|Type|Description| @@ -502,6 +516,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |db_users|[]string|DatabaseUsers is a list of databases users this role is allowed to connect as.| |desktop_groups|[]string|DesktopGroups is a list of groups for created desktop users to be added to| |gcp_service_accounts|[]string|GCPServiceAccounts is a list of GCP service accounts this role is allowed to assume.| +|github_permissions|[][object](#specallowgithub_permissions-items)|GitHubPermissions defines GitHub integration related permissions.| |group_labels|object|GroupLabels is a map of labels used as part of the RBAC system.| |group_labels_expression|string|GroupLabelsExpression is a predicate expression used to allow/deny access to user groups.| |host_groups|[]string|HostGroups is a list of groups for created users to be added to| @@ -541,6 +556,12 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |match|object|Match is a list of object labels that must be matched for the permission to be granted.| |permissions|[]string|Permission is the list of string representations of the permission to be given, e.g. SELECT, INSERT, UPDATE, ...| +### spec.allow.github_permissions items + +|Field|Type|Description| +|---|---|---| +|orgs|[]string|| + ### spec.allow.impersonate |Field|Type|Description| @@ -676,6 +697,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |db_users|[]string|DatabaseUsers is a list of databases users this role is allowed to connect as.| |desktop_groups|[]string|DesktopGroups is a list of groups for created desktop users to be added to| |gcp_service_accounts|[]string|GCPServiceAccounts is a list of GCP service accounts this role is allowed to assume.| +|github_permissions|[][object](#specdenygithub_permissions-items)|GitHubPermissions defines GitHub integration related permissions.| |group_labels|object|GroupLabels is a map of labels used as part of the RBAC system.| |group_labels_expression|string|GroupLabelsExpression is a predicate expression used to allow/deny access to user groups.| |host_groups|[]string|HostGroups is a list of groups for created users to be added to| @@ -715,6 +737,12 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |match|object|Match is a list of object labels that must be matched for the permission to be granted.| |permissions|[]string|Permission is the list of string representations of the permission to be given, e.g. SELECT, INSERT, UPDATE, ...| +### spec.deny.github_permissions items + +|Field|Type|Description| +|---|---|---| +|orgs|[]string|| + ### spec.deny.impersonate |Field|Type|Description| diff --git a/docs/pages/reference/operator-resources/resources-teleport-dev-rolesv6.mdx b/docs/pages/reference/operator-resources/resources-teleport-dev-rolesv6.mdx index e8845bc0784b3..be0ef826e851f 100644 --- a/docs/pages/reference/operator-resources/resources-teleport-dev-rolesv6.mdx +++ b/docs/pages/reference/operator-resources/resources-teleport-dev-rolesv6.mdx @@ -51,6 +51,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |db_users|[]string|DatabaseUsers is a list of databases users this role is allowed to connect as.| |desktop_groups|[]string|DesktopGroups is a list of groups for created desktop users to be added to| |gcp_service_accounts|[]string|GCPServiceAccounts is a list of GCP service accounts this role is allowed to assume.| +|github_permissions|[][object](#specallowgithub_permissions-items)|GitHubPermissions defines GitHub integration related permissions.| |group_labels|object|GroupLabels is a map of labels used as part of the RBAC system.| |group_labels_expression|string|GroupLabelsExpression is a predicate expression used to allow/deny access to user groups.| |host_groups|[]string|HostGroups is a list of groups for created users to be added to| @@ -90,6 +91,12 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |match|object|Match is a list of object labels that must be matched for the permission to be granted.| |permissions|[]string|Permission is the list of string representations of the permission to be given, e.g. SELECT, INSERT, UPDATE, ...| +### spec.allow.github_permissions items + +|Field|Type|Description| +|---|---|---| +|orgs|[]string|| + ### spec.allow.impersonate |Field|Type|Description| @@ -225,6 +232,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |db_users|[]string|DatabaseUsers is a list of databases users this role is allowed to connect as.| |desktop_groups|[]string|DesktopGroups is a list of groups for created desktop users to be added to| |gcp_service_accounts|[]string|GCPServiceAccounts is a list of GCP service accounts this role is allowed to assume.| +|github_permissions|[][object](#specdenygithub_permissions-items)|GitHubPermissions defines GitHub integration related permissions.| |group_labels|object|GroupLabels is a map of labels used as part of the RBAC system.| |group_labels_expression|string|GroupLabelsExpression is a predicate expression used to allow/deny access to user groups.| |host_groups|[]string|HostGroups is a list of groups for created users to be added to| @@ -264,6 +272,12 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |match|object|Match is a list of object labels that must be matched for the permission to be granted.| |permissions|[]string|Permission is the list of string representations of the permission to be given, e.g. SELECT, INSERT, UPDATE, ...| +### spec.deny.github_permissions items + +|Field|Type|Description| +|---|---|---| +|orgs|[]string|| + ### spec.deny.impersonate |Field|Type|Description| diff --git a/docs/pages/reference/operator-resources/resources-teleport-dev-rolesv7.mdx b/docs/pages/reference/operator-resources/resources-teleport-dev-rolesv7.mdx index e00769555d578..f2f32d32f06f3 100644 --- a/docs/pages/reference/operator-resources/resources-teleport-dev-rolesv7.mdx +++ b/docs/pages/reference/operator-resources/resources-teleport-dev-rolesv7.mdx @@ -51,6 +51,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |db_users|[]string|DatabaseUsers is a list of databases users this role is allowed to connect as.| |desktop_groups|[]string|DesktopGroups is a list of groups for created desktop users to be added to| |gcp_service_accounts|[]string|GCPServiceAccounts is a list of GCP service accounts this role is allowed to assume.| +|github_permissions|[][object](#specallowgithub_permissions-items)|GitHubPermissions defines GitHub integration related permissions.| |group_labels|object|GroupLabels is a map of labels used as part of the RBAC system.| |group_labels_expression|string|GroupLabelsExpression is a predicate expression used to allow/deny access to user groups.| |host_groups|[]string|HostGroups is a list of groups for created users to be added to| @@ -90,6 +91,12 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |match|object|Match is a list of object labels that must be matched for the permission to be granted.| |permissions|[]string|Permission is the list of string representations of the permission to be given, e.g. SELECT, INSERT, UPDATE, ...| +### spec.allow.github_permissions items + +|Field|Type|Description| +|---|---|---| +|orgs|[]string|| + ### spec.allow.impersonate |Field|Type|Description| @@ -225,6 +232,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |db_users|[]string|DatabaseUsers is a list of databases users this role is allowed to connect as.| |desktop_groups|[]string|DesktopGroups is a list of groups for created desktop users to be added to| |gcp_service_accounts|[]string|GCPServiceAccounts is a list of GCP service accounts this role is allowed to assume.| +|github_permissions|[][object](#specdenygithub_permissions-items)|GitHubPermissions defines GitHub integration related permissions.| |group_labels|object|GroupLabels is a map of labels used as part of the RBAC system.| |group_labels_expression|string|GroupLabelsExpression is a predicate expression used to allow/deny access to user groups.| |host_groups|[]string|HostGroups is a list of groups for created users to be added to| @@ -264,6 +272,12 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |match|object|Match is a list of object labels that must be matched for the permission to be granted.| |permissions|[]string|Permission is the list of string representations of the permission to be given, e.g. SELECT, INSERT, UPDATE, ...| +### spec.deny.github_permissions items + +|Field|Type|Description| +|---|---|---| +|orgs|[]string|| + ### spec.deny.impersonate |Field|Type|Description| diff --git a/docs/pages/reference/operator-resources/resources-teleport-dev-trustedclustersv2.mdx b/docs/pages/reference/operator-resources/resources-teleport-dev-trustedclustersv2.mdx new file mode 100644 index 0000000000000..8728b51b2ab5c --- /dev/null +++ b/docs/pages/reference/operator-resources/resources-teleport-dev-trustedclustersv2.mdx @@ -0,0 +1,41 @@ +--- +title: TeleportTrustedClusterV2 +description: Provides a comprehensive list of fields in the TeleportTrustedClusterV2 resource available through the Teleport Kubernetes operator +tocDepth: 3 +--- + +{/*Auto-generated file. Do not edit.*/} +{/*To regenerate, navigate to integrations/operator and run "make crd-docs".*/} + +This guide is a comprehensive reference to the fields in the `TeleportTrustedClusterV2` +resource, which you can apply after installing the Teleport Kubernetes operator. + + +## resources.teleport.dev/v1 + +**apiVersion:** resources.teleport.dev/v1 + +|Field|Type|Description| +|---|---|---| +|apiVersion|string|APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources| +|kind|string|Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds| +|metadata|object|| +|spec|[object](#spec)|TrustedCluster resource definition v2 from Teleport| + +### spec + +|Field|Type|Description| +|---|---|---| +|enabled|boolean|Enabled is a bool that indicates if the TrustedCluster is enabled or disabled. Setting Enabled to false has a side effect of deleting the user and host certificate authority (CA).| +|role_map|[][object](#specrole_map-items)|RoleMap specifies role mappings to remote roles.| +|token|string|Token is the authorization token provided by another cluster needed by this cluster to join. This field supports secret lookup. See the operator documentation for more details.| +|tunnel_addr|string|ReverseTunnelAddress is the address of the SSH proxy server of the cluster to join. If not set, it is derived from `:`.| +|web_proxy_addr|string|ProxyAddress is the address of the web proxy server of the cluster to join. If not set, it is derived from `:`.| + +### spec.role_map items + +|Field|Type|Description| +|---|---|---| +|local|[]string|Local specifies local roles to map to| +|remote|string|Remote specifies remote role name to map from| + diff --git a/docs/pages/reference/operator-resources/resources-teleport-dev-users.mdx b/docs/pages/reference/operator-resources/resources-teleport-dev-users.mdx index 96a74152fe72f..f4559d680a7ee 100644 --- a/docs/pages/reference/operator-resources/resources-teleport-dev-users.mdx +++ b/docs/pages/reference/operator-resources/resources-teleport-dev-users.mdx @@ -39,6 +39,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |---|---|---| |connector_id|string|ConnectorID is id of registered OIDC connector, e.g. 'google-example.com'| |samlSingleLogoutUrl|string|SAMLSingleLogoutURL is the SAML Single log-out URL to initiate SAML SLO (single log-out), if applicable.| +|user_id|string|UserID is the ID of the identity. Some connectors like GitHub have an unique ID apart from the username.| |username|string|Username is username supplied by external identity provider| ### spec.oidc_identities items @@ -47,6 +48,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |---|---|---| |connector_id|string|ConnectorID is id of registered OIDC connector, e.g. 'google-example.com'| |samlSingleLogoutUrl|string|SAMLSingleLogoutURL is the SAML Single log-out URL to initiate SAML SLO (single log-out), if applicable.| +|user_id|string|UserID is the ID of the identity. Some connectors like GitHub have an unique ID apart from the username.| |username|string|Username is username supplied by external identity provider| ### spec.saml_identities items @@ -55,5 +57,6 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |---|---|---| |connector_id|string|ConnectorID is id of registered OIDC connector, e.g. 'google-example.com'| |samlSingleLogoutUrl|string|SAMLSingleLogoutURL is the SAML Single log-out URL to initiate SAML SLO (single log-out), if applicable.| +|user_id|string|UserID is the ID of the identity. Some connectors like GitHub have an unique ID apart from the username.| |username|string|Username is username supplied by external identity provider| diff --git a/docs/pages/reference/terraform-provider/data-sources/role.mdx b/docs/pages/reference/terraform-provider/data-sources/role.mdx index e9517adab3e37..c79cebff80852 100644 --- a/docs/pages/reference/terraform-provider/data-sources/role.mdx +++ b/docs/pages/reference/terraform-provider/data-sources/role.mdx @@ -66,6 +66,7 @@ Optional: - `db_users` (List of String) DatabaseUsers is a list of databases users this role is allowed to connect as. - `desktop_groups` (List of String) DesktopGroups is a list of groups for created desktop users to be added to - `gcp_service_accounts` (List of String) GCPServiceAccounts is a list of GCP service accounts this role is allowed to assume. +- `github_permissions` (Attributes List) GitHubPermissions defines GitHub integration related permissions. (see [below for nested schema](#nested-schema-for-specallowgithub_permissions)) - `group_labels` (Map of List of String) GroupLabels is a map of labels used as part of the RBAC system. - `group_labels_expression` (String) GroupLabelsExpression is a predicate expression used to allow/deny access to user groups. - `host_groups` (List of String) HostGroups is a list of groups for created users to be added to @@ -107,6 +108,13 @@ Optional: - `permissions` (List of String) Permission is the list of string representations of the permission to be given, e.g. SELECT, INSERT, UPDATE, ... +### Nested Schema for `spec.allow.github_permissions` + +Optional: + +- `orgs` (List of String) + + ### Nested Schema for `spec.allow.impersonate` Optional: @@ -256,6 +264,7 @@ Optional: - `db_users` (List of String) DatabaseUsers is a list of databases users this role is allowed to connect as. - `desktop_groups` (List of String) DesktopGroups is a list of groups for created desktop users to be added to - `gcp_service_accounts` (List of String) GCPServiceAccounts is a list of GCP service accounts this role is allowed to assume. +- `github_permissions` (Attributes List) GitHubPermissions defines GitHub integration related permissions. (see [below for nested schema](#nested-schema-for-specdenygithub_permissions)) - `group_labels` (Map of List of String) GroupLabels is a map of labels used as part of the RBAC system. - `group_labels_expression` (String) GroupLabelsExpression is a predicate expression used to allow/deny access to user groups. - `host_groups` (List of String) HostGroups is a list of groups for created users to be added to @@ -297,6 +306,13 @@ Optional: - `permissions` (List of String) Permission is the list of string representations of the permission to be given, e.g. SELECT, INSERT, UPDATE, ... +### Nested Schema for `spec.deny.github_permissions` + +Optional: + +- `orgs` (List of String) + + ### Nested Schema for `spec.deny.impersonate` Optional: diff --git a/docs/pages/reference/terraform-provider/data-sources/user.mdx b/docs/pages/reference/terraform-provider/data-sources/user.mdx index a622e9a8203d7..ddfdba981231b 100644 --- a/docs/pages/reference/terraform-provider/data-sources/user.mdx +++ b/docs/pages/reference/terraform-provider/data-sources/user.mdx @@ -55,6 +55,7 @@ Optional: - `connector_id` (String) ConnectorID is id of registered OIDC connector, e.g. 'google-example.com' - `samlSingleLogoutUrl` (String) SAMLSingleLogoutURL is the SAML Single log-out URL to initiate SAML SLO (single log-out), if applicable. +- `user_id` (String) UserID is the ID of the identity. Some connectors like GitHub have an unique ID apart from the username. - `username` (String) Username is username supplied by external identity provider @@ -64,6 +65,7 @@ Optional: - `connector_id` (String) ConnectorID is id of registered OIDC connector, e.g. 'google-example.com' - `samlSingleLogoutUrl` (String) SAMLSingleLogoutURL is the SAML Single log-out URL to initiate SAML SLO (single log-out), if applicable. +- `user_id` (String) UserID is the ID of the identity. Some connectors like GitHub have an unique ID apart from the username. - `username` (String) Username is username supplied by external identity provider @@ -73,6 +75,7 @@ Optional: - `connector_id` (String) ConnectorID is id of registered OIDC connector, e.g. 'google-example.com' - `samlSingleLogoutUrl` (String) SAMLSingleLogoutURL is the SAML Single log-out URL to initiate SAML SLO (single log-out), if applicable. +- `user_id` (String) UserID is the ID of the identity. Some connectors like GitHub have an unique ID apart from the username. - `username` (String) Username is username supplied by external identity provider diff --git a/docs/pages/reference/terraform-provider/resources/role.mdx b/docs/pages/reference/terraform-provider/resources/role.mdx index c6b2a57891cc9..70d9c3edc0f1e 100644 --- a/docs/pages/reference/terraform-provider/resources/role.mdx +++ b/docs/pages/reference/terraform-provider/resources/role.mdx @@ -128,6 +128,7 @@ Optional: - `db_users` (List of String) DatabaseUsers is a list of databases users this role is allowed to connect as. - `desktop_groups` (List of String) DesktopGroups is a list of groups for created desktop users to be added to - `gcp_service_accounts` (List of String) GCPServiceAccounts is a list of GCP service accounts this role is allowed to assume. +- `github_permissions` (Attributes List) GitHubPermissions defines GitHub integration related permissions. (see [below for nested schema](#nested-schema-for-specallowgithub_permissions)) - `group_labels` (Map of List of String) GroupLabels is a map of labels used as part of the RBAC system. - `group_labels_expression` (String) GroupLabelsExpression is a predicate expression used to allow/deny access to user groups. - `host_groups` (List of String) HostGroups is a list of groups for created users to be added to @@ -169,6 +170,13 @@ Optional: - `permissions` (List of String) Permission is the list of string representations of the permission to be given, e.g. SELECT, INSERT, UPDATE, ... +### Nested Schema for `spec.allow.github_permissions` + +Optional: + +- `orgs` (List of String) + + ### Nested Schema for `spec.allow.impersonate` Optional: @@ -318,6 +326,7 @@ Optional: - `db_users` (List of String) DatabaseUsers is a list of databases users this role is allowed to connect as. - `desktop_groups` (List of String) DesktopGroups is a list of groups for created desktop users to be added to - `gcp_service_accounts` (List of String) GCPServiceAccounts is a list of GCP service accounts this role is allowed to assume. +- `github_permissions` (Attributes List) GitHubPermissions defines GitHub integration related permissions. (see [below for nested schema](#nested-schema-for-specdenygithub_permissions)) - `group_labels` (Map of List of String) GroupLabels is a map of labels used as part of the RBAC system. - `group_labels_expression` (String) GroupLabelsExpression is a predicate expression used to allow/deny access to user groups. - `host_groups` (List of String) HostGroups is a list of groups for created users to be added to @@ -359,6 +368,13 @@ Optional: - `permissions` (List of String) Permission is the list of string representations of the permission to be given, e.g. SELECT, INSERT, UPDATE, ... +### Nested Schema for `spec.deny.github_permissions` + +Optional: + +- `orgs` (List of String) + + ### Nested Schema for `spec.deny.impersonate` Optional: diff --git a/docs/pages/reference/terraform-provider/resources/server.mdx b/docs/pages/reference/terraform-provider/resources/server.mdx index d52652885a22d..9370519007cf9 100644 --- a/docs/pages/reference/terraform-provider/resources/server.mdx +++ b/docs/pages/reference/terraform-provider/resources/server.mdx @@ -86,6 +86,7 @@ Optional: - `addr` (String) Addr is a host:port address where this server can be reached. - `cloud_metadata` (Attributes) CloudMetadata contains info about the cloud instance the server is running on, if any. (see [below for nested schema](#nested-schema-for-speccloud_metadata)) +- `github` (Attributes) GitHub contains info about GitHub proxies where each server represents a GitHub organization. (see [below for nested schema](#nested-schema-for-specgithub)) - `hostname` (String) Hostname is server hostname - `peer_addr` (String) PeerAddr is the address a proxy server is reachable at by its peer proxies. - `proxy_ids` (List of String) ProxyIDs is a list of proxy IDs this server is expected to be connected to. @@ -113,6 +114,14 @@ Optional: +### Nested Schema for `spec.github` + +Optional: + +- `integration` (String) Integration is the integration that is associated with this Server. +- `organization` (String) Organization specifies the name of the organization for the GitHub integration. + + ### Nested Schema for `spec.rotation` Optional: diff --git a/docs/pages/reference/terraform-provider/resources/user.mdx b/docs/pages/reference/terraform-provider/resources/user.mdx index 4ea8a262f4880..9e25692d6cc84 100644 --- a/docs/pages/reference/terraform-provider/resources/user.mdx +++ b/docs/pages/reference/terraform-provider/resources/user.mdx @@ -102,6 +102,7 @@ Optional: - `connector_id` (String) ConnectorID is id of registered OIDC connector, e.g. 'google-example.com' - `samlSingleLogoutUrl` (String) SAMLSingleLogoutURL is the SAML Single log-out URL to initiate SAML SLO (single log-out), if applicable. +- `user_id` (String) UserID is the ID of the identity. Some connectors like GitHub have an unique ID apart from the username. - `username` (String) Username is username supplied by external identity provider @@ -111,6 +112,7 @@ Optional: - `connector_id` (String) ConnectorID is id of registered OIDC connector, e.g. 'google-example.com' - `samlSingleLogoutUrl` (String) SAMLSingleLogoutURL is the SAML Single log-out URL to initiate SAML SLO (single log-out), if applicable. +- `user_id` (String) UserID is the ID of the identity. Some connectors like GitHub have an unique ID apart from the username. - `username` (String) Username is username supplied by external identity provider @@ -120,6 +122,7 @@ Optional: - `connector_id` (String) ConnectorID is id of registered OIDC connector, e.g. 'google-example.com' - `samlSingleLogoutUrl` (String) SAMLSingleLogoutURL is the SAML Single log-out URL to initiate SAML SLO (single log-out), if applicable. +- `user_id` (String) UserID is the ID of the identity. Some connectors like GitHub have an unique ID apart from the username. - `username` (String) Username is username supplied by external identity provider diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_openssheiceserversv2.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_openssheiceserversv2.yaml index 3617909ae6a67..bad8469a76fb6 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_openssheiceserversv2.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_openssheiceserversv2.yaml @@ -88,6 +88,20 @@ spec: type: string type: object type: object + github: + description: GitHub contains info about GitHub proxies where each + server represents a GitHub organization. + nullable: true + properties: + integration: + description: Integration is the integration that is associated + with this Server. + type: string + organization: + description: Organization specifies the name of the organization + for the GitHub integration. + type: string + type: object hostname: description: Hostname is server hostname type: string diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_opensshserversv2.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_opensshserversv2.yaml index ad7dfd4174776..fe3d76a8db7a4 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_opensshserversv2.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_opensshserversv2.yaml @@ -87,6 +87,20 @@ spec: type: string type: object type: object + github: + description: GitHub contains info about GitHub proxies where each + server represents a GitHub organization. + nullable: true + properties: + integration: + description: Integration is the integration that is associated + with this Server. + type: string + organization: + description: Organization specifies the name of the organization + for the GitHub integration. + type: string + type: object hostname: description: Hostname is server hostname type: string diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_roles.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_roles.yaml index f7b4a591b6f8f..9e3a0f46e9334 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_roles.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_roles.yaml @@ -157,6 +157,18 @@ spec: type: string nullable: true type: array + github_permissions: + description: GitHubPermissions defines GitHub integration related + permissions. + items: + properties: + orgs: + items: + type: string + nullable: true + type: array + type: object + type: array group_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -733,6 +745,18 @@ spec: type: string nullable: true type: array + github_permissions: + description: GitHubPermissions defines GitHub integration related + permissions. + items: + properties: + orgs: + items: + type: string + nullable: true + type: array + type: object + type: array group_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -1606,6 +1630,18 @@ spec: type: string nullable: true type: array + github_permissions: + description: GitHubPermissions defines GitHub integration related + permissions. + items: + properties: + orgs: + items: + type: string + nullable: true + type: array + type: object + type: array group_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -2182,6 +2218,18 @@ spec: type: string nullable: true type: array + github_permissions: + description: GitHubPermissions defines GitHub integration related + permissions. + items: + properties: + orgs: + items: + type: string + nullable: true + type: array + type: object + type: array group_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv6.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv6.yaml index c90af3b7e8161..5e1ff2a359184 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv6.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv6.yaml @@ -160,6 +160,18 @@ spec: type: string nullable: true type: array + github_permissions: + description: GitHubPermissions defines GitHub integration related + permissions. + items: + properties: + orgs: + items: + type: string + nullable: true + type: array + type: object + type: array group_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -736,6 +748,18 @@ spec: type: string nullable: true type: array + github_permissions: + description: GitHubPermissions defines GitHub integration related + permissions. + items: + properties: + orgs: + items: + type: string + nullable: true + type: array + type: object + type: array group_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv7.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv7.yaml index 64324e5d6fd39..fb682402d11e3 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv7.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv7.yaml @@ -160,6 +160,18 @@ spec: type: string nullable: true type: array + github_permissions: + description: GitHubPermissions defines GitHub integration related + permissions. + items: + properties: + orgs: + items: + type: string + nullable: true + type: array + type: object + type: array group_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -736,6 +748,18 @@ spec: type: string nullable: true type: array + github_permissions: + description: GitHubPermissions defines GitHub integration related + permissions. + items: + properties: + orgs: + items: + type: string + nullable: true + type: array + type: object + type: array group_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_users.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_users.yaml index 504c3695c4532..0c68b6dec714f 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_users.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_users.yaml @@ -57,6 +57,10 @@ spec: description: SAMLSingleLogoutURL is the SAML Single log-out URL to initiate SAML SLO (single log-out), if applicable. type: string + user_id: + description: UserID is the ID of the identity. Some connectors + like GitHub have an unique ID apart from the username. + type: string username: description: Username is username supplied by external identity provider @@ -76,6 +80,10 @@ spec: description: SAMLSingleLogoutURL is the SAML Single log-out URL to initiate SAML SLO (single log-out), if applicable. type: string + user_id: + description: UserID is the ID of the identity. Some connectors + like GitHub have an unique ID apart from the username. + type: string username: description: Username is username supplied by external identity provider @@ -101,6 +109,10 @@ spec: description: SAMLSingleLogoutURL is the SAML Single log-out URL to initiate SAML SLO (single log-out), if applicable. type: string + user_id: + description: UserID is the ID of the identity. Some connectors + like GitHub have an unique ID apart from the username. + type: string username: description: Username is username supplied by external identity provider diff --git a/go.mod b/go.mod index 7a06f6ad87300..c4f79bd085e3c 100644 --- a/go.mod +++ b/go.mod @@ -99,6 +99,7 @@ require ( github.com/fxamacker/cbor/v2 v2.7.0 github.com/ghodss/yaml v1.0.0 github.com/gizak/termui/v3 v3.1.0 + github.com/go-git/go-git/v5 v5.13.1 github.com/go-jose/go-jose/v3 v3.0.3 github.com/go-ldap/ldap/v3 v3.4.8 github.com/go-logr/logr v1.4.2 @@ -148,6 +149,7 @@ require ( github.com/keys-pub/go-libfido2 v1.5.3-0.20220306005615-8ab03fb1ec27 // replaced github.com/lib/pq v1.10.9 github.com/mailgun/mailgun-go/v4 v4.16.0 + github.com/mattn/go-shellwords v1.0.12 github.com/mattn/go-sqlite3 v1.14.23 github.com/mdlayher/netlink v1.7.2 github.com/microsoft/go-mssqldb v1.7.2 // replaced @@ -180,7 +182,7 @@ require ( github.com/snowflakedb/gosnowflake v1.11.1 github.com/spf13/cobra v1.8.1 github.com/spiffe/go-spiffe/v2 v2.3.0 - github.com/stretchr/testify v1.9.0 + github.com/stretchr/testify v1.10.0 github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb github.com/vulcand/predicate v1.2.0 // replaced github.com/xanzy/go-gitlab v0.109.0 @@ -306,7 +308,7 @@ require ( github.com/coreos/pkg v0.0.0-20220810130054-c7d1c02cb6cf // indirect github.com/crewjam/httperr v0.2.0 // indirect github.com/cyberphone/json-canonicalization v0.0.0-20231011164504-785e29786b46 // indirect - github.com/cyphar/filepath-securejoin v0.3.1 // indirect + github.com/cyphar/filepath-securejoin v0.3.6 // indirect github.com/danieljoos/wincred v1.2.1 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/daviddengcn/go-colortext v1.0.0 // indirect @@ -338,6 +340,8 @@ require ( github.com/go-errors/errors v1.4.2 // indirect github.com/go-faster/city v1.0.1 // indirect github.com/go-faster/errors v0.7.1 // indirect + github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect + github.com/go-git/go-billy/v5 v5.6.1 // indirect github.com/go-gorp/gorp/v3 v3.1.0 // indirect github.com/go-jose/go-jose/v4 v4.0.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect @@ -399,6 +403,7 @@ require ( github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect github.com/jackc/puddle/v2 v2.2.2 // indirect + github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/jcmturner/aescts/v2 v2.0.0 // indirect github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect github.com/jcmturner/gofork v1.7.6 // indirect @@ -466,6 +471,7 @@ require ( github.com/pingcap/errors v0.11.5-0.20240311024730-e056997136bb // indirect github.com/pingcap/log v1.1.1-0.20230317032135-a0d097d16e22 // indirect github.com/pingcap/tidb/pkg/parser v0.0.0-20240930120915-74034d4ac243 // indirect + github.com/pjbgf/sha1cd v0.3.0 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pkg/xattr v0.4.10 // indirect @@ -544,6 +550,7 @@ require ( gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect + gopkg.in/warnings.v0 v0.1.2 // indirect k8s.io/component-helpers v0.31.1 // indirect k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect k8s.io/metrics v0.31.1 // indirect diff --git a/go.sum b/go.sum index b4769034fe7ad..f46d701f0aae6 100644 --- a/go.sum +++ b/go.sum @@ -764,8 +764,8 @@ github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAE github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g= -github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c h1:kMFnB0vCcX7IL/m9Y5LO+KQYv+t1CQOiFe6+SV2J7bE= -github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/ProtonMail/go-crypto v1.1.3 h1:nRBOetoydLeUb4nHajyO2bKqMLfWQ/ZPwkXqXxPxCFk= +github.com/ProtonMail/go-crypto v1.1.3/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/ThalesIgnite/crypto11 v1.2.5 h1:1IiIIEqYmBvUYFeMnHqRft4bwf/O36jryEUpY+9ef8E= @@ -1087,8 +1087,8 @@ github.com/crewjam/httperr v0.2.0 h1:b2BfXR8U3AlIHwNeFFvZ+BV1LFvKLlzMjzaTnZMybNo github.com/crewjam/httperr v0.2.0/go.mod h1:Jlz+Sg/XqBQhyMjdDiC+GNNRzZTD7x39Gu3pglZ5oH4= github.com/cyberphone/json-canonicalization v0.0.0-20231011164504-785e29786b46 h1:2Dx4IHfC1yHWI12AxQDJM1QbRCDfk6M+blLzlZCXdrc= github.com/cyberphone/json-canonicalization v0.0.0-20231011164504-785e29786b46/go.mod h1:uzvlm1mxhHkdfqitSA92i7Se+S9ksOn3a3qmv/kyOCw= -github.com/cyphar/filepath-securejoin v0.3.1 h1:1V7cHiaW+C+39wEfpH6XlLBQo3j/PciWFrgfCLS8XrE= -github.com/cyphar/filepath-securejoin v0.3.1/go.mod h1:F7i41x/9cBF7lzCrVsYs9fuzwRZm4NQsGTBdpp6mETc= +github.com/cyphar/filepath-securejoin v0.3.6 h1:4d9N5ykBnSp5Xn2JkhocYDkOpURL/18CYMpo6xB9uWM= +github.com/cyphar/filepath-securejoin v0.3.6/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= github.com/danieljoos/wincred v1.2.1 h1:dl9cBrupW8+r5250DYkYxocLeZ1Y4vB1kxgtjxw8GQs= github.com/danieljoos/wincred v1.2.1/go.mod h1:uGaFL9fDn3OLTvzCGulzE+SzjEe5NGlh5FdCcyfPwps= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -1232,6 +1232,14 @@ github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3 github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= +github.com/go-git/go-billy/v5 v5.6.1 h1:u+dcrgaguSSkbjzHwelEjc0Yj300NUevrrPphk/SoRA= +github.com/go-git/go-billy/v5 v5.6.1/go.mod h1:0AsLr1z2+Uksi4NlElmMblP5rPcDZNRCD8ujZCRR2BE= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= +github.com/go-git/go-git/v5 v5.13.1 h1:DAQ9APonnlvSWpvolXWIuV6Q6zXy2wHbN4cVlNR5Q+M= +github.com/go-git/go-git/v5 v5.13.1/go.mod h1:qryJB4cSBoq3FRoBRf5A77joojuBcmPJ0qu3XXXVixc= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -1672,6 +1680,8 @@ github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dv github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= @@ -1801,6 +1811,8 @@ github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzp github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= @@ -1952,6 +1964,8 @@ github.com/pingcap/log v1.1.1-0.20230317032135-a0d097d16e22 h1:2SOzvGvE8beiC1Y4g github.com/pingcap/log v1.1.1-0.20230317032135-a0d097d16e22/go.mod h1:DWQW5jICDR7UJh4HtxXSM20Churx4CQL0fwL/SoOSA4= github.com/pingcap/tidb/pkg/parser v0.0.0-20240930120915-74034d4ac243 h1:B3pF5adXRpuEDfSKY/bV2Lw+pPKtWH4FOaAX3Jx3X54= github.com/pingcap/tidb/pkg/parser v0.0.0-20240930120915-74034d4ac243/go.mod h1:dXcO3Ts6jUVE1VwBZp3wbVdGO4pi9MXY6IvL4L1z62g= +github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= +github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= @@ -2062,8 +2076,8 @@ github.com/segmentio/encoding v0.4.0 h1:MEBYvRqiUB2nfR2criEXWqwdY6HJOUrCn5hboVOV github.com/segmentio/encoding v0.4.0/go.mod h1:/d03Cd8PoaDeceuhUUUQWjU0KhWjrmYrWPgtJHYZSnI= github.com/segmentio/ksuid v1.0.4 h1:sBo2BdShXjmcugAMwjugoGUdUV0pcxY5mW4xKRn3v4c= github.com/segmentio/ksuid v1.0.4/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE= -github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= -github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= github.com/shabbyrobe/gocovmerge v0.0.0-20190829150210-3e036491d500/go.mod h1:+njLrG5wSeoG4Ds61rFgEzKvenR2UHbjMoDHsczxly0= github.com/shabbyrobe/gocovmerge v0.0.0-20230507112040-c3350d9342df h1:S77Pf5fIGMa7oSwp8SQPp7Hb4ZiI38K3RNBKD2LLeEM= github.com/shabbyrobe/gocovmerge v0.0.0-20230507112040-c3350d9342df/go.mod h1:dcuzJZ83w/SqN9k4eQqwKYMgmKWzg/KzJAURBhRL1tc= @@ -2154,8 +2168,9 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= @@ -3110,6 +3125,8 @@ gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7 gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/integrations/event-handler/go.mod b/integrations/event-handler/go.mod index ed854282e5488..a241cce0684c8 100644 --- a/integrations/event-handler/go.mod +++ b/integrations/event-handler/go.mod @@ -14,7 +14,7 @@ require ( github.com/pelletier/go-toml v1.9.5 github.com/peterbourgon/diskv/v3 v3.0.1 github.com/sethvargo/go-limiter v1.0.0 - github.com/stretchr/testify v1.9.0 + github.com/stretchr/testify v1.10.0 golang.org/x/net v0.33.0 golang.org/x/time v0.6.0 google.golang.org/protobuf v1.35.1 @@ -113,7 +113,7 @@ require ( github.com/coreos/pkg v0.0.0-20220810130054-c7d1c02cb6cf // indirect github.com/crewjam/httperr v0.2.0 // indirect github.com/crewjam/saml v0.4.14 // indirect - github.com/cyphar/filepath-securejoin v0.3.1 // indirect + github.com/cyphar/filepath-securejoin v0.3.6 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/di-wu/parser v0.3.0 // indirect github.com/di-wu/xsd-datetime v1.0.0 // indirect diff --git a/integrations/event-handler/go.sum b/integrations/event-handler/go.sum index f81589670e7b8..b542e042797fc 100644 --- a/integrations/event-handler/go.sum +++ b/integrations/event-handler/go.sum @@ -873,8 +873,8 @@ github.com/crewjam/httperr v0.2.0 h1:b2BfXR8U3AlIHwNeFFvZ+BV1LFvKLlzMjzaTnZMybNo github.com/crewjam/httperr v0.2.0/go.mod h1:Jlz+Sg/XqBQhyMjdDiC+GNNRzZTD7x39Gu3pglZ5oH4= github.com/crewjam/saml v0.4.14 h1:g9FBNx62osKusnFzs3QTN5L9CVA/Egfgm+stJShzw/c= github.com/crewjam/saml v0.4.14/go.mod h1:UVSZCf18jJkk6GpWNVqcyQJMD5HsRugBPf4I1nl2mME= -github.com/cyphar/filepath-securejoin v0.3.1 h1:1V7cHiaW+C+39wEfpH6XlLBQo3j/PciWFrgfCLS8XrE= -github.com/cyphar/filepath-securejoin v0.3.1/go.mod h1:F7i41x/9cBF7lzCrVsYs9fuzwRZm4NQsGTBdpp6mETc= +github.com/cyphar/filepath-securejoin v0.3.6 h1:4d9N5ykBnSp5Xn2JkhocYDkOpURL/18CYMpo6xB9uWM= +github.com/cyphar/filepath-securejoin v0.3.6/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -1529,8 +1529,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/thales-e-security/pool v0.0.2 h1:RAPs4q2EbWsTit6tpzuvTFlgFRJ3S8Evf5gtvVDbmPg= github.com/thales-e-security/pool v0.0.2/go.mod h1:qtpMm2+thHtqhLzTwgDBj/OuNnMpupY8mv0Phz0gjhU= github.com/weppos/publicsuffix-go v0.13.0/go.mod h1:z3LCPQ38eedDQSwmsSRW4Y7t2L8Ln16JPQ02lHAdn5k= diff --git a/integrations/operator/config/crd/bases/resources.teleport.dev_openssheiceserversv2.yaml b/integrations/operator/config/crd/bases/resources.teleport.dev_openssheiceserversv2.yaml index 3617909ae6a67..bad8469a76fb6 100644 --- a/integrations/operator/config/crd/bases/resources.teleport.dev_openssheiceserversv2.yaml +++ b/integrations/operator/config/crd/bases/resources.teleport.dev_openssheiceserversv2.yaml @@ -88,6 +88,20 @@ spec: type: string type: object type: object + github: + description: GitHub contains info about GitHub proxies where each + server represents a GitHub organization. + nullable: true + properties: + integration: + description: Integration is the integration that is associated + with this Server. + type: string + organization: + description: Organization specifies the name of the organization + for the GitHub integration. + type: string + type: object hostname: description: Hostname is server hostname type: string diff --git a/integrations/operator/config/crd/bases/resources.teleport.dev_opensshserversv2.yaml b/integrations/operator/config/crd/bases/resources.teleport.dev_opensshserversv2.yaml index ad7dfd4174776..fe3d76a8db7a4 100644 --- a/integrations/operator/config/crd/bases/resources.teleport.dev_opensshserversv2.yaml +++ b/integrations/operator/config/crd/bases/resources.teleport.dev_opensshserversv2.yaml @@ -87,6 +87,20 @@ spec: type: string type: object type: object + github: + description: GitHub contains info about GitHub proxies where each + server represents a GitHub organization. + nullable: true + properties: + integration: + description: Integration is the integration that is associated + with this Server. + type: string + organization: + description: Organization specifies the name of the organization + for the GitHub integration. + type: string + type: object hostname: description: Hostname is server hostname type: string diff --git a/integrations/operator/config/crd/bases/resources.teleport.dev_roles.yaml b/integrations/operator/config/crd/bases/resources.teleport.dev_roles.yaml index f7b4a591b6f8f..9e3a0f46e9334 100644 --- a/integrations/operator/config/crd/bases/resources.teleport.dev_roles.yaml +++ b/integrations/operator/config/crd/bases/resources.teleport.dev_roles.yaml @@ -157,6 +157,18 @@ spec: type: string nullable: true type: array + github_permissions: + description: GitHubPermissions defines GitHub integration related + permissions. + items: + properties: + orgs: + items: + type: string + nullable: true + type: array + type: object + type: array group_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -733,6 +745,18 @@ spec: type: string nullable: true type: array + github_permissions: + description: GitHubPermissions defines GitHub integration related + permissions. + items: + properties: + orgs: + items: + type: string + nullable: true + type: array + type: object + type: array group_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -1606,6 +1630,18 @@ spec: type: string nullable: true type: array + github_permissions: + description: GitHubPermissions defines GitHub integration related + permissions. + items: + properties: + orgs: + items: + type: string + nullable: true + type: array + type: object + type: array group_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -2182,6 +2218,18 @@ spec: type: string nullable: true type: array + github_permissions: + description: GitHubPermissions defines GitHub integration related + permissions. + items: + properties: + orgs: + items: + type: string + nullable: true + type: array + type: object + type: array group_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true diff --git a/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv6.yaml b/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv6.yaml index c90af3b7e8161..5e1ff2a359184 100644 --- a/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv6.yaml +++ b/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv6.yaml @@ -160,6 +160,18 @@ spec: type: string nullable: true type: array + github_permissions: + description: GitHubPermissions defines GitHub integration related + permissions. + items: + properties: + orgs: + items: + type: string + nullable: true + type: array + type: object + type: array group_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -736,6 +748,18 @@ spec: type: string nullable: true type: array + github_permissions: + description: GitHubPermissions defines GitHub integration related + permissions. + items: + properties: + orgs: + items: + type: string + nullable: true + type: array + type: object + type: array group_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true diff --git a/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv7.yaml b/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv7.yaml index 64324e5d6fd39..fb682402d11e3 100644 --- a/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv7.yaml +++ b/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv7.yaml @@ -160,6 +160,18 @@ spec: type: string nullable: true type: array + github_permissions: + description: GitHubPermissions defines GitHub integration related + permissions. + items: + properties: + orgs: + items: + type: string + nullable: true + type: array + type: object + type: array group_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -736,6 +748,18 @@ spec: type: string nullable: true type: array + github_permissions: + description: GitHubPermissions defines GitHub integration related + permissions. + items: + properties: + orgs: + items: + type: string + nullable: true + type: array + type: object + type: array group_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true diff --git a/integrations/operator/config/crd/bases/resources.teleport.dev_users.yaml b/integrations/operator/config/crd/bases/resources.teleport.dev_users.yaml index 504c3695c4532..0c68b6dec714f 100644 --- a/integrations/operator/config/crd/bases/resources.teleport.dev_users.yaml +++ b/integrations/operator/config/crd/bases/resources.teleport.dev_users.yaml @@ -57,6 +57,10 @@ spec: description: SAMLSingleLogoutURL is the SAML Single log-out URL to initiate SAML SLO (single log-out), if applicable. type: string + user_id: + description: UserID is the ID of the identity. Some connectors + like GitHub have an unique ID apart from the username. + type: string username: description: Username is username supplied by external identity provider @@ -76,6 +80,10 @@ spec: description: SAMLSingleLogoutURL is the SAML Single log-out URL to initiate SAML SLO (single log-out), if applicable. type: string + user_id: + description: UserID is the ID of the identity. Some connectors + like GitHub have an unique ID apart from the username. + type: string username: description: Username is username supplied by external identity provider @@ -101,6 +109,10 @@ spec: description: SAMLSingleLogoutURL is the SAML Single log-out URL to initiate SAML SLO (single log-out), if applicable. type: string + user_id: + description: UserID is the ID of the identity. Some connectors + like GitHub have an unique ID apart from the username. + type: string username: description: Username is username supplied by external identity provider diff --git a/integrations/terraform/go.mod b/integrations/terraform/go.mod index 0c8644bf847a3..fe16e18a59280 100644 --- a/integrations/terraform/go.mod +++ b/integrations/terraform/go.mod @@ -22,7 +22,7 @@ require ( github.com/hashicorp/terraform-plugin-sdk/v2 v2.10.1 github.com/jonboulle/clockwork v0.4.0 github.com/sirupsen/logrus v1.9.3 - github.com/stretchr/testify v1.9.0 + github.com/stretchr/testify v1.10.0 google.golang.org/grpc v1.66.3 google.golang.org/protobuf v1.35.1 ) @@ -129,7 +129,7 @@ require ( github.com/coreos/pkg v0.0.0-20220810130054-c7d1c02cb6cf // indirect github.com/crewjam/httperr v0.2.0 // indirect github.com/crewjam/saml v0.4.14 // indirect - github.com/cyphar/filepath-securejoin v0.3.1 // indirect + github.com/cyphar/filepath-securejoin v0.3.6 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/di-wu/parser v0.3.0 // indirect github.com/di-wu/xsd-datetime v1.0.0 // indirect diff --git a/integrations/terraform/go.sum b/integrations/terraform/go.sum index 651cd28db6216..a81d9b581512b 100644 --- a/integrations/terraform/go.sum +++ b/integrations/terraform/go.sum @@ -955,8 +955,8 @@ github.com/crewjam/httperr v0.2.0 h1:b2BfXR8U3AlIHwNeFFvZ+BV1LFvKLlzMjzaTnZMybNo github.com/crewjam/httperr v0.2.0/go.mod h1:Jlz+Sg/XqBQhyMjdDiC+GNNRzZTD7x39Gu3pglZ5oH4= github.com/crewjam/saml v0.4.14 h1:g9FBNx62osKusnFzs3QTN5L9CVA/Egfgm+stJShzw/c= github.com/crewjam/saml v0.4.14/go.mod h1:UVSZCf18jJkk6GpWNVqcyQJMD5HsRugBPf4I1nl2mME= -github.com/cyphar/filepath-securejoin v0.3.1 h1:1V7cHiaW+C+39wEfpH6XlLBQo3j/PciWFrgfCLS8XrE= -github.com/cyphar/filepath-securejoin v0.3.1/go.mod h1:F7i41x/9cBF7lzCrVsYs9fuzwRZm4NQsGTBdpp6mETc= +github.com/cyphar/filepath-securejoin v0.3.6 h1:4d9N5ykBnSp5Xn2JkhocYDkOpURL/18CYMpo6xB9uWM= +github.com/cyphar/filepath-securejoin v0.3.6/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -1072,12 +1072,12 @@ github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66D github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= -github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= -github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= +github.com/go-git/go-billy/v5 v5.6.1 h1:u+dcrgaguSSkbjzHwelEjc0Yj300NUevrrPphk/SoRA= +github.com/go-git/go-billy/v5 v5.6.1/go.mod h1:0AsLr1z2+Uksi4NlElmMblP5rPcDZNRCD8ujZCRR2BE= github.com/go-git/go-git-fixtures/v4 v4.2.1/go.mod h1:K8zd3kDUAykwTdDCr+I0per6Y6vMiRR/nnVTBtavnB0= github.com/go-git/go-git/v5 v5.4.2/go.mod h1:gQ1kArt6d+n+BGd+/B/I74HwRTLhth2+zti4ihgckDc= -github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys= -github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY= +github.com/go-git/go-git/v5 v5.13.1 h1:DAQ9APonnlvSWpvolXWIuV6Q6zXy2wHbN4cVlNR5Q+M= +github.com/go-git/go-git/v5 v5.13.1/go.mod h1:qryJB4cSBoq3FRoBRf5A77joojuBcmPJ0qu3XXXVixc= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -1574,6 +1574,8 @@ github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= @@ -1824,8 +1826,8 @@ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1F github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/thales-e-security/pool v0.0.2 h1:RAPs4q2EbWsTit6tpzuvTFlgFRJ3S8Evf5gtvVDbmPg= github.com/thales-e-security/pool v0.0.2/go.mod h1:qtpMm2+thHtqhLzTwgDBj/OuNnMpupY8mv0Phz0gjhU= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= diff --git a/integrations/terraform/tfschema/types_terraform.go b/integrations/terraform/tfschema/types_terraform.go index eaea7f787e2f6..80c5ef1c906b3 100644 --- a/integrations/terraform/tfschema/types_terraform.go +++ b/integrations/terraform/tfschema/types_terraform.go @@ -655,6 +655,22 @@ func GenSchemaServerV2(ctx context.Context) (github_com_hashicorp_terraform_plug Description: "CloudMetadata contains info about the cloud instance the server is running on, if any.", Optional: true, }, + "github": { + Attributes: github_com_hashicorp_terraform_plugin_framework_tfsdk.SingleNestedAttributes(map[string]github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{ + "integration": { + Description: "Integration is the integration that is associated with this Server.", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.StringType, + }, + "organization": { + Description: "Organization specifies the name of the organization for the GitHub integration.", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.StringType, + }, + }), + Description: "GitHub contains info about GitHub proxies where each server represents a GitHub organization.", + Optional: true, + }, "hostname": { Description: "Hostname is server hostname", Optional: true, @@ -1687,6 +1703,15 @@ func GenSchemaRoleV6(ctx context.Context) (github_com_hashicorp_terraform_plugin Optional: true, Type: github_com_hashicorp_terraform_plugin_framework_types.ListType{ElemType: github_com_hashicorp_terraform_plugin_framework_types.StringType}, }, + "github_permissions": { + Attributes: github_com_hashicorp_terraform_plugin_framework_tfsdk.ListNestedAttributes(map[string]github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{"orgs": { + Description: "", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.ListType{ElemType: github_com_hashicorp_terraform_plugin_framework_types.StringType}, + }}), + Description: "GitHubPermissions defines GitHub integration related permissions.", + Optional: true, + }, "group_labels": GenSchemaLabels(ctx, github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{ Description: "GroupLabels is a map of labels used as part of the RBAC system.", Optional: true, @@ -2167,6 +2192,15 @@ func GenSchemaRoleV6(ctx context.Context) (github_com_hashicorp_terraform_plugin Optional: true, Type: github_com_hashicorp_terraform_plugin_framework_types.ListType{ElemType: github_com_hashicorp_terraform_plugin_framework_types.StringType}, }, + "github_permissions": { + Attributes: github_com_hashicorp_terraform_plugin_framework_tfsdk.ListNestedAttributes(map[string]github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{"orgs": { + Description: "", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.ListType{ElemType: github_com_hashicorp_terraform_plugin_framework_types.StringType}, + }}), + Description: "GitHubPermissions defines GitHub integration related permissions.", + Optional: true, + }, "group_labels": GenSchemaLabels(ctx, github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{ Description: "GroupLabels is a map of labels used as part of the RBAC system.", Optional: true, @@ -2848,6 +2882,11 @@ func GenSchemaUserV2(ctx context.Context) (github_com_hashicorp_terraform_plugin Optional: true, Type: github_com_hashicorp_terraform_plugin_framework_types.StringType, }, + "user_id": { + Description: "UserID is the ID of the identity. Some connectors like GitHub have an unique ID apart from the username.", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.StringType, + }, "username": { Description: "Username is username supplied by external identity provider", Optional: true, @@ -2869,6 +2908,11 @@ func GenSchemaUserV2(ctx context.Context) (github_com_hashicorp_terraform_plugin Optional: true, Type: github_com_hashicorp_terraform_plugin_framework_types.StringType, }, + "user_id": { + Description: "UserID is the ID of the identity. Some connectors like GitHub have an unique ID apart from the username.", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.StringType, + }, "username": { Description: "Username is username supplied by external identity provider", Optional: true, @@ -2895,6 +2939,11 @@ func GenSchemaUserV2(ctx context.Context) (github_com_hashicorp_terraform_plugin Optional: true, Type: github_com_hashicorp_terraform_plugin_framework_types.StringType, }, + "user_id": { + Description: "UserID is the ID of the identity. Some connectors like GitHub have an unique ID apart from the username.", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.StringType, + }, "username": { Description: "Username is username supplied by external identity provider", Optional: true, @@ -8959,6 +9008,58 @@ func CopyServerV2FromTerraform(_ context.Context, tf github_com_hashicorp_terraf } } } + { + a, ok := tf.Attrs["github"] + if !ok { + diags.Append(attrReadMissingDiag{"ServerV2.Spec.git_hub"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.Object) + if !ok { + diags.Append(attrReadConversionFailureDiag{"ServerV2.Spec.git_hub", "github.com/hashicorp/terraform-plugin-framework/types.Object"}) + } else { + obj.GitHub = nil + if !v.Null && !v.Unknown { + tf := v + obj.GitHub = &github_com_gravitational_teleport_api_types.GitHubServerMetadata{} + obj := obj.GitHub + { + a, ok := tf.Attrs["organization"] + if !ok { + diags.Append(attrReadMissingDiag{"ServerV2.Spec.git_hub.organization"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrReadConversionFailureDiag{"ServerV2.Spec.git_hub.organization", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } else { + var t string + if !v.Null && !v.Unknown { + t = string(v.Value) + } + obj.Organization = t + } + } + } + { + a, ok := tf.Attrs["integration"] + if !ok { + diags.Append(attrReadMissingDiag{"ServerV2.Spec.git_hub.integration"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrReadConversionFailureDiag{"ServerV2.Spec.git_hub.integration", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } else { + var t string + if !v.Null && !v.Unknown { + t = string(v.Value) + } + obj.Integration = t + } + } + } + } + } + } + } } } } @@ -9951,6 +10052,82 @@ func CopyServerV2ToTerraform(ctx context.Context, obj *github_com_gravitational_ } } } + { + a, ok := tf.AttrTypes["github"] + if !ok { + diags.Append(attrWriteMissingDiag{"ServerV2.Spec.git_hub"}) + } else { + o, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.ObjectType) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"ServerV2.Spec.git_hub", "github.com/hashicorp/terraform-plugin-framework/types.ObjectType"}) + } else { + v, ok := tf.Attrs["github"].(github_com_hashicorp_terraform_plugin_framework_types.Object) + if !ok { + v = github_com_hashicorp_terraform_plugin_framework_types.Object{ + + AttrTypes: o.AttrTypes, + Attrs: make(map[string]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(o.AttrTypes)), + } + } else { + if v.Attrs == nil { + v.Attrs = make(map[string]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(tf.AttrTypes)) + } + } + if obj.GitHub == nil { + v.Null = true + } else { + obj := obj.GitHub + tf := &v + { + t, ok := tf.AttrTypes["organization"] + if !ok { + diags.Append(attrWriteMissingDiag{"ServerV2.Spec.git_hub.organization"}) + } else { + v, ok := tf.Attrs["organization"].(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + i, err := t.ValueFromTerraform(ctx, github_com_hashicorp_terraform_plugin_go_tftypes.NewValue(t.TerraformType(ctx), nil)) + if err != nil { + diags.Append(attrWriteGeneralError{"ServerV2.Spec.git_hub.organization", err}) + } + v, ok = i.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"ServerV2.Spec.git_hub.organization", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } + v.Null = string(obj.Organization) == "" + } + v.Value = string(obj.Organization) + v.Unknown = false + tf.Attrs["organization"] = v + } + } + { + t, ok := tf.AttrTypes["integration"] + if !ok { + diags.Append(attrWriteMissingDiag{"ServerV2.Spec.git_hub.integration"}) + } else { + v, ok := tf.Attrs["integration"].(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + i, err := t.ValueFromTerraform(ctx, github_com_hashicorp_terraform_plugin_go_tftypes.NewValue(t.TerraformType(ctx), nil)) + if err != nil { + diags.Append(attrWriteGeneralError{"ServerV2.Spec.git_hub.integration", err}) + } + v, ok = i.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"ServerV2.Spec.git_hub.integration", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } + v.Null = string(obj.Integration) == "" + } + v.Value = string(obj.Integration) + v.Unknown = false + tf.Attrs["integration"] = v + } + } + } + v.Unknown = false + tf.Attrs["github"] = v + } + } + } } v.Unknown = false tf.Attrs["spec"] = v @@ -18938,6 +19115,61 @@ func CopyRoleV6FromTerraform(_ context.Context, tf github_com_hashicorp_terrafor } } } + { + a, ok := tf.Attrs["github_permissions"] + if !ok { + diags.Append(attrReadMissingDiag{"RoleV6.Spec.Allow.git_hub_permissions"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Allow.git_hub_permissions", "github.com/hashicorp/terraform-plugin-framework/types.List"}) + } else { + obj.GitHubPermissions = make([]github_com_gravitational_teleport_api_types.GitHubPermission, len(v.Elems)) + if !v.Null && !v.Unknown { + for k, a := range v.Elems { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.Object) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Allow.git_hub_permissions", "github_com_hashicorp_terraform_plugin_framework_types.Object"}) + } else { + var t github_com_gravitational_teleport_api_types.GitHubPermission + if !v.Null && !v.Unknown { + tf := v + obj := &t + { + a, ok := tf.Attrs["orgs"] + if !ok { + diags.Append(attrReadMissingDiag{"RoleV6.Spec.Allow.git_hub_permissions.organizations"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Allow.git_hub_permissions.organizations", "github.com/hashicorp/terraform-plugin-framework/types.List"}) + } else { + obj.Organizations = make([]string, len(v.Elems)) + if !v.Null && !v.Unknown { + for k, a := range v.Elems { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Allow.git_hub_permissions.organizations", "github_com_hashicorp_terraform_plugin_framework_types.String"}) + } else { + var t string + if !v.Null && !v.Unknown { + t = string(v.Value) + } + obj.Organizations[k] = t + } + } + } + } + } + } + } + obj.GitHubPermissions[k] = t + } + } + } + } + } + } { a, ok := tf.Attrs["workload_identity_labels"] if !ok { @@ -20911,6 +21143,61 @@ func CopyRoleV6FromTerraform(_ context.Context, tf github_com_hashicorp_terrafor } } } + { + a, ok := tf.Attrs["github_permissions"] + if !ok { + diags.Append(attrReadMissingDiag{"RoleV6.Spec.Deny.git_hub_permissions"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Deny.git_hub_permissions", "github.com/hashicorp/terraform-plugin-framework/types.List"}) + } else { + obj.GitHubPermissions = make([]github_com_gravitational_teleport_api_types.GitHubPermission, len(v.Elems)) + if !v.Null && !v.Unknown { + for k, a := range v.Elems { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.Object) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Deny.git_hub_permissions", "github_com_hashicorp_terraform_plugin_framework_types.Object"}) + } else { + var t github_com_gravitational_teleport_api_types.GitHubPermission + if !v.Null && !v.Unknown { + tf := v + obj := &t + { + a, ok := tf.Attrs["orgs"] + if !ok { + diags.Append(attrReadMissingDiag{"RoleV6.Spec.Deny.git_hub_permissions.organizations"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Deny.git_hub_permissions.organizations", "github.com/hashicorp/terraform-plugin-framework/types.List"}) + } else { + obj.Organizations = make([]string, len(v.Elems)) + if !v.Null && !v.Unknown { + for k, a := range v.Elems { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Deny.git_hub_permissions.organizations", "github_com_hashicorp_terraform_plugin_framework_types.String"}) + } else { + var t string + if !v.Null && !v.Unknown { + t = string(v.Value) + } + obj.Organizations[k] = t + } + } + } + } + } + } + } + obj.GitHubPermissions[k] = t + } + } + } + } + } + } { a, ok := tf.Attrs["workload_identity_labels"] if !ok { @@ -25613,6 +25900,115 @@ func CopyRoleV6ToTerraform(ctx context.Context, obj *github_com_gravitational_te } } } + { + a, ok := tf.AttrTypes["github_permissions"] + if !ok { + diags.Append(attrWriteMissingDiag{"RoleV6.Spec.Allow.git_hub_permissions"}) + } else { + o, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.ListType) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"RoleV6.Spec.Allow.git_hub_permissions", "github.com/hashicorp/terraform-plugin-framework/types.ListType"}) + } else { + c, ok := tf.Attrs["github_permissions"].(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + c = github_com_hashicorp_terraform_plugin_framework_types.List{ + + ElemType: o.ElemType, + Elems: make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.GitHubPermissions)), + Null: true, + } + } else { + if c.Elems == nil { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.GitHubPermissions)) + } + } + if obj.GitHubPermissions != nil { + o := o.ElemType.(github_com_hashicorp_terraform_plugin_framework_types.ObjectType) + if len(obj.GitHubPermissions) != len(c.Elems) { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.GitHubPermissions)) + } + for k, a := range obj.GitHubPermissions { + v, ok := tf.Attrs["github_permissions"].(github_com_hashicorp_terraform_plugin_framework_types.Object) + if !ok { + v = github_com_hashicorp_terraform_plugin_framework_types.Object{ + + AttrTypes: o.AttrTypes, + Attrs: make(map[string]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(o.AttrTypes)), + } + } else { + if v.Attrs == nil { + v.Attrs = make(map[string]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(tf.AttrTypes)) + } + } + { + obj := a + tf := &v + { + a, ok := tf.AttrTypes["orgs"] + if !ok { + diags.Append(attrWriteMissingDiag{"RoleV6.Spec.Allow.git_hub_permissions.organizations"}) + } else { + o, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.ListType) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"RoleV6.Spec.Allow.git_hub_permissions.organizations", "github.com/hashicorp/terraform-plugin-framework/types.ListType"}) + } else { + c, ok := tf.Attrs["orgs"].(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + c = github_com_hashicorp_terraform_plugin_framework_types.List{ + + ElemType: o.ElemType, + Elems: make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.Organizations)), + Null: true, + } + } else { + if c.Elems == nil { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.Organizations)) + } + } + if obj.Organizations != nil { + t := o.ElemType + if len(obj.Organizations) != len(c.Elems) { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.Organizations)) + } + for k, a := range obj.Organizations { + v, ok := tf.Attrs["orgs"].(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + i, err := t.ValueFromTerraform(ctx, github_com_hashicorp_terraform_plugin_go_tftypes.NewValue(t.TerraformType(ctx), nil)) + if err != nil { + diags.Append(attrWriteGeneralError{"RoleV6.Spec.Allow.git_hub_permissions.organizations", err}) + } + v, ok = i.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"RoleV6.Spec.Allow.git_hub_permissions.organizations", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } + v.Null = string(a) == "" + } + v.Value = string(a) + v.Unknown = false + c.Elems[k] = v + } + if len(obj.Organizations) > 0 { + c.Null = false + } + } + c.Unknown = false + tf.Attrs["orgs"] = c + } + } + } + } + v.Unknown = false + c.Elems[k] = v + } + if len(obj.GitHubPermissions) > 0 { + c.Null = false + } + } + c.Unknown = false + tf.Attrs["github_permissions"] = c + } + } + } { t, ok := tf.AttrTypes["workload_identity_labels"] if !ok { @@ -29042,6 +29438,115 @@ func CopyRoleV6ToTerraform(ctx context.Context, obj *github_com_gravitational_te } } } + { + a, ok := tf.AttrTypes["github_permissions"] + if !ok { + diags.Append(attrWriteMissingDiag{"RoleV6.Spec.Deny.git_hub_permissions"}) + } else { + o, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.ListType) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"RoleV6.Spec.Deny.git_hub_permissions", "github.com/hashicorp/terraform-plugin-framework/types.ListType"}) + } else { + c, ok := tf.Attrs["github_permissions"].(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + c = github_com_hashicorp_terraform_plugin_framework_types.List{ + + ElemType: o.ElemType, + Elems: make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.GitHubPermissions)), + Null: true, + } + } else { + if c.Elems == nil { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.GitHubPermissions)) + } + } + if obj.GitHubPermissions != nil { + o := o.ElemType.(github_com_hashicorp_terraform_plugin_framework_types.ObjectType) + if len(obj.GitHubPermissions) != len(c.Elems) { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.GitHubPermissions)) + } + for k, a := range obj.GitHubPermissions { + v, ok := tf.Attrs["github_permissions"].(github_com_hashicorp_terraform_plugin_framework_types.Object) + if !ok { + v = github_com_hashicorp_terraform_plugin_framework_types.Object{ + + AttrTypes: o.AttrTypes, + Attrs: make(map[string]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(o.AttrTypes)), + } + } else { + if v.Attrs == nil { + v.Attrs = make(map[string]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(tf.AttrTypes)) + } + } + { + obj := a + tf := &v + { + a, ok := tf.AttrTypes["orgs"] + if !ok { + diags.Append(attrWriteMissingDiag{"RoleV6.Spec.Deny.git_hub_permissions.organizations"}) + } else { + o, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.ListType) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"RoleV6.Spec.Deny.git_hub_permissions.organizations", "github.com/hashicorp/terraform-plugin-framework/types.ListType"}) + } else { + c, ok := tf.Attrs["orgs"].(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + c = github_com_hashicorp_terraform_plugin_framework_types.List{ + + ElemType: o.ElemType, + Elems: make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.Organizations)), + Null: true, + } + } else { + if c.Elems == nil { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.Organizations)) + } + } + if obj.Organizations != nil { + t := o.ElemType + if len(obj.Organizations) != len(c.Elems) { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.Organizations)) + } + for k, a := range obj.Organizations { + v, ok := tf.Attrs["orgs"].(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + i, err := t.ValueFromTerraform(ctx, github_com_hashicorp_terraform_plugin_go_tftypes.NewValue(t.TerraformType(ctx), nil)) + if err != nil { + diags.Append(attrWriteGeneralError{"RoleV6.Spec.Deny.git_hub_permissions.organizations", err}) + } + v, ok = i.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"RoleV6.Spec.Deny.git_hub_permissions.organizations", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } + v.Null = string(a) == "" + } + v.Value = string(a) + v.Unknown = false + c.Elems[k] = v + } + if len(obj.Organizations) > 0 { + c.Null = false + } + } + c.Unknown = false + tf.Attrs["orgs"] = c + } + } + } + } + v.Unknown = false + c.Elems[k] = v + } + if len(obj.GitHubPermissions) > 0 { + c.Null = false + } + } + c.Unknown = false + tf.Attrs["github_permissions"] = c + } + } + } { t, ok := tf.AttrTypes["workload_identity_labels"] if !ok { @@ -29356,6 +29861,23 @@ func CopyUserV2FromTerraform(_ context.Context, tf github_com_hashicorp_terrafor } } } + { + a, ok := tf.Attrs["user_id"] + if !ok { + diags.Append(attrReadMissingDiag{"UserV2.Spec.OIDCIdentities.UserID"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrReadConversionFailureDiag{"UserV2.Spec.OIDCIdentities.UserID", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } else { + var t string + if !v.Null && !v.Unknown { + t = string(v.Value) + } + obj.UserID = t + } + } + } } obj.OIDCIdentities[k] = t } @@ -29435,6 +29957,23 @@ func CopyUserV2FromTerraform(_ context.Context, tf github_com_hashicorp_terrafor } } } + { + a, ok := tf.Attrs["user_id"] + if !ok { + diags.Append(attrReadMissingDiag{"UserV2.Spec.SAMLIdentities.UserID"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrReadConversionFailureDiag{"UserV2.Spec.SAMLIdentities.UserID", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } else { + var t string + if !v.Null && !v.Unknown { + t = string(v.Value) + } + obj.UserID = t + } + } + } } obj.SAMLIdentities[k] = t } @@ -29514,6 +30053,23 @@ func CopyUserV2FromTerraform(_ context.Context, tf github_com_hashicorp_terrafor } } } + { + a, ok := tf.Attrs["user_id"] + if !ok { + diags.Append(attrReadMissingDiag{"UserV2.Spec.GithubIdentities.UserID"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrReadConversionFailureDiag{"UserV2.Spec.GithubIdentities.UserID", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } else { + var t string + if !v.Null && !v.Unknown { + t = string(v.Value) + } + obj.UserID = t + } + } + } } obj.GithubIdentities[k] = t } @@ -30043,6 +30599,28 @@ func CopyUserV2ToTerraform(ctx context.Context, obj *github_com_gravitational_te tf.Attrs["samlSingleLogoutUrl"] = v } } + { + t, ok := tf.AttrTypes["user_id"] + if !ok { + diags.Append(attrWriteMissingDiag{"UserV2.Spec.OIDCIdentities.UserID"}) + } else { + v, ok := tf.Attrs["user_id"].(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + i, err := t.ValueFromTerraform(ctx, github_com_hashicorp_terraform_plugin_go_tftypes.NewValue(t.TerraformType(ctx), nil)) + if err != nil { + diags.Append(attrWriteGeneralError{"UserV2.Spec.OIDCIdentities.UserID", err}) + } + v, ok = i.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"UserV2.Spec.OIDCIdentities.UserID", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } + v.Null = string(obj.UserID) == "" + } + v.Value = string(obj.UserID) + v.Unknown = false + tf.Attrs["user_id"] = v + } + } } v.Unknown = false c.Elems[k] = v @@ -30165,6 +30743,28 @@ func CopyUserV2ToTerraform(ctx context.Context, obj *github_com_gravitational_te tf.Attrs["samlSingleLogoutUrl"] = v } } + { + t, ok := tf.AttrTypes["user_id"] + if !ok { + diags.Append(attrWriteMissingDiag{"UserV2.Spec.SAMLIdentities.UserID"}) + } else { + v, ok := tf.Attrs["user_id"].(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + i, err := t.ValueFromTerraform(ctx, github_com_hashicorp_terraform_plugin_go_tftypes.NewValue(t.TerraformType(ctx), nil)) + if err != nil { + diags.Append(attrWriteGeneralError{"UserV2.Spec.SAMLIdentities.UserID", err}) + } + v, ok = i.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"UserV2.Spec.SAMLIdentities.UserID", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } + v.Null = string(obj.UserID) == "" + } + v.Value = string(obj.UserID) + v.Unknown = false + tf.Attrs["user_id"] = v + } + } } v.Unknown = false c.Elems[k] = v @@ -30287,6 +30887,28 @@ func CopyUserV2ToTerraform(ctx context.Context, obj *github_com_gravitational_te tf.Attrs["samlSingleLogoutUrl"] = v } } + { + t, ok := tf.AttrTypes["user_id"] + if !ok { + diags.Append(attrWriteMissingDiag{"UserV2.Spec.GithubIdentities.UserID"}) + } else { + v, ok := tf.Attrs["user_id"].(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + i, err := t.ValueFromTerraform(ctx, github_com_hashicorp_terraform_plugin_go_tftypes.NewValue(t.TerraformType(ctx), nil)) + if err != nil { + diags.Append(attrWriteGeneralError{"UserV2.Spec.GithubIdentities.UserID", err}) + } + v, ok = i.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"UserV2.Spec.GithubIdentities.UserID", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } + v.Null = string(obj.UserID) == "" + } + v.Value = string(obj.UserID) + v.Unknown = false + tf.Attrs["user_id"] = v + } + } } v.Unknown = false c.Elems[k] = v diff --git a/lib/auth/accesspoint/accesspoint.go b/lib/auth/accesspoint/accesspoint.go index f03ced9931b17..66bf51223990f 100644 --- a/lib/auth/accesspoint/accesspoint.go +++ b/lib/auth/accesspoint/accesspoint.go @@ -109,6 +109,8 @@ type Config struct { AutoUpdateService services.AutoUpdateServiceGetter ProvisioningStates services.ProvisioningStates IdentityCenter services.IdentityCenter + PluginStaticCredentials services.PluginStaticCredentials + GitServers services.GitServers } func (c *Config) CheckAndSetDefaults() error { @@ -207,6 +209,8 @@ func NewCache(cfg Config) (*cache.Cache, error) { DynamicWindowsDesktops: cfg.DynamicWindowsDesktops, ProvisioningStates: cfg.ProvisioningStates, IdentityCenter: cfg.IdentityCenter, + PluginStaticCredentials: cfg.PluginStaticCredentials, + GitServers: cfg.GitServers, } return cache.New(cfg.Setup(cacheCfg)) diff --git a/lib/auth/auth.go b/lib/auth/auth.go index 7ebfa01915055..1ccf48467ea57 100644 --- a/lib/auth/auth.go +++ b/lib/auth/auth.go @@ -332,6 +332,12 @@ func NewServer(cfg *InitConfig, opts ...ServerOption) (*Server, error) { return nil, trace.Wrap(err) } } + if cfg.PluginStaticCredentials == nil { + cfg.PluginStaticCredentials, err = local.NewPluginStaticCredentialsService(cfg.Backend) + if err != nil { + return nil, trace.Wrap(err) + } + } if cfg.UserTasks == nil { cfg.UserTasks, err = local.NewUserTasksService(cfg.Backend) if err != nil { @@ -397,6 +403,12 @@ func NewServer(cfg *InitConfig, opts ...ServerOption) (*Server, error) { } cfg.WorkloadIdentity = workloadIdentity } + if cfg.GitServers == nil { + cfg.GitServers, err = local.NewGitServerService(cfg.Backend) + if err != nil { + return nil, trace.Wrap(err, "creating GitServer service") + } + } if cfg.Logger == nil { cfg.Logger = slog.With(teleport.ComponentKey, teleport.ComponentAuth) } @@ -494,6 +506,8 @@ func NewServer(cfg *InitConfig, opts ...ServerOption) (*Server, error) { ProvisioningStates: cfg.ProvisioningStates, IdentityCenter: cfg.IdentityCenter, WorkloadIdentities: cfg.WorkloadIdentity, + PluginStaticCredentials: cfg.PluginStaticCredentials, + GitServers: cfg.GitServers, } as := Server{ @@ -712,6 +726,8 @@ type Services struct { services.ProvisioningStates services.IdentityCenter services.WorkloadIdentities + services.PluginStaticCredentials + services.GitServers } // GetWebSession returns existing web session described by req. @@ -1005,7 +1021,7 @@ type Server struct { ghaIDTokenValidator ghaIDTokenValidator // ghaIDTokenJWKSValidator allows ID tokens from GitHub Actions to be // validated by the auth server using a known JWKS. It can be overridden for - //the purpose of tests. + // the purpose of tests. ghaIDTokenJWKSValidator ghaIDTokenJWKSValidator // spaceliftIDTokenValidator allows ID tokens from Spacelift to be validated @@ -3206,6 +3222,13 @@ func generateCert(ctx context.Context, a *Server, req certRequest, caType types. return nil, trace.Wrap(err) } + // At most one GitHub identity expected. + var githubUserID, githubUsername string + if githubIdentities := req.user.GetGithubIdentities(); len(githubIdentities) > 0 { + githubUserID = githubIdentities[0].UserID + githubUsername = githubIdentities[0].Username + } + var signedSSHCert []byte if req.sshPublicKey != nil { sshSigner, err := a.keyStore.GetSSHSigner(ctx, ca) @@ -3245,6 +3268,8 @@ func generateCert(ctx context.Context, a *Server, req certRequest, caType types. DeviceID: req.deviceExtensions.DeviceID, DeviceAssetTag: req.deviceExtensions.AssetTag, DeviceCredentialID: req.deviceExtensions.CredentialID, + GitHubUserID: githubUserID, + GitHubUsername: githubUsername, }, } signedSSHCert, err = a.GenerateUserCert(params) diff --git a/lib/auth/authclient/api.go b/lib/auth/authclient/api.go index cca8328d508df..c59bb595a2afd 100644 --- a/lib/auth/authclient/api.go +++ b/lib/auth/authclient/api.go @@ -26,6 +26,7 @@ import ( "github.com/gravitational/trace" "google.golang.org/grpc" + "github.com/gravitational/teleport/api/client/gitserver" "github.com/gravitational/teleport/api/client/proto" accessmonitoringrules "github.com/gravitational/teleport/api/gen/proto/go/teleport/accessmonitoringrules/v1" "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" @@ -320,6 +321,9 @@ type ReadProxyAccessPoint interface { // GetAutoUpdateAgentRollout gets the AutoUpdateAgentRollout from the backend. GetAutoUpdateAgentRollout(ctx context.Context) (*autoupdate.AutoUpdateAgentRollout, error) + + // GitServerReadOnlyClient returns the read-only client for Git servers. + GitServerReadOnlyClient() gitserver.ReadOnlyClient } // SnowflakeSessionWatcher is watcher interface used by Snowflake web session watcher. @@ -1261,6 +1265,12 @@ type Cache interface { // ListAccountAssignments fetches a paginated list of IdentityCenter Account Assignments ListAccountAssignments(context.Context, int, *pagination.PageRequestToken) ([]services.IdentityCenterAccountAssignment, pagination.NextPageToken, error) + + // GetPluginStaticCredentialsByLabels will get a list of plugin static credentials resource by matching labels. + GetPluginStaticCredentialsByLabels(ctx context.Context, labels map[string]string) ([]types.PluginStaticCredentials, error) + + // GitServerGetter defines methods for fetching Git servers. + services.GitServerGetter } type NodeWrapper struct { diff --git a/lib/auth/authclient/clt.go b/lib/auth/authclient/clt.go index 8c818c9015d80..09f13fd233a12 100644 --- a/lib/auth/authclient/clt.go +++ b/lib/auth/authclient/clt.go @@ -35,6 +35,7 @@ import ( "github.com/gravitational/teleport/api/client/databaseobject" "github.com/gravitational/teleport/api/client/dynamicwindows" "github.com/gravitational/teleport/api/client/externalauditstorage" + "github.com/gravitational/teleport/api/client/gitserver" "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/client/secreport" "github.com/gravitational/teleport/api/client/usertask" @@ -1890,4 +1891,13 @@ type ClientI interface { // ProvisioningServiceClient returns provisioning service client. ProvisioningServiceClient() provisioningv1.ProvisioningServiceClient + + // IntegrationsClient returns integrations client. + IntegrationsClient() integrationv1.IntegrationServiceClient + + // GitServerClient returns git server client. + GitServerClient() *gitserver.Client + + // GitServerReadOnlyClient returns the read-only client for Git servers. + GitServerReadOnlyClient() gitserver.ReadOnlyClient } diff --git a/lib/auth/github.go b/lib/auth/github.go index 2a4016da838bc..a447f9dca3594 100644 --- a/lib/auth/github.go +++ b/lib/auth/github.go @@ -491,9 +491,9 @@ func validateGithubAuthCallbackHelper(ctx context.Context, m githubManager, diag } func (a *Server) getGithubConnector(ctx context.Context, request types.GithubAuthRequest) (types.GithubConnector, error) { - if request.SSOTestFlow { + if request.SSOTestFlow || request.AuthenticatedUser != "" { if request.ConnectorSpec == nil { - return nil, trace.BadParameter("ConnectorSpec cannot be nil when SSOTestFlow is true") + return nil, trace.BadParameter("ConnectorSpec cannot be nil for SSOTestFlow or authenticated user flow") } if request.ConnectorID == "" { @@ -537,7 +537,7 @@ func newGithubOAuth2Config(connector types.GithubConnector) oauth2.Config { // ValidateGithubAuthCallback validates Github auth callback redirect func (a *Server) validateGithubAuthCallback(ctx context.Context, diagCtx *SSODiagContext, q url.Values) (*authclient.GithubAuthResponse, error) { - logger := log.WithFields(logrus.Fields{teleport.ComponentKey: "github"}) + logger := a.logger.With(teleport.ComponentKey, "github") if errParam := q.Get("error"); errParam != "" { // try to find request so the error gets logged against it. @@ -575,13 +575,21 @@ func (a *Server) validateGithubAuthCallback(ctx context.Context, diagCtx *SSODia } diagCtx.Info.TestFlow = req.SSOTestFlow + if req.AuthenticatedUser != "" { + return a.validateGithubAuthCallbackForAuthenticatedUser(ctx, code, req, diagCtx, logger) + } + connector, err := a.getGithubConnector(ctx, *req) if err != nil { return nil, trace.Wrap(err, "Failed to get GitHub connector and client.") } diagCtx.Info.GithubTeamsToLogins = connector.GetTeamsToLogins() diagCtx.Info.GithubTeamsToRoles = connector.GetTeamsToRoles() - logger.Debugf("Connector %q teams to logins: %v, roles: %v", connector.GetName(), connector.GetTeamsToLogins(), connector.GetTeamsToRoles()) + logger.DebugContext(ctx, "Connector found", + "connector", connector.GetName(), + "teams_to_logins", connector.GetTeamsToLogins(), + "roles", connector.GetTeamsToRoles(), + ) userResp, teamsResp, err := a.getGithubUserAndTeams(ctx, connector, code, diagCtx, logger) if err != nil { @@ -627,20 +635,30 @@ func (a *Server) validateGithubAuthCallback(ctx context.Context, diagCtx *SSODia return nil, trace.Wrap(err) } - // Auth was successful, return session, certificate, etc. to caller. - auth := authclient.GithubAuthResponse{ - Req: GithubAuthRequestFromProto(req), - Identity: types.ExternalIdentity{ - ConnectorID: params.ConnectorName, - Username: params.Username, - }, - Username: user.GetName(), - } - // In test flow skip signing and creating web sessions. if req.SSOTestFlow { diagCtx.Info.Success = true - return &auth, nil + return &authclient.GithubAuthResponse{ + Req: GithubAuthRequestFromProto(req), + Identity: userResp.makeExternalIdentity(params.ConnectorName), + Username: params.Username, + }, nil + } + + // Auth was successful, return session, certificate, etc. to caller. + return a.makeGithubAuthResponse(ctx, req, userState, userResp, params.SessionTTL) +} + +func (a *Server) makeGithubAuthResponse( + ctx context.Context, + req *types.GithubAuthRequest, + userState services.UserState, + githubUser *GithubUserResponse, + sessionTTL time.Duration) (*authclient.GithubAuthResponse, error) { + auth := authclient.GithubAuthResponse{ + Req: GithubAuthRequestFromProto(req), + Identity: githubUser.makeExternalIdentity(req.ConnectorID), + Username: userState.GetName(), } // If the request is coming from a browser, create a web session. @@ -649,7 +667,7 @@ func (a *Server) validateGithubAuthCallback(ctx context.Context, diagCtx *SSODia User: userState.GetName(), Roles: userState.GetRoles(), Traits: userState.GetTraits(), - SessionTTL: params.SessionTTL, + SessionTTL: sessionTTL, LoginTime: a.clock.Now().UTC(), LoginIP: req.ClientLoginIP, LoginUserAgent: req.ClientUserAgent, @@ -680,7 +698,7 @@ func (a *Server) validateGithubAuthCallback(ctx context.Context, diagCtx *SSODia if len(sshPublicKey)+len(tlsPublicKey) > 0 { sshCert, tlsCert, err := a.CreateSessionCerts(ctx, &SessionCertsRequest{ UserState: userState, - SessionTTL: params.SessionTTL, + SessionTTL: sessionTTL, SSHPubKey: sshPublicKey, TLSPubKey: tlsPublicKey, SSHAttestationStatement: sshAttestationStatement, @@ -716,30 +734,24 @@ func (a *Server) validateGithubAuthCallback(ctx context.Context, diagCtx *SSODia return &auth, nil } -func (a *Server) getGithubUserAndTeams( +func (a *Server) getGitHubAPIClient( ctx context.Context, connector types.GithubConnector, code string, diagCtx *SSODiagContext, - logger *logrus.Entry, -) (*GithubUserResponse, []GithubTeamResponse, error) { - if a.GithubUserAndTeamsOverride != nil { - // Allow tests to override the user and teams response instead of - // calling out to GitHub. - return a.GithubUserAndTeamsOverride() - } - + logger *slog.Logger, +) (*githubAPIClient, error) { config := newGithubOAuth2Config(connector) // exchange the authorization code received by the callback for an access token token, err := config.Exchange(ctx, code) if err != nil { - return nil, nil, trace.Wrap(err, "Requesting GitHub OAuth2 token failed.") + return nil, trace.Wrap(err, "Requesting GitHub OAuth2 token failed.") } scope, ok := token.Extra("scope").(string) if !ok { - return nil, nil, trace.BadParameter("missing or invalid scope found in GitHub OAuth2 token") + return nil, trace.BadParameter("missing or invalid scope found in GitHub OAuth2 token") } diagCtx.Info.GithubTokenInfo = &types.GithubTokenInfo{ TokenType: token.TokenType, @@ -747,20 +759,40 @@ func (a *Server) getGithubUserAndTeams( Scope: scope, } - logger.Debugf("Obtained OAuth2 token: Type=%v Expires=%v Scope=%v.", - token.TokenType, token.ExpiresIn, scope) + logger.DebugContext(ctx, "Obtained OAuth2 token", + "type", token.TokenType, "expires", token.ExpiresIn, "scope", scope) // Get the Github organizations the user is a member of so we don't // make unnecessary API requests apiEndpoint, err := buildAPIEndpoint(connector.GetAPIEndpointURL()) if err != nil { - return nil, nil, trace.Wrap(err) + return nil, trace.Wrap(err) } - ghClient := &githubAPIClient{ + return &githubAPIClient{ token: token.AccessToken, authServer: a, apiEndpoint: apiEndpoint, + }, nil +} + +func (a *Server) getGithubUserAndTeams( + ctx context.Context, + connector types.GithubConnector, + code string, + diagCtx *SSODiagContext, + logger *slog.Logger, +) (*GithubUserResponse, []GithubTeamResponse, error) { + if a.GithubUserAndTeamsOverride != nil { + // Allow tests to override the user and teams response instead of + // calling out to GitHub. + return a.GithubUserAndTeamsOverride() + } + + ghClient, err := a.getGitHubAPIClient(ctx, connector, code, diagCtx, logger) + if err != nil { + return nil, nil, trace.Wrap(err) } + userResp, err := ghClient.getUser() if err != nil { return nil, nil, trace.Wrap(err, "failed to query GitHub user info") @@ -769,7 +801,7 @@ func (a *Server) getGithubUserAndTeams( if err != nil { return nil, nil, trace.Wrap(err, "failed to query GitHub user teams") } - log.Debugf("Retrieved %v teams for GitHub user %v.", len(teamsResp), userResp.Login) + logger.DebugContext(ctx, "Retrieved teams for GitHub user.", "num_teams", len(teamsResp), "github_user", userResp.Login) // If we are running Teleport OSS, ensure that the Github organization // the user is trying to authenticate with is not using external SSO. @@ -784,6 +816,44 @@ func (a *Server) getGithubUserAndTeams( return userResp, teamsResp, nil } +func (a *Server) validateGithubAuthCallbackForAuthenticatedUser( + ctx context.Context, + code string, + req *types.GithubAuthRequest, + diagCtx *SSODiagContext, + logger *slog.Logger, +) (*authclient.GithubAuthResponse, error) { + connector, err := a.getGithubConnector(ctx, *req) + if err != nil { + return nil, trace.Wrap(err, "Failed to get GitHub connector and client.") + } + ghClient, err := a.getGitHubAPIClient(ctx, connector, code, diagCtx, logger) + if err != nil { + return nil, trace.Wrap(err) + } + githubUser, err := ghClient.getUser() + if err != nil { + return nil, trace.Wrap(err) + } + + // Attach the new (but secondary) identity. + teleportUser, err := a.GetUser(ctx, req.AuthenticatedUser, false) + if err != nil { + return nil, trace.Wrap(err) + } + teleportUser.SetGithubIdentities([]types.ExternalIdentity{ + githubUser.makeExternalIdentity(req.ConnectorID), + }) + + // Instead of updating the user, refresh the user login state. + userState, err := a.ulsGenerator.Refresh(ctx, teleportUser, a.UserLoginStates) + if err != nil { + return nil, trace.Wrap(err) + } + + return a.makeGithubAuthResponse(ctx, req, userState, githubUser, req.CertTTL) +} + // buildAPIEndpoint takes a URL of a GitHub API endpoint and returns only // the joined host and path. func buildAPIEndpoint(apiEndpointURLStr string) (string, error) { @@ -808,6 +878,9 @@ type CreateUserParams struct { // Username is the Teleport user name . Username string + // UserID is the unique ID of the GitHub user. + UserID string + // KubeGroups is the list of Kubernetes groups this user belongs to. KubeGroups []string @@ -828,6 +901,7 @@ func (a *Server) calculateGithubUser(ctx context.Context, diagCtx *SSODiagContex p := CreateUserParams{ ConnectorName: connector.GetName(), Username: claims.Username, + UserID: claims.UserID, } // Calculate logins, kubegroups, roles, and traits. @@ -891,6 +965,7 @@ func (a *Server) createGithubUser(ctx context.Context, p *CreateUserParams, dryR GithubIdentities: []types.ExternalIdentity{{ ConnectorID: p.ConnectorName, Username: p.Username, + UserID: p.UserID, }}, CreatedBy: types.CreatedBy{ User: types.UserRef{Name: teleport.UserSystem}, @@ -1054,6 +1129,7 @@ func populateGithubClaims(user *GithubUserResponse, teams []GithubTeamResponse) Username: user.Login, OrganizationToTeams: orgToTeams, Teams: teamList, + UserID: user.getIDStr(), } log.WithFields(logrus.Fields{teleport.ComponentKey: "github"}).Debugf( "Claims: %#v.", claims) @@ -1075,6 +1151,20 @@ type githubAPIClient struct { type GithubUserResponse struct { // Login is the username Login string `json:"login"` + // ID is the user ID + ID int64 `json:"id"` +} + +func (r GithubUserResponse) getIDStr() string { + return fmt.Sprintf("%v", r.ID) +} + +func (r GithubUserResponse) makeExternalIdentity(connectorID string) types.ExternalIdentity { + return types.ExternalIdentity{ + ConnectorID: connectorID, + Username: r.Login, + UserID: r.getIDStr(), + } } // getEmails retrieves a list of emails for authenticated user diff --git a/lib/auth/github_test.go b/lib/auth/github_test.go index e39f1ff9ea0da..56d33fcf91711 100644 --- a/lib/auth/github_test.go +++ b/lib/auth/github_test.go @@ -112,6 +112,7 @@ func TestPopulateClaims(t *testing.T) { require.NoError(t, err) require.Empty(t, cmp.Diff(claims, &types.GithubClaims{ Username: "octocat", + UserID: "1234567", OrganizationToTeams: map[string][]string{ "org1": {"team1", "team2"}, "org2": {"team1"}, @@ -160,7 +161,7 @@ func TestCreateGithubUser(t *testing.T) { type testGithubAPIClient struct{} func (c *testGithubAPIClient) getUser() (*GithubUserResponse, error) { - return &GithubUserResponse{Login: "octocat"}, nil + return &GithubUserResponse{Login: "octocat", ID: 1234567}, nil } func (c *testGithubAPIClient) getTeams() ([]GithubTeamResponse, error) { diff --git a/lib/auth/gitserver/gitserverv1/github.go b/lib/auth/gitserver/gitserverv1/github.go new file mode 100644 index 0000000000000..17aaa60436c67 --- /dev/null +++ b/lib/auth/gitserver/gitserverv1/github.go @@ -0,0 +1,139 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package gitserverv1 + +import ( + "context" + "fmt" + + "github.com/google/uuid" + "github.com/gravitational/trace" + + apidefaults "github.com/gravitational/teleport/api/defaults" + pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/gitserver/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/auth/integration/credentials" + "github.com/gravitational/teleport/lib/authz" +) + +func (s *Service) CreateGitHubAuthRequest(ctx context.Context, in *pb.CreateGitHubAuthRequestRequest) (*types.GithubAuthRequest, error) { + if in.Request == nil { + return nil, trace.BadParameter("missing github auth request") + } + if err := types.ValidateGitHubOrganizationName(in.Organization); err != nil { + return nil, trace.Wrap(err) + } + if in.Request.SSOTestFlow { + return nil, trace.BadParameter("sso test flow is not supported when creating GitHub auth request for authenticated user") + } + if in.Request.CreateWebSession { + return nil, trace.BadParameter("CreateWebSession is not supported when creating GitHub auth request for authenticated user") + } + + authCtx, gitServer, err := s.authAndFindServerByOrg(ctx, in.Organization) + if err != nil { + return nil, trace.Wrap(err) + } + + s.cfg.Log.DebugContext(ctx, "Creating GitHub auth request for authenticated user.", + "user", authCtx.User.GetName(), + "org", gitServer.GetGitHub().Organization, + "integration", gitServer.GetGitHub().Integration, + ) + + // Make a "temporary" connector spec and save it in the request. + uuid := uuid.NewString() + spec, err := s.makeGithubConnectorSpec(ctx, uuid, gitServer.GetGitHub().Organization, gitServer.GetGitHub().Integration) + if err != nil { + return nil, trace.Wrap(err) + } + + in.Request.ConnectorID = uuid + in.Request.ConnectorSpec = spec + in.Request.AuthenticatedUser = authCtx.User.GetName() + in.Request.CertTTL = authCtx.Identity.GetIdentity().Expires.Sub(s.cfg.clock.Now()) + in.Request.ClientLoginIP = authCtx.Identity.GetIdentity().LoginIP + + // More params of in.Request will get updated and checked by + // s.cfg.GitHubAuthRequestCreator. + request, err := s.cfg.GitHubAuthRequestCreator(ctx, *in.Request) + return request, trace.Wrap(err) +} + +func (s *Service) authAndFindServerByOrg(ctx context.Context, org string) (*authz.Context, types.Server, error) { + authCtx, err := s.authorize(ctx, types.VerbRead, types.VerbList) + if err != nil { + return nil, nil, trace.Wrap(err) + } + + // We assume the list of servers is small and this function is called + // rarely. Use a cache when these assumptions change. + var servers []types.Server + var next string + for { + servers, next, err = s.cfg.Backend.ListGitServers(ctx, apidefaults.DefaultChunkSize, next) + if err != nil { + return nil, nil, trace.Wrap(err) + } + for _, server := range servers { + if spec := server.GetGitHub(); spec != nil && spec.Organization == org { + if err := s.checkAccess(authCtx, server); err == nil { + return authCtx, server, nil + } + } + } + if next == "" { + break + } + } + return nil, nil, trace.NotFound("git server with organization %q not found", org) +} + +func (s *Service) makeGithubConnectorSpec(ctx context.Context, uuid, org, integration string) (*types.GithubConnectorSpecV3, error) { + ref, err := credentials.GetIntegrationRef(ctx, integration, s.cfg.Backend) + if err != nil { + return nil, trace.Wrap(err) + } + + cred, err := credentials.GetByPurpose(ctx, ref, credentials.PurposeGitHubOAuth, s.cfg.Backend) + if err != nil { + return nil, trace.Wrap(err) + } + + clientID, clientSecret := cred.GetOAuthClientSecret() + if clientID == "" || clientSecret == "" { + return nil, trace.BadParameter("no OAuth client ID or secret found for integration %v", integration) + } + + return &types.GithubConnectorSpecV3{ + ClientID: clientID, + ClientSecret: clientSecret, + RedirectURL: fmt.Sprintf("https://%s/v1/webapi/github/callback", s.cfg.ProxyPublicAddrGetter()), + EndpointURL: types.GithubURL, + APIEndpointURL: types.GithubAPIURL, + // TODO(greedy52) the GitHub OAuth flow for authenticated user does not + // require team-to-roles mapping. Put some placeholders for now to make + // param-checks happy. + TeamsToRoles: []types.TeamRolesMapping{{ + Organization: org, + Team: uuid, + Roles: []string{uuid}, + }}, + }, nil +} diff --git a/lib/auth/gitserver/gitserverv1/github_test.go b/lib/auth/gitserver/gitserverv1/github_test.go new file mode 100644 index 0000000000000..c3d80455c3862 --- /dev/null +++ b/lib/auth/gitserver/gitserverv1/github_test.go @@ -0,0 +1,70 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package gitserverv1 + +import ( + "context" + "fmt" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/stretchr/testify/require" + + pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/gitserver/v1" + "github.com/gravitational/teleport/api/types" +) + +// TestCreateGitHubAuthRequest verifies the output from the +// CreateGitHubAuthRequest API. Note that RBAC of this API is tested in +// TestServiceAccess. +func TestCreateGitHubAuthRequest(t *testing.T) { + ctx := context.Background() + org1 := newServer(t, "org1") + + checker := &fakeAccessChecker{ + allowVerbs: []string{types.VerbRead, types.VerbList}, + allowResource: true, + } + + service := newService(t, checker, org1) + createdRequest, err := service.CreateGitHubAuthRequest(ctx, &pb.CreateGitHubAuthRequestRequest{ + Request: &types.GithubAuthRequest{}, + Organization: org1.GetGitHub().Organization, + }) + require.NoError(t, err) + require.NotNil(t, createdRequest) + + wantedRequest := &types.GithubAuthRequest{ + CertTTL: time.Hour, + ConnectorSpec: &types.GithubConnectorSpecV3{ + ClientID: fakeClientID, + ClientSecret: fakeClientSecret, + RedirectURL: fmt.Sprintf("https://%s/v1/webapi/github/callback", fakeProxyAddr), + EndpointURL: "https://github.com", + APIEndpointURL: "https://api.github.com", + }, + AuthenticatedUser: fakeTeleportUser, + } + require.Empty(t, cmp.Diff(createdRequest, wantedRequest, + cmpopts.IgnoreTypes([]types.TeamRolesMapping{}), + cmpopts.IgnoreFields(types.GithubAuthRequest{}, "ConnectorID"), + cmpopts.EquateEmpty(), + )) +} diff --git a/lib/auth/gitserver/gitserverv1/service.go b/lib/auth/gitserver/gitserverv1/service.go new file mode 100644 index 0000000000000..e263e7259f97f --- /dev/null +++ b/lib/auth/gitserver/gitserverv1/service.go @@ -0,0 +1,216 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package gitserverv1 + +import ( + "context" + "log/slog" + + "github.com/gravitational/trace" + "github.com/jonboulle/clockwork" + "google.golang.org/protobuf/types/known/emptypb" + + "github.com/gravitational/teleport" + pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/gitserver/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/authz" + "github.com/gravitational/teleport/lib/services" +) + +// Backend handpicks a list of backend functions this service needs. +type Backend interface { + services.GitServers + + // GetIntegration returns the specified integration resources. + GetIntegration(ctx context.Context, name string) (types.Integration, error) + + // GetPluginStaticCredentialsByLabels will get a list of plugin static credentials resource by matching labels. + GetPluginStaticCredentialsByLabels(ctx context.Context, labels map[string]string) ([]types.PluginStaticCredentials, error) +} + +// GitHubAuthRequestCreator creates a new auth request for GitHub OAuth2 flow. +type GitHubAuthRequestCreator func(ctx context.Context, req types.GithubAuthRequest) (*types.GithubAuthRequest, error) + +// Config is the config for Service. +type Config struct { + // Authorizer is the authorizer to use. + Authorizer authz.Authorizer + // Backend is the backend service. + Backend Backend + // Log is the slog logger. + Log *slog.Logger + // ProxyPublicAddrGetter gets the public proxy address. + ProxyPublicAddrGetter func() string + // GitHubAuthRequestCreator is a callback to create the prepared request in + // the backend. + GitHubAuthRequestCreator GitHubAuthRequestCreator + + clock clockwork.Clock +} + +// Service implements the gRPC service that manages git servers. +type Service struct { + pb.UnsafeGitServerServiceServer + + cfg Config +} + +// NewService creates a new git server service. +func NewService(cfg Config) (*Service, error) { + if cfg.Authorizer == nil { + return nil, trace.BadParameter("authorizer is required") + } + if cfg.Backend == nil { + return nil, trace.BadParameter("backend is required") + } + if cfg.ProxyPublicAddrGetter == nil { + return nil, trace.BadParameter("ProxyPublicAddrGetter is required") + } + if cfg.GitHubAuthRequestCreator == nil { + return nil, trace.BadParameter("GitHubAuthRequestCreator is required") + } + if cfg.Log == nil { + cfg.Log = slog.With(teleport.ComponentKey, "gitserver.service") + } + if cfg.clock == nil { + cfg.clock = clockwork.NewRealClock() + } + return &Service{ + cfg: cfg, + }, nil + +} + +func toServerV2(server types.Server) (*types.ServerV2, error) { + serverV2, ok := server.(*types.ServerV2) + if !ok { + return nil, trace.Errorf("encountered unexpected server type: %T", serverV2) + } + return serverV2, nil +} + +func (s *Service) CreateGitServer(ctx context.Context, req *pb.CreateGitServerRequest) (*types.ServerV2, error) { + if _, err := s.authorize(ctx, types.VerbCreate); err != nil { + return nil, trace.Wrap(err) + } + server, err := s.cfg.Backend.CreateGitServer(ctx, req.Server) + if err != nil { + return nil, trace.Wrap(err) + } + return toServerV2(server) +} + +func (s *Service) GetGitServer(ctx context.Context, req *pb.GetGitServerRequest) (*types.ServerV2, error) { + authCtx, err := s.authorize(ctx, types.VerbRead) + if err != nil { + return nil, trace.Wrap(err) + } + server, err := s.cfg.Backend.GetGitServer(ctx, req.Name) + if err != nil { + return nil, trace.Wrap(err) + } + if err := s.checkAccess(authCtx, server); err != nil { + if trace.IsAccessDenied(err) { + return nil, trace.NotFound("git server %q not found", req.Name) + } + return nil, trace.Wrap(err) + } + return toServerV2(server) +} + +func (s *Service) ListGitServers(ctx context.Context, req *pb.ListGitServersRequest) (*pb.ListGitServersResponse, error) { + authCtx, err := s.authorize(ctx, types.VerbRead, types.VerbList) + if err != nil { + return nil, trace.Wrap(err) + } + servers, next, err := s.cfg.Backend.ListGitServers(ctx, int(req.PageSize), req.PageToken) + if err != nil { + return nil, trace.Wrap(err) + } + + resp := &pb.ListGitServersResponse{ + NextPageToken: next, + } + for _, server := range servers { + err := s.checkAccess(authCtx, server) + if trace.IsAccessDenied(err) { + continue + } else if err != nil { + return nil, trace.Wrap(err) + } + + if serverV2, err := toServerV2(server); err != nil { + return nil, trace.Wrap(err) + } else { + resp.Servers = append(resp.Servers, serverV2) + } + } + return resp, nil +} + +func (s *Service) UpdateGitServer(ctx context.Context, req *pb.UpdateGitServerRequest) (*types.ServerV2, error) { + if _, err := s.authorize(ctx, types.VerbUpdate); err != nil { + return nil, trace.Wrap(err) + } + server, err := s.cfg.Backend.UpdateGitServer(ctx, req.Server) + if err != nil { + return nil, trace.Wrap(err) + } + return toServerV2(server) +} + +func (s *Service) UpsertGitServer(ctx context.Context, req *pb.UpsertGitServerRequest) (*types.ServerV2, error) { + if _, err := s.authorize(ctx, types.VerbCreate, types.VerbUpdate); err != nil { + return nil, trace.Wrap(err) + } + server, err := s.cfg.Backend.UpsertGitServer(ctx, req.Server) + if err != nil { + return nil, trace.Wrap(err) + } + return toServerV2(server) +} + +func (s *Service) DeleteGitServer(ctx context.Context, req *pb.DeleteGitServerRequest) (*emptypb.Empty, error) { + _, err := s.authorize(ctx, types.VerbDelete) + if err != nil { + return nil, trace.Wrap(err) + } + if err := s.cfg.Backend.DeleteGitServer(ctx, req.GetName()); err != nil { + return nil, trace.Wrap(err) + } + return &emptypb.Empty{}, nil +} + +func (s *Service) authorize(ctx context.Context, verb string, additionalVerbs ...string) (*authz.Context, error) { + authCtx, err := s.cfg.Authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + if err := authCtx.CheckAccessToKind(types.KindGitServer, verb, additionalVerbs...); err != nil { + return nil, trace.Wrap(err) + } + return authCtx, nil +} + +func (s *Service) checkAccess(authCtx *authz.Context, server types.Server) error { + // MFA is not required for operations on git resources but will be enforced + // at the connection time. + state := services.AccessState{MFAVerified: true} + return trace.Wrap(authCtx.Checker.CheckAccess(server, state)) +} diff --git a/lib/auth/gitserver/gitserverv1/service_test.go b/lib/auth/gitserver/gitserverv1/service_test.go new file mode 100644 index 0000000000000..96db35882cb77 --- /dev/null +++ b/lib/auth/gitserver/gitserverv1/service_test.go @@ -0,0 +1,358 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package gitserverv1 + +import ( + "context" + "slices" + "testing" + "time" + + "github.com/gravitational/trace" + "github.com/jonboulle/clockwork" + "github.com/stretchr/testify/require" + + pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/gitserver/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/auth/integration/credentials" + "github.com/gravitational/teleport/lib/authz" + "github.com/gravitational/teleport/lib/backend/memory" + "github.com/gravitational/teleport/lib/services" + "github.com/gravitational/teleport/lib/services/local" + "github.com/gravitational/teleport/lib/tlsca" +) + +func newServer(t *testing.T, org string) *types.ServerV2 { + server, err := types.NewGitHubServer(types.GitHubServerMetadata{ + Integration: org, + Organization: org, + }) + require.NoError(t, err) + serverV2, ok := server.(*types.ServerV2) + require.True(t, ok) + return serverV2 +} + +func TestServiceAccess(t *testing.T) { + t.Parallel() + + ctx := context.Background() + org1 := newServer(t, "org1") + org2 := newServer(t, "org2") + org3 := newServer(t, "org3") + + testCases := []struct { + name string + checker services.AccessChecker + run func(*testing.T, *Service) + }{ + { + name: "create verb not allowed", + checker: &fakeAccessChecker{ /*nothing allowed*/ }, + run: func(t *testing.T, service *Service) { + _, err := service.CreateGitServer(ctx, &pb.CreateGitServerRequest{Server: org3}) + require.True(t, trace.IsAccessDenied(err)) + }, + }, + { + name: "create success", + checker: &fakeAccessChecker{ + allowVerbs: []string{types.VerbCreate}, + }, + run: func(t *testing.T, service *Service) { + _, err := service.CreateGitServer(ctx, &pb.CreateGitServerRequest{Server: org3}) + require.NoError(t, err) + }, + }, + { + name: "get verb not allowed", + checker: &fakeAccessChecker{ /*nothing allowed*/ }, + run: func(t *testing.T, service *Service) { + _, err := service.GetGitServer(ctx, &pb.GetGitServerRequest{Name: org1.GetName()}) + require.True(t, trace.IsAccessDenied(err)) + }, + }, + { + name: "get resource denied", + checker: &fakeAccessChecker{ + allowVerbs: []string{types.VerbRead}, + }, + run: func(t *testing.T, service *Service) { + _, err := service.GetGitServer(ctx, &pb.GetGitServerRequest{Name: org1.GetName()}) + require.True(t, trace.IsNotFound(err)) + }, + }, + { + name: "get success", + checker: &fakeAccessChecker{ + allowVerbs: []string{types.VerbRead}, + allowResource: true, + }, + run: func(t *testing.T, service *Service) { + server, err := service.GetGitServer(ctx, &pb.GetGitServerRequest{Name: org1.GetName()}) + require.NoError(t, err) + require.Equal(t, "org1", server.GetGitHub().Organization) + }, + }, + { + name: "list verb not allowed", + checker: &fakeAccessChecker{ + allowVerbs: []string{types.VerbRead}, + allowResource: true, + }, + run: func(t *testing.T, service *Service) { + _, err := service.ListGitServers(ctx, &pb.ListGitServersRequest{}) + require.True(t, trace.IsAccessDenied(err)) + }, + }, + { + name: "list resource denied", + checker: &fakeAccessChecker{ + allowVerbs: []string{types.VerbRead, types.VerbList}, + }, + run: func(t *testing.T, service *Service) { + resp, err := service.ListGitServers(ctx, &pb.ListGitServersRequest{}) + require.NoError(t, err) + require.Empty(t, resp.Servers) + }, + }, + { + name: "list success", + checker: &fakeAccessChecker{ + allowVerbs: []string{types.VerbRead, types.VerbList}, + allowResource: true, + }, + run: func(t *testing.T, service *Service) { + resp, err := service.ListGitServers(ctx, &pb.ListGitServersRequest{}) + require.NoError(t, err) + require.Len(t, resp.Servers, 2) + }, + }, + { + name: "update verb not allowed", + checker: &fakeAccessChecker{ /*nothing allowed*/ }, + run: func(t *testing.T, service *Service) { + _, err := service.UpdateGitServer(ctx, &pb.UpdateGitServerRequest{Server: org1}) + require.True(t, trace.IsAccessDenied(err)) + }, + }, + { + name: "update success", + checker: &fakeAccessChecker{ + allowVerbs: []string{types.VerbUpdate}, + }, + run: func(t *testing.T, service *Service) { + org1WithRevision, err := service.cfg.Backend.GetGitServer(ctx, org1.GetName()) + require.NoError(t, err) + _, err = service.UpdateGitServer(ctx, &pb.UpdateGitServerRequest{Server: org1WithRevision.(*types.ServerV2)}) + require.NoError(t, err) + }, + }, + { + name: "upsert verb not allowed", + checker: &fakeAccessChecker{ /*nothing allowed*/ }, + run: func(t *testing.T, service *Service) { + _, err := service.UpsertGitServer(ctx, &pb.UpsertGitServerRequest{Server: org3}) + require.True(t, trace.IsAccessDenied(err)) + }, + }, + { + name: "upsert success", + checker: &fakeAccessChecker{ + allowVerbs: []string{types.VerbCreate, types.VerbUpdate}, + }, + run: func(t *testing.T, service *Service) { + _, err := service.UpsertGitServer(ctx, &pb.UpsertGitServerRequest{Server: org3}) + require.NoError(t, err) + }, + }, + { + name: "delete verb not allowed", + checker: &fakeAccessChecker{ /*nothing allowed*/ }, + run: func(t *testing.T, service *Service) { + _, err := service.DeleteGitServer(ctx, &pb.DeleteGitServerRequest{Name: org1.GetName()}) + require.True(t, trace.IsAccessDenied(err)) + }, + }, + { + name: "delete success", + checker: &fakeAccessChecker{ + allowVerbs: []string{types.VerbDelete}, + }, + run: func(t *testing.T, service *Service) { + _, err := service.DeleteGitServer(ctx, &pb.DeleteGitServerRequest{Name: org1.GetName()}) + require.NoError(t, err) + }, + }, + { + name: "CreateGitHubAuthRequest success", + checker: &fakeAccessChecker{ + allowVerbs: []string{types.VerbRead, types.VerbList}, + allowResource: true, + }, + run: func(t *testing.T, service *Service) { + _, err := service.CreateGitHubAuthRequest(ctx, &pb.CreateGitHubAuthRequestRequest{ + Request: &types.GithubAuthRequest{}, + Organization: org1.GetGitHub().Organization, + }) + require.NoError(t, err) + }, + }, + { + name: "CreateGitHubAuthRequest resource not allowed", + checker: &fakeAccessChecker{ + allowVerbs: []string{types.VerbRead, types.VerbList}, + }, + run: func(t *testing.T, service *Service) { + _, err := service.CreateGitHubAuthRequest(ctx, &pb.CreateGitHubAuthRequestRequest{ + Request: &types.GithubAuthRequest{}, + Organization: org1.GetGitHub().Organization, + }) + // Getting NotFound instead of AccessDenied. + require.True(t, trace.IsNotFound(err)) + }, + }, + } + + for _, test := range testCases { + t.Run(test.name, func(t *testing.T) { + service := newService(t, test.checker, org1, org2) + test.run(t, service) + }) + } +} + +type fakeAccessChecker struct { + services.AccessChecker + allowVerbs []string + allowResource bool +} + +func (f fakeAccessChecker) CheckAccessToRule(_ services.RuleContext, _ string, _ string, verb string) error { + if !slices.Contains(f.allowVerbs, verb) { + return trace.AccessDenied("verb %s not allowed", verb) + } + return nil +} +func (f fakeAccessChecker) CheckAccess(services.AccessCheckable, services.AccessState, ...services.RoleMatcher) error { + if !f.allowResource { + return trace.AccessDenied("access denied") + } + return nil +} + +type testBackend struct { + services.GitServers +} + +// GetIntegration returns a fake integration. +func (b testBackend) GetIntegration(ctx context.Context, name string) (types.Integration, error) { + ig, err := types.NewIntegrationGitHub( + types.Metadata{ + Name: name, + }, + &types.GitHubIntegrationSpecV1{ + Organization: name, + }, + ) + if err != nil { + return nil, trace.Wrap(err) + } + ig.SetCredentials(&types.PluginCredentialsV1{ + Credentials: &types.PluginCredentialsV1_StaticCredentialsRef{ + StaticCredentialsRef: credentials.NewRef(), + }, + }) + return ig, nil +} + +// GetPluginStaticCredentialsByLabels returns a fake GitHub OAuth credential. +func (b testBackend) GetPluginStaticCredentialsByLabels(ctx context.Context, labels map[string]string) ([]types.PluginStaticCredentials, error) { + cred, err := types.NewPluginStaticCredentials( + types.Metadata{ + Name: "cred", + }, + types.PluginStaticCredentialsSpecV1{ + Credentials: &types.PluginStaticCredentialsSpecV1_OAuthClientSecret{ + OAuthClientSecret: &types.PluginStaticCredentialsOAuthClientSecret{ + ClientId: fakeClientID, + ClientSecret: fakeClientSecret, + }, + }, + }, + ) + if err != nil { + return nil, trace.Wrap(err) + } + return []types.PluginStaticCredentials{cred}, nil +} + +const ( + fakeClientID = "id" + fakeClientSecret = "secret" + fakeIdentityTTL = time.Hour + fakeTeleportUser = "Linus.Torvalds" + fakeProxyAddr = "example.teleport.sh:443" +) + +func newService(t *testing.T, checker services.AccessChecker, existing ...*types.ServerV2) *Service { + t.Helper() + + b, err := memory.New(memory.Config{}) + require.NoError(t, err) + + gitServersService, err := local.NewGitServerService(b) + require.NoError(t, err) + + for _, server := range existing { + _, err := gitServersService.CreateGitServer(context.Background(), server) + require.NoError(t, err) + } + + clock := clockwork.NewFakeClock() + authorizer := authz.AuthorizerFunc(func(ctx context.Context) (*authz.Context, error) { + user, err := types.NewUser(fakeTeleportUser) + if err != nil { + return nil, err + } + return &authz.Context{ + User: user, + Checker: checker, + Identity: authz.WrapIdentity(tlsca.Identity{ + Expires: clock.Now().Add(fakeIdentityTTL), + }), + }, nil + }) + + service, err := NewService(Config{ + Authorizer: authorizer, + Backend: testBackend{ + GitServers: gitServersService, + }, + ProxyPublicAddrGetter: func() string { + return fakeProxyAddr + }, + GitHubAuthRequestCreator: func(_ context.Context, req types.GithubAuthRequest) (*types.GithubAuthRequest, error) { + return &req, nil + }, + clock: clock, + }) + require.NoError(t, err) + return service +} diff --git a/lib/auth/grpcserver.go b/lib/auth/grpcserver.go index de38d262d3fe6..ba359750c3850 100644 --- a/lib/auth/grpcserver.go +++ b/lib/auth/grpcserver.go @@ -58,6 +58,7 @@ import ( dbobjectimportrulev1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/dbobjectimportrule/v1" discoveryconfigv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/discoveryconfig/v1" dynamicwindowsv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/dynamicwindows/v1" + gitserverv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/gitserver/v1" identitycenterv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/identitycenter/v1" integrationv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" kubewaitingcontainerv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/kubewaitingcontainer/v1" @@ -91,6 +92,7 @@ import ( "github.com/gravitational/teleport/lib/auth/dbobjectimportrule/dbobjectimportrulev1" "github.com/gravitational/teleport/lib/auth/discoveryconfig/discoveryconfigv1" "github.com/gravitational/teleport/lib/auth/dynamicwindows/dynamicwindowsv1" + "github.com/gravitational/teleport/lib/auth/gitserver/gitserverv1" "github.com/gravitational/teleport/lib/auth/integration/integrationv1" "github.com/gravitational/teleport/lib/auth/kubewaitingcontainer/kubewaitingcontainerv1" "github.com/gravitational/teleport/lib/auth/loginrule/loginrulev1" @@ -5462,6 +5464,17 @@ func NewGRPCServer(cfg GRPCServerConfig) (*GRPCServer, error) { } provisioningv1.RegisterProvisioningServiceServer(server, provisioningStateService) + gitServerService, err := gitserverv1.NewService(gitserverv1.Config{ + Authorizer: cfg.Authorizer, + Backend: cfg.AuthServer.Services, + ProxyPublicAddrGetter: cfg.AuthServer.getProxyPublicAddr, + GitHubAuthRequestCreator: cfg.AuthServer.CreateGithubAuthRequest, + }) + if err != nil { + return nil, trace.Wrap(err) + } + gitserverv1pb.RegisterGitServerServiceServer(server, gitServerService) + // Only register the service if this is an open source build. Enterprise builds // register the actual service via an auth plugin, if we register here then all // Enterprise builds would fail with a duplicate service registered error. diff --git a/lib/auth/helpers.go b/lib/auth/helpers.go index 61bef6d89721c..58079d4745374 100644 --- a/lib/auth/helpers.go +++ b/lib/auth/helpers.go @@ -371,6 +371,8 @@ func NewTestAuthServer(cfg TestAuthServerConfig) (*TestAuthServer, error) { WebToken: svces.WebTokens(), WindowsDesktops: svces.WindowsDesktops, DynamicWindowsDesktops: svces.DynamicWindowsDesktops, + PluginStaticCredentials: svces.PluginStaticCredentials, + GitServers: svces.GitServers, }) if err != nil { return nil, trace.Wrap(err) diff --git a/lib/auth/init.go b/lib/auth/init.go index 5f1413e1ff268..a38fb2a7c05ae 100644 --- a/lib/auth/init.go +++ b/lib/auth/init.go @@ -340,6 +340,12 @@ type InitConfig struct { // IdentityCenter is the Identity Center state storage service to use in // this node. IdentityCenter services.IdentityCenter + + // PluginStaticCredentials handles credentials for integrations and plugins. + PluginStaticCredentials services.PluginStaticCredentials + + // GitServers manages git servers. + GitServers services.GitServers } // Init instantiates and configures an instance of AuthServer diff --git a/lib/auth/integration/credentials/credentials.go b/lib/auth/integration/credentials/credentials.go new file mode 100644 index 0000000000000..5eff20da70da1 --- /dev/null +++ b/lib/auth/integration/credentials/credentials.go @@ -0,0 +1,133 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package credentials + +import ( + "context" + "maps" + + "github.com/google/uuid" + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/types" +) + +// Package credentials defines constants and provides helper functions for +// integration credentials. + +const ( + // LabelStaticCredentialsIntegration is the label used to store the + // UUID ref in the static credentials. + LabelStaticCredentialsIntegration = types.TeleportInternalLabelPrefix + types.KindIntegration + // LabelStaticCredentialsPurpose is the label used to store the purpose of + // the static credentials. + LabelStaticCredentialsPurpose = "purpose" + + // PurposeGitHubSSHCA is the label value that indicates the static + // credentials contains the GitHub SSH CA. + PurposeGitHubSSHCA = "github-sshca" + // PurposeGitHubOAuth is the label value that indicates the static + // credentials contains the GitHub OAuth ID and secret. + PurposeGitHubOAuth = "github-oauth" +) + +// NewRef creates a new PluginStaticCredentialsRef that is saved along with the +// integration resource in the backend. The actual credentials are saved as +// PlugStaticCredentials and can only be retrieved by the ref. +func NewRef() *types.PluginStaticCredentialsRef { + return NewRefWithUUID(uuid.NewString()) +} + +// NewRefWithUUID creates a PluginStaticCredentialsRef with provided UUID. +func NewRefWithUUID(uuid string) *types.PluginStaticCredentialsRef { + return &types.PluginStaticCredentialsRef{ + Labels: map[string]string{ + LabelStaticCredentialsIntegration: uuid, + }, + } +} + +// CopyRefLabels copies the labels from the Ref to the actual credentials so the +// credentials can be retrieved using the same labels. +func CopyRefLabels(cred types.PluginStaticCredentials, ref *types.PluginStaticCredentialsRef) { + labels := cred.GetStaticLabels() + if labels == nil { + labels = make(map[string]string) + } + maps.Copy(labels, ref.Labels) + + cred.SetStaticLabels(labels) +} + +// ByLabelsGetter defines an interface to retrieve credentials by labels. +type ByLabelsGetter interface { + // GetPluginStaticCredentialsByLabels will get a list of plugin static credentials resource by matching labels. + GetPluginStaticCredentialsByLabels(ctx context.Context, labels map[string]string) ([]types.PluginStaticCredentials, error) +} + +// GetByPurpose retrieves a credentials based on the provided purpose. +func GetByPurpose(ctx context.Context, ref *types.PluginStaticCredentialsRef, purpose string, getter ByLabelsGetter) (types.PluginStaticCredentials, error) { + if ref == nil { + return nil, trace.BadParameter("missing credentials ref") + } + labels := ref.Labels + if len(labels) == 0 { + return nil, trace.BadParameter("missing labels from credentials ref") + } + labels[LabelStaticCredentialsPurpose] = purpose + + creds, err := getter.GetPluginStaticCredentialsByLabels(ctx, labels) + if err != nil { + return nil, trace.Wrap(err) + } + switch len(creds) { + case 0: + return nil, trace.NotFound("%v credentials not found", purpose) + case 1: + return creds[0], nil + default: + return nil, trace.CompareFailed("expecting one plugin static credentials but got %v", len(creds)) + } +} + +// IntegrationGetter defines an interface to retrieve an integration by name. +type IntegrationGetter interface { + // GetIntegration returns the specified integration resources. + GetIntegration(ctx context.Context, name string) (types.Integration, error) +} + +// GetIntegrationRef is a helper to get the PluginStaticCredentialsRef from the +// integration. +func GetIntegrationRef(ctx context.Context, integration string, igGetter IntegrationGetter) (*types.PluginStaticCredentialsRef, error) { + ig, err := igGetter.GetIntegration(ctx, integration) + if err != nil { + return nil, trace.Wrap(err) + } + + cred := ig.GetCredentials() + if cred == nil { + return nil, trace.BadParameter("no credentials found for %q", integration) + } + + ref := cred.GetStaticCredentialsRef() + if ref == nil { + return nil, trace.BadParameter("no credentials ref found for %q", integration) + } + return ref, nil +} diff --git a/lib/auth/integration/credentials/credentials_test.go b/lib/auth/integration/credentials/credentials_test.go new file mode 100644 index 0000000000000..03cc55c345d6e --- /dev/null +++ b/lib/auth/integration/credentials/credentials_test.go @@ -0,0 +1,139 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package credentials + +import ( + "context" + "fmt" + "maps" + "testing" + + "github.com/google/uuid" + "github.com/gravitational/trace" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/api/types" +) + +type mockByLabelsGetter struct { + mock.Mock +} + +func (m *mockByLabelsGetter) GetPluginStaticCredentialsByLabels(_ context.Context, labels map[string]string) ([]types.PluginStaticCredentials, error) { + args := m.Called(labels) + creds, ok := args.Get(0).([]types.PluginStaticCredentials) + if ok { + return creds, args.Error(1) + } + return nil, args.Error(1) +} + +func mustMakeCred(t *testing.T, labels map[string]string) types.PluginStaticCredentials { + t.Helper() + cred, err := types.NewPluginStaticCredentials( + types.Metadata{ + Name: uuid.NewString(), + Labels: labels, + }, + types.PluginStaticCredentialsSpecV1{ + Credentials: &types.PluginStaticCredentialsSpecV1_APIToken{ + APIToken: "token", + }, + }, + ) + require.NoError(t, err) + return cred +} + +func TestGetByPurpose(t *testing.T) { + ref := NewRef() + purpose := "test-found" + labels := map[string]string{LabelStaticCredentialsPurpose: purpose} + maps.Copy(labels, ref.Labels) + cred := mustMakeCred(t, labels) + + tests := []struct { + name string + ref *types.PluginStaticCredentialsRef + setupMock func(m *mockByLabelsGetter) + wantError func(error) bool + wantCred types.PluginStaticCredentials + }{ + { + name: "nil ref", + ref: nil, + wantError: trace.IsBadParameter, + }, + { + name: "success", + ref: ref, + setupMock: func(m *mockByLabelsGetter) { + m.On("GetPluginStaticCredentialsByLabels", labels). + Return([]types.PluginStaticCredentials{cred}, nil) + }, + wantCred: cred, + }, + { + name: "no creds found", + ref: ref, + setupMock: func(m *mockByLabelsGetter) { + m.On("GetPluginStaticCredentialsByLabels", labels). + Return([]types.PluginStaticCredentials{}, nil) + }, + wantError: trace.IsNotFound, + }, + { + name: "too mandy creds found", + ref: ref, + setupMock: func(m *mockByLabelsGetter) { + m.On("GetPluginStaticCredentialsByLabels", labels). + Return([]types.PluginStaticCredentials{cred, mustMakeCred(t, labels)}, nil) + }, + wantError: trace.IsCompareFailed, + }, + { + name: "backend issue", + ref: ref, + setupMock: func(m *mockByLabelsGetter) { + m.On("GetPluginStaticCredentialsByLabels", labels). + Return(nil, trace.ConnectionProblem(fmt.Errorf("backend"), "problem")) + }, + wantError: trace.IsConnectionProblem, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + m := &mockByLabelsGetter{} + if test.setupMock != nil { + test.setupMock(m) + } + + cred, err := GetByPurpose(context.Background(), test.ref, purpose, m) + if test.wantError != nil { + require.True(t, test.wantError(err)) + return + } + + require.NoError(t, err) + require.Equal(t, test.wantCred, cred) + }) + } +} diff --git a/lib/auth/integration/integrationv1/credentials.go b/lib/auth/integration/integrationv1/credentials.go new file mode 100644 index 0000000000000..4d6cb888d2012 --- /dev/null +++ b/lib/auth/integration/integrationv1/credentials.go @@ -0,0 +1,249 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package integrationv1 + +import ( + "context" + + "github.com/google/uuid" + "github.com/gravitational/trace" + + integrationpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/auth/integration/credentials" + "github.com/gravitational/teleport/lib/cryptosuites" +) + +// ExportIntegrationCertAuthorities exports cert authorities for an integration. +func (s *Service) ExportIntegrationCertAuthorities(ctx context.Context, in *integrationpb.ExportIntegrationCertAuthoritiesRequest) (*integrationpb.ExportIntegrationCertAuthoritiesResponse, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + if err := authCtx.CheckAccessToKind(types.KindIntegration, types.VerbRead); err != nil { + return nil, trace.Wrap(err) + } + ig, err := s.cache.GetIntegration(ctx, in.Integration) + if err != nil { + return nil, trace.Wrap(err) + } + + // Currently only public keys are exported. + switch ig.GetSubKind() { + case types.IntegrationSubKindGitHub: + caKeySet, err := s.getGitHubCertAuthorities(ctx, ig) + if err != nil { + return nil, trace.Wrap(err) + } + caKeySetWithoutSecerts := caKeySet.WithoutSecrets() + return &integrationpb.ExportIntegrationCertAuthoritiesResponse{CertAuthorities: &caKeySetWithoutSecerts}, nil + default: + return nil, trace.BadParameter("unsupported for integration subkind %v", ig.GetSubKind()) + } +} + +func buildGitHubOAuthCredentials(ig types.Integration) (*types.PluginStaticCredentialsV1, error) { + if ig.GetCredentials() == nil || ig.GetCredentials().GetIdSecret() == nil { + return nil, trace.BadParameter("GitHub integration requires OAuth ID and secret for credentials") + } + + return &types.PluginStaticCredentialsV1{ + ResourceHeader: types.ResourceHeader{ + Metadata: types.Metadata{ + Name: uuid.NewString(), + Labels: map[string]string{ + credentials.LabelStaticCredentialsPurpose: credentials.PurposeGitHubOAuth, + }, + }, + }, + Spec: &types.PluginStaticCredentialsSpecV1{ + Credentials: &types.PluginStaticCredentialsSpecV1_OAuthClientSecret{ + OAuthClientSecret: &types.PluginStaticCredentialsOAuthClientSecret{ + ClientId: ig.GetCredentials().GetIdSecret().Id, + ClientSecret: ig.GetCredentials().GetIdSecret().Secret, + }, + }, + }, + }, nil +} + +func (s *Service) newGitHubSSHCA(ctx context.Context) (*types.PluginStaticCredentialsV1, error) { + ca, err := s.keyStoreManager.NewSSHKeyPair(ctx, cryptosuites.GitHubProxyCASSH) + if err != nil { + return nil, trace.Wrap(err) + } + return &types.PluginStaticCredentialsV1{ + ResourceHeader: types.ResourceHeader{ + Metadata: types.Metadata{ + Name: uuid.NewString(), + Labels: map[string]string{ + credentials.LabelStaticCredentialsPurpose: credentials.PurposeGitHubSSHCA, + }, + }, + }, + Spec: &types.PluginStaticCredentialsSpecV1{ + Credentials: &types.PluginStaticCredentialsSpecV1_SSHCertAuthorities{ + SSHCertAuthorities: &types.PluginStaticCredentialsSSHCertAuthorities{ + CertAuthorities: []*types.SSHKeyPair{ca}, + }, + }, + }, + }, nil +} + +func (s *Service) createGitHubCredentials(ctx context.Context, ig types.Integration) error { + var creds []types.PluginStaticCredentials + + if oauthCred, err := buildGitHubOAuthCredentials(ig); err != nil { + return trace.Wrap(err) + } else { + creds = append(creds, oauthCred) + } + + // TODO(greedy52) support per auth CA like HSM. + if caCred, err := s.newGitHubSSHCA(ctx); err != nil { + return trace.Wrap(err) + } else { + creds = append(creds, caCred) + } + + return trace.Wrap(s.createStaticCredentials(ctx, ig, creds...)) +} + +func (s *Service) createStaticCredentials(ctx context.Context, ig types.Integration, creds ...types.PluginStaticCredentials) error { + ref := credentials.NewRef() + + for _, cred := range creds { + s.logger.DebugContext(ctx, "Creating static credentials", "integration", ig.GetName(), "labels", cred.GetStaticLabels()) + credentials.CopyRefLabels(cred, ref) + if err := s.backend.CreatePluginStaticCredentials(ctx, cred); err != nil { + return trace.Wrap(err) + } + } + + ig.SetCredentials(&types.PluginCredentialsV1{ + Credentials: &types.PluginCredentialsV1_StaticCredentialsRef{ + StaticCredentialsRef: ref, + }, + }) + return nil +} + +func (s *Service) maybeUpdateStaticCredentials(ctx context.Context, newIg types.Integration) error { + oldIg, err := s.backend.GetIntegration(ctx, newIg.GetName()) + if err != nil { + return trace.Wrap(err) + } + + // Preserve existing credentials. + if newIg.GetCredentials() == nil { + newIg.SetCredentials(oldIg.GetCredentials()) + return nil + } + + switch newIg.GetSubKind() { + case types.IntegrationSubKindGitHub: + if oauthCred, err := buildGitHubOAuthCredentials(newIg); err != nil { + return trace.Wrap(err) + } else { + // Copy ref. + newIg.SetCredentials(oldIg.GetCredentials()) + return trace.Wrap(s.updateStaticCredentials(ctx, newIg, oauthCred)) + } + } + return nil +} + +func (s *Service) updateStaticCredentials(ctx context.Context, ig types.Integration, creds ...types.PluginStaticCredentials) error { + if ig.GetCredentials() == nil || ig.GetCredentials().GetStaticCredentialsRef() == nil { + return trace.BadParameter("missing credentials ref") + } + + ref := ig.GetCredentials().GetStaticCredentialsRef() + for _, cred := range creds { + s.logger.DebugContext(ctx, "Updating static credentials", "integration", ig.GetName(), "labels", cred.GetStaticLabels()) + + // Use same labels to find existing credentials. + credentials.CopyRefLabels(cred, ref) + oldCreds, err := s.backend.GetPluginStaticCredentialsByLabels(ctx, cred.GetStaticLabels()) + if err != nil { + return trace.Wrap(err) + } + if len(oldCreds) != 1 { + return trace.CompareFailed("expecting one credential but got %v", len(oldCreds)) + } + + cred.SetName(oldCreds[0].GetName()) + cred.SetRevision(oldCreds[0].GetRevision()) + if _, err := s.backend.UpdatePluginStaticCredentials(ctx, cred); err != nil { + return trace.Wrap(err) + } + } + return nil +} + +func (s *Service) removeStaticCredentials(ctx context.Context, ig types.Integration) error { + if ig.GetCredentials() == nil { + return nil + } + + ref := ig.GetCredentials().GetStaticCredentialsRef() + if ref == nil { + return trace.NotFound("missing static credentials ref") + } + + staticCreds, err := s.backend.GetPluginStaticCredentialsByLabels(ctx, ref.Labels) + if err != nil { + return trace.Wrap(err) + } + var errors []error + for _, cred := range staticCreds { + s.logger.DebugContext(ctx, "Removing static credentials", "integration", ig.GetName(), "labels", cred.GetStaticLabels()) + if err := s.backend.DeletePluginStaticCredentials(ctx, cred.GetName()); err != nil { + errors = append(errors, err) + } + } + return trace.NewAggregate(errors...) +} + +func (s *Service) getStaticCredentialsWithPurpose(ctx context.Context, ig types.Integration, purpose string) (types.PluginStaticCredentials, error) { + if ig.GetCredentials() == nil { + return nil, trace.BadParameter("missing credentials") + } + + return credentials.GetByPurpose(ctx, ig.GetCredentials().GetStaticCredentialsRef(), purpose, s.cache) +} + +func (s *Service) getGitHubCertAuthorities(ctx context.Context, ig types.Integration) (*types.CAKeySet, error) { + if ig.GetSubKind() != types.IntegrationSubKindGitHub { + return nil, trace.BadParameter("integration is not a GitHub integration") + } + creds, err := s.getStaticCredentialsWithPurpose(ctx, ig, credentials.PurposeGitHubSSHCA) + if err != nil { + return nil, trace.Wrap(err) + } + + cas := creds.GetSSHCertAuthorities() + if len(cas) == 0 { + return nil, trace.BadParameter("missing SSH cert authorities from plugin static credentials") + } + return &types.CAKeySet{ + SSH: cas, + }, nil +} diff --git a/lib/auth/integration/integrationv1/credentials_test.go b/lib/auth/integration/integrationv1/credentials_test.go new file mode 100644 index 0000000000000..f227ffa59b366 --- /dev/null +++ b/lib/auth/integration/integrationv1/credentials_test.go @@ -0,0 +1,126 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package integrationv1 + +import ( + "context" + "testing" + + "github.com/gravitational/trace" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + integrationpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/authz" + "github.com/gravitational/teleport/lib/modules" +) + +func TestExportIntegrationCertAuthorities(t *testing.T) { + modules.SetTestModules(t, &modules.TestModules{TestBuildType: modules.BuildEnterprise}) + + ca := newCertAuthority(t, types.HostCA, "test-cluster") + ctx, localClient, resourceSvc := initSvc(t, ca, ca.GetClusterName(), "127.0.0.1") + + githubIntegration, err := newGitHubIntegration("github-my-org", "id", "secret") + require.NoError(t, err) + + oidcIntegration, err := types.NewIntegrationAWSOIDC( + types.Metadata{Name: "aws-oidc"}, + &types.AWSOIDCIntegrationSpecV1{ + RoleARN: "arn:aws:iam::123456789012:role/OpsTeam", + }, + ) + require.NoError(t, err) + + adminCtx := authz.ContextWithUser(ctx, authz.BuiltinRole{ + Role: types.RoleAdmin, + Username: string(types.RoleAdmin), + }) + + _, err = resourceSvc.CreateIntegration(adminCtx, &integrationpb.CreateIntegrationRequest{Integration: githubIntegration}) + require.NoError(t, err) + _, err = resourceSvc.CreateIntegration(adminCtx, &integrationpb.CreateIntegrationRequest{Integration: oidcIntegration}) + require.NoError(t, err) + + tests := []struct { + name string + integration string + identity context.Context + check func(*testing.T, *integrationpb.ExportIntegrationCertAuthoritiesResponse, error) + }{ + { + name: "success", + integration: githubIntegration.GetName(), + identity: adminCtx, + check: func(t *testing.T, resp *integrationpb.ExportIntegrationCertAuthoritiesResponse, err error) { + t.Helper() + require.NoError(t, err) + require.NotNil(t, resp) + require.NotNil(t, resp.CertAuthorities) + require.Len(t, resp.CertAuthorities.SSH, 1) + require.NotNil(t, resp.CertAuthorities.SSH[0]) + assert.NotEmpty(t, resp.CertAuthorities.SSH[0].PublicKey) + assert.Empty(t, resp.CertAuthorities.SSH[0].PrivateKey) + }, + }, + { + name: "not found", + integration: "not-found", + identity: adminCtx, + check: func(t *testing.T, resp *integrationpb.ExportIntegrationCertAuthoritiesResponse, err error) { + t.Helper() + require.Nil(t, resp) + require.Error(t, err) + require.True(t, trace.IsNotFound(err)) + }, + }, + { + name: "not allowed", + integration: githubIntegration.GetName(), + identity: authorizerForDummyUser(t, ctx, types.RoleSpecV6{}, localClient), + check: func(t *testing.T, resp *integrationpb.ExportIntegrationCertAuthoritiesResponse, err error) { + t.Helper() + require.Nil(t, resp) + require.Error(t, err) + require.True(t, trace.IsAccessDenied(err)) + }, + }, + { + name: "not supported", + integration: oidcIntegration.GetName(), + identity: adminCtx, + check: func(t *testing.T, resp *integrationpb.ExportIntegrationCertAuthoritiesResponse, err error) { + t.Helper() + require.Nil(t, resp) + require.Error(t, err) + require.True(t, trace.IsBadParameter(err)) + }, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + resp, err := resourceSvc.ExportIntegrationCertAuthorities(test.identity, &integrationpb.ExportIntegrationCertAuthoritiesRequest{ + Integration: test.integration, + }) + test.check(t, resp, err) + }) + } +} diff --git a/lib/auth/integration/integrationv1/github.go b/lib/auth/integration/integrationv1/github.go new file mode 100644 index 0000000000000..4283132b2d543 --- /dev/null +++ b/lib/auth/integration/integrationv1/github.go @@ -0,0 +1,103 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package integrationv1 + +import ( + "context" + "crypto/rand" + "time" + + "github.com/gravitational/trace" + "golang.org/x/crypto/ssh" + + integrationpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/authz" +) + +// GenerateGitHubUserCert signs a SSH certificate for GitHub integration. +func (s *Service) GenerateGitHubUserCert(ctx context.Context, in *integrationpb.GenerateGitHubUserCertRequest) (*integrationpb.GenerateGitHubUserCertResponse, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + if !authz.HasBuiltinRole(*authCtx, string(types.RoleProxy)) { + return nil, trace.AccessDenied("GenerateGitHubUserCert is only available to proxy services") + } + + cert, err := s.prepareGitHubCert(in) + if err != nil { + return nil, trace.Wrap(err) + } + caSigner, err := s.getGitHubSigner(ctx, in.Integration) + if err != nil { + return nil, trace.Wrap(err) + } + if err := cert.SignCert(rand.Reader, caSigner); err != nil { + return nil, trace.Wrap(err) + } + return &integrationpb.GenerateGitHubUserCertResponse{ + AuthorizedKey: ssh.MarshalAuthorizedKey(cert), + }, nil +} + +func (s *Service) prepareGitHubCert(in *integrationpb.GenerateGitHubUserCertRequest) (*ssh.Certificate, error) { + if in.UserId == "" { + return nil, trace.BadParameter("missing UserId for GenerateGitHubUserCert") + } + if in.KeyId == "" { + return nil, trace.BadParameter("missing KeyId for GenerateGitHubUserCert") + } + key, _, _, _, err := ssh.ParseAuthorizedKey(in.PublicKey) + if err != nil { + return nil, trace.Wrap(err) + } + // Sign with user ID set in id@github.com extension. + // https://docs.github.com/en/enterprise-cloud@latest/organizations/managing-git-access-to-your-organizations-repositories/about-ssh-certificate-authorities + now := s.clock.Now() + cert := &ssh.Certificate{ + Key: key, + CertType: ssh.UserCert, + KeyId: in.KeyId, + ValidAfter: uint64(now.Add(-time.Minute).Unix()), + ValidBefore: uint64(now.Add(in.Ttl.AsDuration()).Unix()), + Permissions: ssh.Permissions{ + Extensions: map[string]string{ + "id@github.com": in.UserId, + }, + }, + } + return cert, nil +} + +func (s *Service) getGitHubSigner(ctx context.Context, integration string) (ssh.Signer, error) { + ig, err := s.cache.GetIntegration(ctx, integration) + if err != nil { + return nil, trace.Wrap(err) + } + caKeySet, err := s.getGitHubCertAuthorities(ctx, ig) + if err != nil { + return nil, trace.Wrap(err) + } + caSigner, err := s.keyStoreManager.GetSSHSignerFromKeySet(ctx, *caKeySet) + if err != nil { + return nil, trace.Wrap(err) + } + return caSigner, nil +} diff --git a/lib/auth/integration/integrationv1/github_test.go b/lib/auth/integration/integrationv1/github_test.go new file mode 100644 index 0000000000000..35ae05f3f8f78 --- /dev/null +++ b/lib/auth/integration/integrationv1/github_test.go @@ -0,0 +1,83 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package integrationv1 + +import ( + "testing" + "time" + + "github.com/gravitational/trace" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "golang.org/x/crypto/ssh" + "google.golang.org/protobuf/types/known/durationpb" + + integrationpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/authz" + "github.com/gravitational/teleport/lib/cryptosuites" + "github.com/gravitational/teleport/lib/modules" +) + +func TestGenerateGitHubUserCert(t *testing.T) { + modules.SetTestModules(t, &modules.TestModules{TestBuildType: modules.BuildEnterprise}) + + ca := newCertAuthority(t, types.HostCA, "test-cluster") + ctx, _, resourceSvc := initSvc(t, ca, ca.GetClusterName(), "127.0.0.1.nip.io") + + githubIntegration, err := newGitHubIntegration("github-my-org", "id", "secret") + require.NoError(t, err) + + adminCtx := authz.ContextWithUser(ctx, authz.BuiltinRole{ + Role: types.RoleAdmin, + Username: string(types.RoleAdmin), + }) + _, err = resourceSvc.CreateIntegration(adminCtx, &integrationpb.CreateIntegrationRequest{Integration: githubIntegration}) + require.NoError(t, err) + + key, err := cryptosuites.GeneratePrivateKeyWithAlgorithm(cryptosuites.Ed25519) + require.NoError(t, err) + + req := &integrationpb.GenerateGitHubUserCertRequest{ + Integration: "github-my-org", + PublicKey: key.MarshalSSHPublicKey(), + UserId: "1122334455", + KeyId: "alice", + Ttl: durationpb.New(time.Minute), + } + + // Admin users cannot generate certs. + _, err = resourceSvc.GenerateGitHubUserCert(adminCtx, req) + require.True(t, trace.IsAccessDenied(err)) + + // Call as Proxy. + proxyCtx := authz.ContextWithUser(ctx, authz.BuiltinRole{ + Role: types.RoleProxy, + Username: string(types.RoleProxy), + }) + resp, err := resourceSvc.GenerateGitHubUserCert(proxyCtx, req) + require.NoError(t, err) + authorizedKey, _, _, _, err := ssh.ParseAuthorizedKey(resp.AuthorizedKey) + require.NoError(t, err) + sshCert, ok := authorizedKey.(*ssh.Certificate) + require.True(t, ok) + + assert.Equal(t, "alice", sshCert.KeyId) + assert.Equal(t, map[string]string{"id@github.com": "1122334455"}, sshCert.Permissions.Extensions) +} diff --git a/lib/auth/integration/integrationv1/service.go b/lib/auth/integration/integrationv1/service.go index 68831213c0fd5..5f673dd58714d 100644 --- a/lib/auth/integration/integrationv1/service.go +++ b/lib/auth/integration/integrationv1/service.go @@ -26,6 +26,7 @@ import ( "github.com/gravitational/trace" "github.com/jonboulle/clockwork" + "golang.org/x/crypto/ssh" "google.golang.org/protobuf/types/known/emptypb" "github.com/gravitational/teleport" @@ -33,7 +34,9 @@ import ( "github.com/gravitational/teleport/api/types" apievents "github.com/gravitational/teleport/api/types/events" "github.com/gravitational/teleport/lib/authz" + "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/events" + "github.com/gravitational/teleport/lib/modules" "github.com/gravitational/teleport/lib/services" ) @@ -51,19 +54,33 @@ type Cache interface { // IntegrationsGetter defines methods to access Integration resources. services.IntegrationsGetter + + // GetPluginStaticCredentialsByLabels will get a list of plugin static credentials resource by matching labels. + GetPluginStaticCredentialsByLabels(ctx context.Context, labels map[string]string) ([]types.PluginStaticCredentials, error) } // KeyStoreManager defines methods to get signers using the server's keystore. type KeyStoreManager interface { // GetJWTSigner selects a usable JWT keypair from the given keySet and returns a [crypto.Signer]. GetJWTSigner(ctx context.Context, ca types.CertAuthority) (crypto.Signer, error) + // NewSSHKeyPair generates a new SSH keypair in the keystore backend and returns it. + NewSSHKeyPair(ctx context.Context, purpose cryptosuites.KeyPurpose) (*types.SSHKeyPair, error) + // GetSSHSignerFromKeySet selects a usable SSH keypair from the provided key set. + GetSSHSignerFromKeySet(ctx context.Context, keySet types.CAKeySet) (ssh.Signer, error) +} + +// Backend defines the interface for all the backend services that the +// integration service needs. +type Backend interface { + services.Integrations + services.PluginStaticCredentials } // ServiceConfig holds configuration options for // the Integration gRPC service. type ServiceConfig struct { Authorizer authz.Authorizer - Backend services.Integrations + Backend Backend Cache Cache KeyStoreManager KeyStoreManager Logger *slog.Logger @@ -112,7 +129,7 @@ type Service struct { authorizer authz.Authorizer cache Cache keyStoreManager KeyStoreManager - backend services.Integrations + backend Backend logger *slog.Logger clock clockwork.Clock emitter apievents.Emitter @@ -155,6 +172,7 @@ func (s *Service) ListIntegrations(ctx context.Context, req *integrationpb.ListI igs := make([]*types.IntegrationV1, len(results)) for i, r := range results { + r = r.WithoutCredentials() v1, ok := r.(*types.IntegrationV1) if !ok { return nil, trace.BadParameter("unexpected Integration type %T", r) @@ -183,6 +201,8 @@ func (s *Service) GetIntegration(ctx context.Context, req *integrationpb.GetInte return nil, trace.Wrap(err) } + // Credentials are not used outside of Auth service. + integration = integration.WithoutCredentials() igV1, ok := integration.(*types.IntegrationV1) if !ok { return nil, trace.BadParameter("unexpected Integration type %T", integration) @@ -202,7 +222,17 @@ func (s *Service) CreateIntegration(ctx context.Context, req *integrationpb.Crea return nil, trace.Wrap(err) } - ig, err := s.backend.CreateIntegration(ctx, req.GetIntegration()) + switch req.Integration.GetSubKind() { + case types.IntegrationSubKindGitHub: + if modules.GetModules().BuildType() != modules.BuildEnterprise { + return nil, trace.AccessDenied("GitHub integration requires a Teleport Enterprise license") + } + if err := s.createGitHubCredentials(ctx, req.Integration); err != nil { + return nil, trace.Wrap(err) + } + } + + ig, err := s.backend.CreateIntegration(ctx, req.Integration) if err != nil { return nil, trace.Wrap(err) } @@ -228,6 +258,7 @@ func (s *Service) CreateIntegration(ctx context.Context, req *integrationpb.Crea s.logger.WarnContext(ctx, "Failed to emit integration create event.", "error", err) } + ig = ig.WithoutCredentials() igV1, ok := ig.(*types.IntegrationV1) if !ok { return nil, trace.BadParameter("unexpected Integration type %T", ig) @@ -236,7 +267,7 @@ func (s *Service) CreateIntegration(ctx context.Context, req *integrationpb.Crea return igV1, nil } -// UpdateIntegration updates an existing Okta import rule resource. +// UpdateIntegration updates an existing integration. func (s *Service) UpdateIntegration(ctx context.Context, req *integrationpb.UpdateIntegrationRequest) (*types.IntegrationV1, error) { authCtx, err := s.authorizer.Authorize(ctx) if err != nil { @@ -247,11 +278,16 @@ func (s *Service) UpdateIntegration(ctx context.Context, req *integrationpb.Upda return nil, trace.Wrap(err) } - ig, err := s.backend.UpdateIntegration(ctx, req.GetIntegration()) + if err := s.maybeUpdateStaticCredentials(ctx, req.Integration); err != nil { + return nil, trace.Wrap(err) + } + + ig, err := s.backend.UpdateIntegration(ctx, req.Integration) if err != nil { return nil, trace.Wrap(err) } + ig = ig.WithoutCredentials() igMeta, err := getIntegrationMetadata(ig) if err != nil { s.logger.WarnContext(ctx, "Failed to build all integration metadata for audit event.", "error", err) @@ -297,6 +333,10 @@ func (s *Service) DeleteIntegration(ctx context.Context, req *integrationpb.Dele return nil, trace.Wrap(err) } + if err := s.removeStaticCredentials(ctx, ig); err != nil { + return nil, trace.Wrap(err) + } + if err := s.backend.DeleteIntegration(ctx, req.GetName()); err != nil { return nil, trace.Wrap(err) } @@ -339,6 +379,10 @@ func getIntegrationMetadata(ig types.Integration) (apievents.IntegrationMetadata TenantID: ig.GetAzureOIDCIntegrationSpec().TenantID, ClientID: ig.GetAzureOIDCIntegrationSpec().ClientID, } + case types.IntegrationSubKindGitHub: + igMeta.GitHub = &apievents.GitHubIntegrationMetadata{ + Organization: ig.GetGitHubIntegrationSpec().Organization, + } default: return apievents.IntegrationMetadata{}, fmt.Errorf("unknown integration subkind: %s", igMeta.SubKind) } diff --git a/lib/auth/integration/integrationv1/service_test.go b/lib/auth/integration/integrationv1/service_test.go index e8ae3268d1c45..32ed9740618ae 100644 --- a/lib/auth/integration/integrationv1/service_test.go +++ b/lib/auth/integration/integrationv1/service_test.go @@ -24,24 +24,28 @@ import ( "github.com/google/uuid" "github.com/gravitational/trace" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" integrationpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/externalauditstorage" + "github.com/gravitational/teleport/lib/auth/integration/credentials" "github.com/gravitational/teleport/lib/auth/keystore" "github.com/gravitational/teleport/lib/auth/testauthority" "github.com/gravitational/teleport/lib/authz" "github.com/gravitational/teleport/lib/backend/memory" "github.com/gravitational/teleport/lib/events" "github.com/gravitational/teleport/lib/fixtures" + "github.com/gravitational/teleport/lib/modules" "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/services/local" "github.com/gravitational/teleport/lib/tlsca" ) func TestIntegrationCRUD(t *testing.T) { - t.Parallel() + modules.SetTestModules(t, &modules.TestModules{TestBuildType: modules.BuildEnterprise}) + clusterName := "test-cluster" proxyPublicAddr := "127.0.0.1.nip.io" @@ -68,6 +72,7 @@ func TestIntegrationCRUD(t *testing.T) { Role types.RoleSpecV6 Setup func(t *testing.T, igName string) Test func(ctx context.Context, resourceSvc *Service, igName string) error + Validate func(t *testing.T, igName string) Cleanup func(t *testing.T, igName string) ErrAssertion func(error) bool }{ @@ -188,6 +193,28 @@ func TestIntegrationCRUD(t *testing.T) { }, ErrAssertion: noError, }, + { + Name: "create github integrations", + Role: types.RoleSpecV6{ + Allow: types.RoleConditions{Rules: []types.Rule{{ + Resources: []string{types.KindIntegration}, + Verbs: []string{types.VerbCreate}, + }}}, + }, + Test: func(ctx context.Context, resourceSvc *Service, igName string) error { + ig, err := newGitHubIntegration(igName, "id", "secret") + if err != nil { + return trace.Wrap(err) + } + + _, err = resourceSvc.CreateIntegration(ctx, &integrationpb.CreateIntegrationRequest{Integration: ig}) + return trace.Wrap(err) + }, + Validate: func(t *testing.T, igName string) { + mustFindGitHubCredentials(t, localClient, igName, "id", "secret") + }, + ErrAssertion: noError, + }, // Update { @@ -219,6 +246,66 @@ func TestIntegrationCRUD(t *testing.T) { }, ErrAssertion: noError, }, + { + Name: "credentials updated", + Role: types.RoleSpecV6{ + Allow: types.RoleConditions{Rules: []types.Rule{{ + Resources: []string{types.KindIntegration}, + Verbs: []string{types.VerbUpdate, types.VerbCreate}, + }}}, + }, + Test: func(ctx context.Context, resourceSvc *Service, igName string) error { + oldIg, err := newGitHubIntegration(igName, "id", "secret") + if err != nil { + return trace.Wrap(err) + } + _, err = resourceSvc.CreateIntegration(ctx, &integrationpb.CreateIntegrationRequest{Integration: oldIg}) + if err != nil { + return trace.Wrap(err) + } + + newIg, err := newGitHubIntegration(igName, "new-id", "new-secret") + if err != nil { + return trace.Wrap(err) + } + _, err = resourceSvc.UpdateIntegration(ctx, &integrationpb.UpdateIntegrationRequest{Integration: newIg}) + return err + }, + Validate: func(t *testing.T, igName string) { + mustFindGitHubCredentials(t, localClient, igName, "new-id", "new-secret") + }, + ErrAssertion: noError, + }, + { + Name: "credentials preserved", + Role: types.RoleSpecV6{ + Allow: types.RoleConditions{Rules: []types.Rule{{ + Resources: []string{types.KindIntegration}, + Verbs: []string{types.VerbUpdate, types.VerbCreate}, + }}}, + }, + Test: func(ctx context.Context, resourceSvc *Service, igName string) error { + oldIg, err := newGitHubIntegration(igName, "id", "secret") + if err != nil { + return trace.Wrap(err) + } + _, err = resourceSvc.CreateIntegration(ctx, &integrationpb.CreateIntegrationRequest{Integration: oldIg}) + if err != nil { + return trace.Wrap(err) + } + + newIg, err := newGitHubIntegration(igName, "", "") + if err != nil { + return trace.Wrap(err) + } + _, err = resourceSvc.UpdateIntegration(ctx, &integrationpb.UpdateIntegrationRequest{Integration: newIg}) + return err + }, + Validate: func(t *testing.T, igName string) { + mustFindGitHubCredentials(t, localClient, igName, "id", "secret") + }, + ErrAssertion: noError, + }, // Delete { @@ -324,6 +411,68 @@ func TestIntegrationCRUD(t *testing.T) { }, ErrAssertion: noError, }, + { + Name: "credentials are also deleted", + Role: types.RoleSpecV6{ + Allow: types.RoleConditions{Rules: []types.Rule{{ + Resources: []string{types.KindIntegration}, + Verbs: []string{types.VerbDelete}, + }}}, + }, + Setup: func(t *testing.T, igName string) { + t.Helper() + + ig := sampleIntegrationFn(t, igName) + refUUID := uuid.NewString() + ig.SetCredentials(&types.PluginCredentialsV1{ + Credentials: &types.PluginCredentialsV1_StaticCredentialsRef{ + StaticCredentialsRef: credentials.NewRefWithUUID(refUUID), + }, + }) + + _, err := localClient.CreateIntegration(ctx, ig) + require.NoError(t, err) + + // Save a fake credentials that can be found using igName. + cred := &types.PluginStaticCredentialsV1{ + ResourceHeader: types.ResourceHeader{ + Metadata: types.Metadata{ + Name: igName, + Labels: map[string]string{ + credentials.LabelStaticCredentialsIntegration: refUUID, + credentials.LabelStaticCredentialsPurpose: "test", + }, + }, + }, + Spec: &types.PluginStaticCredentialsSpecV1{ + Credentials: &types.PluginStaticCredentialsSpecV1_OAuthClientSecret{ + OAuthClientSecret: &types.PluginStaticCredentialsOAuthClientSecret{ + ClientId: "id", + ClientSecret: "secret", + }, + }, + }, + } + err = localClient.CreatePluginStaticCredentials(ctx, cred) + require.NoError(t, err) + + // double-check + staticCreds, err := localClient.GetPluginStaticCredentials(context.Background(), igName) + require.NoError(t, err) + require.NotNil(t, staticCreds) + }, + Test: func(ctx context.Context, resourceSvc *Service, igName string) error { + _, err := resourceSvc.DeleteIntegration(ctx, &integrationpb.DeleteIntegrationRequest{Name: igName}) + return err + }, + Validate: func(t *testing.T, igName string) { + t.Helper() + _, err := localClient.GetPluginStaticCredentials(context.Background(), igName) + require.Error(t, err) + require.True(t, trace.IsNotFound(err)) + }, + ErrAssertion: noError, + }, // Delete all { @@ -358,6 +507,11 @@ func TestIntegrationCRUD(t *testing.T) { err := tc.Test(localCtx, resourceSvc, igName) require.True(t, tc.ErrAssertion(err), err) + + // Extra validation + if tc.Validate != nil { + tc.Validate(t, igName) + } }) } } @@ -390,13 +544,14 @@ func authorizerForDummyUser(t *testing.T, ctx context.Context, roleSpec types.Ro type localClient interface { CreateUser(ctx context.Context, user types.User) (types.User, error) CreateRole(ctx context.Context, role types.Role) (types.Role, error) - CreateIntegration(ctx context.Context, ig types.Integration) (types.Integration, error) GenerateDraftExternalAuditStorage(ctx context.Context, integrationName, region string) (*externalauditstorage.ExternalAuditStorage, error) DeleteDraftExternalAuditStorage(ctx context.Context) error PromoteToClusterExternalAuditStorage(ctx context.Context) error DisableClusterExternalAuditStorage(ctx context.Context) error CreatePlugin(ctx context.Context, plugin types.Plugin) error DeletePlugin(ctx context.Context, name string) error + services.PluginStaticCredentials + services.Integrations } type testClient struct { @@ -455,6 +610,16 @@ func initSvc(t *testing.T, ca types.CertAuthority, clusterName string, proxyPubl localResourceService, err := local.NewIntegrationsService(backend) require.NoError(t, err) + localCredService, err := local.NewPluginStaticCredentialsService(backend) + require.NoError(t, err) + + backendSvc := struct { + services.Integrations + services.PluginStaticCredentials + }{ + Integrations: localResourceService, + PluginStaticCredentials: localCredService, + } cacheResourceService, err := local.NewIntegrationsService(backend, local.WithIntegrationsServiceCacheMode(true)) require.NoError(t, err) @@ -467,11 +632,12 @@ func initSvc(t *testing.T, ca types.CertAuthority, clusterName string, proxyPubl PublicAddrs: []string{proxyPublicAddr}, }}, }, - IntegrationsService: *cacheResourceService, + IntegrationsService: *cacheResourceService, + PluginStaticCredentialsService: localCredService, } resourceSvc, err := NewService(&ServiceConfig{ - Backend: localResourceService, + Backend: backendSvc, Authorizer: authorizer, Cache: cache, KeyStoreManager: keystore.NewSoftwareKeystoreForTests(t), @@ -485,12 +651,14 @@ func initSvc(t *testing.T, ca types.CertAuthority, clusterName string, proxyPubl *local.ExternalAuditStorageService *local.IntegrationsService *local.PluginsService + *local.PluginStaticCredentialsService }{ - AccessService: roleSvc, - IdentityService: userSvc, - ExternalAuditStorageService: easSvc, - IntegrationsService: localResourceService, - PluginsService: pluginSvc, + AccessService: roleSvc, + IdentityService: userSvc, + ExternalAuditStorageService: easSvc, + IntegrationsService: localResourceService, + PluginsService: pluginSvc, + PluginStaticCredentialsService: localCredService, }, resourceSvc } @@ -502,6 +670,7 @@ type mockCache struct { returnErr error local.IntegrationsService + *local.PluginStaticCredentialsService } func (m *mockCache) GetProxies() ([]types.Server, error) { @@ -556,3 +725,59 @@ func newCertAuthority(t *testing.T, caType types.CertAuthType, domain string) ty return ca } + +func newGitHubIntegration(name, id, secret string) (*types.IntegrationV1, error) { + ig, err := types.NewIntegrationGitHub( + types.Metadata{ + Name: name, + }, + &types.GitHubIntegrationSpecV1{ + Organization: "my-org", + }, + ) + if err != nil { + return nil, trace.Wrap(err) + } + + if secret != "" { + ig.SetCredentials(&types.PluginCredentialsV1{ + Credentials: &types.PluginCredentialsV1_IdSecret{ + IdSecret: &types.PluginIdSecretCredential{ + Id: id, + Secret: secret, + }, + }, + }) + } + return ig, nil +} + +func mustFindGitHubCredentials(t *testing.T, localClient Backend, igName, wantId, wantSecret string) { + t.Helper() + + ig, err := localClient.GetIntegration(context.Background(), igName) + require.NoError(t, err) + + creds := ig.GetCredentials() + require.NotNil(t, creds) + require.NotNil(t, creds.GetStaticCredentialsRef()) + + staticCreds, err := localClient.GetPluginStaticCredentialsByLabels(context.Background(), creds.GetStaticCredentialsRef().Labels) + require.NoError(t, err) + require.Len(t, staticCreds, 2) + + var seenSSHCA, seenOAuth bool + for _, cred := range staticCreds { + if len(cred.GetSSHCertAuthorities()) != 0 { + seenSSHCA = true + continue + } + if id, secret := cred.GetOAuthClientSecret(); id != "" { + assert.Equal(t, wantId, id) + assert.Equal(t, wantSecret, secret) + seenOAuth = true + } + } + assert.True(t, seenSSHCA) + assert.True(t, seenOAuth) +} diff --git a/lib/auth/keystore/manager.go b/lib/auth/keystore/manager.go index 3c8fcfc16498b..68073ae7f297f 100644 --- a/lib/auth/keystore/manager.go +++ b/lib/auth/keystore/manager.go @@ -251,18 +251,20 @@ func (s *cryptoCountSigner) Sign(rand io.Reader, digest []byte, opts crypto.Sign // GetSSHSigner selects a usable SSH keypair from the given CA ActiveKeys and // returns an [ssh.Signer]. func (m *Manager) GetSSHSigner(ctx context.Context, ca types.CertAuthority) (ssh.Signer, error) { - signer, err := m.getSSHSigner(ctx, ca.GetActiveKeys()) + signer, err := m.GetSSHSignerFromKeySet(ctx, ca.GetActiveKeys()) return signer, trace.Wrap(err) } // GetSSHSigner selects a usable SSH keypair from the given CA // AdditionalTrustedKeys and returns an [ssh.Signer]. func (m *Manager) GetAdditionalTrustedSSHSigner(ctx context.Context, ca types.CertAuthority) (ssh.Signer, error) { - signer, err := m.getSSHSigner(ctx, ca.GetAdditionalTrustedKeys()) + signer, err := m.GetSSHSignerFromKeySet(ctx, ca.GetAdditionalTrustedKeys()) return signer, trace.Wrap(err) } -func (m *Manager) getSSHSigner(ctx context.Context, keySet types.CAKeySet) (ssh.Signer, error) { +// GetSSHSignerFromKeySet selects a usable SSH keypair from the provided key +// set. +func (m *Manager) GetSSHSignerFromKeySet(ctx context.Context, keySet types.CAKeySet) (ssh.Signer, error) { for _, backend := range m.usableSigningBackends { for _, keyPair := range keySet.SSH { canSign, err := backend.canSignWithKey(ctx, keyPair.PrivateKey, keyPair.PrivateKeyType) diff --git a/lib/auth/test/suite.go b/lib/auth/test/suite.go index 082768d8ca281..14d22f8265647 100644 --- a/lib/auth/test/suite.go +++ b/lib/auth/test/suite.go @@ -233,6 +233,27 @@ func (s *AuthSuite) GenerateUserCert(t *testing.T) { assert.Equal(t, devTag, sshCert.Extensions[teleport.CertExtensionDeviceAssetTag], "AssetTag mismatch") assert.Equal(t, devCred, sshCert.Extensions[teleport.CertExtensionDeviceCredentialID], "CredentialID mismatch") }) + + t.Run("github identity", func(t *testing.T) { + githubUserID := "1234567" + githubUsername := "github-user" + certRaw, err := s.A.GenerateUserCert(sshca.UserCertificateRequest{ + CASigner: caSigner, // Required. + PublicUserKey: pub, // Required. + Identity: sshca.Identity{ + Username: "llama", // Required. + AllowedLogins: []string{"llama"}, // Required. + GitHubUserID: githubUserID, + GitHubUsername: githubUsername, + }, + }) + require.NoError(t, err, "GenerateUserCert failed") + + sshCert, err := sshutils.ParseCertificate(certRaw) + require.NoError(t, err, "ParseCertificate failed") + assert.Equal(t, githubUserID, sshCert.Extensions[teleport.CertExtensionGitHubUserID]) + assert.Equal(t, githubUsername, sshCert.Extensions[teleport.CertExtensionGitHubUsername]) + }) } func checkCertExpiry(cert []byte, after, before time.Time) error { diff --git a/lib/auth/userloginstate/generator.go b/lib/auth/userloginstate/generator.go index 90f894411f3c7..f9c72ac1a5f07 100644 --- a/lib/auth/userloginstate/generator.go +++ b/lib/auth/userloginstate/generator.go @@ -132,9 +132,10 @@ func NewGenerator(config GeneratorConfig) (*Generator, error) { } // Generate will generate the user login state for the given user. -func (g *Generator) Generate(ctx context.Context, user types.User) (*userloginstate.UserLoginState, error) { +func (g *Generator) Generate(ctx context.Context, user types.User, ulsService services.UserLoginStates) (*userloginstate.UserLoginState, error) { var originalTraits map[string][]string var traits map[string][]string + var githubIdentity *userloginstate.ExternalIdentity if len(user.GetTraits()) > 0 { originalTraits = make(map[string][]string, len(user.GetTraits())) traits = make(map[string][]string, len(user.GetTraits())) @@ -144,6 +145,14 @@ func (g *Generator) Generate(ctx context.Context, user types.User) (*userloginst } } + // Only expecting one for now. + if githubIdentities := user.GetGithubIdentities(); len(githubIdentities) > 0 { + githubIdentity = &userloginstate.ExternalIdentity{ + UserID: githubIdentities[0].UserID, + Username: githubIdentities[0].Username, + } + } + // Create a new empty user login state. uls, err := userloginstate.New( header.Metadata{ @@ -155,6 +164,7 @@ func (g *Generator) Generate(ctx context.Context, user types.User) (*userloginst Roles: utils.CopyStrings(user.GetRoles()), Traits: traits, UserType: user.GetUserType(), + GitHubIdentity: githubIdentity, }) if err != nil { return nil, trace.Wrap(err) @@ -166,6 +176,13 @@ func (g *Generator) Generate(ctx context.Context, user types.User) (*userloginst return nil, trace.Wrap(err) } + // Preserve states like GitHub identities across logins. + // TODO(greedy52) implement a way to remove the identity or find a way to + // avoid keeping the identity forever. + if err := g.maybePreserveGitHubIdentity(ctx, uls, ulsService); err != nil { + return nil, trace.Wrap(err) + } + // Clean up the user login state after generating it. if err := g.postProcess(ctx, uls); err != nil { return nil, trace.Wrap(err) @@ -400,9 +417,29 @@ func (g *Generator) emitUsageEvent(ctx context.Context, user types.User, state * return nil } +func (g *Generator) maybePreserveGitHubIdentity(ctx context.Context, uls *userloginstate.UserLoginState, ulsService services.UserLoginStates) error { + // Use the new one. + if uls.Spec.GitHubIdentity != nil { + return nil + } + + // Find the old state if exists. + oldUls, err := ulsService.GetUserLoginState(ctx, uls.GetName()) + if err != nil { + if trace.IsNotFound(err) { + return nil + } + return trace.Wrap(err) + } + if oldUls.Spec.GitHubIdentity != nil { + uls.Spec.GitHubIdentity = oldUls.Spec.GitHubIdentity + } + return nil +} + // Refresh will take the user and update the user login state in the backend. func (g *Generator) Refresh(ctx context.Context, user types.User, ulsService services.UserLoginStates) (*userloginstate.UserLoginState, error) { - uls, err := g.Generate(ctx, user) + uls, err := g.Generate(ctx, user, ulsService) if err != nil { return nil, trace.Wrap(err) } diff --git a/lib/auth/userloginstate/generator_test.go b/lib/auth/userloginstate/generator_test.go index 3f8b29edca2cf..1154dec233de3 100644 --- a/lib/auth/userloginstate/generator_test.go +++ b/lib/auth/userloginstate/generator_test.go @@ -601,7 +601,7 @@ func TestAccessLists(t *testing.T) { require.NoError(t, backendSvc.UpsertLock(ctx, lock)) } - state, err := svc.Generate(ctx, test.user) + state, err := svc.Generate(ctx, test.user, backendSvc) test.wantErr(t, err) if err != nil { @@ -629,9 +629,82 @@ func TestAccessLists(t *testing.T) { } } +func TestGitHubIdentity(t *testing.T) { + ctx := context.Background() + svc, backendSvc := initGeneratorSvc(t) + + noGitHubIdentity, err := types.NewUser("alice") + require.NoError(t, err) + + withGitHubIdentity, err := types.NewUser("alice") + require.NoError(t, err) + withGitHubIdentity.SetGithubIdentities([]types.ExternalIdentity{{ + UserID: "1234567", + Username: "username1234567", + }}) + + withGitHubIdentityUpdated, err := types.NewUser("alice") + require.NoError(t, err) + withGitHubIdentityUpdated.SetGithubIdentities([]types.ExternalIdentity{{ + UserID: "7654321", + Username: "username7654321", + }}) + + tests := []struct { + name string + user types.User + expectGitHubIdentity *userloginstate.ExternalIdentity + }{ + { + name: "no github identity", + user: noGitHubIdentity, + expectGitHubIdentity: nil, + }, + { + name: "with github identity", + user: withGitHubIdentity, + expectGitHubIdentity: &userloginstate.ExternalIdentity{ + UserID: "1234567", + Username: "username1234567", + }, + }, + { + // at this point alice's GitHub identity should be saved in old + // states. + name: "github identity preserved", + user: noGitHubIdentity, + expectGitHubIdentity: &userloginstate.ExternalIdentity{ + UserID: "1234567", + Username: "username1234567", + }, + }, + { + name: "github identity updated", + user: withGitHubIdentityUpdated, + expectGitHubIdentity: &userloginstate.ExternalIdentity{ + UserID: "7654321", + Username: "username7654321", + }, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + uls, err := svc.Generate(ctx, test.user, backendSvc) + require.NoError(t, err) + require.Equal(t, test.expectGitHubIdentity, uls.Spec.GitHubIdentity) + + // Upsert the state for the next test case. + _, err = backendSvc.UpsertUserLoginState(ctx, uls) + require.NoError(t, err) + }) + } +} + type svc struct { services.AccessLists services.Access + services.UserLoginStates event *usageeventsv1.UsageEventOneOf } @@ -653,9 +726,15 @@ func initGeneratorSvc(t *testing.T) (*Generator, *svc) { accessListsSvc, err := local.NewAccessListService(mem, clock) require.NoError(t, err) accessSvc := local.NewAccessService(mem) + ulsService, err := local.NewUserLoginStateService(mem) + require.NoError(t, err) log := logrus.WithField("test", "logger") - svc := &svc{AccessLists: accessListsSvc, Access: accessSvc} + svc := &svc{ + AccessLists: accessListsSvc, + Access: accessSvc, + UserLoginStates: ulsService, + } emitter := &eventstest.MockRecorderEmitter{} diff --git a/lib/authz/permissions.go b/lib/authz/permissions.go index d5fff2f945474..5de396ca5e05b 100644 --- a/lib/authz/permissions.go +++ b/lib/authz/permissions.go @@ -796,6 +796,9 @@ func (a *authorizer) authorizeRemoteBuiltinRole(r RemoteBuiltinRole) (*Context, AppLabels: types.Labels{types.Wildcard: []string{types.Wildcard}}, DatabaseLabels: types.Labels{types.Wildcard: []string{types.Wildcard}}, KubernetesLabels: types.Labels{types.Wildcard: []string{types.Wildcard}}, + GitHubPermissions: []types.GitHubPermission{{ + Organizations: []string{types.Wildcard}, + }}, Rules: []types.Rule{ types.NewRule(types.KindNode, services.RO()), types.NewRule(types.KindProxy, services.RO()), @@ -815,6 +818,7 @@ func (a *authorizer) authorizeRemoteBuiltinRole(r RemoteBuiltinRole) (*Context, types.NewRule(types.KindInstaller, services.RO()), types.NewRule(types.KindUIConfig, services.RO()), types.NewRule(types.KindDatabaseService, services.RO()), + types.NewRule(types.KindGitServer, services.RO()), // this rule allows remote proxy to update the cluster's certificate authorities // during certificates renewal { @@ -868,6 +872,9 @@ func roleSpecForProxy(clusterName string) types.RoleSpecV6 { DatabaseLabels: types.Labels{types.Wildcard: []string{types.Wildcard}}, DatabaseServiceLabels: types.Labels{types.Wildcard: []string{types.Wildcard}}, KubernetesLabels: types.Labels{types.Wildcard: []string{types.Wildcard}}, + GitHubPermissions: []types.GitHubPermission{{ + Organizations: []string{types.Wildcard}, + }}, Rules: []types.Rule{ types.NewRule(types.KindProxy, services.RW()), types.NewRule(types.KindOIDCRequest, services.RW()), @@ -921,6 +928,7 @@ func roleSpecForProxy(clusterName string) types.RoleSpecV6 { types.NewRule(types.KindSecurityReport, services.RO()), types.NewRule(types.KindSecurityReportState, services.RO()), types.NewRule(types.KindUserTask, services.RO()), + types.NewRule(types.KindGitServer, services.RO()), // this rule allows cloud proxies to read // plugins of `openai` type, since Assist uses the OpenAI API and runs in Proxy. { @@ -1114,6 +1122,9 @@ func definitionForBuiltinRole(clusterName string, recConfig readonly.SessionReco DatabaseServiceLabels: types.Labels{types.Wildcard: []string{types.Wildcard}}, ClusterLabels: types.Labels{types.Wildcard: []string{types.Wildcard}}, WindowsDesktopLabels: types.Labels{types.Wildcard: []string{types.Wildcard}}, + GitHubPermissions: []types.GitHubPermission{{ + Organizations: []string{types.Wildcard}, + }}, Rules: []types.Rule{ types.NewRule(types.Wildcard, services.RW()), types.NewRule(types.KindDevice, append(services.RW(), types.VerbCreateEnrollToken, types.VerbEnroll)), diff --git a/lib/cache/cache.go b/lib/cache/cache.go index 2a7cae63ce99e..4d01a9ed8862a 100644 --- a/lib/cache/cache.go +++ b/lib/cache/cache.go @@ -103,6 +103,7 @@ var highVolumeResources = map[string]struct{}{ types.KindWindowsDesktopService: {}, types.KindKubeServer: {}, types.KindDatabaseObject: {}, + types.KindGitServer: {}, } func isHighVolumeResource(kind string) bool { @@ -199,6 +200,8 @@ func ForAuth(cfg Config) Config { {Kind: types.KindIdentityCenterPrincipalAssignment}, {Kind: types.KindIdentityCenterAccountAssignment}, {Kind: types.KindWorkloadIdentity}, + {Kind: types.KindPluginStaticCredentials}, + {Kind: types.KindGitServer}, } cfg.QueueSize = defaults.AuthQueueSize // We don't want to enable partial health for auth cache because auth uses an event stream @@ -256,6 +259,7 @@ func ForProxy(cfg Config) Config { {Kind: types.KindAutoUpdateVersion}, {Kind: types.KindAutoUpdateAgentRollout}, {Kind: types.KindUserTask}, + {Kind: types.KindGitServer}, } cfg.QueueSize = defaults.ProxyQueueSize return cfg @@ -284,6 +288,7 @@ func ForRemoteProxy(cfg Config) Config { {Kind: types.KindDatabaseServer}, {Kind: types.KindDatabaseService}, {Kind: types.KindKubeServer}, + {Kind: types.KindGitServer}, } cfg.QueueSize = defaults.ProxyQueueSize return cfg @@ -552,6 +557,8 @@ type Cache struct { provisioningStatesCache *local.ProvisioningStateService identityCenterCache *local.IdentityCenterService workloadIdentityCache workloadIdentityCacher + pluginStaticCredentialsCache *local.PluginStaticCredentialsService + gitServersCache *local.GitServerService // closed indicates that the cache has been closed closed atomic.Bool @@ -789,6 +796,10 @@ type Config struct { // IdentityCenter is the upstream Identity Center service that we're caching IdentityCenter services.IdentityCenter + // PluginStaticCredentials is the plugin static credentials services + PluginStaticCredentials services.PluginStaticCredentials + // GitServers is the Git server service. + GitServers services.GitServerGetter } // CheckAndSetDefaults checks parameters and sets default values @@ -1034,6 +1045,18 @@ func New(config Config) (*Cache, error) { return nil, trace.Wrap(err) } + pluginStaticCredentialsCache, err := local.NewPluginStaticCredentialsService(config.Backend) + if err != nil { + cancel() + return nil, trace.Wrap(err) + } + + gitServersCache, err := local.NewGitServerService(config.Backend) + if err != nil { + cancel() + return nil, trace.Wrap(err) + } + cs := &Cache{ ctx: ctx, cancel: cancel, @@ -1082,6 +1105,8 @@ func New(config Config) (*Cache, error) { provisioningStatesCache: provisioningStatesCache, identityCenterCache: identityCenterCache, workloadIdentityCache: workloadIdentityCache, + pluginStaticCredentialsCache: pluginStaticCredentialsCache, + gitServersCache: gitServersCache, Logger: log.WithFields(log.Fields{ teleport.ComponentKey: config.Component, }), diff --git a/lib/cache/cache_test.go b/lib/cache/cache_test.go index 379e77d897e8e..db21b40e06949 100644 --- a/lib/cache/cache_test.go +++ b/lib/cache/cache_test.go @@ -142,17 +142,20 @@ type testPack struct { provisioningStates services.ProvisioningStates identityCenter services.IdentityCenter workloadIdentity *local.WorkloadIdentityService + pluginStaticCredentials *local.PluginStaticCredentialsService + gitServers services.GitServers } // testFuncs are functions to support testing an object in a cache. type testFuncs[T types.Resource] struct { - newResource func(string) (T, error) - create func(context.Context, T) error - list func(context.Context) ([]T, error) - cacheGet func(context.Context, string) (T, error) - cacheList func(context.Context) ([]T, error) - update func(context.Context, T) error - deleteAll func(context.Context) error + newResource func(string) (T, error) + create func(context.Context, T) error + list func(context.Context) ([]T, error) + cacheGet func(context.Context, string) (T, error) + cacheList func(context.Context) ([]T, error) + update func(context.Context, T) error + deleteAll func(context.Context) error + changeResource func(T) } // testFuncs153 are functions to support testing an RFD153-style resource in a cache. @@ -409,6 +412,16 @@ func newPackWithoutCache(dir string, opts ...packOption) (*testPack, error) { return nil, trace.Wrap(err) } + p.pluginStaticCredentials, err = local.NewPluginStaticCredentialsService(p.backend) + if err != nil { + return nil, trace.Wrap(err) + } + + p.gitServers, err = local.NewGitServerService(p.backend) + if err != nil { + return nil, trace.Wrap(err) + } + return p, nil } @@ -463,6 +476,8 @@ func newPack(dir string, setupConfig func(c Config) Config, opts ...packOption) ProvisioningStates: p.provisioningStates, IdentityCenter: p.identityCenter, WorkloadIdentity: p.workloadIdentity, + PluginStaticCredentials: p.pluginStaticCredentials, + GitServers: p.gitServers, MaxRetryPeriod: 200 * time.Millisecond, EventsC: p.eventsC, })) @@ -877,7 +892,9 @@ func TestCompletenessInit(t *testing.T) { WorkloadIdentity: p.workloadIdentity, MaxRetryPeriod: 200 * time.Millisecond, IdentityCenter: p.identityCenter, + PluginStaticCredentials: p.pluginStaticCredentials, EventsC: p.eventsC, + GitServers: p.gitServers, })) require.NoError(t, err) @@ -961,8 +978,10 @@ func TestCompletenessReset(t *testing.T) { ProvisioningStates: p.provisioningStates, IdentityCenter: p.identityCenter, WorkloadIdentity: p.workloadIdentity, + PluginStaticCredentials: p.pluginStaticCredentials, MaxRetryPeriod: 200 * time.Millisecond, EventsC: p.eventsC, + GitServers: p.gitServers, })) require.NoError(t, err) @@ -1172,9 +1191,11 @@ func TestListResources_NodesTTLVariant(t *testing.T) { ProvisioningStates: p.provisioningStates, IdentityCenter: p.identityCenter, WorkloadIdentity: p.workloadIdentity, + PluginStaticCredentials: p.pluginStaticCredentials, MaxRetryPeriod: 200 * time.Millisecond, EventsC: p.eventsC, neverOK: true, // ensure reads are never healthy + GitServers: p.gitServers, })) require.NoError(t, err) @@ -1268,8 +1289,10 @@ func initStrategy(t *testing.T) { ProvisioningStates: p.provisioningStates, IdentityCenter: p.identityCenter, WorkloadIdentity: p.workloadIdentity, + PluginStaticCredentials: p.pluginStaticCredentials, MaxRetryPeriod: 200 * time.Millisecond, EventsC: p.eventsC, + GitServers: p.gitServers, })) require.NoError(t, err) @@ -2938,10 +2961,20 @@ func TestStaticHostUsers(t *testing.T) { func testResources[T types.Resource](t *testing.T, p *testPack, funcs testFuncs[T]) { ctx := context.Background() + if funcs.changeResource == nil { + funcs.changeResource = func(t T) { + if t.Expiry().IsZero() { + t.SetExpiry(time.Now().Add(30 * time.Minute)) + } else { + t.SetExpiry(t.Expiry().Add(30 * time.Minute)) + } + } + } + // Create a resource. r, err := funcs.newResource("test-sp") require.NoError(t, err) - r.SetExpiry(time.Now().Add(30 * time.Minute)) + funcs.changeResource(r) err = funcs.create(ctx, r) require.NoError(t, err) @@ -2975,7 +3008,7 @@ func testResources[T types.Resource](t *testing.T, p *testPack, funcs testFuncs[ // update is optional as not every resource implements it if funcs.update != nil { // Update the resource and upsert it into the backend again. - r.SetExpiry(r.Expiry().Add(30 * time.Minute)) + funcs.changeResource(r) err = funcs.update(ctx, r) require.NoError(t, err) } @@ -3534,6 +3567,8 @@ func TestCacheWatchKindExistsInEvents(t *testing.T) { types.KindIdentityCenterAccountAssignment: types.Resource153ToLegacy(newIdentityCenterAccountAssignment("some_account_assignment")), types.KindIdentityCenterPrincipalAssignment: types.Resource153ToLegacy(newIdentityCenterPrincipalAssignment("some_principal_assignment")), types.KindWorkloadIdentity: types.Resource153ToLegacy(newWorkloadIdentity("some_identifier")), + types.KindPluginStaticCredentials: &types.PluginStaticCredentialsV1{}, + types.KindGitServer: &types.ServerV2{}, } for name, cfg := range cases { diff --git a/lib/cache/collections.go b/lib/cache/collections.go index b13b2601e2c41..418d74e2747ec 100644 --- a/lib/cache/collections.go +++ b/lib/cache/collections.go @@ -178,6 +178,8 @@ type cacheCollections struct { identityCenterPrincipalAssignments collectionReader[identityCenterPrincipalAssignmentGetter] identityCenterAccountAssignments collectionReader[identityCenterAccountAssignmentGetter] workloadIdentity collectionReader[WorkloadIdentityReader] + pluginStaticCredentials collectionReader[pluginStaticCredentialsGetter] + gitServers collectionReader[services.GitServerGetter] } // setupCollections returns a registry of collections. @@ -795,6 +797,33 @@ func setupCollections(c *Cache, watches []types.WatchKind) (*cacheCollections, e } collections.byKind[resourceKind] = collections.identityCenterAccountAssignments + case types.KindPluginStaticCredentials: + if c.PluginStaticCredentials == nil { + return nil, trace.BadParameter("missing parameter PluginStaticCredentials") + } + collections.pluginStaticCredentials = &genericCollection[ + types.PluginStaticCredentials, + pluginStaticCredentialsGetter, + pluginStaticCredentialsExecutor, + ]{ + cache: c, + watch: watch, + } + collections.byKind[resourceKind] = collections.pluginStaticCredentials + + case types.KindGitServer: + if c.GitServers == nil { + return nil, trace.BadParameter("missing parameter GitServers") + } + collections.gitServers = &genericCollection[ + types.Server, + services.GitServerGetter, + gitServerExecutor, + ]{ + cache: c, + watch: watch, + } + collections.byKind[resourceKind] = collections.gitServers default: return nil, trace.BadParameter("resource %q is not supported", watch.Kind) } diff --git a/lib/cache/git_server.go b/lib/cache/git_server.go new file mode 100644 index 0000000000000..b585b0b169817 --- /dev/null +++ b/lib/cache/git_server.go @@ -0,0 +1,105 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package cache + +import ( + "context" + + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/client/gitserver" + apidefaults "github.com/gravitational/teleport/api/defaults" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/services" +) + +// GitServerReadOnlyClient returns the read-only client for Git servers. +// +// Note that Cache implements GitServerReadOnlyClient to satisfy +// auth.ProxyAccessPoint but also has the getter functions at top level to +// satisfy auth.Cache. +func (c *Cache) GitServerReadOnlyClient() gitserver.ReadOnlyClient { + return c +} + +func (c *Cache) GetGitServer(ctx context.Context, name string) (types.Server, error) { + ctx, span := c.Tracer.Start(ctx, "cache/GetGitServer") + defer span.End() + + rg, err := readCollectionCache(c, c.collections.gitServers) + if err != nil { + return nil, trace.Wrap(err) + } + defer rg.Release() + return rg.reader.GetGitServer(ctx, name) +} + +func (c *Cache) ListGitServers(ctx context.Context, pageSize int, pageToken string) ([]types.Server, string, error) { + ctx, span := c.Tracer.Start(ctx, "cache/ListGitServers") + defer span.End() + + rg, err := readCollectionCache(c, c.collections.gitServers) + if err != nil { + return nil, "", trace.Wrap(err) + } + defer rg.Release() + return rg.reader.ListGitServers(ctx, pageSize, pageToken) +} + +type gitServerExecutor struct{} + +func (gitServerExecutor) getAll(ctx context.Context, cache *Cache, loadSecrets bool) (all []types.Server, err error) { + var page []types.Server + var nextToken string + for { + page, nextToken, err = cache.GitServers.ListGitServers(ctx, apidefaults.DefaultChunkSize, nextToken) + if err != nil { + return nil, trace.Wrap(err) + } + all = append(all, page...) + if nextToken == "" { + break + } + } + return all, nil +} + +func (gitServerExecutor) upsert(ctx context.Context, cache *Cache, resource types.Server) error { + _, err := cache.gitServersCache.UpsertGitServer(ctx, resource) + return trace.Wrap(err) +} + +func (gitServerExecutor) deleteAll(ctx context.Context, cache *Cache) error { + return cache.gitServersCache.DeleteAllGitServers(ctx) +} + +func (gitServerExecutor) delete(ctx context.Context, cache *Cache, resource types.Resource) error { + return cache.gitServersCache.DeleteGitServer(ctx, resource.GetName()) +} + +func (gitServerExecutor) isSingleton() bool { return false } + +func (gitServerExecutor) getReader(cache *Cache, cacheOK bool) services.GitServerGetter { + if cacheOK { + return cache.gitServersCache + } + return cache.Config.GitServers +} + +var _ executor[types.Server, services.GitServerGetter] = gitServerExecutor{} diff --git a/lib/cache/git_server_test.go b/lib/cache/git_server_test.go new file mode 100644 index 0000000000000..35ce40941a53b --- /dev/null +++ b/lib/cache/git_server_test.go @@ -0,0 +1,65 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package cache + +import ( + "context" + "testing" + + "github.com/gravitational/trace" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/api/types" +) + +func TestGitServers(t *testing.T) { + t.Parallel() + + p, err := newPack(t.TempDir(), ForAuth) + require.NoError(t, err) + t.Cleanup(p.Close) + + testResources(t, p, testFuncs[types.Server]{ + newResource: func(name string) (types.Server, error) { + return types.NewGitHubServer( + types.GitHubServerMetadata{ + Integration: name, + Organization: name, + }) + }, + create: func(ctx context.Context, server types.Server) error { + _, err := p.gitServers.CreateGitServer(ctx, server) + return trace.Wrap(err) + }, + list: func(ctx context.Context) ([]types.Server, error) { + servers, _, err := p.gitServers.ListGitServers(ctx, 0, "") + return servers, trace.Wrap(err) + }, + update: func(ctx context.Context, server types.Server) error { + _, err := p.gitServers.UpdateGitServer(ctx, server) + return trace.Wrap(err) + }, + deleteAll: p.gitServers.DeleteAllGitServers, + cacheList: func(ctx context.Context) ([]types.Server, error) { + servers, _, err := p.cache.ListGitServers(ctx, 0, "") + return servers, trace.Wrap(err) + }, + cacheGet: p.cache.GetGitServer, + }) +} diff --git a/lib/cache/plugin_static_credentials.go b/lib/cache/plugin_static_credentials.go new file mode 100644 index 0000000000000..a756eb419ce35 --- /dev/null +++ b/lib/cache/plugin_static_credentials.go @@ -0,0 +1,84 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package cache + +import ( + "context" + + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/types" +) + +func (c *Cache) GetPluginStaticCredentials(ctx context.Context, name string) (types.PluginStaticCredentials, error) { + ctx, span := c.Tracer.Start(ctx, "cache/GetPluginStaticCredentials") + defer span.End() + + rg, err := readCollectionCache(c, c.collections.pluginStaticCredentials) + if err != nil { + return nil, trace.Wrap(err) + } + defer rg.Release() + return rg.reader.GetPluginStaticCredentials(ctx, name) +} + +func (c *Cache) GetPluginStaticCredentialsByLabels(ctx context.Context, labels map[string]string) ([]types.PluginStaticCredentials, error) { + ctx, span := c.Tracer.Start(ctx, "cache/GetPluginStaticCredentialsByLabels") + defer span.End() + + rg, err := readCollectionCache(c, c.collections.pluginStaticCredentials) + if err != nil { + return nil, trace.Wrap(err) + } + defer rg.Release() + return rg.reader.GetPluginStaticCredentialsByLabels(ctx, labels) +} + +type pluginStaticCredentialsGetter interface { + GetPluginStaticCredentials(ctx context.Context, name string) (types.PluginStaticCredentials, error) + GetPluginStaticCredentialsByLabels(ctx context.Context, labels map[string]string) ([]types.PluginStaticCredentials, error) +} + +var _ executor[types.PluginStaticCredentials, pluginStaticCredentialsGetter] = pluginStaticCredentialsExecutor{} + +type pluginStaticCredentialsExecutor struct{} + +func (pluginStaticCredentialsExecutor) getAll(ctx context.Context, cache *Cache, loadSecrets bool) ([]types.PluginStaticCredentials, error) { + return cache.PluginStaticCredentials.GetAllPluginStaticCredentials(ctx) +} + +func (pluginStaticCredentialsExecutor) upsert(ctx context.Context, cache *Cache, resource types.PluginStaticCredentials) error { + _, err := cache.pluginStaticCredentialsCache.UpsertPluginStaticCredentials(ctx, resource) + return trace.Wrap(err) +} + +func (pluginStaticCredentialsExecutor) deleteAll(ctx context.Context, cache *Cache) error { + return cache.pluginStaticCredentialsCache.DeleteAllPluginStaticCredentials(ctx) +} + +func (pluginStaticCredentialsExecutor) delete(ctx context.Context, cache *Cache, resource types.Resource) error { + return cache.pluginStaticCredentialsCache.DeletePluginStaticCredentials(ctx, resource.GetName()) +} + +func (pluginStaticCredentialsExecutor) isSingleton() bool { return false } + +func (pluginStaticCredentialsExecutor) getReader(cache *Cache, cacheOK bool) pluginStaticCredentialsGetter { + if cacheOK { + return cache.pluginStaticCredentialsCache + } + return cache.Config.PluginStaticCredentials +} diff --git a/lib/cache/plugin_static_credentials_test.go b/lib/cache/plugin_static_credentials_test.go new file mode 100644 index 0000000000000..c7b05119d092d --- /dev/null +++ b/lib/cache/plugin_static_credentials_test.go @@ -0,0 +1,104 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package cache + +import ( + "context" + "testing" + "time" + + "github.com/gravitational/trace" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/api/types" +) + +func TestPluginStaticCredentials(t *testing.T) { + t.Parallel() + + p, err := newPack(t.TempDir(), ForAuth) + require.NoError(t, err) + t.Cleanup(p.Close) + + makeLabels := func(name string) map[string]string { + return map[string]string{ + "resource-label": "label-for-" + name, + } + } + + cacheGets := []struct { + name string + fn func(context.Context, string) (types.PluginStaticCredentials, error) + }{ + { + name: "GetPluginStaticCredentials", + fn: p.cache.GetPluginStaticCredentials, + }, + { + name: "GetPluginStaticCredentialsByLabels", + fn: func(ctx context.Context, name string) (types.PluginStaticCredentials, error) { + creds, err := p.cache.GetPluginStaticCredentialsByLabels(ctx, makeLabels(name)) + if err != nil { + return nil, trace.Wrap(err) + } + if len(creds) != 1 { + return nil, trace.CompareFailed("expecting one creds for this test but got %v", len(creds)) + } + return creds[0], nil + }, + }, + } + + for _, cacheGet := range cacheGets { + t.Run(cacheGet.name, func(t *testing.T) { + // Empty backend before the test. + err := p.pluginStaticCredentials.DeleteAllPluginStaticCredentials(context.Background()) + require.NoError(t, err) + + testResources(t, p, testFuncs[types.PluginStaticCredentials]{ + newResource: func(name string) (types.PluginStaticCredentials, error) { + return types.NewPluginStaticCredentials( + types.Metadata{ + Name: name, + Labels: makeLabels(name), + }, + types.PluginStaticCredentialsSpecV1{ + Credentials: &types.PluginStaticCredentialsSpecV1_APIToken{ + APIToken: "some-token", + }, + }) + }, + create: p.pluginStaticCredentials.CreatePluginStaticCredentials, + list: p.pluginStaticCredentials.GetAllPluginStaticCredentials, + update: func(ctx context.Context, cred types.PluginStaticCredentials) error { + _, err := p.pluginStaticCredentials.UpdatePluginStaticCredentials(ctx, cred) + return err + }, + deleteAll: p.pluginStaticCredentials.DeleteAllPluginStaticCredentials, + cacheList: p.cache.pluginStaticCredentialsCache.GetAllPluginStaticCredentials, + cacheGet: cacheGet.fn, + changeResource: func(cred types.PluginStaticCredentials) { + // types.PluginStaticCredentials does not support Expires. Let's + // use labels. + labels := cred.GetStaticLabels() + labels["now"] = time.Now().String() + cred.SetStaticLabels(labels) + }, + }) + }) + } +} diff --git a/lib/client/ca_export.go b/lib/client/ca_export.go index d8f648819e4b8..6a1aefddb058d 100644 --- a/lib/client/ca_export.go +++ b/lib/client/ca_export.go @@ -22,12 +22,15 @@ import ( "context" "encoding/pem" "errors" + "fmt" + "log/slog" "strings" "time" "github.com/gravitational/trace" apidefaults "github.com/gravitational/teleport/api/defaults" + integrationpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" "github.com/gravitational/teleport/api/mfa" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/auth/authclient" @@ -49,6 +52,23 @@ type ExportAuthoritiesRequest struct { AuthType string ExportAuthorityFingerprint string UseCompatVersion bool + Integration string +} + +func (r *ExportAuthoritiesRequest) shouldExportIntegration(ctx context.Context) (bool, error) { + switch r.AuthType { + case "github": + if r.Integration == "" { + return false, trace.BadParameter("integration name must be provided for %q CAs", r.AuthType) + } + return true, nil + default: + if r.Integration != "" { + r.Integration = "" + slog.DebugContext(ctx, "Integration name is ignored for non-integration CAs") + } + return false, nil + } } // ExportAuthorities returns the list of authorities in OpenSSH compatible formats as a string. @@ -76,12 +96,22 @@ type ExportAuthoritiesRequest struct { // > @cert-authority *.cluster-a ssh-rsa AAA... type=host // URL encoding is used to pass the CA type and allowed logins into the comment field. func ExportAuthorities(ctx context.Context, client authclient.ClientI, req ExportAuthoritiesRequest) (string, error) { + if isIntegration, err := req.shouldExportIntegration(ctx); err != nil { + return "", trace.Wrap(err) + } else if isIntegration { + return exportAuthForIntegration(ctx, client, req) + } return exportAuth(ctx, client, req, false /* exportSecrets */) } // ExportAuthoritiesSecrets exports the Authority Certificate secrets (private keys). // See ExportAuthorities for more information. func ExportAuthoritiesSecrets(ctx context.Context, client authclient.ClientI, req ExportAuthoritiesRequest) (string, error) { + if isIntegration, err := req.shouldExportIntegration(ctx); err != nil { + return "", trace.Wrap(err) + } else if isIntegration { + return "", trace.NotImplemented("export with secrets is not supported for %q CAs", req.AuthType) + } return exportAuth(ctx, client, req, true /* exportSecrets */) } @@ -344,3 +374,49 @@ func hostCAFormat(ca types.CertAuthority, keyBytes []byte, client authclient.Cli }, }) } + +func exportAuthForIntegration(ctx context.Context, client authclient.ClientI, req ExportAuthoritiesRequest) (string, error) { + switch req.AuthType { + case "github": + keySet, err := fetchIntegrationCAKeySet(ctx, client, req.Integration) + if err != nil { + return "", trace.Wrap(err) + } + ret, err := exportGitHubCAs(keySet, req) + if err != nil { + return "", trace.Wrap(err) + } + return ret, nil + + default: + return "", trace.BadParameter("unknown integration CA type %q", req.AuthType) + } +} + +func fetchIntegrationCAKeySet(ctx context.Context, client authclient.ClientI, integration string) (*types.CAKeySet, error) { + resp, err := client.IntegrationsClient().ExportIntegrationCertAuthorities(ctx, &integrationpb.ExportIntegrationCertAuthoritiesRequest{ + Integration: integration, + }) + if err != nil { + return nil, trace.Wrap(err) + } + return resp.CertAuthorities, nil +} + +func exportGitHubCAs(keySet *types.CAKeySet, req ExportAuthoritiesRequest) (string, error) { + ret := strings.Builder{} + for _, key := range keySet.SSH { + if req.ExportAuthorityFingerprint != "" { + if fingerprint, err := sshutils.AuthorizedKeyFingerprint(key.PublicKey); err != nil { + return "", trace.Wrap(err) + } else if !sshutils.EqualFingerprints(req.ExportAuthorityFingerprint, fingerprint) { + continue + } + } + + // GitHub only needs the keys like "ssh-rsa xxx" so print them without + // cert-authority for easier copy-and-paste. + ret.WriteString(fmt.Sprintf("%s integration=%s\n", strings.TrimSpace(string(key.PublicKey)), req.Integration)) + } + return ret.String(), nil +} diff --git a/lib/client/ca_export_test.go b/lib/client/ca_export_test.go index 32082427ee523..cf7ff693716fe 100644 --- a/lib/client/ca_export_test.go +++ b/lib/client/ca_export_test.go @@ -26,18 +26,22 @@ import ( "testing" "github.com/stretchr/testify/require" + "google.golang.org/grpc" "github.com/gravitational/teleport/api/client/proto" + integrationpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" "github.com/gravitational/teleport/api/mfa" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/utils/keys" "github.com/gravitational/teleport/lib/auth" "github.com/gravitational/teleport/lib/auth/authclient" + "github.com/gravitational/teleport/lib/fixtures" ) type mockAuthClient struct { authclient.ClientI - server *auth.Server + server *auth.Server + integrationsClient mockIntegrationsClient } func (m *mockAuthClient) GetDomainName(ctx context.Context) (string, error) { @@ -57,6 +61,21 @@ func (m *mockAuthClient) PerformMFACeremony(ctx context.Context, challengeReques return nil, &mfa.ErrMFANotRequired } +func (m *mockAuthClient) IntegrationsClient() integrationpb.IntegrationServiceClient { + return &m.integrationsClient +} + +type mockIntegrationsClient struct { + integrationpb.IntegrationServiceClient + caKeySet *types.CAKeySet +} + +func (m *mockIntegrationsClient) ExportIntegrationCertAuthorities(ctx context.Context, in *integrationpb.ExportIntegrationCertAuthoritiesRequest, opts ...grpc.CallOption) (*integrationpb.ExportIntegrationCertAuthoritiesResponse, error) { + return &integrationpb.ExportIntegrationCertAuthoritiesResponse{ + CertAuthorities: m.caKeySet, + }, nil +} + func TestExportAuthorities(t *testing.T) { ctx := context.Background() const localClusterName = "localcluster" @@ -100,6 +119,10 @@ func TestExportAuthorities(t *testing.T) { require.NotNil(t, privKey, "x509.ParsePKCS8PrivateKey returned a nil key") } + validateGitHubCAFunc := func(t *testing.T, s string) { + require.Contains(t, s, fixtures.SSHCAPublicKey) + } + for _, exportSecrets := range []bool{false, true} { for _, tt := range []struct { name string @@ -247,10 +270,33 @@ func TestExportAuthorities(t *testing.T) { assertNoSecrets: validateTLSCertificateDERFunc, assertSecrets: validateRSAPrivateKeyDERFunc, }, + { + name: "github missing integration", + req: ExportAuthoritiesRequest{ + AuthType: "github", + }, + errorCheck: require.Error, + }, + { + name: "github", + req: ExportAuthoritiesRequest{ + AuthType: "github", + Integration: "my-github", + }, + errorCheck: require.NoError, + assertNoSecrets: validateGitHubCAFunc, + }, } { t.Run(fmt.Sprintf("%s_exportSecrets_%v", tt.name, exportSecrets), func(t *testing.T) { mockedClient := &mockAuthClient{ server: testAuth.AuthServer, + integrationsClient: mockIntegrationsClient{ + caKeySet: &types.CAKeySet{ + SSH: []*types.SSHKeyPair{{ + PublicKey: []byte(fixtures.SSHCAPublicKey), + }}, + }, + }, } var ( err error @@ -264,6 +310,10 @@ func TestExportAuthorities(t *testing.T) { checkFunc = tt.assertSecrets } + if checkFunc == nil { + t.Skip("assert func not provided") + } + exported, err = exportFunc(ctx, mockedClient, tt.req) tt.errorCheck(t, err) diff --git a/lib/client/client_store_test.go b/lib/client/client_store_test.go index 7405b1c705c7b..71239884aaaba 100644 --- a/lib/client/client_store_test.go +++ b/lib/client/client_store_test.go @@ -55,16 +55,19 @@ type testAuthority struct { keygen *testauthority.Keygen tlsCA *tlsca.CertAuthority trustedCerts authclient.TrustedCerts + clock clockwork.Clock } func newTestAuthority(t *testing.T) testAuthority { tlsCA, trustedCerts, err := newSelfSignedCA(CAPriv, "localhost") require.NoError(t, err) + clock := clockwork.NewFakeClock() return testAuthority{ - keygen: testauthority.New(), + keygen: testauthority.NewWithClock(clock), tlsCA: tlsCA, trustedCerts: trustedCerts, + clock: clock, } } @@ -85,7 +88,6 @@ func (s *testAuthority) makeSignedKeyRing(t *testing.T, idx KeyRingIndex, makeEx ttl = -ttl } - clock := clockwork.NewRealClock() identity := tlsca.Identity{ Username: idx.Username, Groups: []string{"groups"}, @@ -93,10 +95,10 @@ func (s *testAuthority) makeSignedKeyRing(t *testing.T, idx KeyRingIndex, makeEx subject, err := identity.Subject() require.NoError(t, err) tlsCert, err := s.tlsCA.GenerateCertificate(tlsca.CertificateRequest{ - Clock: clock, + Clock: s.clock, PublicKey: tlsKey.Public(), Subject: subject, - NotAfter: clock.Now().UTC().Add(ttl), + NotAfter: s.clock.Now().UTC().Add(ttl), }) require.NoError(t, err) @@ -112,6 +114,8 @@ func (s *testAuthority) makeSignedKeyRing(t *testing.T, idx KeyRingIndex, makeEx AllowedLogins: allowedLogins, PermitAgentForwarding: false, PermitPortForwarding: true, + GitHubUserID: "1234567", + GitHubUsername: "github-username", }, }) require.NoError(t, err) diff --git a/lib/client/github.go b/lib/client/github.go new file mode 100644 index 0000000000000..611892e702757 --- /dev/null +++ b/lib/client/github.go @@ -0,0 +1,106 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package client + +import ( + "context" + + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/client/sso" +) + +// ReissueWithGitHubOAuth starts a GitHub OAuth flow for an logged-in user. +// The flow does not use regular SSO connectors for logins. Instead, a temporary +// connector will be created from the GitHub integration associated with the Git +// server of the provided GitHub organization. +// TODO(greedy52) preserve access request IDs throughout this flow. +func (tc *TeleportClient) ReissueWithGitHubOAuth(ctx context.Context, githubOrg string) error { + keyRing, err := tc.localAgent.GetKeyRing(tc.SiteName, WithSSHCerts{}) + if err != nil { + return trace.Wrap(err) + } + + rdConfig, err := tc.ssoRedirectorConfig(ctx, "" /* display name is optional */) + if err != nil { + return trace.Wrap(err) + } + + rd, err := sso.NewRedirector(rdConfig) + if err != nil { + return trace.Wrap(err) + } + defer rd.Close() + + ssoCeremony := sso.NewCLICeremony(rd, tc.loggedInUserGitHubOAuthInitFunc(keyRing, githubOrg)) + resp, err := ssoCeremony.Run(ctx) + if err != nil { + return trace.Wrap(err) + } + + // Treat it as reissuing an SSH cert. + keyRing.ClusterName = tc.SiteName + keyRing.Cert = resp.Cert + return trace.Wrap(tc.localAgent.AddKeyRing(keyRing)) +} + +func (tc *TeleportClient) loggedInUserGitHubOAuthInitFunc(keyRing *KeyRing, org string) sso.CeremonyInit { + return func(ctx context.Context, clientCallbackURL string) (redirectURL string, err error) { + request, err := tc.makeGitHubAuthRequest(keyRing, clientCallbackURL) + if err != nil { + return "", trace.Wrap(err) + } + + clusterClient, err := tc.ConnectToCluster(ctx) + if err != nil { + return "", trace.Wrap(err) + } + defer clusterClient.Close() + + rootClient, err := clusterClient.ConnectToRootCluster(ctx) + if err != nil { + return "", trace.Wrap(err) + } + defer rootClient.Close() + + resp, err := rootClient.GitServerClient().CreateGitHubAuthRequest(ctx, request, org) + if err != nil { + return "", trace.Wrap(err) + } + return resp.RedirectURL, nil + } +} + +func (tc *TeleportClient) makeGitHubAuthRequest(keyRing *KeyRing, clientCallbackURL string) (*types.GithubAuthRequest, error) { + tlsPub, err := keyRing.TLSPrivateKey.MarshalTLSPublicKey() + if err != nil { + return nil, trace.Wrap(err) + } + + return &types.GithubAuthRequest{ + ClientRedirectURL: clientCallbackURL, + KubernetesCluster: tc.KubernetesCluster, + SshPublicKey: keyRing.SSHPrivateKey.MarshalSSHPublicKey(), + TlsPublicKey: tlsPub, + SshAttestationStatement: keyRing.SSHPrivateKey.GetAttestationStatement().ToProto(), + TlsAttestationStatement: keyRing.TLSPrivateKey.GetAttestationStatement().ToProto(), + Compatibility: tc.CertificateFormat, + }, nil +} diff --git a/lib/client/profile.go b/lib/client/profile.go index 5b06fe0e48dcc..985266ee3bc75 100644 --- a/lib/client/profile.go +++ b/lib/client/profile.go @@ -248,6 +248,17 @@ type ProfileStatus struct { // SSOHost is the host of the SSO provider used to log in. SSOHost string + + // GitHubIdentity is the GitHub identity attached to the user. + GitHubIdentity *GitHubIdentity +} + +// GitHubIdentity is the GitHub identity attached to the user. +type GitHubIdentity struct { + // UserID is the unique ID of the GitHub user. + UserID string + // Username is the GitHub username. + Username string } // profileOptions contains fields needed to initialize a profile beyond those @@ -319,7 +330,9 @@ func profileStatusFromKeyRing(keyRing *KeyRing, opts profileOptions) (*ProfileSt ext == teleport.CertExtensionTeleportTraits || ext == teleport.CertExtensionTeleportRouteToCluster || ext == teleport.CertExtensionTeleportActiveRequests || - ext == teleport.CertExtensionAllowedResources { + ext == teleport.CertExtensionAllowedResources || + ext == teleport.CertExtensionGitHubUserID || + ext == teleport.CertExtensionGitHubUsername { continue } extensions = append(extensions, ext) @@ -355,6 +368,14 @@ func profileStatusFromKeyRing(keyRing *KeyRing, opts profileOptions) (*ProfileSt } } + var gitHubIdentity *GitHubIdentity + if gitHubUserID := sshCert.Extensions[teleport.CertExtensionGitHubUserID]; gitHubUserID != "" { + gitHubIdentity = &GitHubIdentity{ + UserID: gitHubUserID, + Username: sshCert.Extensions[teleport.CertExtensionGitHubUsername], + } + } + return &ProfileStatus{ Name: opts.ProfileName, Dir: opts.ProfileDir, @@ -383,6 +404,7 @@ func profileStatusFromKeyRing(keyRing *KeyRing, opts profileOptions) (*ProfileSt AllowedResourceIDs: allowedResourceIDs, SAMLSingleLogoutEnabled: opts.SAMLSingleLogoutEnabled, SSOHost: opts.SSOHost, + GitHubIdentity: gitHubIdentity, }, nil } diff --git a/lib/client/profile_test.go b/lib/client/profile_test.go index fc042c0b7bf4c..19aceaa7ece8d 100644 --- a/lib/client/profile_test.go +++ b/lib/client/profile_test.go @@ -19,11 +19,13 @@ package client import ( + "net/url" "testing" "time" "github.com/stretchr/testify/require" + "github.com/gravitational/teleport" "github.com/gravitational/teleport/api/profile" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/wrappers" @@ -146,3 +148,49 @@ func TestProfileStatusAccessInfo(t *testing.T) { require.Equal(t, wantAccessInfo, profileStatus.AccessInfo()) } + +func Test_profileStatusFromKeyRing(t *testing.T) { + auth := newTestAuthority(t) + idx := KeyRingIndex{ + ProxyHost: "proxy.example.com", + ClusterName: "root", + Username: "test-user", + } + profile := &profile.Profile{ + WebProxyAddr: idx.ProxyHost + ":3080", + SiteName: idx.ClusterName, + Username: idx.Username, + } + keyRing := auth.makeSignedKeyRing(t, idx, false) + profileStatus, err := profileStatusFromKeyRing(keyRing, profileOptions{ + ProfileName: profile.Name(), + WebProxyAddr: profile.WebProxyAddr, + ProfileDir: "", + Username: profile.Username, + SiteName: profile.SiteName, + KubeProxyAddr: profile.KubeProxyAddr, + IsVirtual: true, + }) + require.NoError(t, err) + require.Equal(t, &ProfileStatus{ + Name: "proxy.example.com", + Cluster: "root", + ProxyURL: url.URL{ + Scheme: "https", + Host: "proxy.example.com:3080", + }, + Username: "test-user", + Logins: []string{"test-user", "root"}, + Extensions: []string{ + teleport.CertExtensionPermitPortForwarding, + teleport.CertExtensionPermitPTY, + }, + ValidUntil: time.Unix(auth.clock.Now().Add(20*time.Minute).Unix(), 0), + IsVirtual: true, + GitHubIdentity: &GitHubIdentity{ + UserID: "1234567", + Username: "github-username", + }, + CriticalOptions: map[string]string{}, + }, profileStatus) +} diff --git a/lib/cryptosuites/suites.go b/lib/cryptosuites/suites.go index 2449a589422ec..8a06d18998c2c 100644 --- a/lib/cryptosuites/suites.go +++ b/lib/cryptosuites/suites.go @@ -111,6 +111,13 @@ const ( // EC2InstanceConnect is a key used for the EC2 Instance Connect service. EC2InstanceConnect + // GitHubProxyCASSH represents the SSH key for GitHub proxy CAs. + GitHubProxyCASSH + + // GitClient represents a key used to forward Git commands to Git services + // like GitHub. + GitClient + // keyPurposeMax is 1 greater than the last valid key purpose, used to test that all values less than this // are valid for each suite. keyPurposeMax @@ -184,6 +191,8 @@ var ( ProxyKubeClient: RSA2048, // EC2InstanceConnect has always used Ed25519 by default. EC2InstanceConnect: Ed25519, + GitHubProxyCASSH: Ed25519, + GitClient: Ed25519, } // balancedV1 strikes a balance between security, compatibility, and @@ -214,6 +223,8 @@ var ( ProxyToDatabaseAgent: ECDSAP256, ProxyKubeClient: ECDSAP256, EC2InstanceConnect: Ed25519, + GitHubProxyCASSH: Ed25519, + GitClient: Ed25519, } // fipsv1 is an algorithm suite tailored for FIPS compliance. It is based on @@ -244,6 +255,8 @@ var ( ProxyToDatabaseAgent: ECDSAP256, ProxyKubeClient: ECDSAP256, EC2InstanceConnect: ECDSAP256, + GitHubProxyCASSH: ECDSAP256, + GitClient: ECDSAP256, } // hsmv1 in an algorithm suite tailored for clusters using an HSM or KMS @@ -276,6 +289,8 @@ var ( ProxyToDatabaseAgent: ECDSAP256, ProxyKubeClient: ECDSAP256, EC2InstanceConnect: Ed25519, + GitHubProxyCASSH: ECDSAP256, + GitClient: Ed25519, } allSuites = map[types.SignatureAlgorithmSuite]suite{ diff --git a/lib/events/api.go b/lib/events/api.go index a48514b71314f..c54bf49475e7b 100644 --- a/lib/events/api.go +++ b/lib/events/api.go @@ -855,6 +855,9 @@ const ( ContactCreateEvent = "contact.create" // ContactDeleteEvent is emitted when a Contact resource is deleted. ContactDeleteEvent = "contact.delete" + + // GitCommandEvent is emitted when a Git command is executed. + GitCommandEvent = "git.command" ) // Add an entry to eventsMap in lib/events/events_test.go when you add diff --git a/lib/events/codes.go b/lib/events/codes.go index 1be60d7fa39f4..b43ebc0384d3e 100644 --- a/lib/events/codes.go +++ b/lib/events/codes.go @@ -688,6 +688,11 @@ const ( // ContactDeleteCode is the auto update version delete event code. ContactDeleteCode = "TCTC002I" + // GitCommandCode is the git command event code + GitCommandCode = "TGIT001I" + // GitCommandFailureCode is the git command feature event code. + GitCommandFailureCode = "TGIT001E" + // UnknownCode is used when an event of unknown type is encountered. UnknownCode = apievents.UnknownCode ) diff --git a/lib/events/dynamic.go b/lib/events/dynamic.go index 1112a63892c28..a638abb99d25a 100644 --- a/lib/events/dynamic.go +++ b/lib/events/dynamic.go @@ -390,6 +390,8 @@ func FromEventFields(fields EventFields) (events.AuditEvent, error) { e = &events.AccessGraphSettingsUpdate{} case DatabaseSessionSpannerRPCEvent: e = &events.SpannerRPC{} + case GitCommandEvent: + e = &events.GitCommand{} case UnknownEvent: e = &events.Unknown{} diff --git a/lib/proxy/router.go b/lib/proxy/router.go index f54f9718af604..612067b7a8bc7 100644 --- a/lib/proxy/router.go +++ b/lib/proxy/router.go @@ -23,6 +23,7 @@ import ( "context" "errors" "fmt" + "math/rand/v2" "net" "os" "sync" @@ -286,7 +287,6 @@ func (r *Router) DialHost(ctx context.Context, clientSrcAddr, clientDstAddr net. } } } - } else { return nil, trace.ConnectionProblem(errors.New("connection problem"), "direct dialing to nodes not found in inventory is not supported") } @@ -386,6 +386,7 @@ func (r *Router) getRemoteCluster(ctx context.Context, clusterName string, check type site interface { GetNodes(ctx context.Context, fn func(n readonly.Server) bool) ([]types.Server, error) GetClusterNetworkingConfig(ctx context.Context) (types.ClusterNetworkingConfig, error) + GetGitServers(context.Context, func(readonly.Server) bool) ([]types.Server, error) } // remoteSite is a site implementation that wraps @@ -401,6 +402,17 @@ func (r remoteSite) GetNodes(ctx context.Context, fn func(n readonly.Server) boo return nil, trace.Wrap(err) } + servers, err := watcher.CurrentResourcesWithFilter(ctx, fn) + return servers, trace.Wrap(err) +} + +// GetGitServers uses the wrapped sites GitServerWatcher to filter git servers. +func (r remoteSite) GetGitServers(ctx context.Context, fn func(n readonly.Server) bool) ([]types.Server, error) { + watcher, err := r.site.GitServerWatcher() + if err != nil { + return nil, trace.Wrap(err) + } + return watcher.CurrentResourcesWithFilter(ctx, fn) } @@ -418,6 +430,9 @@ func (r remoteSite) GetClusterNetworkingConfig(ctx context.Context) (types.Clust // getServer attempts to locate a node matching the provided host and port in // the provided site. func getServer(ctx context.Context, host, port string, site site) (types.Server, error) { + if org, ok := types.GetGitHubOrgFromNodeAddr(host); ok { + return getGitHubServer(ctx, org, site) + } return getServerWithResolver(ctx, host, port, site, nil /* use default resolver */) } @@ -568,3 +583,25 @@ func (r *Router) GetSiteClient(ctx context.Context, clusterName string) (authcli } return site.GetClient() } + +func getGitHubServer(ctx context.Context, gitHubOrg string, site site) (types.Server, error) { + servers, err := site.GetGitServers(ctx, func(s readonly.Server) bool { + github := s.GetGitHub() + return github != nil && github.Organization == gitHubOrg + }) + if err != nil { + return nil, trace.Wrap(err) + } + + switch len(servers) { + case 0: + return nil, trace.NotFound("unable to locate Git server for GitHub organization %s", gitHubOrg) + case 1: + return servers[0], nil + default: + // It's unusual but possible to have multiple servers per organization + // (e.g. possibly a second Git server for a manual CA rotation). Pick a + // random one. + return servers[rand.N(len(servers))], nil + } +} diff --git a/lib/proxy/router_test.go b/lib/proxy/router_test.go index 660f9fd435762..a6d2b13bc2c00 100644 --- a/lib/proxy/router_test.go +++ b/lib/proxy/router_test.go @@ -27,6 +27,7 @@ import ( "github.com/google/uuid" "github.com/gravitational/trace" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "golang.org/x/crypto/ssh" @@ -43,8 +44,9 @@ import ( ) type testSite struct { - cfg types.ClusterNetworkingConfig - nodes []types.Server + cfg types.ClusterNetworkingConfig + nodes []types.Server + gitServers []types.Server } func (t testSite) GetClusterNetworkingConfig(ctx context.Context) (types.ClusterNetworkingConfig, error) { @@ -61,6 +63,16 @@ func (t testSite) GetNodes(ctx context.Context, fn func(n readonly.Server) bool) return out, nil } +func (t testSite) GetGitServers(ctx context.Context, fn func(n readonly.Server) bool) ([]types.Server, error) { + var out []types.Server + for _, s := range t.gitServers { + if fn(s) { + out = append(out, s) + } + } + + return out, nil +} type server struct { name string @@ -326,6 +338,26 @@ func TestGetServers(t *testing.T) { }, }) + servers = append(servers, + &types.ServerV2{ + Kind: types.KindNode, + SubKind: types.SubKindOpenSSHNode, + Version: types.V2, + Metadata: types.Metadata{ + Name: "agentless-node-1", + }, + Spec: types.ServerSpecV2{ + Addr: "1.2.3.4:22", + Hostname: "agentless-1", + }, + }, + ) + + gitServers := []types.Server{ + makeGitHubServer(t, "org1"), + makeGitHubServer(t, "org2"), + } + // ensure tests don't have order-dependence rand.Shuffle(len(servers), func(i, j int) { servers[i], servers[j] = servers[j], servers[i] @@ -462,6 +494,28 @@ func TestGetServers(t *testing.T) { require.Empty(t, srv) }, }, + { + name: "git server", + site: testSite{cfg: &unambiguousCfg, gitServers: gitServers}, + host: "org2.teleport-github-org", + errAssertion: require.NoError, + serverAssertion: func(t *testing.T, srv types.Server) { + require.NotNil(t, srv) + require.NotNil(t, srv.GetGitHub()) + assert.Equal(t, "org2", srv.GetGitHub().Organization) + }, + }, + { + name: "git server not found", + site: testSite{cfg: &unambiguousCfg, gitServers: gitServers}, + host: "org-not-found.teleport-github-org", + errAssertion: func(t require.TestingT, err error, i ...interface{}) { + require.True(t, trace.IsNotFound(err), i...) + }, + serverAssertion: func(t *testing.T, srv types.Server) { + require.Nil(t, srv) + }, + }, } ctx := context.Background() @@ -874,3 +928,13 @@ func TestRouter_DialSite(t *testing.T) { }) } } + +func makeGitHubServer(t *testing.T, org string) types.Server { + t.Helper() + server, err := types.NewGitHubServer(types.GitHubServerMetadata{ + Integration: org, + Organization: org, + }) + require.NoError(t, err) + return server +} diff --git a/lib/reversetunnel/localsite.go b/lib/reversetunnel/localsite.go index 7c89ea25273b0..2fcb10de5a82e 100644 --- a/lib/reversetunnel/localsite.go +++ b/lib/reversetunnel/localsite.go @@ -21,6 +21,7 @@ package reversetunnel import ( "context" "fmt" + "log/slog" "net" "slices" "sync" @@ -46,6 +47,7 @@ import ( "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/services/readonly" "github.com/gravitational/teleport/lib/srv/forward" + "github.com/gravitational/teleport/lib/srv/git" "github.com/gravitational/teleport/lib/teleagent" "github.com/gravitational/teleport/lib/utils" proxyutils "github.com/gravitational/teleport/lib/utils/proxy" @@ -108,6 +110,10 @@ func newLocalSite(srv *server, domainName string, authServers []string, opts ... "cluster": domainName, }, }), + logger: slog.With( + teleport.ComponentKey, teleport.ComponentReverseTunnelServer, + "cluster", domainName, + ), offlineThreshold: srv.offlineThreshold, peerClient: srv.PeerClient, periodicFunctionInterval: periodicFunctionInterval, @@ -130,6 +136,7 @@ func newLocalSite(srv *server, domainName string, authServers []string, opts ... // it implements RemoteSite interface type localSite struct { log log.FieldLogger + logger *slog.Logger domainName string authServers []string srv *server @@ -185,6 +192,11 @@ func (s *localSite) NodeWatcher() (*services.GenericWatcher[types.Server, readon return s.srv.NodeWatcher, nil } +// GitServerWatcher returns a Git server watcher for this cluster. +func (s *localSite) GitServerWatcher() (*services.GenericWatcher[types.Server, readonly.Server], error) { + return s.srv.GitServerWatcher, nil +} + // GetClient returns a client to the full Auth Server API. func (s *localSite) GetClient() (authclient.ClientI, error) { return s.client, nil @@ -249,6 +261,10 @@ func shouldDialAndForward(params reversetunnelclient.DialParams, recConfig types } func (s *localSite) Dial(params reversetunnelclient.DialParams) (net.Conn, error) { + if params.TargetServer != nil && params.TargetServer.GetKind() == types.KindGitServer { + return s.dialAndForwardGit(params) + } + recConfig, err := s.accessPoint.GetSessionRecordingConfig(s.srv.Context) if err != nil { return nil, trace.Wrap(err) @@ -260,7 +276,6 @@ func (s *localSite) Dial(params reversetunnelclient.DialParams) (net.Conn, error if shouldDialAndForward(params, recConfig) { return s.dialAndForward(params) } - // Attempt to perform a direct TCP dial. return s.DialTCP(params) } @@ -345,6 +360,51 @@ func (s *localSite) adviseReconnect(ctx context.Context) { } } +func (s *localSite) dialAndForwardGit(params reversetunnelclient.DialParams) (_ net.Conn, retErr error) { + s.logger.DebugContext(s.srv.ctx, "Dialing and forwarding git", "from", params.From, "to", params.To) + + dialStart := s.srv.Clock.Now() + targetConn, err := s.dialDirect(params) + if err != nil { + return nil, trace.ConnectionProblem(err, "failed to connect to git server") + } + + // Get a host certificate for the forwarding node from the cache. + hostCertificate, err := s.certificateCache.getHostCertificate(context.TODO(), params.Address, params.Principals) + if err != nil { + return nil, trace.Wrap(err) + } + + // Create a forwarding server that serves a single SSH connection on it. This + // server does not need to close, it will close and release all resources + // once conn is closed. + serverConfig := &git.ForwardServerConfig{ + AuthClient: s.client, + AccessPoint: s.accessPoint, + TargetConn: newMetricConn(targetConn, dialTypeDirect, dialStart, s.srv.Clock), + SrcAddr: params.From, + DstAddr: params.To, + HostCertificate: hostCertificate, + Ciphers: s.srv.Config.Ciphers, + KEXAlgorithms: s.srv.Config.KEXAlgorithms, + MACAlgorithms: s.srv.Config.MACAlgorithms, + Emitter: s.srv.Config.Emitter, + ParentContext: s.srv.Context, + LockWatcher: s.srv.LockWatcher, + HostUUID: s.srv.ID, + TargetServer: params.TargetServer, + Clock: s.clock, + } + remoteServer, err := git.NewForwardServer(serverConfig) + if err != nil { + s.logger.ErrorContext(s.srv.ctx, "Failed to create git forward server", "error", err) + return nil, trace.Wrap(err) + } + go remoteServer.Serve() + + return remoteServer.Dial() +} + func (s *localSite) dialAndForward(params reversetunnelclient.DialParams) (_ net.Conn, retErr error) { if params.GetUserAgent == nil && !params.IsAgentlessNode { return nil, trace.BadParameter("agentless node require an agent getter") @@ -448,6 +508,18 @@ func (s *localSite) dialTunnel(dreq *sshutils.DialReq) (net.Conn, error) { return conn, nil } +func (s *localSite) dialDirect(params reversetunnelclient.DialParams) (net.Conn, error) { + dialer := proxyutils.DialerFromEnvironment(params.To.String()) + + dialTimeout := apidefaults.DefaultIOTimeout + if cnc, err := s.accessPoint.GetClusterNetworkingConfig(s.srv.Context); err != nil { + s.logger.WarnContext(s.srv.ctx, "Failed to get cluster networking config - using default dial timeout", "error", err) + } else { + dialTimeout = cnc.GetSSHDialTimeout() + } + return dialer.DialTimeout(s.srv.Context, params.To.Network(), params.To.String(), dialTimeout) +} + // tryProxyPeering determines whether the node should try to be reached over // a peer proxy. func (s *localSite) tryProxyPeering(params reversetunnelclient.DialParams) bool { @@ -641,16 +713,7 @@ func (s *localSite) getConn(params reversetunnelclient.DialParams) (conn net.Con } // If no tunnel connection was found, dial to the target host. - dialer := proxyutils.DialerFromEnvironment(params.To.String()) - - dialTimeout := apidefaults.DefaultIOTimeout - if cnc, err := s.accessPoint.GetClusterNetworkingConfig(s.srv.Context); err != nil { - s.log.WithError(err).Warn("Failed to get cluster networking config - using default dial timeout") - } else { - dialTimeout = cnc.GetSSHDialTimeout() - } - - conn, directErr = dialer.DialTimeout(s.srv.Context, params.To.Network(), params.To.String(), dialTimeout) + conn, directErr = s.dialDirect(params) if directErr != nil { directMsg := getTunnelErrorMessage(params, "direct dial", directErr) s.log.WithField("address", params.To.String()).Debugf("All attempted dial methods failed. tunnel=%q, peer=%q, direct=%q", tunnelErr, peerErr, directErr) diff --git a/lib/reversetunnel/peer.go b/lib/reversetunnel/peer.go index 570be5edf4bbe..359a4fed12e9b 100644 --- a/lib/reversetunnel/peer.go +++ b/lib/reversetunnel/peer.go @@ -99,6 +99,14 @@ func (p *clusterPeers) NodeWatcher() (*services.GenericWatcher[types.Server, rea return peer.NodeWatcher() } +func (p *clusterPeers) GitServerWatcher() (*services.GenericWatcher[types.Server, readonly.Server], error) { + peer, err := p.pickPeer() + if err != nil { + return nil, trace.Wrap(err) + } + return peer.GitServerWatcher() +} + func (p *clusterPeers) GetClient() (authclient.ClientI, error) { peer, err := p.pickPeer() if err != nil { @@ -207,6 +215,10 @@ func (s *clusterPeer) NodeWatcher() (*services.GenericWatcher[types.Server, read return nil, trace.ConnectionProblem(nil, "unable to fetch node watcher, this proxy %v has not been discovered yet, try again later", s) } +func (s *clusterPeer) GitServerWatcher() (*services.GenericWatcher[types.Server, readonly.Server], error) { + return nil, trace.ConnectionProblem(nil, "unable to fetch git server watcher, this proxy %v has not been discovered yet, try again later", s) +} + func (s *clusterPeer) GetClient() (authclient.ClientI, error) { return nil, trace.ConnectionProblem(nil, "unable to fetch client, this proxy %v has not been discovered yet, try again later", s) } diff --git a/lib/reversetunnel/remotesite.go b/lib/reversetunnel/remotesite.go index f9617f33b87d5..121bf65856b8e 100644 --- a/lib/reversetunnel/remotesite.go +++ b/lib/reversetunnel/remotesite.go @@ -169,6 +169,11 @@ func (s *remoteSite) NodeWatcher() (*services.GenericWatcher[types.Server, reado return s.nodeWatcher, nil } +// GitServerWatcher returns the Git server watcher for the remote cluster. +func (s *remoteSite) GitServerWatcher() (*services.GenericWatcher[types.Server, readonly.Server], error) { + return nil, trace.NotImplemented("GitServerWatcher not implemented for remoteSite") +} + func (s *remoteSite) GetClient() (authclient.ClientI, error) { return s.remoteClient, nil } diff --git a/lib/reversetunnel/srv.go b/lib/reversetunnel/srv.go index cd36109a0b72f..2f2ee9b48f3ee 100644 --- a/lib/reversetunnel/srv.go +++ b/lib/reversetunnel/srv.go @@ -204,6 +204,9 @@ type Config struct { // NodeWatcher is a node watcher. NodeWatcher *services.GenericWatcher[types.Server, readonly.Server] + // GitServerWatcher is a Git server watcher. + GitServerWatcher *services.GenericWatcher[types.Server, readonly.Server] + // CertAuthorityWatcher is a cert authority watcher. CertAuthorityWatcher *services.CertAuthorityWatcher @@ -273,6 +276,9 @@ func (cfg *Config) CheckAndSetDefaults() error { if cfg.NodeWatcher == nil { return trace.BadParameter("missing parameter NodeWatcher") } + if cfg.GitServerWatcher == nil { + return trace.BadParameter("missing parameter GitServerWatcher") + } if cfg.CertAuthorityWatcher == nil { return trace.BadParameter("missing parameter CertAuthorityWatcher") } @@ -1273,7 +1279,6 @@ func newRemoteSite(srv *server, domainName string, sconn ssh.Conn) (*remoteSite, } go remoteSite.updateLocks(lockRetry) - return remoteSite, nil } diff --git a/lib/reversetunnelclient/api.go b/lib/reversetunnelclient/api.go index e044bf4beb012..1be0980c03e2d 100644 --- a/lib/reversetunnelclient/api.go +++ b/lib/reversetunnelclient/api.go @@ -125,6 +125,8 @@ type RemoteSite interface { CachingAccessPoint() (authclient.RemoteProxyAccessPoint, error) // NodeWatcher returns the node watcher that maintains the node set for the site NodeWatcher() (*services.GenericWatcher[types.Server, readonly.Server], error) + // GitServerWatcher returns the Git server watcher for the site + GitServerWatcher() (*services.GenericWatcher[types.Server, readonly.Server], error) // GetTunnelsCount returns the amount of active inbound tunnels // from the remote cluster GetTunnelsCount() int diff --git a/lib/service/service.go b/lib/service/service.go index 5d15bc10981b0..30b12f9449103 100644 --- a/lib/service/service.go +++ b/lib/service/service.go @@ -2584,6 +2584,8 @@ func (process *TeleportProcess) newAccessCacheForServices(cfg accesspoint.Config cfg.AutoUpdateService = services.AutoUpdateService cfg.ProvisioningStates = services.ProvisioningStates cfg.IdentityCenter = services.IdentityCenter + cfg.PluginStaticCredentials = services.PluginStaticCredentials + cfg.GitServers = services.GitServers return accesspoint.NewCache(cfg) } @@ -2630,6 +2632,7 @@ func (process *TeleportProcess) newAccessCacheForClient(cfg accesspoint.Config, cfg.WindowsDesktops = client cfg.DynamicWindowsDesktops = client.DynamicDesktopClient() cfg.AutoUpdateService = client + cfg.GitServers = client.GitServerClient() return accesspoint.NewCache(cfg) } @@ -4334,6 +4337,19 @@ func (process *TeleportProcess) initProxyEndpoint(conn *Connector) error { return trace.Wrap(err) } + gitServerWatcher, err := services.NewGitServerWatcher(process.ExitContext(), services.GitServerWatcherConfig{ + ResourceWatcherConfig: services.ResourceWatcherConfig{ + Component: teleport.ComponentProxy, + Logger: process.logger.With(teleport.ComponentKey, teleport.ComponentProxy), + Client: accessPoint, + MaxStaleness: time.Minute, + }, + GitServerGetter: accessPoint.GitServerReadOnlyClient(), + }) + if err != nil { + return trace.Wrap(err) + } + caWatcher, err := services.NewCertAuthorityWatcher(process.ExitContext(), services.CertAuthorityWatcherConfig{ ResourceWatcherConfig: services.ResourceWatcherConfig{ Component: teleport.ComponentProxy, @@ -4448,6 +4464,7 @@ func (process *TeleportProcess) initProxyEndpoint(conn *Connector) error { LockWatcher: lockWatcher, PeerClient: peerClient, NodeWatcher: nodeWatcher, + GitServerWatcher: gitServerWatcher, CertAuthorityWatcher: caWatcher, CircuitBreakerConfig: process.Config.CircuitBreakerConfig, LocalAuthAddresses: utils.NetAddrsToStrings(process.Config.AuthServerAddresses()), diff --git a/lib/services/access_checker.go b/lib/services/access_checker.go index 2c7317b42d98d..1d3639bc742c8 100644 --- a/lib/services/access_checker.go +++ b/lib/services/access_checker.go @@ -1364,6 +1364,9 @@ type UserState interface { // IsBot returns true if the user belongs to a bot. IsBot() bool + + // GetGithubIdentities returns a list of connected GitHub identities + GetGithubIdentities() []types.ExternalIdentity } // AccessInfoFromUser return a new AccessInfo populated from the roles and diff --git a/lib/services/git_server.go b/lib/services/git_server.go new file mode 100644 index 0000000000000..aa23dae56ee5d --- /dev/null +++ b/lib/services/git_server.go @@ -0,0 +1,55 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package services + +import ( + "context" + + "github.com/gravitational/teleport/api/client/gitserver" + "github.com/gravitational/teleport/api/types" +) + +// GitServerGetter defines interface for fetching git servers. +type GitServerGetter gitserver.ReadOnlyClient + +// GitServers defines an interface for managing git servers. +type GitServers interface { + GitServerGetter + + // CreateGitServer creates a Git server resource. + CreateGitServer(ctx context.Context, item types.Server) (types.Server, error) + // UpdateGitServer updates a Git server resource. + UpdateGitServer(ctx context.Context, item types.Server) (types.Server, error) + // UpsertGitServer updates a Git server resource, creating it if it doesn't exist. + UpsertGitServer(ctx context.Context, item types.Server) (types.Server, error) + // DeleteGitServer removes the specified Git server resource. + DeleteGitServer(ctx context.Context, name string) error + // DeleteAllGitServers removes all Git server resources. + DeleteAllGitServers(ctx context.Context) error +} + +// MarshalGitServer marshals the Git Server resource to JSON. +func MarshalGitServer(server types.Server, opts ...MarshalOption) ([]byte, error) { + return MarshalServer(server, opts...) +} + +// UnmarshalGitServer unmarshals the Git Server resource from JSON. +func UnmarshalGitServer(bytes []byte, opts ...MarshalOption) (types.Server, error) { + return UnmarshalServer(bytes, types.KindGitServer, opts...) +} diff --git a/lib/services/local/events.go b/lib/services/local/events.go index ebf5613d81159..46c08cd07365e 100644 --- a/lib/services/local/events.go +++ b/lib/services/local/events.go @@ -250,6 +250,10 @@ func (e *EventsService) NewWatcher(ctx context.Context, watch types.Watch) (type parser = newIdentityCenterAccountAssignmentParser() case types.KindWorkloadIdentity: parser = newWorkloadIdentityParser() + case types.KindPluginStaticCredentials: + parser = newPluginStaticCredentialsParser() + case types.KindGitServer: + parser = newGitServerParser() default: if watch.AllowPartialSuccess { continue diff --git a/lib/services/local/git_server.go b/lib/services/local/git_server.go new file mode 100644 index 0000000000000..857bc19447ab3 --- /dev/null +++ b/lib/services/local/git_server.go @@ -0,0 +1,172 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package local + +import ( + "context" + + "github.com/gravitational/trace" + + apidefaults "github.com/gravitational/teleport/api/defaults" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/backend" + "github.com/gravitational/teleport/lib/defaults" + "github.com/gravitational/teleport/lib/services" + "github.com/gravitational/teleport/lib/services/local/generic" +) + +const gitServerPrefix = "git_server" + +// GitServerService is the local implementation of GitSerever service that is +// using local backend. +type GitServerService struct { + service *generic.Service[types.Server] +} + +func validateKind(server types.Server) error { + if server.GetKind() != types.KindGitServer { + return trace.CompareFailed("expecting kind git_server but got %v", server.GetKind()) + } + return nil +} + +// NewGitServerService returns new instance of GitServerService +func NewGitServerService(b backend.Backend) (*GitServerService, error) { + service, err := generic.NewService(&generic.ServiceConfig[types.Server]{ + Backend: b, + ResourceKind: types.KindGitServer, + PageLimit: defaults.MaxIterationLimit, + BackendPrefix: backend.NewKey(gitServerPrefix), + MarshalFunc: services.MarshalGitServer, + UnmarshalFunc: services.UnmarshalGitServer, + ValidateFunc: validateKind, + }) + if err != nil { + return nil, trace.Wrap(err) + } + return &GitServerService{ + service: service, + }, nil +} + +// GetGitServer returns Git servers by name. +func (s *GitServerService) GetGitServer(ctx context.Context, name string) (types.Server, error) { + item, err := s.service.GetResource(ctx, name) + if err != nil { + return nil, trace.Wrap(err) + } + return item, nil +} + +// CreateGitServer creates a Git server resource. +func (s *GitServerService) CreateGitServer(ctx context.Context, item types.Server) (types.Server, error) { + created, err := s.service.CreateResource(ctx, item) + if err != nil { + return nil, trace.Wrap(err) + } + return created, nil +} + +// UpdateGitServer updates a Git server resource. +func (s *GitServerService) UpdateGitServer(ctx context.Context, item types.Server) (types.Server, error) { + // ConditionalUpdateResource can return invalid revision instead of not found, so we'll check if resource exists first + if _, err := s.service.GetResource(ctx, item.GetName()); trace.IsNotFound(err) { + return nil, err + } + updated, err := s.service.ConditionalUpdateResource(ctx, item) + if err != nil { + return nil, trace.Wrap(err) + } + return updated, nil +} + +// UpsertGitServer updates a Git server resource, creating it if it doesn't exist. +func (s *GitServerService) UpsertGitServer(ctx context.Context, item types.Server) (types.Server, error) { + upserted, err := s.service.UpsertResource(ctx, item) + if err != nil { + return nil, trace.Wrap(err) + } + return upserted, nil +} + +// DeleteGitServer removes the specified Git server resource. +func (s *GitServerService) DeleteGitServer(ctx context.Context, name string) error { + if err := s.service.DeleteResource(ctx, name); err != nil { + return trace.Wrap(err) + } + return nil +} + +// DeleteAllGitServers removes all Git server resources. +func (s *GitServerService) DeleteAllGitServers(ctx context.Context) error { + if err := s.service.DeleteAllResources(ctx); err != nil { + return trace.Wrap(err) + } + return nil +} + +// ListGitServers returns all Git servers matching filter. +func (s *GitServerService) ListGitServers(ctx context.Context, pageSize int, pageToken string) ([]types.Server, string, error) { + items, next, err := s.service.ListResources(ctx, pageSize, pageToken) + if err != nil { + return nil, "", trace.Wrap(err) + } + return items, next, nil +} + +func newGitServerParser() *gitServerParser { + return &gitServerParser{ + baseParser: newBaseParser(backend.NewKey(gitServerPrefix)), + } +} + +type gitServerParser struct { + baseParser +} + +func (p *gitServerParser) parse(event backend.Event) (types.Resource, error) { + switch event.Type { + case types.OpDelete: + components := event.Item.Key.Components() + if len(components) < 2 { + return nil, trace.NotFound("failed parsing %s", event.Item.Key) + } + + return &types.ResourceHeader{ + Kind: types.KindGitServer, + Version: types.V2, + Metadata: types.Metadata{ + Name: components[1], + Namespace: apidefaults.Namespace, + }, + }, nil + case types.OpPut: + resource, err := services.UnmarshalServer(event.Item.Value, + types.KindGitServer, + services.WithExpires(event.Item.Expires), + services.WithRevision(event.Item.Revision), + ) + if err != nil { + return nil, trace.Wrap(err) + } + return resource, nil + default: + return nil, trace.BadParameter("event %v is not supported", event.Type) + } +} diff --git a/lib/services/local/git_server_test.go b/lib/services/local/git_server_test.go new file mode 100644 index 0000000000000..15232dd9272ac --- /dev/null +++ b/lib/services/local/git_server_test.go @@ -0,0 +1,150 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package local + +import ( + "context" + "sort" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/gravitational/trace" + "github.com/jonboulle/clockwork" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/backend/memory" + "github.com/gravitational/teleport/lib/services" +) + +func mustMakeGitHubServer(t *testing.T, org string) types.Server { + t.Helper() + server, err := types.NewGitHubServer(types.GitHubServerMetadata{ + Organization: org, + Integration: org, + }) + require.NoError(t, err) + return server +} + +func compareGitServers(t *testing.T, listA, listB []types.Server) { + t.Helper() + sortedListA := services.SortedServers(listA) + sortedListB := services.SortedServers(listB) + sort.Sort(sortedListA) + sort.Sort(sortedListB) + + require.Empty(t, cmp.Diff(sortedListA, sortedListB, + cmpopts.IgnoreFields(types.Metadata{}, "Revision"), + )) +} + +func TestGitServerCRUD(t *testing.T) { + ctx := context.Background() + clock := clockwork.NewFakeClock() + + backend, err := memory.New(memory.Config{ + Context: ctx, + Clock: clock, + }) + require.NoError(t, err) + + server1 := mustMakeGitHubServer(t, "org1") + server2 := mustMakeGitHubServer(t, "org2") + service, err := NewGitServerService(backend) + require.NoError(t, err) + + t.Run("nothing yet", func(t *testing.T) { + out, _, err := service.ListGitServers(ctx, 10, "") + require.NoError(t, err) + require.Empty(t, out) + }) + + t.Run("invalid server", func(t *testing.T) { + node, err := types.NewServerWithLabels("node1", types.KindNode, types.ServerSpecV2{}, nil) + require.NoError(t, err) + _, err = service.CreateGitServer(ctx, node) + require.Error(t, err) + }) + + t.Run("create", func(t *testing.T) { + _, err = service.CreateGitServer(ctx, server1) + require.NoError(t, err) + _, err = service.CreateGitServer(ctx, server2) + require.NoError(t, err) + }) + + t.Run("list", func(t *testing.T) { + out, _, err := service.ListGitServers(ctx, 10, "") + require.NoError(t, err) + compareGitServers(t, []types.Server{server1, server2}, out) + }) + + t.Run("list with token", func(t *testing.T) { + out, token, err := service.ListGitServers(ctx, 1, "") + require.NoError(t, err) + require.NotEmpty(t, token) + require.Len(t, out, 1) + out2, token, err := service.ListGitServers(ctx, 1, token) + require.NoError(t, err) + require.Empty(t, token) + require.Len(t, out2, 1) + compareGitServers(t, []types.Server{server1, server2}, append(out, out2...)) + }) + + t.Run("get and update", func(t *testing.T) { + out, err := service.GetGitServer(ctx, server1.GetName()) + require.NoError(t, err) + require.Empty(t, cmp.Diff(server1, out, + cmpopts.IgnoreFields(types.Metadata{}, "Revision"), + )) + + out.GetGitHub().Integration = "updated" + out, err = service.UpdateGitServer(ctx, out) + require.NoError(t, err) + require.Equal(t, "updated", out.GetGitHub().Integration) + }) + + t.Run("delete not found", func(t *testing.T) { + err := service.DeleteGitServer(ctx, "doesnotexist") + require.IsType(t, trace.NotFound(""), err) + }) + + t.Run("delete", func(t *testing.T) { + require.NoError(t, service.DeleteGitServer(ctx, server1.GetName())) + }) + + t.Run("upsert", func(t *testing.T) { + server3 := mustMakeGitHubServer(t, "org3") + _, err := service.UpsertGitServer(ctx, server3) + require.NoError(t, err) + + out, _, err := service.ListGitServers(ctx, 10, "") + require.NoError(t, err) + compareGitServers(t, []types.Server{server2, server3}, out) + }) + + t.Run("delete all", func(t *testing.T) { + require.NoError(t, service.DeleteAllGitServers(ctx)) + out, _, err := service.ListGitServers(ctx, 10, "") + require.NoError(t, err) + require.Empty(t, out) + }) +} diff --git a/lib/services/local/plugin_static_credentials.go b/lib/services/local/plugin_static_credentials.go index 47fdac4db13ca..409612a0f17bf 100644 --- a/lib/services/local/plugin_static_credentials.go +++ b/lib/services/local/plugin_static_credentials.go @@ -23,6 +23,7 @@ import ( "github.com/gravitational/trace" + apidefaults "github.com/gravitational/teleport/api/defaults" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/backend" "github.com/gravitational/teleport/lib/services" @@ -94,4 +95,62 @@ func (p *PluginStaticCredentialsService) DeletePluginStaticCredentials(ctx conte return trace.Wrap(p.svc.DeleteResource(ctx, name)) } +// GetAllPluginStaticCredentials will get all plugin static credentials. Cache +// use only. +func (p *PluginStaticCredentialsService) GetAllPluginStaticCredentials(ctx context.Context) ([]types.PluginStaticCredentials, error) { + creds, err := p.svc.GetResources(ctx) + return creds, trace.Wrap(err) +} + +// DeleteAllPluginStaticCredentials will remove all plugin static credentials. +// Cache use only. +func (p *PluginStaticCredentialsService) DeleteAllPluginStaticCredentials(ctx context.Context) error { + return trace.Wrap(p.svc.DeleteAllResources(ctx)) +} + +// UpsertPluginStaticCredentials will upsert a plugin static credentials. Cache +// use only. +func (p *PluginStaticCredentialsService) UpsertPluginStaticCredentials(ctx context.Context, item types.PluginStaticCredentials) (types.PluginStaticCredentials, error) { + cred, err := p.svc.UpsertResource(ctx, item) + return cred, trace.Wrap(err) +} + var _ services.PluginStaticCredentials = (*PluginStaticCredentialsService)(nil) + +type pluginStaticCredentialsParser struct { + baseParser +} + +func newPluginStaticCredentialsParser() *pluginStaticCredentialsParser { + return &pluginStaticCredentialsParser{ + baseParser: newBaseParser(backend.NewKey(pluginStaticCredentialsPrefix)), + } +} + +func (p *pluginStaticCredentialsParser) parse(event backend.Event) (types.Resource, error) { + switch event.Type { + case types.OpDelete: + parts := event.Item.Key.Components() + if len(parts) != 2 { + return nil, trace.BadParameter("malformed key for %s event: %s", types.KindPluginStaticCredentials, event.Item.Key) + } + + return &types.ResourceHeader{ + Kind: types.KindPluginStaticCredentials, + Version: types.V1, + Metadata: types.Metadata{ + Name: parts[1], + Namespace: apidefaults.Namespace, + Description: parts[0], + }, + }, nil + + case types.OpPut: + return services.UnmarshalPluginStaticCredentials( + event.Item.Value, + services.WithExpires(event.Item.Expires), + services.WithRevision(event.Item.Revision)) + default: + return nil, trace.BadParameter("event %v is not supported", event.Type) + } +} diff --git a/lib/services/local/plugin_static_credentials_test.go b/lib/services/local/plugin_static_credentials_test.go index 389332eb347f1..9f0c9887ab633 100644 --- a/lib/services/local/plugin_static_credentials_test.go +++ b/lib/services/local/plugin_static_credentials_test.go @@ -88,6 +88,11 @@ func TestPluginStaticCredentialsCRUD(t *testing.T) { cmpopts.IgnoreFields(types.Metadata{}, "Revision"), )) + // Fetch all. + all, err := service.GetAllPluginStaticCredentials(ctx) + require.NoError(t, err) + require.Len(t, all, 2) + // Try to fetch a static credential that doesn't exist. _, err = service.GetPluginStaticCredentials(ctx, "doesnotexist") require.True(t, trace.IsNotFound(err)) @@ -132,4 +137,17 @@ func TestPluginStaticCredentialsCRUD(t *testing.T) { // Try to delete a static credential that doesn't exist. err = service.DeletePluginStaticCredentials(ctx, "doesnotexist") require.True(t, trace.IsNotFound(err)) + + // Upsert. + _, err = service.UpsertPluginStaticCredentials(ctx, cred1) + require.NoError(t, err) + _, err = service.GetPluginStaticCredentials(ctx, cred1.GetName()) + require.NoError(t, err) + + // Delete all. + err = service.DeleteAllPluginStaticCredentials(ctx) + require.NoError(t, err) + all, err = service.GetAllPluginStaticCredentials(ctx) + require.NoError(t, err) + require.Empty(t, all) } diff --git a/lib/services/matchers.go b/lib/services/matchers.go index b0724b0f1c8ff..2deb3e9bb7479 100644 --- a/lib/services/matchers.go +++ b/lib/services/matchers.go @@ -158,6 +158,7 @@ func MatchResourceByFilters(resource types.ResourceWithLabels, filter MatchResou types.KindKubernetesCluster, types.KindWindowsDesktop, types.KindWindowsDesktopService, types.KindUserGroup, + types.KindGitServer, types.KindIdentityCenterAccount, types.KindIdentityCenterAccountAssignment: specResource = resource diff --git a/lib/services/plugin_static_credentials.go b/lib/services/plugin_static_credentials.go index cdb32551ef857..7759df5f933c6 100644 --- a/lib/services/plugin_static_credentials.go +++ b/lib/services/plugin_static_credentials.go @@ -44,6 +44,9 @@ type PluginStaticCredentials interface { // DeletePluginStaticCredentials will delete a plugin static credentials resource. DeletePluginStaticCredentials(ctx context.Context, name string) error + + // GetAllPluginStaticCredentials will get all plugin static credentials. + GetAllPluginStaticCredentials(ctx context.Context) ([]types.PluginStaticCredentials, error) } // MarshalPluginStaticCredentials marshals PluginStaticCredentials resource to JSON. diff --git a/lib/services/plugin_static_credentials_test.go b/lib/services/plugin_static_credentials_test.go index f488d53fcc7a0..792c5cbfec878 100644 --- a/lib/services/plugin_static_credentials_test.go +++ b/lib/services/plugin_static_credentials_test.go @@ -20,6 +20,7 @@ package services import ( "testing" + "time" "github.com/google/go-cmp/cmp" "github.com/stretchr/testify/require" @@ -45,4 +46,24 @@ func TestMarshalPluginStaticCredentialsRoundTrip(t *testing.T) { unmarshaled, err := UnmarshalPluginStaticCredentials(payload) require.NoError(t, err) require.Empty(t, cmp.Diff(creds, unmarshaled)) + + // TODO(greedy52) PluginStaticCredentials uses protojson for marshaling + // and unmarshaling. Unfortunately Expires (*time.Time) is not supported + // and becomes zero after the marshaling. Unlikely Expires will ever be + // needed for PluginStaticCredentials in production but this can cause + // unexpected issues in other places (like resource.SetExpiry in cache + // tests). + t.Run("with expires", func(t *testing.T) { + t.Skip("PluginStaticCredentials does not marshal Expires") + now := time.Now() + + creds.SetExpiry(now) + payload, err := MarshalPluginStaticCredentials(creds) + require.NoError(t, err) + + unmarshaled, err := UnmarshalPluginStaticCredentials(payload) + require.NoError(t, err) + require.Empty(t, cmp.Diff(creds, unmarshaled)) + require.Equal(t, now, unmarshaled.Expiry()) + }) } diff --git a/lib/services/readonly/readonly.go b/lib/services/readonly/readonly.go index c4ed3185ace66..cde219d787cb7 100644 --- a/lib/services/readonly/readonly.go +++ b/lib/services/readonly/readonly.go @@ -431,6 +431,9 @@ type Server interface { GetAWSInstanceID() string // GetAWSAccountID returns the AWS Account ID if this node comes from an EC2 instance. GetAWSAccountID() string + + // GetGitHub returns the GitHub server spec. + GetGitHub() *types.GitHubServerMetadata } // DynamicWindowsDesktop represents a Windows desktop host that is automatically discovered by Windows Desktop Service. diff --git a/lib/services/resource.go b/lib/services/resource.go index 4ba89f2527078..dd0382c439fef 100644 --- a/lib/services/resource.go +++ b/lib/services/resource.go @@ -257,6 +257,8 @@ func ParseShortcut(in string) (string, error) { return types.KindAutoUpdateVersion, nil case types.KindAutoUpdateAgentRollout: return types.KindAutoUpdateAgentRollout, nil + case types.KindGitServer, types.KindGitServer + "s": + return types.KindGitServer, nil } return "", trace.BadParameter("unsupported resource: %q - resources should be expressed as 'type/name', for example 'connector/github'", in) } diff --git a/lib/services/role.go b/lib/services/role.go index eaf951c518d16..e08b3a4e84d6a 100644 --- a/lib/services/role.go +++ b/lib/services/role.go @@ -80,6 +80,7 @@ var DefaultImplicitRules = []types.Rule{ types.NewRule(types.KindSPIFFEFederation, RO()), types.NewRule(types.KindSAMLIdPServiceProvider, RO()), types.NewRule(types.KindIdentityCenter, RO()), + types.NewRule(types.KindGitServer, RO()), } // DefaultCertAuthorityRules provides access the minimal set of resources @@ -3566,3 +3567,30 @@ func MarshalRole(role types.Role, opts ...MarshalOption) ([]byte, error) { return nil, trace.BadParameter("unrecognized role version %T", role) } } + +// AuthPreferenceGetter defines an interface for getting the authentication +// preferences. +type AuthPreferenceGetter interface { + // GetAuthPreference fetches the cluster authentication preferences. + GetAuthPreference(ctx context.Context) (types.AuthPreference, error) +} + +// AccessStateFromSSHCertificate populates access state based on user's SSH +// certificate and auth preference. +func AccessStateFromSSHCertificate(ctx context.Context, cert *ssh.Certificate, checker AccessChecker, authPrefGetter AuthPreferenceGetter) (AccessState, error) { + authPref, err := authPrefGetter.GetAuthPreference(ctx) + if err != nil { + return AccessState{}, trace.Wrap(err) + } + state := checker.GetAccessState(authPref) + _, state.MFAVerified = cert.Extensions[teleport.CertExtensionMFAVerified] + // Certain hardware-key based private key policies are treated as MFA verification. + if policyString, ok := cert.Extensions[teleport.CertExtensionPrivateKeyPolicy]; ok { + if keys.PrivateKeyPolicy(policyString).MFAVerified() { + state.MFAVerified = true + } + } + state.EnableDeviceVerification = true + state.DeviceVerified = dtauthz.IsSSHDeviceVerified(cert) + return state, nil +} diff --git a/lib/services/role_test.go b/lib/services/role_test.go index 8bde24cca2fed..4e0233267be35 100644 --- a/lib/services/role_test.go +++ b/lib/services/role_test.go @@ -2546,6 +2546,20 @@ func TestDefaultImplicitRules(t *testing.T) { {rule: types.KindSAMLIdPServiceProvider, verb: types.VerbDelete, namespace: apidefaults.Namespace, hasAccess: false}, }, }, + { + name: "KindGitServer with empty rules", + role: newRole(func(r *types.RoleV6) { + r.Spec.Allow = types.RoleConditions{} + r.Spec.Deny = types.RoleConditions{} + }), + checks: []check{ + {rule: types.KindGitServer, verb: types.VerbRead, namespace: apidefaults.Namespace, hasAccess: true}, + {rule: types.KindGitServer, verb: types.VerbList, namespace: apidefaults.Namespace, hasAccess: true}, + {rule: types.KindGitServer, verb: types.VerbCreate, namespace: apidefaults.Namespace, hasAccess: false}, + {rule: types.KindGitServer, verb: types.VerbUpdate, namespace: apidefaults.Namespace, hasAccess: false}, + {rule: types.KindGitServer, verb: types.VerbDelete, namespace: apidefaults.Namespace, hasAccess: false}, + }, + }, } for _, tc := range testCases { roleSet := NewRoleSet(tc.role) @@ -9592,3 +9606,75 @@ func TestCheckSPIFFESVID(t *testing.T) { }) } } + +func TestCheckAccessToGitServer(t *testing.T) { + githubOrgServer, err := types.NewGitHubServer(types.GitHubServerMetadata{ + Integration: "my-org", + Organization: "my-org", + }) + require.NoError(t, err) + + makeRole := func(t *testing.T, allowOrg, denyOrg string) types.Role { + spec := types.RoleSpecV6{} + if allowOrg != "" { + spec.Allow.GitHubPermissions = append(spec.Allow.GitHubPermissions, types.GitHubPermission{ + Organizations: []string{allowOrg}, + }) + } + if denyOrg != "" { + spec.Deny.GitHubPermissions = append(spec.Deny.GitHubPermissions, types.GitHubPermission{ + Organizations: []string{denyOrg}, + }) + } + role, err := types.NewRole(uuid.NewString(), spec) + require.NoError(t, err) + return role + } + + tests := []struct { + name string + roles []types.Role + requireErr require.ErrorAssertionFunc + }{ + { + name: "no roles", + requireErr: requireAccessDenied, + }, + { + name: "explicit allow", + roles: []types.Role{ + makeRole(t, "my-org", ""), + }, + requireErr: require.NoError, + }, + { + name: "wildcard allow", + roles: []types.Role{ + makeRole(t, "*", "some-other-org"), + }, + requireErr: require.NoError, + }, + { + name: "explicit deny", + roles: []types.Role{ + makeRole(t, "*", "my-org"), + }, + requireErr: requireAccessDenied, + }, + { + name: "wildcard deny", + roles: []types.Role{ + makeRole(t, "my-org", "*"), + }, + requireErr: requireAccessDenied, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + accessChecker := makeAccessCheckerWithRoleSet(test.roles) + err := accessChecker.CheckAccess(githubOrgServer, AccessState{}) + test.requireErr(t, err) + }) + } +} diff --git a/lib/services/server.go b/lib/services/server.go index 5ffeec5a97320..43b1e4d78e50b 100644 --- a/lib/services/server.go +++ b/lib/services/server.go @@ -128,6 +128,9 @@ func compareServers(a, b types.Server) int { if !slices.Equal(a.GetProxyIDs(), b.GetProxyIDs()) { return Different } + if !cmp.Equal(a.GetGitHub(), b.GetGitHub()) { + return Different + } // OnlyTimestampsDifferent check must be after all Different checks. if !a.Expiry().Equal(b.Expiry()) { return OnlyTimestampsDifferent diff --git a/lib/services/unified_resource.go b/lib/services/unified_resource.go index 43eaf8718407b..13df734d2364e 100644 --- a/lib/services/unified_resource.go +++ b/lib/services/unified_resource.go @@ -50,6 +50,7 @@ var UnifiedResourceKinds []string = []string{ types.KindSAMLIdPServiceProvider, types.KindIdentityCenterAccount, types.KindIdentityCenterAccountAssignment, + types.KindGitServer, } // UnifiedResourceCacheConfig is used to configure a UnifiedResourceCache @@ -355,6 +356,7 @@ type ResourceGetter interface { KubernetesServerGetter SAMLIdpServiceProviderGetter IdentityCenterAccountGetter + GitServerGetter IdentityCenterAccountAssignmentGetter } @@ -387,8 +389,11 @@ func makeResourceSortKey(resource types.Resource) resourceSortKey { // the container type. switch r := resource.(type) { case types.Server: - name = r.GetHostname() + "/" + r.GetName() - kind = types.KindNode + switch r.GetKind() { + case types.KindNode, types.KindGitServer: + name = r.GetHostname() + "/" + r.GetName() + kind = r.GetKind() + } case types.AppServer: app := r.GetApp() if app != nil { @@ -464,6 +469,11 @@ func (c *UnifiedResourceCache) getResourcesAndUpdateCurrent(ctx context.Context) return trace.Wrap(err) } + newGitServers, err := c.getGitServers(ctx) + if err != nil { + return trace.Wrap(err) + } + newICAccountAssignments, err := c.getIdentityCenterAccountAssignments(ctx) if err != nil { return trace.Wrap(err) @@ -485,6 +495,7 @@ func (c *UnifiedResourceCache) getResourcesAndUpdateCurrent(ctx context.Context) putResources[types.SAMLIdPServiceProvider](c, newSAMLApps) putResources[types.WindowsDesktop](c, newDesktops) putResources[resource](c, newICAccounts) + putResources[types.Server](c, newGitServers) putResources[resource](c, newICAccountAssignments) c.stale = false c.defineCollectorAsInitialized() @@ -635,6 +646,23 @@ func (c *UnifiedResourceCache) getIdentityCenterAccountAssignments(ctx context.C return accounts, nil } +func (c *UnifiedResourceCache) getGitServers(ctx context.Context) (all []types.Server, err error) { + var page []types.Server + nextToken := "" + for { + page, nextToken, err = c.ListGitServers(ctx, apidefaults.DefaultChunkSize, nextToken) + if err != nil { + return nil, trace.Wrap(err, "getting Git servers for unified resource watcher") + } + + all = append(all, page...) + if nextToken == "" { + break + } + } + return all, nil +} + // read applies the supplied closure to either the primary tree or the ttl-based fallback tree depending on // wether or not the cache is currently healthy. locking is handled internally and the passed-in tree should // not be accessed after the closure completes. @@ -954,6 +982,19 @@ func MakePaginatedResource(ctx context.Context, requestType string, r types.Reso return nil, trace.Wrap(err) } + case types.KindGitServer: + server, ok := resource.(*types.ServerV2) + if !ok { + return nil, trace.BadParameter("%s has invalid type %T", resourceKind, resource) + } + + protoResource = &proto.PaginatedResource{ + Resource: &proto.PaginatedResource_GitServer{ + GitServer: server, + }, + RequiresRequest: requiresRequest, + } + case types.KindIdentityCenterAccountAssignment: unwrapper, ok := resource.(types.Resource153Unwrapper) if !ok { diff --git a/lib/services/unified_resource_test.go b/lib/services/unified_resource_test.go index 70229739b48d9..7dea1251469ca 100644 --- a/lib/services/unified_resource_test.go +++ b/lib/services/unified_resource_test.go @@ -46,42 +46,51 @@ import ( "github.com/gravitational/teleport/lib/services/local" ) -func TestUnifiedResourceWatcher(t *testing.T) { - t.Parallel() +type client struct { + services.Presence + services.WindowsDesktops + services.SAMLIdPServiceProviders + services.GitServers + services.IdentityCenterAccounts + services.IdentityCenterAccountAssignments + types.Events +} - ctx := context.Background() +func newClient(t *testing.T) *client { + t.Helper() bk, err := memory.New(memory.Config{}) require.NoError(t, err) - type client struct { - services.Presence - services.WindowsDesktops - services.SAMLIdPServiceProviders - services.IdentityCenterAccounts - services.IdentityCenterAccountAssignments - types.Events - } - samlService, err := local.NewSAMLIdPServiceProviderService(bk) require.NoError(t, err) - + gitService, err := local.NewGitServerService(bk) + require.NoError(t, err) icService, err := local.NewIdentityCenterService(local.IdentityCenterServiceConfig{ Backend: bk, }) require.NoError(t, err) - clt := &client{ + return &client{ Presence: local.NewPresenceService(bk), WindowsDesktops: local.NewWindowsDesktopService(bk), SAMLIdPServiceProviders: samlService, Events: local.NewEventsService(bk), + GitServers: gitService, IdentityCenterAccounts: icService, IdentityCenterAccountAssignments: icService, } +} + +func TestUnifiedResourceWatcher(t *testing.T) { + t.Parallel() + + ctx := context.Background() + clt := newClient(t) + // Add node to the backend. node := newNodeServer(t, "node1", "hostname1", "127.0.0.1:22", false /*tunnel*/) - _, err = clt.UpsertNode(ctx, node) + _, err := clt.UpsertNode(ctx, node) require.NoError(t, err) db, err := types.NewDatabaseV3(types.Metadata{ @@ -101,6 +110,10 @@ func TestUnifiedResourceWatcher(t *testing.T) { require.NoError(t, err) _, err = clt.UpsertDatabaseServer(ctx, dbServer) require.NoError(t, err) + gitServer := newGitServer(t, "my-org") + require.NoError(t, err) + _, err = clt.CreateGitServer(ctx, gitServer) + require.NoError(t, err) w, err := services.NewUnifiedResourceCache(ctx, services.UnifiedResourceCacheConfig{ ResourceWatcherConfig: services.ResourceWatcherConfig{ @@ -110,10 +123,10 @@ func TestUnifiedResourceWatcher(t *testing.T) { ResourceGetter: clt, }) require.NoError(t, err) - // node and db expected initially + // node, db, and git_server expected initially res, err := w.GetUnifiedResources(ctx) require.NoError(t, err) - require.Len(t, res, 2) + require.Len(t, res, 3) assert.Eventually(t, func() bool { return w.IsInitialized() @@ -154,11 +167,17 @@ func TestUnifiedResourceWatcher(t *testing.T) { err = clt.UpsertWindowsDesktop(ctx, win) require.NoError(t, err) + // add another git server + gitServer2 := newGitServer(t, "my-org-2") + _, err = clt.UpsertGitServer(ctx, gitServer2) + require.NoError(t, err) + icAcct := newICAccount(t, ctx, clt) icAcctAssignment := newICAccountAssignment(t, ctx, clt) // we expect each of the resources above to exist expectedRes := []types.ResourceWithLabels{node, app, samlapp, dbServer, win, + gitServer, gitServer2, types.Resource153ToUnifiedResource(icAcct), types.Resource153ToUnifiedResource(icAcctAssignment), } @@ -200,6 +219,7 @@ func TestUnifiedResourceWatcher(t *testing.T) { // this should include the updated node, and shouldn't have any apps included expectedRes = []types.ResourceWithLabels{nodeUpdated, samlapp, dbServer, win, + gitServer, gitServer2, types.Resource153ToUnifiedResource(icAcct), types.Resource153ToUnifiedResource(icAcctAssignment)} @@ -243,35 +263,7 @@ func TestUnifiedResourceWatcher_PreventDuplicates(t *testing.T) { t.Parallel() ctx := context.Background() - - bk, err := memory.New(memory.Config{}) - require.NoError(t, err) - - type client struct { - services.Presence - services.WindowsDesktops - services.SAMLIdPServiceProviders - services.IdentityCenterAccountGetter - services.IdentityCenterAccountAssignments - types.Events - } - - samlService, err := local.NewSAMLIdPServiceProviderService(bk) - require.NoError(t, err) - - icService, err := local.NewIdentityCenterService(local.IdentityCenterServiceConfig{ - Backend: bk, - }) - require.NoError(t, err) - - clt := &client{ - Presence: local.NewPresenceService(bk), - WindowsDesktops: local.NewWindowsDesktopService(bk), - SAMLIdPServiceProviders: samlService, - Events: local.NewEventsService(bk), - IdentityCenterAccountGetter: icService, - IdentityCenterAccountAssignments: icService, - } + clt := newClient(t) w, err := services.NewUnifiedResourceCache(ctx, services.UnifiedResourceCacheConfig{ ResourceWatcherConfig: services.ResourceWatcherConfig{ Component: teleport.ComponentUnifiedResource, @@ -308,35 +300,7 @@ func TestUnifiedResourceWatcher_DeleteEvent(t *testing.T) { t.Parallel() ctx := context.Background() - - bk, err := memory.New(memory.Config{}) - require.NoError(t, err) - - type client struct { - services.Presence - services.WindowsDesktops - services.SAMLIdPServiceProviders - services.IdentityCenterAccounts - services.IdentityCenterAccountAssignments - types.Events - } - - samlService, err := local.NewSAMLIdPServiceProviderService(bk) - require.NoError(t, err) - - icService, err := local.NewIdentityCenterService(local.IdentityCenterServiceConfig{ - Backend: bk, - }) - require.NoError(t, err) - - clt := &client{ - Presence: local.NewPresenceService(bk), - WindowsDesktops: local.NewWindowsDesktopService(bk), - SAMLIdPServiceProviders: samlService, - Events: local.NewEventsService(bk), - IdentityCenterAccounts: icService, - IdentityCenterAccountAssignments: icService, - } + clt := newClient(t) w, err := services.NewUnifiedResourceCache(ctx, services.UnifiedResourceCacheConfig{ ResourceWatcherConfig: services.ResourceWatcherConfig{ Component: teleport.ComponentUnifiedResource, @@ -433,9 +397,14 @@ func TestUnifiedResourceWatcher_DeleteEvent(t *testing.T) { icAcct := newICAccount(t, ctx, clt) + // add git server + gitServer := newGitServer(t, "my-org") + _, err = clt.CreateGitServer(ctx, gitServer) + require.NoError(t, err) + assert.Eventually(t, func() bool { res, _ := w.GetUnifiedResources(ctx) - return len(res) == 7 + return len(res) == 8 }, 5*time.Second, 10*time.Millisecond, "Timed out waiting for unified resources to be added") // delete everything @@ -453,6 +422,8 @@ func TestUnifiedResourceWatcher_DeleteEvent(t *testing.T) { require.NoError(t, err) err = clt.DeleteIdentityCenterAccount(ctx, services.IdentityCenterAccountID(icAcct.GetMetadata().GetName())) require.NoError(t, err) + err = clt.DeleteGitServer(ctx, gitServer.GetName()) + require.NoError(t, err) assert.Eventually(t, func() bool { res, _ := w.GetUnifiedResources(ctx) @@ -505,6 +476,16 @@ func newTestEntityDescriptor(entityID string) string { return fmt.Sprintf(testEntityDescriptor, entityID) } +func newGitServer(t *testing.T, githubOrg string) types.Server { + t.Helper() + gitServer, err := types.NewGitHubServer(types.GitHubServerMetadata{ + Organization: githubOrg, + Integration: githubOrg, + }) + require.NoError(t, err) + return gitServer +} + // A test entity descriptor from https://sptest.iamshowcase.com/testsp_metadata.xml. const testEntityDescriptor = ` diff --git a/lib/services/watcher.go b/lib/services/watcher.go index 6bbd71bee0993..62b9e882c68d6 100644 --- a/lib/services/watcher.go +++ b/lib/services/watcher.go @@ -1705,3 +1705,40 @@ func (c *oktaAssignmentCollector) processEventsAndUpdateCurrent(ctx context.Cont } func (*oktaAssignmentCollector) notifyStale() {} + +// GitServerWatcherConfig is the config for Git server watcher. +type GitServerWatcherConfig struct { + GitServerGetter + ResourceWatcherConfig +} + +// NewGitServerWatcher returns a new instance of Git server watcher. +func NewGitServerWatcher(ctx context.Context, cfg GitServerWatcherConfig) (*GenericWatcher[types.Server, readonly.Server], error) { + if cfg.GitServerGetter == nil { + return nil, trace.BadParameter("NodesGetter must be provided") + } + + w, err := NewGenericResourceWatcher(ctx, GenericWatcherConfig[types.Server, readonly.Server]{ + ResourceWatcherConfig: cfg.ResourceWatcherConfig, + ResourceKind: types.KindGitServer, + ResourceGetter: func(ctx context.Context) (all []types.Server, err error) { + var page []types.Server + var token string + for { + page, token, err = cfg.GitServerGetter.ListGitServers(ctx, apidefaults.DefaultChunkSize, token) + if err != nil { + return nil, trace.Wrap(err) + } + all = append(all, page...) + if token == "" { + break + } + } + return all, nil + }, + ResourceKey: types.Server.GetName, + DisableUpdateBroadcast: true, + CloneFunc: types.Server.DeepCopy, + }) + return w, trace.Wrap(err) +} diff --git a/lib/services/watcher_test.go b/lib/services/watcher_test.go index 52988beae8355..c369f5efda054 100644 --- a/lib/services/watcher_test.go +++ b/lib/services/watcher_test.go @@ -1403,3 +1403,66 @@ func newOktaAssignment(t *testing.T, name string) types.OktaAssignment { require.NoError(t, err) return assignment } + +func TestGitServerWatcher(t *testing.T) { + t.Parallel() + + ctx := context.Background() + bk, err := memory.New(memory.Config{}) + require.NoError(t, err) + + gitServerService, err := local.NewGitServerService(bk) + require.NoError(t, err) + w, err := services.NewGitServerWatcher(ctx, services.GitServerWatcherConfig{ + ResourceWatcherConfig: services.ResourceWatcherConfig{ + Component: "test", + Client: local.NewEventsService(bk), + MaxStaleness: time.Minute, + }, + GitServerGetter: gitServerService, + }) + require.NoError(t, err) + t.Cleanup(w.Close) + require.NoError(t, w.WaitInitialization()) + + // Add some git servers. + servers := make([]types.Server, 0, 5) + for i := 0; i < 5; i++ { + server := newGitServer(t, fmt.Sprintf("org%v", i+1)) + _, err = gitServerService.CreateGitServer(ctx, server) + require.NoError(t, err) + servers = append(servers, server) + } + + require.EventuallyWithT(t, func(t *assert.CollectT) { + filtered, err := w.CurrentResources(ctx) + assert.NoError(t, err) + assert.Len(t, filtered, len(servers)) + }, time.Second, time.Millisecond, "Timeout waiting for watcher to receive nodes.") + + filtered, err := w.CurrentResourcesWithFilter(ctx, func(s readonly.Server) bool { + if github := s.GetGitHub(); github != nil { + return github.Organization == "org1" || github.Organization == "org2" + } + return false + }) + require.NoError(t, err) + require.Len(t, filtered, 2) + + // Delete a server. + require.NoError(t, gitServerService.DeleteGitServer(ctx, servers[0].GetName())) + require.EventuallyWithT(t, func(t *assert.CollectT) { + filtered, err := w.CurrentResources(ctx) + assert.NoError(t, err) + assert.Len(t, filtered, len(servers)-1) + }, time.Second, time.Millisecond, "Timeout waiting for watcher to receive nodes.") + + filtered, err = w.CurrentResourcesWithFilter(ctx, func(s readonly.Server) bool { + if github := s.GetGitHub(); github != nil { + return github.Organization == "org1" + } + return false + }) + require.NoError(t, err) + require.Empty(t, filtered) +} diff --git a/lib/srv/authhandlers.go b/lib/srv/authhandlers.go index eed3b37c0a53f..7f5244343b0ed 100644 --- a/lib/srv/authhandlers.go +++ b/lib/srv/authhandlers.go @@ -36,12 +36,10 @@ import ( "github.com/gravitational/teleport" "github.com/gravitational/teleport/api/types" apievents "github.com/gravitational/teleport/api/types/events" - "github.com/gravitational/teleport/api/utils/keys" apisshutils "github.com/gravitational/teleport/api/utils/sshutils" "github.com/gravitational/teleport/lib/auditd" "github.com/gravitational/teleport/lib/auth" "github.com/gravitational/teleport/lib/connectmycomputer" - dtauthz "github.com/gravitational/teleport/lib/devicetrust/authz" "github.com/gravitational/teleport/lib/events" "github.com/gravitational/teleport/lib/observability/metrics" "github.com/gravitational/teleport/lib/services" @@ -460,7 +458,9 @@ func (h *AuthHandlers) UserKeyAuth(conn ssh.ConnMetadata, key ssh.PublicKey) (*s log.Warnf("Unexpected cert type: %v", cert.CertType) } - if h.isProxy() { + // Skip RBAC check for proxy or git servers. RBAC check on git servers are + // performed outside this handler. + if h.isProxy() || h.c.Component == teleport.ComponentForwardingGit { return permissions, nil } @@ -635,19 +635,10 @@ func (a *ahLoginChecker) canLoginWithRBAC(cert *ssh.Certificate, ca types.CertAu return trace.Wrap(err) } - authPref, err := a.c.AccessPoint.GetAuthPreference(ctx) + state, err := services.AccessStateFromSSHCertificate(ctx, cert, accessChecker, a.c.AccessPoint) if err != nil { return trace.Wrap(err) } - state := accessChecker.GetAccessState(authPref) - _, state.MFAVerified = cert.Extensions[teleport.CertExtensionMFAVerified] - - // Certain hardware-key based private key policies are treated as MFA verification. - if policyString, ok := cert.Extensions[teleport.CertExtensionPrivateKeyPolicy]; ok { - if keys.PrivateKeyPolicy(policyString).MFAVerified() { - state.MFAVerified = true - } - } // we don't need to check the RBAC for the node if they are only allowed to join sessions if osUser == teleport.SSHSessionJoinPrincipal && @@ -665,9 +656,6 @@ func (a *ahLoginChecker) canLoginWithRBAC(cert *ssh.Certificate, ca types.CertAu } } - state.EnableDeviceVerification = true - state.DeviceVerified = dtauthz.IsSSHDeviceVerified(cert) - // check if roles allow access to server if err := accessChecker.CheckAccess( target, diff --git a/lib/srv/authhandlers_test.go b/lib/srv/authhandlers_test.go index 907a3db97b786..8e009819e2108 100644 --- a/lib/srv/authhandlers_test.go +++ b/lib/srv/authhandlers_test.go @@ -102,38 +102,58 @@ func (m mockConnMetadata) RemoteAddr() net.Addr { func TestRBAC(t *testing.T) { t.Parallel() + node, err := types.NewNode("testie_node", types.SubKindTeleportNode, types.ServerSpecV2{ + Addr: "1.2.3.4:22", + Hostname: "testie", + }, nil) + require.NoError(t, err) + + openSSHNode, err := types.NewNode("openssh", types.SubKindOpenSSHNode, types.ServerSpecV2{ + Addr: "1.2.3.4:22", + Hostname: "openssh", + }, nil) + require.NoError(t, err) + + gitServer, err := types.NewGitHubServer(types.GitHubServerMetadata{ + Integration: "org", + Organization: "org", + }) + require.NoError(t, err) + tests := []struct { name string component string - nodeExists bool - openSSHNode bool + targetServer types.Server assertRBACCheck require.BoolAssertionFunc }{ { name: "teleport node, regular server", component: teleport.ComponentNode, - nodeExists: true, - openSSHNode: false, + targetServer: node, assertRBACCheck: require.True, }, { name: "teleport node, forwarding server", component: teleport.ComponentForwardingNode, - nodeExists: true, - openSSHNode: false, + targetServer: node, assertRBACCheck: require.False, }, { name: "registered openssh node, forwarding server", component: teleport.ComponentForwardingNode, - nodeExists: true, - openSSHNode: true, + targetServer: openSSHNode, assertRBACCheck: require.True, }, { name: "unregistered openssh node, forwarding server", component: teleport.ComponentForwardingNode, - nodeExists: false, + targetServer: nil, + assertRBACCheck: require.False, + }, + { + name: "forwarding git", + component: teleport.ComponentForwardingGit, + targetServer: gitServer, assertRBACCheck: require.False, }, } @@ -176,29 +196,12 @@ func TestRBAC(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - // create node resource - var target types.Server - if tt.nodeExists { - n, err := types.NewServer("testie_node", types.KindNode, types.ServerSpecV2{ - Addr: "1.2.3.4:22", - Hostname: "testie", - Version: types.V2, - }) - require.NoError(t, err) - server, ok := n.(*types.ServerV2) - require.True(t, ok) - if tt.openSSHNode { - server.SubKind = types.SubKindOpenSSHNode - } - target = server - } - config := &AuthHandlerConfig{ Server: server, Component: tt.component, Emitter: &eventstest.MockRecorderEmitter{}, AccessPoint: accessPoint, - TargetServer: target, + TargetServer: tt.targetServer, } ah, err := NewAuthHandlers(config) require.NoError(t, err) diff --git a/lib/srv/ctx.go b/lib/srv/ctx.go index 802851d6c7b68..3e5d290ea61e8 100644 --- a/lib/srv/ctx.go +++ b/lib/srv/ctx.go @@ -847,7 +847,9 @@ func (c *ServerContext) reportStats(conn utils.Stater) { // Never emit session data events for the proxy or from a Teleport node if // sessions are being recorded at the proxy (this would result in double // events). - if c.GetServer().Component() == teleport.ComponentProxy { + // Do not emit session data for git commands as they have their own events. + if c.GetServer().Component() == teleport.ComponentProxy || + c.GetServer().Component() == teleport.ComponentForwardingGit { return } if services.IsRecordAtProxy(c.SessionRecordingConfig.GetMode()) && diff --git a/lib/srv/git/audit.go b/lib/srv/git/audit.go new file mode 100644 index 0000000000000..32fc3d8b1e54c --- /dev/null +++ b/lib/srv/git/audit.go @@ -0,0 +1,157 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package git + +import ( + "bytes" + "context" + "io" + "log/slog" + "sync" + + "github.com/go-git/go-git/v5/plumbing/format/pktline" + "github.com/go-git/go-git/v5/plumbing/protocol/packp" + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/gravitational/trace" + + "github.com/gravitational/teleport" + apievents "github.com/gravitational/teleport/api/types/events" + "github.com/gravitational/teleport/lib/utils/log" +) + +// CommandRecorder records Git commands by implementing io.Writer to receive a +// copy of stdin from the git client. +type CommandRecorder interface { + // Writer is the basic interface for the recorder to receive payload. + io.Writer + + // GetCommand returns basic info of the command. + GetCommand() Command + // GetActions returns the action details of the command. + GetActions() ([]*apievents.GitCommandAction, error) +} + +// NewCommandRecorder returns a new Git command recorder. +// +// The recorder receives stdin input from the git client which is in Git pack +// protocol format: +// https://git-scm.com/docs/pack-protocol#_ssh_transport +// +// For SSH transport, the command type and the repository come from the command +// executed through the SSH session. +// +// Based on the command type, we can decode the pack protocol defined above. In +// general, some metadata are exchanged in pkt-lines followed by packfile sent +// via side-bands. +func NewCommandRecorder(parentCtx context.Context, command Command) CommandRecorder { + // For now, only record details on the push. Fetch is not very interesting. + if command.Service == transport.ReceivePackServiceName { + return newPushCommandRecorder(parentCtx, command) + } + return newNoopRecorder(command) +} + +// noopRecorder is a no-op recorder that implements CommandRecorder +type noopRecorder struct { + Command +} + +func newNoopRecorder(command Command) *noopRecorder { + return &noopRecorder{ + Command: command, + } +} + +func (r *noopRecorder) GetCommand() Command { + return r.Command +} +func (r *noopRecorder) GetActions() ([]*apievents.GitCommandAction, error) { + return nil, nil +} +func (r *noopRecorder) Write(p []byte) (int, error) { + return len(p), nil +} + +// pushCommandRecorder records actions for git-receive-pack. +type pushCommandRecorder struct { + Command + + parentCtx context.Context + logger *slog.Logger + payload []byte + mu sync.Mutex + seenFlush bool +} + +func newPushCommandRecorder(parentCtx context.Context, command Command) *pushCommandRecorder { + return &pushCommandRecorder{ + Command: command, + logger: slog.With(teleport.ComponentKey, "git:packp"), + } +} + +func (r *pushCommandRecorder) GetCommand() Command { + return r.Command +} + +func (r *pushCommandRecorder) Write(p []byte) (int, error) { + r.mu.Lock() + defer r.mu.Unlock() + + // Avoid caching packfile as it can be large. Look for flush-pkt which + // comes after the command-list. + // + // https://git-scm.com/docs/pack-protocol#_reference_update_request_and_packfile_transfer + if r.seenFlush { + r.logger.Log(r.parentCtx, log.TraceLevel, "Discarding packet protocol", "packet_length", len(p)) + return len(p), nil + } + + r.logger.Log(r.parentCtx, log.TraceLevel, "Recording Git command in packet protocol", "packet", string(p)) + r.payload = append(r.payload, p...) + if bytes.HasSuffix(p, pktline.FlushPkt) { + r.seenFlush = true + } + return len(p), nil +} + +func (r *pushCommandRecorder) GetActions() ([]*apievents.GitCommandAction, error) { + r.mu.Lock() + defer r.mu.Unlock() + + // Noop push (e.g. "Everything up-to-date") + if bytes.Equal(r.payload, pktline.FlushPkt) { + return nil, nil + } + + request := packp.NewReferenceUpdateRequest() + if err := request.Decode(bytes.NewReader(r.payload)); err != nil { + return nil, trace.Wrap(err) + } + var actions []*apievents.GitCommandAction + for _, command := range request.Commands { + actions = append(actions, &apievents.GitCommandAction{ + Action: string(command.Action()), + Reference: string(command.Name), + Old: command.Old.String(), + New: command.New.String(), + }) + } + return actions, nil +} diff --git a/lib/srv/git/audit_test.go b/lib/srv/git/audit_test.go new file mode 100644 index 0000000000000..1392b50c74e88 --- /dev/null +++ b/lib/srv/git/audit_test.go @@ -0,0 +1,83 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package git + +import ( + "context" + "testing" + + "github.com/go-git/go-git/v5/plumbing/format/pktline" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + apievents "github.com/gravitational/teleport/api/types/events" +) + +func TestCommandRecorder(t *testing.T) { + tests := []struct { + name string + sshCommand string + inputs [][]byte + wantActions []*apievents.GitCommandAction + }{ + { + name: "fetch", + sshCommand: "git-upload-pack 'my-org/my-repo.git'", + inputs: [][]byte{pktline.FlushPkt}, + wantActions: nil, + }, + { + name: "no-op push", + sshCommand: "git-receive-pack 'my-org/my-repo.git'", + inputs: [][]byte{pktline.FlushPkt}, + wantActions: nil, + }, + { + name: "push with packfile", + sshCommand: "git-receive-pack 'my-org/my-repo.git'", + inputs: [][]byte{ + []byte("00af8a43aa31be3cb1816c8d517d34d61795613300f5 75ad3a489c1537ed064caa874ee38076b5a126be refs/heads/STeve/test\x00 report-status-v2 side-band-64k object-format=sha1 agent=git/2.45.00000"), + []byte("PACK-FILE-SHOULD-BE-IGNORED"), + }, + wantActions: []*apievents.GitCommandAction{{ + Action: "update", + Reference: "refs/heads/STeve/test", + Old: "8a43aa31be3cb1816c8d517d34d61795613300f5", + New: "75ad3a489c1537ed064caa874ee38076b5a126be", + }}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + command, err := ParseSSHCommand(tt.sshCommand) + require.NoError(t, err) + + recorder := NewCommandRecorder(context.Background(), *command) + for _, input := range tt.inputs { + n, err := recorder.Write(input) + require.NoError(t, err) + require.Equal(t, len(input), n) + } + actions, err := recorder.GetActions() + require.NoError(t, err) + assert.Equal(t, tt.wantActions, actions) + }) + } +} diff --git a/lib/srv/git/command.go b/lib/srv/git/command.go new file mode 100644 index 0000000000000..9ce7cad2c5dbf --- /dev/null +++ b/lib/srv/git/command.go @@ -0,0 +1,130 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package git + +import ( + "strings" + + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/gravitational/trace" + "github.com/mattn/go-shellwords" + + "github.com/gravitational/teleport/api/types" +) + +// Repository is the repository path in the SSH command. +type Repository string + +// Owner returns the first part of the repository path. If repository does not +// have multiple parts, empty string will be returned. +// +// For GitHub, owner is either the user or the organization that owns the repo. +func (r Repository) Owner() string { + if owner, _, ok := strings.Cut(string(r), "/"); ok { + return owner + } + return "" +} + +// Command is the Git command to be executed. +type Command struct { + // SSHCommand is the original SSH command. + SSHCommand string + // Service is the git service of the command (either git-upload-pack or + // git-receive-pack). + Service string + // Repository returns the repository path of the command. + Repository Repository +} + +// ParseSSHCommand parses the provided SSH command and returns the plumbing +// command details. +func ParseSSHCommand(sshCommand string) (*Command, error) { + args, err := shellwords.Parse(sshCommand) + if err != nil { + return nil, trace.Wrap(err) + } + if len(args) == 0 { + return nil, trace.BadParameter("invalid SSH command %s", sshCommand) + } + + // There are a number of plumbing commands but only upload-pack and + // receive-pack are expected over SSH transport. + // https://git-scm.com/docs/pack-protocol#_transports + switch args[0] { + // git-receive-pack - Receive what is pushed into the repository + // Example: git-receive-pack 'my-org/my-repo.git' + // https://git-scm.com/docs/git-receive-pack + case transport.ReceivePackServiceName: + if len(args) != 2 { + return nil, trace.CompareFailed("invalid SSH command %s: expecting 2 arguments for %q but got %d", sshCommand, args[0], len(args)) + } + return &Command{ + SSHCommand: sshCommand, + Service: args[0], + Repository: Repository(args[1]), + }, nil + + // git-upload-pack - Send objects packed back to git-fetch-pack + // Example: git-upload-pack 'my-org/my-repo.git' + // https://git-scm.com/docs/git-upload-pack + case transport.UploadPackServiceName: + args = skipSSHCommandFlags(args) + if len(args) != 2 { + return nil, trace.CompareFailed("invalid SSH command %s: expecting 2 non-flag arguments for %q but got %d", sshCommand, args[0], len(args)) + } + + return &Command{ + SSHCommand: sshCommand, + Service: args[0], + Repository: Repository(args[1]), + }, nil + default: + return nil, trace.BadParameter("unsupported SSH command %q", sshCommand) + } +} + +// skipSSHCommandFlags filters out flags from the provided arguments. +// +// A flag typically has "--" as prefix. If a flag requires a value, it is +// specified in the same arg with "=" (e.g. "--timeout=60") so there is no need +// to skip an extra arg. +func skipSSHCommandFlags(args []string) (ret []string) { + for _, arg := range args { + if !strings.HasPrefix(arg, "-") { + ret = append(ret, arg) + } + } + return +} + +// checkSSHCommand performs basic checks against the SSH command. +func checkSSHCommand(server types.Server, command *Command) error { + // Only supporting GitHub for now. + if server.GetGitHub() == nil { + return trace.BadParameter("the git_server is misconfigured due to missing GitHub spec, contact your Teleport administrator") + } + if server.GetGitHub().Organization != command.Repository.Owner() { + return trace.AccessDenied("expect organization %q but got %q", + server.GetGitHub().Organization, + command.Repository.Owner(), + ) + } + return nil +} diff --git a/lib/srv/git/command_test.go b/lib/srv/git/command_test.go new file mode 100644 index 0000000000000..0cae75d071570 --- /dev/null +++ b/lib/srv/git/command_test.go @@ -0,0 +1,148 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package git + +import ( + "testing" + + "github.com/gravitational/trace" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/api/types" +) + +func TestParseSSHCommand(t *testing.T) { + tests := []struct { + name string + input string + checkError require.ErrorAssertionFunc + wantOutput *Command + }{ + { + name: "git-upload-pack", + input: "git-upload-pack 'my-org/my-repo.git'", + checkError: require.NoError, + wantOutput: &Command{ + SSHCommand: "git-upload-pack 'my-org/my-repo.git'", + Service: "git-upload-pack", + Repository: "my-org/my-repo.git", + }, + }, + { + name: "git-upload-pack with double quote", + input: "git-upload-pack \"my-org/my-repo.git\"", + checkError: require.NoError, + wantOutput: &Command{ + SSHCommand: "git-upload-pack \"my-org/my-repo.git\"", + Service: "git-upload-pack", + Repository: "my-org/my-repo.git", + }, + }, + { + name: "git-upload-pack with args", + input: "git-upload-pack --strict 'my-org/my-repo.git'", + checkError: require.NoError, + wantOutput: &Command{ + SSHCommand: "git-upload-pack --strict 'my-org/my-repo.git'", + Service: "git-upload-pack", + Repository: "my-org/my-repo.git", + }, + }, + { + name: "git-upload-pack with args after repo", + input: "git-upload-pack --strict 'my-org/my-repo.git' --timeout=60", + checkError: require.NoError, + wantOutput: &Command{ + SSHCommand: "git-upload-pack --strict 'my-org/my-repo.git' --timeout=60", + Service: "git-upload-pack", + Repository: "my-org/my-repo.git", + }, + }, + { + name: "missing quote", + input: "git-upload-pack 'my-org/my-repo.git", + checkError: require.Error, + }, + { + name: "git-receive-pack", + input: "git-receive-pack 'my-org/my-repo.git'", + checkError: require.NoError, + wantOutput: &Command{ + SSHCommand: "git-receive-pack 'my-org/my-repo.git'", + Service: "git-receive-pack", + Repository: "my-org/my-repo.git", + }, + }, + { + name: "missing args", + input: "git-receive-pack", + checkError: require.Error, + }, + { + name: "unsupported", + input: "git-cat-file", + checkError: require.Error, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + output, err := ParseSSHCommand(tt.input) + tt.checkError(t, err) + require.Equal(t, tt.wantOutput, output) + }) + } +} + +func Test_checkSSHCommand(t *testing.T) { + server, err := types.NewGitHubServer(types.GitHubServerMetadata{ + Integration: "my-org", + Organization: "my-org", + }) + require.NoError(t, err) + + tests := []struct { + name string + server types.Server + sshCommand string + checkError require.ErrorAssertionFunc + }{ + { + name: "success", + server: server, + sshCommand: "git-upload-pack 'my-org/my-repo.git'", + checkError: require.NoError, + }, + { + name: "org does not match", + server: server, + sshCommand: "git-upload-pack 'some-other-org/my-repo.git'", + checkError: func(t require.TestingT, err error, i ...interface{}) { + require.True(t, trace.IsAccessDenied(err), i...) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + command, err := ParseSSHCommand(tt.sshCommand) + require.NoError(t, err) + tt.checkError(t, checkSSHCommand(tt.server, command)) + }) + } +} diff --git a/lib/srv/git/forward.go b/lib/srv/git/forward.go new file mode 100644 index 0000000000000..578e7d6929a28 --- /dev/null +++ b/lib/srv/git/forward.go @@ -0,0 +1,677 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package git + +import ( + "context" + "io" + "log/slog" + "net" + "strconv" + + "github.com/google/uuid" + "github.com/gravitational/trace" + "github.com/jonboulle/clockwork" + "golang.org/x/crypto/ssh" + + "github.com/gravitational/teleport" + tracessh "github.com/gravitational/teleport/api/observability/tracing/ssh" + "github.com/gravitational/teleport/api/types" + apievents "github.com/gravitational/teleport/api/types/events" + "github.com/gravitational/teleport/lib/auth/authclient" + "github.com/gravitational/teleport/lib/bpf" + "github.com/gravitational/teleport/lib/events" + "github.com/gravitational/teleport/lib/service/servicecfg" + "github.com/gravitational/teleport/lib/services" + "github.com/gravitational/teleport/lib/srv" + "github.com/gravitational/teleport/lib/sshutils" + "github.com/gravitational/teleport/lib/utils" + logutils "github.com/gravitational/teleport/lib/utils/log" +) + +// ForwardServerConfig is the configuration for the ForwardServer. +type ForwardServerConfig struct { + // ParentContext is a parent context, used to signal global + // closure + ParentContext context.Context + // TargetServer is the target server that represents the git-hosting + // service. + TargetServer types.Server + // TargetConn is the TCP connection to the remote host. + TargetConn net.Conn + // AuthClient is a client connected to the Auth server of this local cluster. + AuthClient authclient.ClientI + // AccessPoint is a caching client that provides access to this local cluster. + AccessPoint srv.AccessPoint + // Emitter is audit events emitter + Emitter events.StreamEmitter + // LockWatcher is a lock watcher. + LockWatcher *services.LockWatcher + // HostCertificate is the SSH host certificate this in-memory server presents + // to the client. + HostCertificate ssh.Signer + // SrcAddr is the source address + SrcAddr net.Addr + // DstAddr is the destination address + DstAddr net.Addr + // HostUUID is the UUID of the underlying proxy that the forwarding server + // is running in. + HostUUID string + + // Ciphers is a list of ciphers that the server supports. If omitted, + // the defaults will be used. + Ciphers []string + // KEXAlgorithms is a list of key exchange (KEX) algorithms that the + // server supports. If omitted, the defaults will be used. + KEXAlgorithms []string + // MACAlgorithms is a list of message authentication codes (MAC) that + // the server supports. If omitted the defaults will be used. + MACAlgorithms []string + // FIPS mode means Teleport started in a FedRAMP/FIPS 140-2 compliant + // configuration. + FIPS bool + + // Clock is an optoinal clock to override default real time clock + Clock clockwork.Clock +} + +// CheckAndSetDefaults checks and sets default values for any missing fields. +func (c *ForwardServerConfig) CheckAndSetDefaults() error { + if c.TargetServer == nil { + return trace.BadParameter("missing parameter TargetServer") + } + if c.TargetConn == nil { + return trace.BadParameter("missing parameter TargetConn") + } + if c.AuthClient == nil { + return trace.BadParameter("missing parameter AuthClient") + } + if c.AccessPoint == nil { + return trace.BadParameter("missing parameter AccessPoint") + } + if c.Emitter == nil { + return trace.BadParameter("missing parameter Emitter") + } + if c.HostCertificate == nil { + return trace.BadParameter("missing parameter HostCertificate") + } + if c.ParentContext == nil { + return trace.BadParameter("missing parameter ParentContext") + } + if c.LockWatcher == nil { + return trace.BadParameter("missing parameter LockWatcher") + } + if c.SrcAddr == nil { + return trace.BadParameter("source address required to identify client") + } + if c.DstAddr == nil { + return trace.BadParameter("destination address required to identify client") + } + if c.Clock == nil { + c.Clock = clockwork.NewRealClock() + } + return nil +} + +// ForwardServer is an in-memory SSH server that forwards git commands to remote +// git-hosting services like "github.com". +type ForwardServer struct { + events.StreamEmitter + cfg *ForwardServerConfig + logger *slog.Logger + auth *srv.AuthHandlers + reply *sshutils.Reply + id string + + // serverConn is the server side of the pipe to the client connection. + serverConn net.Conn + // clientConn is the client side of the pipe to the client connection. + clientConn net.Conn + // remoteClient is the client connected to the git-hosting service. + remoteClient *tracessh.Client + + // verifyRemoteHost is a callback to verify remote host like "github.com". + // Can be overridden for tests. Defaults to verifyRemoteHost. + verifyRemoteHost ssh.HostKeyCallback + // makeRemoteSigner generates the client certificate for connecting to the + // remote server. Can be overridden for tests. Defaults to makeRemoteSigner. + makeRemoteSigner func(context.Context, *ForwardServerConfig, srv.IdentityContext) (ssh.Signer, error) +} + +// Dial returns the client connection of the pipe +func (s *ForwardServer) Dial() (net.Conn, error) { + return s.clientConn, nil +} + +// NewForwardServer creates a new in-memory SSH server that forwards git +// commands to remote git-hosting services like "github.com". +func NewForwardServer(cfg *ForwardServerConfig) (*ForwardServer, error) { + if err := cfg.CheckAndSetDefaults(); err != nil { + return nil, trace.Wrap(err) + } + + serverConn, clientConn, err := utils.DualPipeNetConn(cfg.SrcAddr, cfg.DstAddr) + if err != nil { + return nil, trace.Wrap(err) + } + + logger := slog.With(teleport.ComponentKey, teleport.ComponentForwardingGit, + "src_addr", cfg.SrcAddr.String(), + "dst_addr", cfg.DstAddr.String(), + ) + s := &ForwardServer{ + StreamEmitter: cfg.Emitter, + cfg: cfg, + serverConn: serverConn, + clientConn: clientConn, + logger: logger, + reply: sshutils.NewReply(logger), + id: uuid.NewString(), + verifyRemoteHost: verifyRemoteHost(cfg.TargetServer), + makeRemoteSigner: makeRemoteSigner, + } + // TODO(greedy52) extract common parts from srv.NewAuthHandlers like + // CreateIdentityContext and UserKeyAuth to a common package. + s.auth, err = srv.NewAuthHandlers(&srv.AuthHandlerConfig{ + Server: s, + Component: teleport.ComponentForwardingGit, + Emitter: s.cfg.Emitter, + AccessPoint: cfg.AccessPoint, + TargetServer: cfg.TargetServer, + FIPS: cfg.FIPS, + Clock: cfg.Clock, + }) + if err != nil { + return nil, trace.Wrap(err) + } + return s, nil + +} + +// Serve starts an SSH server that forwards git commands. +func (s *ForwardServer) Serve() { + defer s.close() + s.logger.DebugContext(s.cfg.ParentContext, "Starting forwarding git") + defer s.logger.DebugContext(s.cfg.ParentContext, "Finished forwarding git") + server, err := sshutils.NewServer( + teleport.ComponentForwardingGit, + utils.NetAddr{}, /* empty addr, this is one time use so no use for listener*/ + sshutils.NewChanHandlerFunc(s.onChannel), + sshutils.StaticHostSigners(s.cfg.HostCertificate), + sshutils.AuthMethods{ + PublicKey: s.userKeyAuth, + }, + sshutils.SetFIPS(s.cfg.FIPS), + sshutils.SetCiphers(s.cfg.Ciphers), + sshutils.SetKEXAlgorithms(s.cfg.KEXAlgorithms), + sshutils.SetMACAlgorithms(s.cfg.MACAlgorithms), + sshutils.SetClock(s.cfg.Clock), + sshutils.SetNewConnHandler(sshutils.NewConnHandlerFunc(s.onConnection)), + ) + if err != nil { + s.logger.ErrorContext(s.cfg.ParentContext, "Failed to create git forward server", "error", err) + return + } + server.HandleConnection(s.serverConn) +} + +func (s *ForwardServer) close() { + if err := s.serverConn.Close(); err != nil && !utils.IsOKNetworkError(err) { + s.logger.WarnContext(s.cfg.ParentContext, "Failed to close server conn", "error", err) + } + if err := s.clientConn.Close(); err != nil && !utils.IsOKNetworkError(err) { + s.logger.WarnContext(s.cfg.ParentContext, "Failed to close client conn", "error", err) + } + if err := s.cfg.TargetConn.Close(); err != nil && !utils.IsOKNetworkError(err) { + s.logger.WarnContext(s.cfg.ParentContext, "Failed to close target conn", "error", err) + } +} + +func (s *ForwardServer) userKeyAuth(conn ssh.ConnMetadata, key ssh.PublicKey) (*ssh.Permissions, error) { + cert, ok := key.(*ssh.Certificate) + if !ok { + return nil, trace.BadParameter("unsupported key type") + } + if len(cert.Extensions[teleport.CertExtensionGitHubUserID]) == 0 { + return nil, trace.BadParameter("missing GitHub user ID") + } + + // Verify incoming user is "git" and override it with any valid principle + // to bypass principle validation. + if conn.User() != gitUser { + return nil, trace.BadParameter("only git is expected as user for git connections") + } + if len(cert.ValidPrincipals) > 0 { + conn = sshutils.NewSSHConnMetadataWithUser(conn, cert.ValidPrincipals[0]) + } + + // Use auth.UserKeyAuth to verify user cert is signed by UserCA. + permissions, err := s.auth.UserKeyAuth(conn, key) + if err != nil { + return nil, trace.Wrap(err) + } + + // Check RBAC on the git server resource (aka s.cfg.TargetServer). + if err := s.checkUserAccess(cert); err != nil { + s.logger.ErrorContext(s.Context(), "Permission denied", + "error", err, + "local_addr", logutils.StringerAttr(conn.LocalAddr()), + "remote_addr", logutils.StringerAttr(conn.RemoteAddr()), + "key", key.Type(), + "fingerprint", sshutils.Fingerprint(key), + "user", cert.KeyId, + ) + return nil, trace.Wrap(err) + } + return permissions, nil +} + +func (s *ForwardServer) checkUserAccess(cert *ssh.Certificate) error { + clusterName, err := s.cfg.AccessPoint.GetClusterName() + if err != nil { + return trace.Wrap(err) + } + accessInfo, err := services.AccessInfoFromLocalCertificate(cert) + if err != nil { + return trace.Wrap(err) + } + accessChecker, err := services.NewAccessChecker(accessInfo, clusterName.GetClusterName(), s.cfg.AccessPoint) + if err != nil { + return trace.Wrap(err) + } + state, err := services.AccessStateFromSSHCertificate(s.Context(), cert, accessChecker, s.cfg.AccessPoint) + if err != nil { + return trace.Wrap(err) + } + return trace.Wrap(accessChecker.CheckAccess(s.cfg.TargetServer, state)) +} + +func (s *ForwardServer) onConnection(ctx context.Context, ccx *sshutils.ConnectionContext) (context.Context, error) { + s.logger.Log(ctx, logutils.TraceLevel, "Handling new connection") + + identityCtx, err := s.auth.CreateIdentityContext(ccx.ServerConn) + if err != nil { + return nil, trace.Wrap(err) + } + + if err := s.initRemoteConn(ctx, ccx, identityCtx); err != nil { + s.logger.DebugContext(ctx, "onConnection failed", "error", err) + return ctx, trace.Wrap(err) + } + + // TODO(greedy52) decouple from srv.NewServerContext. We only need + // connection monitoring. + _, serverCtx, err := srv.NewServerContext(ctx, ccx, s, identityCtx) + if err != nil { + return nil, trace.Wrap(err) + } + + s.logger.Log(ctx, logutils.TraceLevel, "New connection accepted") + ccx.AddCloser(serverCtx) + return context.WithValue(ctx, serverContextKey{}, serverCtx), nil +} + +func (s *ForwardServer) onChannel(ctx context.Context, ccx *sshutils.ConnectionContext, nch ssh.NewChannel) { + s.logger.DebugContext(ctx, "Handling channel request", "channel", nch.ChannelType()) + + serverCtx, ok := ctx.Value(serverContextKey{}).(*srv.ServerContext) + if !ok { + // This should not happen. Double check just in case. + s.reply.RejectChannel(ctx, nch, ssh.ResourceShortage, "server context not found") + return + } + + // Only expecting a session to execute a command. + if nch.ChannelType() != teleport.ChanSession { + s.reply.RejectUnknownChannel(ctx, nch) + return + } + + if s.remoteClient == nil { + s.reply.RejectWithNewRemoteSessionError(ctx, nch, trace.NotFound("missing remote client")) + return + } + remoteSession, err := s.remoteClient.NewSession(ctx) + if err != nil { + s.reply.RejectWithNewRemoteSessionError(ctx, nch, err) + return + } + defer remoteSession.Close() + + ch, in, err := nch.Accept() + if err != nil { + s.reply.RejectWithAcceptError(ctx, nch, err) + return + } + defer ch.Close() + + sctx := newSessionContext(serverCtx, ch, remoteSession) + for { + select { + case req := <-in: + if req == nil { + s.logger.DebugContext(ctx, "Client disconnected", "remote_addr", ccx.ServerConn.RemoteAddr()) + return + } + + ok, err := s.dispatch(ctx, sctx, req) + if err != nil { + s.reply.ReplyError(ctx, req, err) + return + } + s.reply.ReplyRequest(ctx, req, ok, nil) + + case execErr := <-sctx.waitExec: + code := sshutils.ExitCodeFromExecError(execErr) + s.logger.DebugContext(ctx, "Exec request complete", "code", code) + s.reply.SendExitStatus(ctx, ch, code) + return + + case <-ctx.Done(): + return + } + } +} + +type sessionContext struct { + *srv.ServerContext + + channel ssh.Channel + remoteSession *tracessh.Session + waitExec chan error +} + +func newSessionContext(serverCtx *srv.ServerContext, ch ssh.Channel, remoteSession *tracessh.Session) *sessionContext { + return &sessionContext{ + ServerContext: serverCtx, + channel: ch, + remoteSession: remoteSession, + waitExec: make(chan error, 1), + } +} + +// dispatch executes an incoming request. If successful, it returns the ok value +// for the reply. Otherwise, it returns the error it encountered. +func (s *ForwardServer) dispatch(ctx context.Context, sctx *sessionContext, req *ssh.Request) (bool, error) { + s.logger.DebugContext(ctx, "Dispatching client request", "request_type", req.Type) + + switch req.Type { + case tracessh.EnvsRequest: + s.logger.DebugContext(ctx, "Ignored request", "request_type", req.Type) + return true, nil + case sshutils.ExecRequest: + return true, trace.Wrap(s.handleExec(ctx, sctx, req)) + case sshutils.EnvRequest: + return true, trace.Wrap(s.handleEnv(ctx, sctx, req)) + default: + s.logger.WarnContext(ctx, "Received unsupported SSH request", "request_type", req.Type) + return false, nil + } +} + +// handleExec proxies the Git command between client and the target server. +func (s *ForwardServer) handleExec(ctx context.Context, sctx *sessionContext, req *ssh.Request) (err error) { + var r sshutils.ExecReq + defer func() { + if err != nil { + s.emitEvent(s.makeGitCommandEvent(sctx, r.Command, err)) + } + }() + + if err := ssh.Unmarshal(req.Payload, &r); err != nil { + return trace.Wrap(err, "failed to unmarshal exec request") + } + + command, err := ParseSSHCommand(r.Command) + if err != nil { + return trace.Wrap(err) + } + if err := checkSSHCommand(s.cfg.TargetServer, command); err != nil { + return trace.Wrap(err) + } + recorder := NewCommandRecorder(ctx, *command) + + sctx.remoteSession.Stdout = sctx.channel + sctx.remoteSession.Stderr = sctx.channel.Stderr() + remoteStdin, err := sctx.remoteSession.StdinPipe() + if err != nil { + return trace.Wrap(err, "failed to open remote session") + } + go func() { + defer remoteStdin.Close() + if _, err := io.Copy(io.MultiWriter(remoteStdin, recorder), sctx.channel); err != nil { + s.logger.WarnContext(ctx, "Failed to copy git command stdin", "error", err) + } + }() + + if err := sctx.remoteSession.Start(ctx, r.Command); err != nil { + return trace.Wrap(err, "failed to start git command") + } + + go func() { + execErr := sctx.remoteSession.Wait() + sctx.waitExec <- execErr + s.emitEvent(s.makeGitCommandEventWithExecResult(sctx, recorder, execErr)) + }() + return nil +} + +func (s *ForwardServer) emitEvent(event apievents.AuditEvent) { + if err := s.cfg.Emitter.EmitAuditEvent(s.cfg.ParentContext, event); err != nil { + s.logger.WarnContext(s.cfg.ParentContext, "Failed to emit event", + "error", err, + "event_type", event.GetType(), + "event_code", event.GetCode(), + ) + } +} + +func (s *ForwardServer) makeGitCommandEvent(sctx *sessionContext, command string, err error) *apievents.GitCommand { + event := &apievents.GitCommand{ + Metadata: apievents.Metadata{ + Type: events.GitCommandEvent, + Code: events.GitCommandCode, + }, + UserMetadata: sctx.Identity.GetUserMetadata(), + SessionMetadata: sctx.GetSessionMetadata(), + CommandMetadata: apievents.CommandMetadata{ + Command: command, + }, + ConnectionMetadata: apievents.ConnectionMetadata{ + RemoteAddr: sctx.ServerConn.RemoteAddr().String(), + LocalAddr: sctx.ServerConn.LocalAddr().String(), + }, + ServerMetadata: s.TargetMetadata(), + } + if err != nil { + event.Metadata.Code = events.GitCommandFailureCode + event.Error = err.Error() + } + return event +} + +func (s *ForwardServer) makeGitCommandEventWithExecResult(sctx *sessionContext, recorder CommandRecorder, execErr error) *apievents.GitCommand { + event := s.makeGitCommandEvent(sctx, recorder.GetCommand().SSHCommand, execErr) + + event.ExitCode = strconv.Itoa(sshutils.ExitCodeFromExecError(execErr)) + event.Path = string(recorder.GetCommand().Repository) + event.Service = recorder.GetCommand().Service + + actions, err := recorder.GetActions() + if err != nil { + s.logger.WarnContext(s.cfg.ParentContext, "Failed to get actions from Git command recorder. No actions will be recorded in the event.", "error", err) + } else { + event.Actions = actions + } + return event +} + +// handleEnv sets env on the target server. +func (s *ForwardServer) handleEnv(ctx context.Context, sctx *sessionContext, req *ssh.Request) error { + var e sshutils.EnvReqParams + if err := ssh.Unmarshal(req.Payload, &e); err != nil { + return trace.Wrap(err) + } + s.logger.DebugContext(ctx, "Setting env on remote Git server", "name", e.Name, "value", e.Value) + err := sctx.remoteSession.Setenv(ctx, e.Name, e.Value) + if err != nil { + s.logger.WarnContext(ctx, "Failed to set env on remote session", "error", err, "request", e) + } + return nil +} + +func (s *ForwardServer) initRemoteConn(ctx context.Context, ccx *sshutils.ConnectionContext, identityCtx srv.IdentityContext) error { + netConfig, err := s.cfg.AccessPoint.GetClusterNetworkingConfig(s.cfg.ParentContext) + if err != nil { + return trace.Wrap(err) + } + signer, err := s.makeRemoteSigner(ctx, s.cfg, identityCtx) + if err != nil { + return trace.Wrap(err) + } + clientConfig := &ssh.ClientConfig{ + User: gitUser, + Auth: []ssh.AuthMethod{ + ssh.PublicKeys(signer), + }, + HostKeyCallback: s.verifyRemoteHost, + Timeout: netConfig.GetSSHDialTimeout(), + } + clientConfig.Ciphers = s.cfg.Ciphers + clientConfig.KeyExchanges = s.cfg.KEXAlgorithms + clientConfig.MACs = s.cfg.MACAlgorithms + + s.remoteClient, err = tracessh.NewClientConnWithDeadline( + s.cfg.ParentContext, + s.cfg.TargetConn, + s.cfg.DstAddr.String(), + clientConfig, + ) + if err != nil { + return trace.Wrap(err) + } + ccx.AddCloser(s.remoteClient) + return nil +} + +func makeRemoteSigner(ctx context.Context, cfg *ForwardServerConfig, identityCtx srv.IdentityContext) (ssh.Signer, error) { + switch cfg.TargetServer.GetSubKind() { + case types.SubKindGitHub: + return MakeGitHubSigner(ctx, GitHubSignerConfig{ + Server: cfg.TargetServer, + TeleportUser: identityCtx.TeleportUser, + IdentityExpires: identityCtx.CertValidBefore, + GitHubUserID: identityCtx.Certificate.Extensions[teleport.CertExtensionGitHubUserID], + AuthPreferenceGetter: cfg.AccessPoint, + GitHubUserCertGenerator: cfg.AuthClient.IntegrationsClient(), + Clock: cfg.Clock, + }) + default: + return nil, trace.BadParameter("unsupported subkind %q", cfg.TargetServer.GetSubKind()) + } +} + +func verifyRemoteHost(targetServer types.Server) ssh.HostKeyCallback { + return func(hostname string, remote net.Addr, key ssh.PublicKey) error { + switch targetServer.GetSubKind() { + case types.SubKindGitHub: + return VerifyGitHubHostKey(hostname, remote, key) + default: + return trace.BadParameter("unsupported subkind %q", targetServer.GetSubKind()) + } + } +} + +// Below functions implement srv.Server so git.ForwardServer can be used for +// srv.NewServerContext and srv.NewAuthHandlers. +// TODO(greedy52) decouple from srv.Server. + +func (s *ForwardServer) Context() context.Context { + return s.cfg.ParentContext +} +func (s *ForwardServer) TargetMetadata() apievents.ServerMetadata { + return apievents.ServerMetadata{ + ServerVersion: teleport.Version, + ServerNamespace: s.cfg.TargetServer.GetNamespace(), + ServerAddr: s.cfg.DstAddr.String(), + ServerHostname: s.cfg.TargetServer.GetHostname(), + ForwardedBy: s.cfg.HostUUID, + ServerSubKind: s.cfg.TargetServer.GetSubKind(), + } +} +func (s *ForwardServer) GetInfo() types.Server { + return s.cfg.TargetServer +} +func (s *ForwardServer) ID() string { + return s.id +} +func (s *ForwardServer) HostUUID() string { + return s.cfg.HostUUID +} +func (s *ForwardServer) GetNamespace() string { + return s.cfg.TargetServer.GetNamespace() +} +func (s *ForwardServer) AdvertiseAddr() string { + return s.clientConn.RemoteAddr().String() +} +func (s *ForwardServer) Component() string { + return teleport.ComponentForwardingGit +} +func (s *ForwardServer) PermitUserEnvironment() bool { + return false +} +func (s *ForwardServer) GetAccessPoint() srv.AccessPoint { + return s.cfg.AccessPoint +} +func (s *ForwardServer) GetDataDir() string { + return "" +} +func (s *ForwardServer) GetPAM() (*servicecfg.PAMConfig, error) { + return nil, trace.NotImplemented("not supported for git forward server") +} +func (s *ForwardServer) GetClock() clockwork.Clock { + return s.cfg.Clock +} +func (s *ForwardServer) UseTunnel() bool { + return false +} +func (s *ForwardServer) GetBPF() bpf.BPF { + return nil +} +func (s *ForwardServer) GetUserAccountingPaths() (utmp, wtmp, btmp string) { + return +} +func (s *ForwardServer) GetLockWatcher() *services.LockWatcher { + return s.cfg.LockWatcher +} +func (s *ForwardServer) GetCreateHostUser() bool { + return false +} +func (s *ForwardServer) GetHostUsers() srv.HostUsers { + return nil +} +func (s *ForwardServer) GetHostSudoers() srv.HostSudoers { + return nil +} + +type serverContextKey struct{} + +const ( + gitUser = "git" +) diff --git a/lib/srv/git/forward_test.go b/lib/srv/git/forward_test.go new file mode 100644 index 0000000000000..6275be7841be5 --- /dev/null +++ b/lib/srv/git/forward_test.go @@ -0,0 +1,439 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package git + +import ( + "context" + "io" + "log/slog" + "net" + "os" + "testing" + "time" + + "github.com/gravitational/trace" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "golang.org/x/crypto/ssh" + + "github.com/gravitational/teleport/api/constants" + tracessh "github.com/gravitational/teleport/api/observability/tracing/ssh" + "github.com/gravitational/teleport/api/types" + apievents "github.com/gravitational/teleport/api/types/events" + "github.com/gravitational/teleport/api/types/wrappers" + apisshutils "github.com/gravitational/teleport/api/utils/sshutils" + "github.com/gravitational/teleport/lib/auth/authclient" + "github.com/gravitational/teleport/lib/auth/testauthority" + "github.com/gravitational/teleport/lib/backend/memory" + "github.com/gravitational/teleport/lib/cryptosuites" + libevents "github.com/gravitational/teleport/lib/events" + "github.com/gravitational/teleport/lib/events/eventstest" + "github.com/gravitational/teleport/lib/services" + "github.com/gravitational/teleport/lib/services/local" + "github.com/gravitational/teleport/lib/srv" + "github.com/gravitational/teleport/lib/sshca" + "github.com/gravitational/teleport/lib/sshutils" + "github.com/gravitational/teleport/lib/utils" +) + +func TestMain(m *testing.M) { + utils.InitLoggerForTests() + os.Exit(m.Run()) +} + +func TestForwardServer(t *testing.T) { + caSigner, err := apisshutils.MakeTestSSHCA() + require.NoError(t, err) + userCert := makeUserCert(t, caSigner) + + tests := []struct { + name string + allowedGitHubOrg string + clientLogin string + verifyRemoteHost ssh.HostKeyCallback + wantNewClientError bool + verifyWithClient func(t *testing.T, ctx context.Context, client *tracessh.Client, m *mockGitHostingService) + verifyEvent func(t *testing.T, event apievents.AuditEvent) + }{ + { + name: "success", + allowedGitHubOrg: "*", + clientLogin: "git", + verifyRemoteHost: ssh.InsecureIgnoreHostKey(), + wantNewClientError: false, + verifyWithClient: func(t *testing.T, ctx context.Context, client *tracessh.Client, m *mockGitHostingService) { + session, err := client.NewSession(ctx) + require.NoError(t, err) + defer session.Close() + + gitCommand := "git-upload-pack 'org/my-repo.git'" + session.Stderr = io.Discard + session.Stdout = io.Discard + err = session.Run(ctx, gitCommand) + require.NoError(t, err) + require.Equal(t, gitCommand, m.receivedExec.Command) + }, + verifyEvent: func(t *testing.T, event apievents.AuditEvent) { + gitEvent, ok := event.(*apievents.GitCommand) + require.True(t, ok) + assert.Equal(t, libevents.GitCommandEvent, gitEvent.Metadata.Type) + assert.Equal(t, libevents.GitCommandCode, gitEvent.Metadata.Code) + assert.Equal(t, "alice", gitEvent.User) + assert.Equal(t, "0", gitEvent.CommandMetadata.ExitCode) + assert.Equal(t, "git-upload-pack", gitEvent.Service) + assert.Equal(t, "org/my-repo.git", gitEvent.Path) + }, + }, + { + name: "command failure", + allowedGitHubOrg: "*", + clientLogin: "git", + verifyRemoteHost: ssh.InsecureIgnoreHostKey(), + wantNewClientError: false, + verifyWithClient: func(t *testing.T, ctx context.Context, client *tracessh.Client, m *mockGitHostingService) { + m.exitCode = 1 + + session, err := client.NewSession(ctx) + require.NoError(t, err) + defer session.Close() + + gitCommand := "git-receive-pack 'org/my-repo.git'" + session.Stderr = io.Discard + session.Stdout = io.Discard + require.Error(t, session.Run(ctx, gitCommand)) + }, + verifyEvent: func(t *testing.T, event apievents.AuditEvent) { + gitEvent, ok := event.(*apievents.GitCommand) + require.True(t, ok) + assert.Equal(t, libevents.GitCommandEvent, gitEvent.Metadata.Type) + assert.Equal(t, libevents.GitCommandFailureCode, gitEvent.Metadata.Code) + assert.Equal(t, "alice", gitEvent.User) + assert.Equal(t, "1", gitEvent.CommandMetadata.ExitCode) + assert.Equal(t, "git-receive-pack", gitEvent.Service) + assert.Equal(t, "org/my-repo.git", gitEvent.Path) + }, + }, + { + name: "failed RBAC", + allowedGitHubOrg: "no-org-allowed", + clientLogin: "git", + verifyRemoteHost: ssh.InsecureIgnoreHostKey(), + wantNewClientError: true, + }, + { + name: "failed client login check", + allowedGitHubOrg: "*", + clientLogin: "not-git", + verifyRemoteHost: ssh.InsecureIgnoreHostKey(), + wantNewClientError: true, + }, + { + name: "failed remote host check", + allowedGitHubOrg: "*", + clientLogin: "git", + verifyRemoteHost: func(string, net.Addr, ssh.PublicKey) error { + return trace.AccessDenied("fake a remote host check error") + }, + verifyWithClient: func(t *testing.T, ctx context.Context, client *tracessh.Client, m *mockGitHostingService) { + // Connection is accepted but anything following fails. + _, err := client.NewSession(ctx) + require.Error(t, err) + }, + }, + { + name: "invalid channel type", + allowedGitHubOrg: "*", + clientLogin: "git", + verifyRemoteHost: ssh.InsecureIgnoreHostKey(), + verifyWithClient: func(t *testing.T, ctx context.Context, client *tracessh.Client, m *mockGitHostingService) { + _, _, err := client.OpenChannel(ctx, "unknown", nil) + require.Error(t, err) + require.Contains(t, err.Error(), "unknown channel type") + }, + }, + { + name: "org mismatch", + allowedGitHubOrg: "*", + clientLogin: "git", + verifyRemoteHost: ssh.InsecureIgnoreHostKey(), + wantNewClientError: false, + verifyWithClient: func(t *testing.T, ctx context.Context, client *tracessh.Client, m *mockGitHostingService) { + session, err := client.NewSession(ctx) + require.NoError(t, err) + defer session.Close() + + gitCommand := "git-upload-pack 'some-other-org/my-repo.git'" + session.Stderr = io.Discard + session.Stdout = io.Discard + require.Error(t, session.Run(ctx, gitCommand)) + }, + verifyEvent: func(t *testing.T, event apievents.AuditEvent) { + gitEvent, ok := event.(*apievents.GitCommand) + require.True(t, ok) + assert.Equal(t, libevents.GitCommandEvent, gitEvent.Metadata.Type) + assert.Equal(t, libevents.GitCommandFailureCode, gitEvent.Metadata.Code) + assert.Equal(t, "alice", gitEvent.User) + assert.Contains(t, gitEvent.Error, "expect organization") + }, + }, + } + + for _, test := range tests { + test := test + t.Run(test.name, func(t *testing.T) { + t.Parallel() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + mockEmitter := &eventstest.MockRecorderEmitter{} + mockGitService := newMockGitHostingService(t, caSigner) + hostCert, err := apisshutils.MakeRealHostCert(caSigner) + require.NoError(t, err) + targetConn, err := net.Dial("tcp", mockGitService.Addr()) + require.NoError(t, err) + + s, err := NewForwardServer(&ForwardServerConfig{ + TargetServer: makeGitServer(t, "org"), + TargetConn: targetConn, + AuthClient: mockAuthClient{}, + AccessPoint: mockAccessPoint{ + ca: caSigner, + allowedGitHubOrg: test.allowedGitHubOrg, + }, + Emitter: mockEmitter, + HostCertificate: hostCert, + ParentContext: ctx, + LockWatcher: makeLockWatcher(t), + SrcAddr: utils.MustParseAddr("127.0.0.1:12345"), + DstAddr: utils.MustParseAddr("127.0.0.1:2222"), + }) + require.NoError(t, err) + + s.verifyRemoteHost = test.verifyRemoteHost + s.makeRemoteSigner = func(context.Context, *ForwardServerConfig, srv.IdentityContext) (ssh.Signer, error) { + // mock server does not validate this, just put whatever. + return userCert, nil + } + go s.Serve() + + clientDialConn, err := s.Dial() + require.NoError(t, err) + + conn, chCh, reqCh, err := ssh.NewClientConn( + clientDialConn, + "127.0.0.1:222", + &ssh.ClientConfig{ + User: test.clientLogin, + Auth: []ssh.AuthMethod{ + ssh.PublicKeys(userCert), + }, + HostKeyCallback: ssh.InsecureIgnoreHostKey(), + Timeout: 5 * time.Second, + }, + ) + if test.wantNewClientError { + require.Error(t, err) + return + } + require.NoError(t, err) + client := tracessh.NewClient(conn, chCh, reqCh) + defer client.Close() + + test.verifyWithClient(t, ctx, client, mockGitService) + if test.verifyEvent != nil { + // Server emits exec event after sending result to client. + require.EventuallyWithT(t, func(t *assert.CollectT) { + assert.NotNil(t, mockEmitter.LastEvent()) + }, time.Second*2, time.Millisecond*100, "Timeout waiting for audit event.") + test.verifyEvent(t, mockEmitter.LastEvent()) + } + }) + } + +} + +func makeUserCert(t *testing.T, caSigner ssh.Signer) ssh.Signer { + t.Helper() + keygen := testauthority.New() + clientPrivateKey, err := cryptosuites.GeneratePrivateKeyWithAlgorithm(cryptosuites.ECDSAP256) + require.NoError(t, err) + clientCertBytes, err := keygen.GenerateUserCert(sshca.UserCertificateRequest{ + CASigner: caSigner, + PublicUserKey: clientPrivateKey.MarshalSSHPublicKey(), + CertificateFormat: constants.CertificateFormatStandard, + Identity: sshca.Identity{ + Username: "alice", + AllowedLogins: []string{"does-not-matter"}, + GitHubUserID: "1234567", + Traits: wrappers.Traits{}, + Roles: []string{"editor"}, + }, + }) + require.NoError(t, err) + clientAuthorizedCert, _, _, _, err := ssh.ParseAuthorizedKey(clientCertBytes) + require.NoError(t, err) + clientSigner, err := apisshutils.SSHSigner(clientAuthorizedCert.(*ssh.Certificate), clientPrivateKey) + require.NoError(t, err) + return clientSigner +} + +func makeLockWatcher(t *testing.T) *services.LockWatcher { + t.Helper() + backend, err := memory.New(memory.Config{}) + require.NoError(t, err) + lockWatcher, err := services.NewLockWatcher(context.Background(), services.LockWatcherConfig{ + ResourceWatcherConfig: services.ResourceWatcherConfig{ + Component: "git.test", + Client: local.NewEventsService(backend), + }, + LockGetter: local.NewAccessService(backend), + }) + require.NoError(t, err) + return lockWatcher +} + +func makeGitServer(t *testing.T, org string) types.Server { + t.Helper() + server, err := types.NewGitHubServer(types.GitHubServerMetadata{ + Integration: org, + Organization: org, + }) + require.NoError(t, err) + return server +} + +type mockGitHostingService struct { + *sshutils.Server + *sshutils.Reply + receivedExec sshutils.ExecReq + exitCode int +} + +func newMockGitHostingService(t *testing.T, caSigner ssh.Signer) *mockGitHostingService { + t.Helper() + hostCert, err := apisshutils.MakeRealHostCert(caSigner) + require.NoError(t, err) + m := &mockGitHostingService{ + Reply: &sshutils.Reply{}, + } + server, err := sshutils.NewServer( + "git.test", + utils.NetAddr{AddrNetwork: "tcp", Addr: "localhost:0"}, + m, + sshutils.StaticHostSigners(hostCert), + sshutils.AuthMethods{NoClient: true}, + sshutils.SetNewConnHandler(m), + ) + require.NoError(t, err) + require.NoError(t, server.Start()) + t.Cleanup(func() { + server.Close() + }) + m.Server = server + return m +} +func (m *mockGitHostingService) HandleNewConn(ctx context.Context, ccx *sshutils.ConnectionContext) (context.Context, error) { + slog.DebugContext(ctx, "mock git service receives new connection") + return ctx, nil +} +func (m *mockGitHostingService) HandleNewChan(ctx context.Context, ccx *sshutils.ConnectionContext, nch ssh.NewChannel) { + slog.DebugContext(ctx, "mock git service receives new chan") + ch, in, err := nch.Accept() + if err != nil { + m.RejectWithAcceptError(ctx, nch, err) + return + } + defer ch.Close() + for { + select { + case req := <-in: + if req == nil { + return + } + + if err := ssh.Unmarshal(req.Payload, &m.receivedExec); err != nil { + m.ReplyError(ctx, req, err) + return + } + if req.WantReply { + m.ReplyRequest(ctx, req, true, nil) + } + slog.DebugContext(ctx, "mock git service receives new exec request", "req", m.receivedExec) + m.SendExitStatus(ctx, ch, m.exitCode) + return + + case <-ctx.Done(): + return + } + } +} + +type mockAuthClient struct { + authclient.ClientI +} + +type mockAccessPoint struct { + srv.AccessPoint + ca ssh.Signer + allowedGitHubOrg string +} + +func (m mockAccessPoint) GetClusterName(...services.MarshalOption) (types.ClusterName, error) { + return types.NewClusterName(types.ClusterNameSpecV2{ + ClusterName: "git.test", + ClusterID: "git.test", + }) +} +func (m mockAccessPoint) GetClusterNetworkingConfig(context.Context) (types.ClusterNetworkingConfig, error) { + return types.DefaultClusterNetworkingConfig(), nil +} +func (m mockAccessPoint) GetSessionRecordingConfig(context.Context) (types.SessionRecordingConfig, error) { + return types.DefaultSessionRecordingConfig(), nil +} +func (m mockAccessPoint) GetAuthPreference(context.Context) (types.AuthPreference, error) { + return types.DefaultAuthPreference(), nil +} +func (m mockAccessPoint) GetRole(_ context.Context, name string) (types.Role, error) { + return types.NewRole(name, types.RoleSpecV6{ + Allow: types.RoleConditions{ + GitHubPermissions: []types.GitHubPermission{{ + Organizations: []string{m.allowedGitHubOrg}, + }}, + }, + }) +} +func (m mockAccessPoint) GetCertAuthorities(_ context.Context, caType types.CertAuthType, _ bool) ([]types.CertAuthority, error) { + if m.ca == nil { + return nil, trace.NotFound("no certificate authority found") + } + ca, err := types.NewCertAuthority(types.CertAuthoritySpecV2{ + Type: caType, + ClusterName: "git.test", + ActiveKeys: types.CAKeySet{ + SSH: []*types.SSHKeyPair{{ + PublicKey: ssh.MarshalAuthorizedKey(m.ca.PublicKey()), + }}, + }, + }) + if err != nil { + return nil, trace.Wrap(err) + } + return []types.CertAuthority{ca}, nil +} diff --git a/lib/srv/git/github.go b/lib/srv/git/github.go new file mode 100644 index 0000000000000..416d47b356c5c --- /dev/null +++ b/lib/srv/git/github.go @@ -0,0 +1,160 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package git + +import ( + "context" + "net" + "slices" + "time" + + "github.com/gravitational/trace" + "github.com/jonboulle/clockwork" + "golang.org/x/crypto/ssh" + "google.golang.org/grpc" + "google.golang.org/protobuf/types/known/durationpb" + + integrationv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/cryptosuites" + "github.com/gravitational/teleport/lib/sshutils" +) + +// knownGithubDotComFingerprints contains a list of known GitHub fingerprints. +// +// https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/githubs-ssh-key-fingerprints +// +// TODO(greedy52) these fingerprints can change (e.g. GitHub changed its RSA +// key in 2023 because of an incident). Instead of hard-coding the values, we +// should try to periodically (e.g. once per day) poll them from the API. +var knownGithubDotComFingerprints = []string{ + "SHA256:uNiVztksCsDhcc0u9e8BujQXVUpKZIDTMczCvj3tD2s", + "SHA256:p2QAMXNIC1TJYWeIOttrVc98/R1BUFWu3/LiyKgUfQM", + "SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU", +} + +// VerifyGitHubHostKey is an ssh.HostKeyCallback that verifies the host key +// belongs to "github.com". +func VerifyGitHubHostKey(_ string, _ net.Addr, key ssh.PublicKey) error { + actualFingerprint := ssh.FingerprintSHA256(key) + if slices.Contains(knownGithubDotComFingerprints, actualFingerprint) { + return nil + } + return trace.BadParameter("cannot verify github.com: unknown fingerprint %v algo %v", actualFingerprint, key.Type()) +} + +// AuthPreferenceGetter is an interface for retrieving the current configured +// cluster auth preference. +type AuthPreferenceGetter interface { + // GetAuthPreference returns the current cluster auth preference. + GetAuthPreference(context.Context) (types.AuthPreference, error) +} + +// GitHubUserCertGenerator is an interface to generating user certs for +// connecting to GitHub. +type GitHubUserCertGenerator interface { + // GenerateGitHubUserCert signs an SSH certificate for GitHub integration. + GenerateGitHubUserCert(context.Context, *integrationv1.GenerateGitHubUserCertRequest, ...grpc.CallOption) (*integrationv1.GenerateGitHubUserCertResponse, error) +} + +// GitHubSignerConfig is the config for MakeGitHubSigner. +type GitHubSignerConfig struct { + // Server is the target Git server. + Server types.Server + // GitHubUserID is the ID of the GitHub user to impersonate. + GitHubUserID string + // TeleportUser is the Teleport username + TeleportUser string + // AuthPreferenceGetter is used to get auth preference. + AuthPreferenceGetter AuthPreferenceGetter + // GitHubUserCertGenerator generate + GitHubUserCertGenerator GitHubUserCertGenerator + // IdentityExpires is the time that the identity should expire. + IdentityExpires time.Time + // Clock is used to control time. + Clock clockwork.Clock +} + +func (c *GitHubSignerConfig) CheckAndSetDefaults() error { + if c.Server == nil { + return trace.BadParameter("missing target server") + } + if c.Server.GetGitHub() == nil { + return trace.BadParameter("missing GitHub spec") + } + if c.GitHubUserID == "" { + return trace.BadParameter("missing GitHubUserID") + } + if c.TeleportUser == "" { + return trace.BadParameter("missing TeleportUser") + } + if c.AuthPreferenceGetter == nil { + return trace.BadParameter("missing AuthPreferenceGetter") + } + if c.GitHubUserCertGenerator == nil { + return trace.BadParameter("missing GitHubUserCertGenerator") + } + if c.IdentityExpires.IsZero() { + return trace.BadParameter("missing IdentityExpires") + } + if c.Clock == nil { + c.Clock = clockwork.NewRealClock() + } + return nil +} + +func (c *GitHubSignerConfig) certTTL() time.Duration { + userTTL := c.IdentityExpires.Sub(c.Clock.Now()) + return min(userTTL, defaultGitHubUserCertTTL) +} + +// MakeGitHubSigner generates an ssh.Signer that can impersonate a GitHub user +// to connect to GitHub. +func MakeGitHubSigner(ctx context.Context, config GitHubSignerConfig) (ssh.Signer, error) { + if err := config.CheckAndSetDefaults(); err != nil { + return nil, trace.Wrap(err) + } + + algo, err := cryptosuites.AlgorithmForKey(ctx, + cryptosuites.GetCurrentSuiteFromAuthPreference(config.AuthPreferenceGetter), + cryptosuites.GitClient) + if err != nil { + return nil, trace.Wrap(err, "getting signing algorithm") + } + sshKey, err := cryptosuites.GeneratePrivateKeyWithAlgorithm(algo) + if err != nil { + return nil, trace.Wrap(err, "generating SSH key") + } + resp, err := config.GitHubUserCertGenerator.GenerateGitHubUserCert(ctx, &integrationv1.GenerateGitHubUserCertRequest{ + Integration: config.Server.GetGitHub().Integration, + PublicKey: sshKey.MarshalSSHPublicKey(), + UserId: config.GitHubUserID, + KeyId: config.TeleportUser, + Ttl: durationpb.New(config.certTTL()), + }) + if err != nil { + return nil, trace.Wrap(err) + } + + // TODO(greedy52) cache it for TTL. + signer, err := sshutils.NewSigner(sshKey.PrivateKeyPEM(), resp.AuthorizedKey) + return signer, trace.Wrap(err) +} + +const defaultGitHubUserCertTTL = 10 * time.Minute diff --git a/lib/srv/git/github_test.go b/lib/srv/git/github_test.go new file mode 100644 index 0000000000000..916c87afb17e9 --- /dev/null +++ b/lib/srv/git/github_test.go @@ -0,0 +1,145 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package git + +import ( + "context" + "crypto/rand" + "testing" + "time" + + "github.com/gravitational/trace" + "github.com/jonboulle/clockwork" + "github.com/stretchr/testify/require" + "golang.org/x/crypto/ssh" + "google.golang.org/grpc" + + integrationv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" + "github.com/gravitational/teleport/api/types" + apisshutils "github.com/gravitational/teleport/api/utils/sshutils" +) + +type fakeAuthPreferenceGetter struct { +} + +func (f fakeAuthPreferenceGetter) GetAuthPreference(context.Context) (types.AuthPreference, error) { + return types.DefaultAuthPreference(), nil +} + +type fakeGitHubUserCertGenerator struct { + clock clockwork.Clock + checkTTL time.Duration +} + +func (f fakeGitHubUserCertGenerator) GenerateGitHubUserCert(_ context.Context, input *integrationv1.GenerateGitHubUserCertRequest, _ ...grpc.CallOption) (*integrationv1.GenerateGitHubUserCertResponse, error) { + if f.checkTTL != 0 && f.checkTTL != input.Ttl.AsDuration() { + return nil, trace.CompareFailed("expect ttl %v but got %v", f.checkTTL, input.Ttl.AsDuration()) + } + + caSigner, err := apisshutils.MakeTestSSHCA() + if err != nil { + return nil, trace.Wrap(err) + } + pubKey, _, _, _, err := ssh.ParseAuthorizedKey(input.PublicKey) + if err != nil { + return nil, trace.Wrap(err) + } + cert := &ssh.Certificate{ + // we have to use key id to identify teleport user + KeyId: input.KeyId, + Key: pubKey, + ValidAfter: uint64(f.clock.Now().Add(-time.Minute).Unix()), + ValidBefore: uint64(f.clock.Now().Add(input.Ttl.AsDuration()).Unix()), + CertType: ssh.UserCert, + } + if err := cert.SignCert(rand.Reader, caSigner); err != nil { + return nil, trace.Wrap(err) + } + return &integrationv1.GenerateGitHubUserCertResponse{ + AuthorizedKey: ssh.MarshalAuthorizedKey(cert), + }, nil +} + +func TestMakeGitHubSigner(t *testing.T) { + clock := clockwork.NewFakeClock() + server := makeGitServer(t, "org") + + tests := []struct { + name string + config GitHubSignerConfig + checkError require.ErrorAssertionFunc + }{ + { + name: "success", + config: GitHubSignerConfig{ + Server: server, + GitHubUserID: "1234567", + TeleportUser: "alice", + AuthPreferenceGetter: fakeAuthPreferenceGetter{}, + GitHubUserCertGenerator: fakeGitHubUserCertGenerator{ + clock: clock, + checkTTL: defaultGitHubUserCertTTL, + }, + IdentityExpires: clock.Now().Add(time.Hour), + Clock: clock, + }, + checkError: require.NoError, + }, + { + name: "success short ttl", + config: GitHubSignerConfig{ + Server: server, + GitHubUserID: "1234567", + TeleportUser: "alice", + AuthPreferenceGetter: fakeAuthPreferenceGetter{}, + GitHubUserCertGenerator: fakeGitHubUserCertGenerator{ + clock: clock, + checkTTL: time.Minute, + }, + IdentityExpires: clock.Now().Add(time.Minute), + Clock: clock, + }, + checkError: require.NoError, + }, + { + name: "no GitHubUserID", + config: GitHubSignerConfig{ + Server: server, + TeleportUser: "alice", + AuthPreferenceGetter: fakeAuthPreferenceGetter{}, + GitHubUserCertGenerator: fakeGitHubUserCertGenerator{ + clock: clock, + checkTTL: time.Minute, + }, + IdentityExpires: clock.Now().Add(time.Minute), + Clock: clock, + }, + checkError: func(t require.TestingT, err error, i ...interface{}) { + require.True(t, trace.IsBadParameter(err), i...) + }, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + _, err := MakeGitHubSigner(context.Background(), test.config) + test.checkError(t, err) + }) + } +} diff --git a/lib/srv/regular/sshserver_test.go b/lib/srv/regular/sshserver_test.go index 87104def0c7c0..47e688e9fa7d1 100644 --- a/lib/srv/regular/sshserver_test.go +++ b/lib/srv/regular/sshserver_test.go @@ -1687,6 +1687,7 @@ func TestProxyRoundRobin(t *testing.T) { Log: logger, LockWatcher: lockWatcher, NodeWatcher: nodeWatcher, + GitServerWatcher: newGitServerWatcher(ctx, t, proxyClient), CertAuthorityWatcher: caWatcher, CircuitBreakerConfig: breaker.NoopBreakerConfig(), }) @@ -1826,6 +1827,7 @@ func TestProxyDirectAccess(t *testing.T) { Log: logger, LockWatcher: lockWatcher, NodeWatcher: nodeWatcher, + GitServerWatcher: newGitServerWatcher(ctx, t, proxyClient), CertAuthorityWatcher: caWatcher, CircuitBreakerConfig: breaker.NoopBreakerConfig(), }) @@ -2517,6 +2519,7 @@ func TestParseSubsystemRequest(t *testing.T) { Log: logrus.StandardLogger(), LockWatcher: lockWatcher, NodeWatcher: nodeWatcher, + GitServerWatcher: newGitServerWatcher(ctx, t, proxyClient), CertAuthorityWatcher: caWatcher, }) require.NoError(t, err) @@ -2781,6 +2784,7 @@ func TestIgnorePuTTYSimpleChannel(t *testing.T) { Log: logger, LockWatcher: lockWatcher, NodeWatcher: nodeWatcher, + GitServerWatcher: newGitServerWatcher(ctx, t, proxyClient), CertAuthorityWatcher: caWatcher, }) require.NoError(t, err) @@ -3121,6 +3125,19 @@ func newNodeWatcher(ctx context.Context, t *testing.T, client *authclient.Client return nodeWatcher } +func newGitServerWatcher(ctx context.Context, t *testing.T, client *authclient.Client) *services.GenericWatcher[types.Server, readonly.Server] { + watcher, err := services.NewGitServerWatcher(ctx, services.GitServerWatcherConfig{ + ResourceWatcherConfig: services.ResourceWatcherConfig{ + Component: "test", + Client: client, + }, + GitServerGetter: client.GitServerReadOnlyClient(), + }) + require.NoError(t, err) + t.Cleanup(watcher.Close) + return watcher +} + func newCertAuthorityWatcher(ctx context.Context, t *testing.T, client types.Events) *services.CertAuthorityWatcher { caWatcher, err := services.NewCertAuthorityWatcher(ctx, services.CertAuthorityWatcherConfig{ ResourceWatcherConfig: services.ResourceWatcherConfig{ @@ -3204,6 +3221,7 @@ func TestHostUserCreationProxy(t *testing.T) { Log: logger, LockWatcher: lockWatcher, NodeWatcher: nodeWatcher, + GitServerWatcher: newGitServerWatcher(ctx, t, proxyClient), CertAuthorityWatcher: caWatcher, CircuitBreakerConfig: breaker.NoopBreakerConfig(), }) diff --git a/lib/sshca/identity.go b/lib/sshca/identity.go index 0e988f244a830..762aa701c206c 100644 --- a/lib/sshca/identity.go +++ b/lib/sshca/identity.go @@ -112,6 +112,12 @@ type Identity struct { // DeviceCredentialID is the identifier for the credential used by the device // to authenticate itself. DeviceCredentialID string + // GitHubUserID indicates the GitHub user ID identified by the GitHub + // connector. + GitHubUserID string + // GitHubUserID indicates the GitHub username identified by the GitHub + // connector. + GitHubUsername string } // Check performs validation of certain fields in the identity. @@ -200,6 +206,12 @@ func (i *Identity) Encode(certFormat string) (*ssh.Certificate, error) { if credID := i.DeviceCredentialID; credID != "" { cert.Permissions.Extensions[teleport.CertExtensionDeviceCredentialID] = credID } + if i.GitHubUserID != "" { + cert.Permissions.Extensions[teleport.CertExtensionGitHubUserID] = i.GitHubUserID + } + if i.GitHubUsername != "" { + cert.Permissions.Extensions[teleport.CertExtensionGitHubUsername] = i.GitHubUsername + } if i.PinnedIP != "" { if cert.CriticalOptions == nil { @@ -329,6 +341,8 @@ func DecodeIdentity(cert *ssh.Certificate) (*Identity, error) { ident.DeviceID = takeValue(teleport.CertExtensionDeviceID) ident.DeviceAssetTag = takeValue(teleport.CertExtensionDeviceAssetTag) ident.DeviceCredentialID = takeValue(teleport.CertExtensionDeviceCredentialID) + ident.GitHubUserID = takeValue(teleport.CertExtensionGitHubUserID) + ident.GitHubUsername = takeValue(teleport.CertExtensionGitHubUsername) if v, ok := cert.CriticalOptions[teleport.CertCriticalOptionSourceAddress]; ok { parts := strings.Split(v, "/") diff --git a/lib/sshca/identity_test.go b/lib/sshca/identity_test.go index b7e4463ffc1e2..5c7c6db75b3e8 100644 --- a/lib/sshca/identity_test.go +++ b/lib/sshca/identity_test.go @@ -72,6 +72,8 @@ func TestIdentityConversion(t *testing.T) { DeviceID: "device", DeviceAssetTag: "asset", DeviceCredentialID: "cred", + GitHubUserID: "github", + GitHubUsername: "ghuser", } ignores := []string{ diff --git a/lib/sshutils/exec.go b/lib/sshutils/exec.go new file mode 100644 index 0000000000000..e8476121e86c7 --- /dev/null +++ b/lib/sshutils/exec.go @@ -0,0 +1,70 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package sshutils + +import ( + "context" + "errors" + "log/slog" + "syscall" + + "github.com/gravitational/teleport" +) + +// errorWithExitStatus defines an interface that provides an ExitStatus +// function to get the exit code of the process execution. +// +// This interface is introduced so ssh.ExitError can be mocked in unit test. +type errorWithExitStatus interface { + ExitStatus() int +} + +// execExitError defines an interface that provides a Sys function to get exit +// status from the process execution. +// +// This interface is introduced so exec.ExitError can be mocked in unit test. +type execExitError interface { + Sys() any +} + +// ExitCodeFromExecError extracts and returns the exit code from the +// error. +func ExitCodeFromExecError(err error) int { + // If no error occurred, return 0 (success). + if err == nil { + return teleport.RemoteCommandSuccess + } + + var execExitErr execExitError + var exitErr errorWithExitStatus + switch { + case errors.As(err, &execExitErr): + waitStatus, ok := execExitErr.Sys().(syscall.WaitStatus) + if !ok { + return teleport.RemoteCommandFailure + } + return waitStatus.ExitStatus() + case errors.As(err, &exitErr): + return exitErr.ExitStatus() + // An error occurred, but the type is unknown, return a generic 255 code. + default: + slog.DebugContext(context.Background(), "Unknown error returned when executing command", "error", err) + return teleport.RemoteCommandFailure + } +} diff --git a/lib/sshutils/exec_test.go b/lib/sshutils/exec_test.go new file mode 100644 index 0000000000000..fd24eac6a42c5 --- /dev/null +++ b/lib/sshutils/exec_test.go @@ -0,0 +1,98 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package sshutils + +import ( + "errors" + "os/exec" + "syscall" + "testing" + + "github.com/stretchr/testify/require" + "golang.org/x/crypto/ssh" + + "github.com/gravitational/teleport" +) + +type mockErrorWithExitStatus struct { +} + +func (e mockErrorWithExitStatus) ExitStatus() int { + return 2 +} +func (e mockErrorWithExitStatus) Error() string { + return "mockErrorWithExitStatus" +} + +type mockExecExitError struct { + sys any +} + +func (e mockExecExitError) Sys() any { + return e.sys +} +func (e mockExecExitError) Error() string { + return "mockExecExitError" +} + +func TestExitCodeFromExecError(t *testing.T) { + // These struct types cannot be mocked. Implementation uses interfaces + // instead of these types. Double check if these types satisfy the + // interfaces. + require.ErrorAs(t, &ssh.ExitError{}, new(errorWithExitStatus)) + require.ErrorAs(t, &exec.ExitError{}, new(execExitError)) + + tests := []struct { + name string + input error + want int + }{ + { + name: "success", + input: nil, + want: teleport.RemoteCommandSuccess, + }, + { + name: "exec exit error", + input: mockExecExitError{sys: syscall.WaitStatus(1 << 8)}, + want: 1, + }, + { + name: "exec exit error with unknown sys", + input: mockExecExitError{sys: "unknown"}, + want: teleport.RemoteCommandFailure, + }, + { + name: "ssh exit error", + input: mockErrorWithExitStatus{}, + want: 2, + }, + { + name: "unknown error", + input: errors.New("unknown error"), + want: teleport.RemoteCommandFailure, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + require.Equal(t, tt.want, ExitCodeFromExecError(tt.input)) + }) + } +} diff --git a/lib/sshutils/fingerprint.go b/lib/sshutils/fingerprint.go index bae36ae07857e..010dc6bb7b783 100644 --- a/lib/sshutils/fingerprint.go +++ b/lib/sshutils/fingerprint.go @@ -19,6 +19,8 @@ package sshutils import ( + "strings" + "github.com/gravitational/trace" "golang.org/x/crypto/ssh" ) @@ -47,3 +49,18 @@ func PrivateKeyFingerprint(keyBytes []byte) (string, error) { } return Fingerprint(signer.PublicKey()), nil } + +// fingerprintPrefix is the fingerprint prefix added by ssh.FingerprintSHA256. +const fingerprintPrefix = "SHA256:" + +func maybeAddPrefix(fingerprint string) string { + if !strings.HasPrefix(fingerprint, fingerprintPrefix) { + return fingerprintPrefix + fingerprint + } + return fingerprint +} + +// EqualFingerprints checks if two finger prints are equal. +func EqualFingerprints(a, b string) bool { + return strings.EqualFold(maybeAddPrefix(a), maybeAddPrefix(b)) +} diff --git a/lib/sshutils/fingerprint_test.go b/lib/sshutils/fingerprint_test.go new file mode 100644 index 0000000000000..a17878236008a --- /dev/null +++ b/lib/sshutils/fingerprint_test.go @@ -0,0 +1,64 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package sshutils + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestEqualFingerprints(t *testing.T) { + tests := []struct { + name string + a string + b string + check require.BoolAssertionFunc + }{ + { + name: "equal", + a: "SHA256:fingerprint", + b: "SHA256:fingerprint", + check: require.True, + }, + { + name: "not equal", + a: "SHA256:fingerprint", + b: "SHA256:fingerprint2", + check: require.False, + }, + { + name: "equal without prefix", + a: "SHA256:fingerprint", + b: "fingerprint", + check: require.True, + }, + { + name: "equal fold", + a: "FINGERPRINT", + b: "SHA256:fingerprint", + check: require.True, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + test.check(t, EqualFingerprints(test.a, test.b)) + }) + } +} diff --git a/lib/sshutils/mock.go b/lib/sshutils/mock_test.go similarity index 57% rename from lib/sshutils/mock.go rename to lib/sshutils/mock_test.go index 37cdc2b819f1b..43cfe4c543eb9 100644 --- a/lib/sshutils/mock.go +++ b/lib/sshutils/mock_test.go @@ -22,6 +22,7 @@ import ( "errors" "io" + "github.com/stretchr/testify/mock" "golang.org/x/crypto/ssh" ) @@ -67,3 +68,55 @@ type mockSSHConn struct { func (mc *mockSSHConn) OpenChannel(name string, data []byte) (ssh.Channel, <-chan *ssh.Request, error) { return mc.mockChan, make(<-chan *ssh.Request), nil } + +type mockSSHNewChannel struct { + mock.Mock + ssh.NewChannel +} + +func newMockSSHNewChannel(channelType string) *mockSSHNewChannel { + m := new(mockSSHNewChannel) + m.On("ChannelType").Return(channelType) + m.On("Reject", mock.Anything, mock.Anything).Return(nil) + return m +} + +func (m *mockSSHNewChannel) ChannelType() string { + return m.Called().String(0) +} + +func (m *mockSSHNewChannel) Reject(reason ssh.RejectionReason, message string) error { + args := m.Called(reason, message) + return args.Error(0) +} + +type mockSSHChannel struct { + mock.Mock + ssh.Channel +} + +func newMockSSHChannel() *mockSSHChannel { + m := new(mockSSHChannel) + m.On("SendRequest", mock.Anything, mock.Anything, mock.Anything).Return(false, nil) + return m +} + +func (m *mockSSHChannel) SendRequest(name string, wantReply bool, payload []byte) (bool, error) { + args := m.Called(name, wantReply, payload) + return args.Bool(0), args.Error(1) +} + +type mockSSHRequest struct { + mock.Mock +} + +func newMockSSHRequest() *mockSSHRequest { + m := new(mockSSHRequest) + m.On("Reply", mock.Anything, mock.Anything).Return(nil) + return m +} + +func (m *mockSSHRequest) Reply(ok bool, payload []byte) error { + args := m.Called(ok, payload) + return args.Error(0) +} diff --git a/lib/sshutils/reply.go b/lib/sshutils/reply.go new file mode 100644 index 0000000000000..a96d66efd79f8 --- /dev/null +++ b/lib/sshutils/reply.go @@ -0,0 +1,106 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package sshutils + +import ( + "context" + "errors" + "fmt" + "log/slog" + + "golang.org/x/crypto/ssh" +) + +// SSHRequest defines an interface for ssh.Request. +type SSHRequest interface { + // Reply sends a response to a request. + Reply(ok bool, payload []byte) error +} + +func sshRequestType(r SSHRequest) string { + if sshReq, ok := r.(*ssh.Request); ok { + return sshReq.Type + } + return "unknown" +} + +// Reply is a helper to handle replying/rejecting and log messages when needed. +type Reply struct { + log *slog.Logger +} + +// NewReply creates a new reply helper for SSH servers. +func NewReply(log *slog.Logger) *Reply { + return &Reply{log: log} +} + +// RejectChannel rejects the channel with provided message. +func (r *Reply) RejectChannel(ctx context.Context, nch ssh.NewChannel, reason ssh.RejectionReason, msg string) { + if err := nch.Reject(reason, msg); err != nil { + r.log.WarnContext(ctx, "Failed to reject channel", "error", err) + } +} + +// RejectUnknownChannel rejects the channel with reason ssh.UnknownChannelType. +func (r *Reply) RejectUnknownChannel(ctx context.Context, nch ssh.NewChannel) { + channelType := nch.ChannelType() + r.log.WarnContext(ctx, "Unknown channel type", "channel", channelType) + r.RejectChannel(ctx, nch, ssh.UnknownChannelType, fmt.Sprintf("unknown channel type: %v", channelType)) +} + +// RejectWithAcceptError rejects the channel when ssh.NewChannel.Accept fails. +func (r *Reply) RejectWithAcceptError(ctx context.Context, nch ssh.NewChannel, err error) { + r.log.WarnContext(ctx, "Unable to accept channel", "channel", nch.ChannelType(), "error", err) + r.RejectChannel(ctx, nch, ssh.ConnectionFailed, fmt.Sprintf("unable to accept channel: %v", err)) +} + +// RejectWithNewRemoteSessionError rejects the channel when the corresponding +// remote session fails to create. +func (r *Reply) RejectWithNewRemoteSessionError(ctx context.Context, nch ssh.NewChannel, remoteError error) { + r.log.WarnContext(ctx, "Remote session open failed", "error", remoteError) + reason, msg := ssh.ConnectionFailed, fmt.Sprintf("remote session open failed: %v", remoteError) + var e *ssh.OpenChannelError + if errors.As(remoteError, &e) { + reason, msg = e.Reason, e.Message + } + r.RejectChannel(ctx, nch, reason, msg) +} + +// ReplyError replies an error to an ssh.Request. +func (r *Reply) ReplyError(ctx context.Context, req SSHRequest, err error) { + r.log.WarnContext(ctx, "failure handling SSH request", "request_type", sshRequestType(req), "error", err) + if err := req.Reply(false, []byte(err.Error())); err != nil { + r.log.WarnContext(ctx, "failed sending error Reply on SSH channel", "error", err) + } +} + +// ReplyRequest replies to an ssh.Request with provided ok and payload. +func (r *Reply) ReplyRequest(ctx context.Context, req SSHRequest, ok bool, payload []byte) { + if err := req.Reply(ok, payload); err != nil { + r.log.WarnContext(ctx, "failed replying OK to SSH request", "request_type", sshRequestType(req), "error", err) + } +} + +// SendExitStatus sends an exit-status. +func (r *Reply) SendExitStatus(ctx context.Context, ch ssh.Channel, code int) { + _, err := ch.SendRequest("exit-status", false, ssh.Marshal(struct{ C uint32 }{C: uint32(code)})) + if err != nil { + r.log.InfoContext(ctx, "Failed to send exit status", "error", err) + } +} diff --git a/lib/sshutils/reply_test.go b/lib/sshutils/reply_test.go new file mode 100644 index 0000000000000..68427142dbffc --- /dev/null +++ b/lib/sshutils/reply_test.go @@ -0,0 +1,93 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package sshutils + +import ( + "context" + "errors" + "log/slog" + "testing" + + "golang.org/x/crypto/ssh" + + "github.com/gravitational/teleport" +) + +func TestReply(t *testing.T) { + r := NewReply(slog.With(teleport.Component, "test")) + + t.Run("RejectChannel", func(t *testing.T) { + m := newMockSSHNewChannel("session") + r.RejectChannel(context.Background(), m, ssh.ResourceShortage, "test error") + m.AssertCalled(t, "Reject", ssh.ResourceShortage, "test error") + }) + + t.Run("RejectUnknownChannel", func(t *testing.T) { + m := newMockSSHNewChannel("unknown_channel") + r.RejectUnknownChannel(context.Background(), m) + m.AssertCalled(t, "Reject", ssh.UnknownChannelType, "unknown channel type: unknown_channel") + }) + + t.Run("RejectWithAcceptError", func(t *testing.T) { + m := newMockSSHNewChannel("session") + r.RejectWithAcceptError(context.Background(), m, errors.New("test error")) + m.AssertCalled(t, "Reject", ssh.ConnectionFailed, "unable to accept channel: test error") + }) + + t.Run("RejectWithNewRemoteSessionError", func(t *testing.T) { + t.Run("internal error", func(t *testing.T) { + m := newMockSSHNewChannel("session") + r.RejectWithNewRemoteSessionError(context.Background(), m, errors.New("test error")) + m.AssertCalled(t, "Reject", ssh.ConnectionFailed, "remote session open failed: test error") + }) + t.Run("remote error", func(t *testing.T) { + m := newMockSSHNewChannel("session") + r.RejectWithNewRemoteSessionError(context.Background(), m, &ssh.OpenChannelError{ + Reason: ssh.ResourceShortage, + Message: "test error", + }) + m.AssertCalled(t, "Reject", ssh.ResourceShortage, "test error") + }) + }) + + t.Run("ReplyError", func(t *testing.T) { + m := newMockSSHRequest() + r.ReplyError(context.Background(), m, errors.New("test error")) + m.AssertCalled(t, "Reply", false, []byte("test error")) + }) + + t.Run("ReplyRequest", func(t *testing.T) { + t.Run("ok true", func(t *testing.T) { + m := newMockSSHRequest() + r.ReplyRequest(context.Background(), m, true, []byte("ok true")) + m.AssertCalled(t, "Reply", true, []byte("ok true")) + }) + t.Run("ok false", func(t *testing.T) { + m := newMockSSHRequest() + r.ReplyRequest(context.Background(), m, false, []byte("ok false")) + m.AssertCalled(t, "Reply", false, []byte("ok false")) + }) + }) + + t.Run("SendExitStatus", func(t *testing.T) { + m := newMockSSHChannel() + r.SendExitStatus(context.Background(), m, 1) + m.AssertCalled(t, "SendRequest", "exit-status", false, []byte{0, 0, 0, 1}) + }) +} diff --git a/lib/sshutils/server.go b/lib/sshutils/server.go index fb1a431105aa6..6b5c848fca184 100644 --- a/lib/sshutils/server.go +++ b/lib/sshutils/server.go @@ -713,6 +713,13 @@ type NewConnHandler interface { HandleNewConn(ctx context.Context, ccx *ConnectionContext) (context.Context, error) } +// NewConnHandlerFunc wraps a function to satisfy NewConnHandler interface. +type NewConnHandlerFunc func(ctx context.Context, ccx *ConnectionContext) (context.Context, error) + +func (f NewConnHandlerFunc) HandleNewConn(ctx context.Context, ccx *ConnectionContext) (context.Context, error) { + return f(ctx, ccx) +} + type AuthMethods struct { PublicKey PublicKeyFunc Password PasswordFunc diff --git a/lib/sshutils/utils.go b/lib/sshutils/utils.go index 5f08a40748fbe..7dcd762629e74 100644 --- a/lib/sshutils/utils.go +++ b/lib/sshutils/utils.go @@ -23,6 +23,7 @@ import ( "strconv" "github.com/gravitational/trace" + "golang.org/x/crypto/ssh" "github.com/gravitational/teleport/lib/utils" ) @@ -42,3 +43,22 @@ func SplitHostPort(addrString string) (string, uint32, error) { } return addr.Host(), uint32(addr.Port(0)), nil } + +// SSHConnMetadataWithUser overrides an ssh.ConnMetadata with provided user. +type SSHConnMetadataWithUser struct { + ssh.ConnMetadata + user string +} + +// NewSSHConnMetadataWithUser overrides an ssh.ConnMetadata with provided user. +func NewSSHConnMetadataWithUser(conn ssh.ConnMetadata, user string) SSHConnMetadataWithUser { + return SSHConnMetadataWithUser{ + ConnMetadata: conn, + user: user, + } +} + +// User returns the user ID for this connection. +func (s SSHConnMetadataWithUser) User() string { + return s.user +} diff --git a/lib/web/apiserver_test.go b/lib/web/apiserver_test.go index 599eba51bff8f..5d3b89d8f2d51 100644 --- a/lib/web/apiserver_test.go +++ b/lib/web/apiserver_test.go @@ -400,6 +400,16 @@ func newWebSuiteWithConfig(t *testing.T, cfg webSuiteConfig) *WebSuite { require.NoError(t, err) defer caWatcher.Close() + proxyGitServerWatcher, err := services.NewGitServerWatcher(ctx, services.GitServerWatcherConfig{ + ResourceWatcherConfig: services.ResourceWatcherConfig{ + Component: teleport.ComponentProxy, + Client: s.proxyClient, + }, + GitServerGetter: s.proxyClient.GitServerReadOnlyClient(), + }) + require.NoError(t, err) + t.Cleanup(proxyGitServerWatcher.Close) + revTunServer, err := reversetunnel.NewServer(reversetunnel.Config{ ID: node.ID(), Listener: revTunListener, @@ -415,6 +425,7 @@ func newWebSuiteWithConfig(t *testing.T, cfg webSuiteConfig) *WebSuite { DataDir: t.TempDir(), LockWatcher: proxyLockWatcher, NodeWatcher: proxyNodeWatcher, + GitServerWatcher: proxyGitServerWatcher, CertAuthorityWatcher: caWatcher, CircuitBreakerConfig: breaker.NoopBreakerConfig(), LocalAuthAddresses: []string{s.server.TLS.Listener.Addr().String()}, @@ -8305,6 +8316,16 @@ func createProxy(ctx context.Context, t *testing.T, proxyID string, node *regula require.NoError(t, err) t.Cleanup(proxyNodeWatcher.Close) + proxyGitServerWatcher, err := services.NewGitServerWatcher(ctx, services.GitServerWatcherConfig{ + ResourceWatcherConfig: services.ResourceWatcherConfig{ + Component: teleport.ComponentProxy, + Client: client, + }, + GitServerGetter: client.GitServerReadOnlyClient(), + }) + require.NoError(t, err) + t.Cleanup(proxyGitServerWatcher.Close) + revTunServer, err := reversetunnel.NewServer(reversetunnel.Config{ ID: node.ID(), Listener: revTunListener, @@ -8320,6 +8341,7 @@ func createProxy(ctx context.Context, t *testing.T, proxyID string, node *regula DataDir: t.TempDir(), LockWatcher: proxyLockWatcher, NodeWatcher: proxyNodeWatcher, + GitServerWatcher: proxyGitServerWatcher, CertAuthorityWatcher: proxyCAWatcher, CircuitBreakerConfig: breaker.NoopBreakerConfig(), LocalAuthAddresses: []string{authServer.Listener.Addr().String()}, diff --git a/lib/web/ui/integration.go b/lib/web/ui/integration.go index 40a8689d97a22..ce8f527a8cbd5 100644 --- a/lib/web/ui/integration.go +++ b/lib/web/ui/integration.go @@ -49,6 +49,11 @@ type IntegrationAWSOIDCSpec struct { Audience string `json:"audience,omitempty"` } +// IntegrationGitHub contains the specific fields for the `github` subkind integration. +type IntegrationGitHub struct { + Organization string `json:"organization"` +} + // CheckAndSetDefaults for the aws oidc integration spec. func (r *IntegrationAWSOIDCSpec) CheckAndSetDefaults() error { if r.RoleARN == "" { @@ -129,6 +134,8 @@ type Integration struct { SubKind string `json:"subKind,omitempty"` // AWSOIDC contains the fields for `aws-oidc` subkind integration. AWSOIDC *IntegrationAWSOIDCSpec `json:"awsoidc,omitempty"` + // GitHub contains the fields for `github` subkind integration. + GitHub *IntegrationGitHub `json:"github,omitempty"` } // CheckAndSetDefaults for the create request. @@ -148,6 +155,16 @@ func (r *Integration) CheckAndSetDefaults() error { } } + switch r.SubKind { + case types.IntegrationSubKindGitHub: + if r.GitHub == nil { + return trace.BadParameter("missing spec for GitHub integrations") + } + if err := types.ValidateGitHubOrganizationName(r.GitHub.Organization); err != nil { + return trace.Wrap(err) + } + } + return nil } @@ -220,6 +237,14 @@ func MakeIntegration(ig types.Integration) (*Integration, error) { IssuerS3Prefix: s3Prefix, Audience: ig.GetAWSOIDCIntegrationSpec().Audience, } + case types.IntegrationSubKindGitHub: + spec := ig.GetGitHubIntegrationSpec() + if spec == nil { + return nil, trace.BadParameter("missing spec for GitHub integrations") + } + ret.GitHub = &IntegrationGitHub{ + Organization: spec.Organization, + } } return ret, nil diff --git a/lib/web/ui/integration_test.go b/lib/web/ui/integration_test.go new file mode 100644 index 0000000000000..f10594a028489 --- /dev/null +++ b/lib/web/ui/integration_test.go @@ -0,0 +1,84 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package ui + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/api/types" +) + +func TestMakeIntegration(t *testing.T) { + oidcIntegration, err := types.NewIntegrationAWSOIDC( + types.Metadata{ + Name: "aws-oidc", + }, + &types.AWSOIDCIntegrationSpecV1{ + RoleARN: "arn:aws:iam::123456789012:role/OidcRole", + }, + ) + require.NoError(t, err) + + githubIntegration, err := types.NewIntegrationGitHub( + types.Metadata{ + Name: "github-my-org", + }, + &types.GitHubIntegrationSpecV1{ + Organization: "my-org", + }, + ) + require.NoError(t, err) + + testCases := []struct { + integration types.Integration + want Integration + }{ + { + integration: oidcIntegration, + want: Integration{ + Name: "aws-oidc", + SubKind: types.IntegrationSubKindAWSOIDC, + AWSOIDC: &IntegrationAWSOIDCSpec{ + RoleARN: "arn:aws:iam::123456789012:role/OidcRole", + }, + }, + }, + { + integration: githubIntegration, + want: Integration{ + Name: "github-my-org", + SubKind: types.IntegrationSubKindGitHub, + GitHub: &IntegrationGitHub{ + Organization: "my-org", + }, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.integration.GetName(), func(t *testing.T) { + actual, err := MakeIntegration(tc.integration) + require.NoError(t, err) + require.NotNil(t, actual) + require.Equal(t, tc.want, *actual) + }) + } +} diff --git a/tool/tctl/common/auth_command.go b/tool/tctl/common/auth_command.go index 77678e0fa6013..8800f3aca7f72 100644 --- a/tool/tctl/common/auth_command.go +++ b/tool/tctl/common/auth_command.go @@ -96,6 +96,7 @@ type AuthCommand struct { caType string streamTarfile bool identityWriter identityfile.ConfigWriter + integration string authRotate authRotateCommand @@ -121,6 +122,7 @@ func (a *AuthCommand) Initialize(app *kingpin.Application, _ *tctlcfg.GlobalCLIF a.authExport.Flag("type", fmt.Sprintf("export certificate type (%v)", strings.Join(allowedCertificateTypes, ", "))). EnumVar(&a.authType, allowedCertificateTypes...) + a.authExport.Flag("integration", "Name of the integration. Only applies to \"github\" CAs.").StringVar(&a.integration) a.authGenerate = auth.Command("gen", "Generate a new SSH keypair.").Hidden() a.authGenerate.Flag("pub-key", "path to the public key").Required().StringVar(&a.genPubPath) @@ -215,6 +217,7 @@ var allowedCertificateTypes = []string{ "db-client-der", "openssh", "saml-idp", + "github", } // allowedCRLCertificateTypes list of certificate authorities types that can @@ -242,6 +245,7 @@ func (a *AuthCommand) ExportAuthorities(ctx context.Context, clt authCommandClie AuthType: a.authType, ExportAuthorityFingerprint: a.exportAuthorityFingerprint, UseCompatVersion: a.compatVersion == "1.0", + Integration: a.integration, }, ) if err != nil { diff --git a/tool/tctl/common/resource_command.go b/tool/tctl/common/resource_command.go index e0fcdb3ddbea5..0f3d097dbe1f7 100644 --- a/tool/tctl/common/resource_command.go +++ b/tool/tctl/common/resource_command.go @@ -179,6 +179,7 @@ func (rc *ResourceCommand) Initialize(app *kingpin.Application, _ *tctlcfg.Globa types.KindUserTask: rc.createUserTask, types.KindAutoUpdateConfig: rc.createAutoUpdateConfig, types.KindAutoUpdateVersion: rc.createAutoUpdateVersion, + types.KindGitServer: rc.createGitServer, } rc.UpdateHandlers = map[ResourceKind]ResourceCreateHandler{ types.KindUser: rc.updateUser, @@ -199,6 +200,7 @@ func (rc *ResourceCommand) Initialize(app *kingpin.Application, _ *tctlcfg.Globa types.KindAutoUpdateConfig: rc.updateAutoUpdateConfig, types.KindAutoUpdateVersion: rc.updateAutoUpdateVersion, types.KindDynamicWindowsDesktop: rc.updateDynamicWindowsDesktop, + types.KindGitServer: rc.updateGitServer, } rc.config = config @@ -1470,6 +1472,8 @@ func (rc *ResourceCommand) createIntegration(ctx context.Context, client *authcl switch integration.GetSubKind() { case types.IntegrationSubKindAWSOIDC: existingIntegration.SetAWSOIDCIntegrationSpec(integration.GetAWSOIDCIntegrationSpec()) + case types.IntegrationSubKindGitHub: + existingIntegration.SetGitHubIntegrationSpec(integration.GetGitHubIntegrationSpec()) default: return trace.BadParameter("subkind %q is not supported", integration.GetSubKind()) } @@ -2023,6 +2027,11 @@ func (rc *ResourceCommand) Delete(ctx context.Context, client *authclient.Client return trace.Wrap(err) } fmt.Printf("static host user %q has been deleted\n", rc.ref.Name) + case types.KindGitServer: + if err := client.GitServerClient().DeleteGitServer(ctx, rc.ref.Name); err != nil { + return trace.Wrap(err) + } + fmt.Printf("git_server %q has been deleted\n", rc.ref.Name) case types.KindAutoUpdateConfig: if err := client.DeleteAutoUpdateConfig(ctx); err != nil { return trace.Wrap(err) @@ -3300,6 +3309,31 @@ func (rc *ResourceCommand) getCollection(ctx context.Context, client *authclient nextToken = token } return &accessMonitoringRuleCollection{items: rules}, nil + case types.KindGitServer: + var page, servers []types.Server + + // TODO(greedy52) use unified resource request once available. + if rc.ref.Name != "" { + server, err := client.GitServerClient().GetGitServer(ctx, rc.ref.Name) + if err != nil { + return nil, trace.Wrap(err) + } + return &serverCollection{servers: append(servers, server)}, nil + } + var err error + var token string + for { + page, token, err = client.GitServerClient().ListGitServers(ctx, 0, token) + if err != nil { + return nil, trace.Wrap(err) + } + servers = append(servers, page...) + if token == "" { + break + } + } + // TODO(greedy52) consider making dedicated git server collection. + return &serverCollection{servers: servers}, nil } return nil, trace.BadParameter("getting %q is not supported", rc.ref.String()) } @@ -3712,3 +3746,32 @@ func (rc *ResourceCommand) updateAutoUpdateVersion(ctx context.Context, client * fmt.Println("autoupdate_version has been updated") return nil } + +func (rc *ResourceCommand) createGitServer(ctx context.Context, client *authclient.Client, raw services.UnknownResource) error { + server, err := services.UnmarshalGitServer(raw.Raw) + if err != nil { + return trace.Wrap(err) + } + if rc.IsForced() { + _, err = client.GitServerClient().UpsertGitServer(ctx, server) + } else { + _, err = client.GitServerClient().CreateGitServer(ctx, server) + } + if err != nil { + return trace.Wrap(err) + } + fmt.Printf("git server %q has been created\n", server.GetName()) + return nil +} +func (rc *ResourceCommand) updateGitServer(ctx context.Context, client *authclient.Client, raw services.UnknownResource) error { + server, err := services.UnmarshalGitServer(raw.Raw) + if err != nil { + return trace.Wrap(err) + } + _, err = client.GitServerClient().UpdateGitServer(ctx, server) + if err != nil { + return trace.Wrap(err) + } + fmt.Printf("git server %q has been updated\n", server.GetName()) + return nil +} diff --git a/tool/tsh/common/git.go b/tool/tsh/common/git.go new file mode 100644 index 0000000000000..990ddb8f22fc7 --- /dev/null +++ b/tool/tsh/common/git.go @@ -0,0 +1,146 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package common + +import ( + "bytes" + "io" + "os/exec" + "strings" + + "github.com/alecthomas/kingpin/v2" + "github.com/go-git/go-git/v5/plumbing/transport" + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/types" +) + +type gitCommands struct { + list *gitListCommand + login *gitLoginCommand + ssh *gitSSHCommand + config *gitConfigCommand + clone *gitCloneCommand +} + +func newGitCommands(app *kingpin.Application) gitCommands { + git := app.Command("git", "Git server commands.") + cmds := gitCommands{ + login: newGitLoginCommand(git), + list: newGitListCommand(git), + ssh: newGitSSHCommand(git), + config: newGitConfigCommand(git), + clone: newGitCloneCommand(git), + } + + // TODO(greedy52) hide the commands until all basic features are implemented. + git.Hidden() + cmds.login.Hidden() + cmds.list.Hidden() + cmds.config.Hidden() + cmds.clone.Hidden() + return cmds +} + +type gitSSHURL transport.Endpoint + +func (g gitSSHURL) check() error { + switch { + case g.isGitHub(): + if err := types.ValidateGitHubOrganizationName(g.owner()); err != nil { + return trace.Wrap(err) + } + } + return nil +} + +func (g gitSSHURL) isGitHub() bool { + return g.Host == "github.com" +} + +// owner returns the first part of the path. If the path does not have an owner, +// an empty string is returned. +// +// For GitHub, owner is either the user or the organization that owns the repo. +// +// For example, if the SSH url is git@github.com:gravitational/teleport.git, the +// owner would be "gravitational". +func (g gitSSHURL) owner() string { + // g.Path may have a preceding "/" from url.Parse. + owner, _, ok := strings.Cut(strings.TrimPrefix(g.Path, "/"), "/") + if !ok { + return "" + } + return owner +} + +// parseGitSSHURL parse a Git SSH URL. +// +// Git URL Spec: +// - spec: https://git-scm.com/docs/git-clone#_git_urls +// - example: ssh://example.org/path/to/repo.git +// +// GitHub (SCP-like) URL: +// - spec: https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories +// - example: git@github.com:gravitational/teleport.git +func parseGitSSHURL(originalURL string) (*gitSSHURL, error) { + endpoint, err := transport.NewEndpoint(originalURL) + if err != nil { + return nil, trace.Wrap(err) + } + if endpoint.Protocol != "ssh" { + return nil, trace.BadParameter("unsupported git ssh URL %s", originalURL) + } + s := gitSSHURL(*endpoint) + if err := s.check(); err != nil { + return nil, trace.Wrap(err) + } + return &s, nil +} + +func execGitAndCaptureStdout(cf *CLIConf, args ...string) (string, error) { + var bufStd bytes.Buffer + if err := execGitWithStdoutAndStderr(cf, &bufStd, cf.Stderr(), args...); err != nil { + return "", trace.Wrap(err) + } + return strings.TrimSpace(bufStd.String()), nil +} + +func execGit(cf *CLIConf, args ...string) error { + return trace.Wrap(execGitWithStdoutAndStderr(cf, cf.Stdout(), cf.Stderr(), args...)) +} + +func execGitWithStdoutAndStderr(cf *CLIConf, stdout, stderr io.Writer, args ...string) error { + const gitExecutable = "git" + gitPath, err := cf.LookPath(gitExecutable) + if err != nil { + return trace.NotFound(`could not locate the executable %q. The following error occurred: +%s + +tsh requires that the %q executable to be installed. +You can install it by following the instructions at https://git-scm.com/book/en/v2/Getting-Started-Installing-Git`, + gitExecutable, err.Error(), gitExecutable) + } + logger.DebugContext(cf.Context, "Executing git command", "path", gitPath, "args", args) + cmd := exec.CommandContext(cf.Context, gitPath, args...) + cmd.Stdin = cf.Stdin() + cmd.Stdout = stdout + cmd.Stderr = stderr + return trace.Wrap(cf.RunCommand(cmd)) +} diff --git a/tool/tsh/common/git_clone.go b/tool/tsh/common/git_clone.go new file mode 100644 index 0000000000000..93d00d4134434 --- /dev/null +++ b/tool/tsh/common/git_clone.go @@ -0,0 +1,73 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package common + +import ( + "fmt" + + "github.com/alecthomas/kingpin/v2" + "github.com/gravitational/trace" +) + +// gitCloneCommand implements `tsh git clone`. +// +// This command internally executes `git clone` while setting `core.sshcommand`. +// You can generally assume the user has `git` binary installed (otherwise there +// is no point using the `git` proxy feature). +// +// TODO(greedy52) investigate using `go-git` library instead of calling `git +// clone`. +type gitCloneCommand struct { + *kingpin.CmdClause + + repository string + directory string +} + +func newGitCloneCommand(parent *kingpin.CmdClause) *gitCloneCommand { + cmd := &gitCloneCommand{ + CmdClause: parent.Command("clone", "Clone a Git repository."), + } + + cmd.Arg("repository", "Git URL of the repository to clone.").Required().StringVar(&cmd.repository) + cmd.Arg("directory", "The name of a new directory to clone into.").StringVar(&cmd.directory) + // TODO(greedy52) support passing extra args to git like --branch/--depth. + return cmd +} + +func (c *gitCloneCommand) run(cf *CLIConf) error { + u, err := parseGitSSHURL(c.repository) + if err != nil { + return trace.Wrap(err) + } + if !u.isGitHub() { + return trace.BadParameter("%s is not a GitHub repository", c.repository) + } + + sshCommand := makeGitCoreSSHCommand(cf.executablePath, u.owner()) + args := []string{ + "clone", + "--config", fmt.Sprintf("%s=%s", gitCoreSSHCommand, sshCommand), + c.repository, + } + if c.directory != "" { + args = append(args, c.directory) + } + return trace.Wrap(execGit(cf, args...)) +} diff --git a/tool/tsh/common/git_clone_test.go b/tool/tsh/common/git_clone_test.go new file mode 100644 index 0000000000000..4e27e3ac3286f --- /dev/null +++ b/tool/tsh/common/git_clone_test.go @@ -0,0 +1,115 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package common + +import ( + "context" + "os/exec" + "slices" + "testing" + + "github.com/gravitational/trace" + "github.com/stretchr/testify/require" +) + +func TestGitCloneCommand(t *testing.T) { + tests := []struct { + name string + cmd *gitCloneCommand + verifyCommand func(*exec.Cmd) error + checkError require.ErrorAssertionFunc + }{ + { + name: "success", + cmd: &gitCloneCommand{ + repository: "git@github.com:gravitational/teleport.git", + }, + verifyCommand: func(cmd *exec.Cmd) error { + expect := []string{ + "git", "clone", + "--config", "core.sshcommand=\"tsh\" git ssh --github-org gravitational", + "git@github.com:gravitational/teleport.git", + } + if !slices.Equal(expect, cmd.Args) { + return trace.CompareFailed("expect %v but got %v", expect, cmd.Args) + } + return nil + }, + checkError: require.NoError, + }, + { + name: "success with target dir", + cmd: &gitCloneCommand{ + repository: "git@github.com:gravitational/teleport.git", + directory: "target_dir", + }, + verifyCommand: func(cmd *exec.Cmd) error { + expect := []string{ + "git", "clone", + "--config", "core.sshcommand=\"tsh\" git ssh --github-org gravitational", + "git@github.com:gravitational/teleport.git", + "target_dir", + } + if !slices.Equal(expect, cmd.Args) { + return trace.CompareFailed("expect %v but got %v", expect, cmd.Args) + } + return nil + }, + checkError: require.NoError, + }, + { + name: "invalid URL", + cmd: &gitCloneCommand{ + repository: "not-a-git-ssh-url", + }, + checkError: require.Error, + }, + { + name: "unsupported Git service", + cmd: &gitCloneCommand{ + repository: "git@gitlab.com:group/project.git", + }, + checkError: require.Error, + }, + { + name: "git fails", + cmd: &gitCloneCommand{ + repository: "git@github.com:gravitational/teleport.git", + }, + verifyCommand: func(cmd *exec.Cmd) error { + return trace.BadParameter("some git error") + }, + checkError: func(t require.TestingT, err error, i ...interface{}) { + require.ErrorIs(t, err, trace.BadParameter("some git error")) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cf := &CLIConf{ + Context: context.Background(), + executablePath: "tsh", + cmdRunner: tt.verifyCommand, + lookPathOverride: "git", + } + tt.checkError(t, tt.cmd.run(cf)) + }) + } +} diff --git a/tool/tsh/common/git_config.go b/tool/tsh/common/git_config.go new file mode 100644 index 0000000000000..89771735b30b3 --- /dev/null +++ b/tool/tsh/common/git_config.go @@ -0,0 +1,184 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package common + +import ( + "fmt" + "io" + "strings" + + "github.com/alecthomas/kingpin/v2" + "github.com/gravitational/trace" +) + +// gitConfigCommand implements `tsh git config`. +// +// This command internally executes `git` commands like `git config xxx`. +// can generally assume the user has `git` binary installed (otherwise there is +// no point using the `git` proxy feature). +// +// TODO(greedy52) investigate using `go-git` library instead of calling `git +// config`. +type gitConfigCommand struct { + *kingpin.CmdClause + + action string +} + +const ( + gitConfigActionDefault = "" + gitConfigActionUpdate = "update" + gitConfigActionReset = "reset" + + // gitCoreSSHCommand is the Git config used for setting up alternative SSH + // command. For Git-proxying, the command should point to "tsh git ssh". + // + // https://git-scm.com/docs/git-config#Documentation/git-config.txt-coresshCommand + gitCoreSSHCommand = "core.sshcommand" +) + +func newGitConfigCommand(parent *kingpin.CmdClause) *gitConfigCommand { + cmd := &gitConfigCommand{ + CmdClause: parent.Command("config", "Check Teleport config on the working Git directory. Or provide an action ('update' or 'reset') to configure the Git repo."), + } + + cmd.Arg("action", "Optional action to perform. 'update' to configure the Git repo to proxy Git commands through Teleport. 'reset' to clear Teleport configuration from the Git repo."). + EnumVar(&cmd.action, gitConfigActionUpdate, gitConfigActionReset) + return cmd +} + +func (c *gitConfigCommand) run(cf *CLIConf) error { + // Make sure we are in a Git dir. + err := execGitWithStdoutAndStderr(cf, io.Discard, io.Discard, "rev-parse", "--is-inside-work-tree") + if err != nil { + // In case git is not found, return the look path error. + if trace.IsNotFound(err) { + return trace.Wrap(err) + } + // This error message is a slight alternation of the original error + // message from the above command. + return trace.BadParameter("the current directory is not a Git repository (or any of the parent directories)") + } + + switch c.action { + case gitConfigActionDefault: + return trace.Wrap(c.doCheck(cf)) + case gitConfigActionUpdate: + return trace.Wrap(c.doUpdate(cf)) + case gitConfigActionReset: + return trace.Wrap(c.doReset(cf)) + default: + return trace.BadParameter("unknown action '%v'", c.action) + } +} + +func (c *gitConfigCommand) doCheck(cf *CLIConf) error { + sshCommand, err := c.getCoreSSHCommand(cf) + if err != nil { + return trace.Wrap(err) + } + wantPrefix := makeGitCoreSSHCommand(cf.executablePath, "") + if strings.HasPrefix(sshCommand, wantPrefix) { + _, org, _ := strings.Cut(sshCommand, wantPrefix) + fmt.Fprintf(cf.Stdout(), "The current Git directory is configured with Teleport for GitHub organization %q.\n", org) + return nil + } + + c.printDirNotConfigured(cf.Stdout(), true, sshCommand) + return nil +} + +func (c *gitConfigCommand) printDirNotConfigured(w io.Writer, withUpdate bool, existingSSHCommand string) { + fmt.Fprintln(w, "The current Git directory is not configured with Teleport.") + if withUpdate { + if existingSSHCommand != "" { + fmt.Fprintf(w, "%q currently has value %q.\n", gitCoreSSHCommand, existingSSHCommand) + fmt.Fprintf(w, "Run 'tsh git config update' to configure Git directory with Teleport but %q will be overwritten.\n", gitCoreSSHCommand) + } else { + fmt.Fprintln(w, "Run 'tsh git config update' to configure it.") + } + } +} + +func (c *gitConfigCommand) doUpdate(cf *CLIConf) error { + urls, err := execGitAndCaptureStdout(cf, "ls-remote", "--get-url") + if err != nil { + return trace.Wrap(err) + } + for _, url := range strings.Split(urls, "\n") { + u, err := parseGitSSHURL(url) + if err != nil { + logger.DebugContext(cf.Context, "Skippig URL", "error", err, "url", url) + continue + } + if !u.isGitHub() { + logger.DebugContext(cf.Context, "Skippig non-GitHub host", "host", u.Host) + continue + } + + logger.DebugContext(cf.Context, "Configuring repo to use tsh.", "url", url, "owner", u.owner()) + args := []string{ + "config", "--local", + "--replace-all", gitCoreSSHCommand, + makeGitCoreSSHCommand(cf.executablePath, u.owner()), + } + if err := execGit(cf, args...); err != nil { + return trace.Wrap(err) + } + fmt.Fprintln(cf.Stdout(), "Teleport configuration added.") + return trace.Wrap(c.doCheck(cf)) + } + return trace.NotFound("no GitHub SSH URL found from 'git ls-remote --get-url'") +} + +func (c *gitConfigCommand) doReset(cf *CLIConf) error { + sshCommand, err := c.getCoreSSHCommand(cf) + if err != nil { + return trace.Wrap(err) + } + wantPrefix := makeGitCoreSSHCommand(cf.executablePath, "") + if !strings.HasPrefix(sshCommand, wantPrefix) { + c.printDirNotConfigured(cf.Stdout(), false, sshCommand) + return nil + } + + if err := execGit(cf, "config", "--local", "--unset-all", gitCoreSSHCommand); err != nil { + return trace.Wrap(err) + } + fmt.Fprintln(cf.Stdout(), "Teleport configuration removed.") + return nil +} + +func (c *gitConfigCommand) getCoreSSHCommand(cf *CLIConf) (string, error) { + return execGitAndCaptureStdout(cf, + "config", "--local", + // set default to empty to avoid non-zero exit when config is missing + "--default", "", + "--get", gitCoreSSHCommand, + ) +} + +// makeGitCoreSSHCommand generates the value for Git config "core.sshcommand". +func makeGitCoreSSHCommand(tshBin, githubOrg string) string { + // Quote the path in case it has spaces + return fmt.Sprintf("\"%s\" git ssh --github-org %s", + tshBin, + githubOrg, + ) +} diff --git a/tool/tsh/common/git_config_test.go b/tool/tsh/common/git_config_test.go new file mode 100644 index 0000000000000..b045e9342bb5f --- /dev/null +++ b/tool/tsh/common/git_config_test.go @@ -0,0 +1,184 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package common + +import ( + "bytes" + "context" + "fmt" + "os/exec" + "slices" + "testing" + + "github.com/gravitational/trace" + "github.com/stretchr/testify/require" +) + +func isGitDirCheck(cmd *exec.Cmd) bool { + return slices.Equal([]string{"git", "rev-parse", "--is-inside-work-tree"}, cmd.Args) +} +func isGitListRemoteURL(cmd *exec.Cmd) bool { + return slices.Equal([]string{"git", "ls-remote", "--get-url"}, cmd.Args) +} +func isGitConfigGetCoreSSHCommand(cmd *exec.Cmd) bool { + return slices.Equal([]string{"git", "config", "--local", "--default", "", "--get", "core.sshcommand"}, cmd.Args) +} + +type fakeGitCommandRunner struct { + dirCheckError error + coreSSHCommand string + remoteURL string + verifyCommand func(cmd *exec.Cmd) error +} + +func (f fakeGitCommandRunner) run(cmd *exec.Cmd) error { + switch { + case isGitDirCheck(cmd): + return f.dirCheckError + case isGitConfigGetCoreSSHCommand(cmd): + fmt.Fprintln(cmd.Stdout, f.coreSSHCommand) + return nil + case isGitListRemoteURL(cmd): + fmt.Fprintln(cmd.Stdout, f.remoteURL) + return nil + default: + if f.verifyCommand != nil { + return trace.Wrap(f.verifyCommand(cmd)) + } + return trace.NotFound("unknown command") + } +} + +func TestGitConfigCommand(t *testing.T) { + tests := []struct { + name string + cmd *gitConfigCommand + fakeRunner fakeGitCommandRunner + checkError require.ErrorAssertionFunc + checkOutputContains string + }{ + { + name: "not a git dir", + cmd: &gitConfigCommand{}, + fakeRunner: fakeGitCommandRunner{ + dirCheckError: trace.BadParameter("not a git dir"), + }, + checkError: func(t require.TestingT, err error, i ...interface{}) { + require.Error(t, err) + require.Contains(t, err.Error(), "the current directory is not a Git repository") + }, + }, + { + name: "check", + cmd: &gitConfigCommand{}, + fakeRunner: fakeGitCommandRunner{ + coreSSHCommand: makeGitCoreSSHCommand("tsh", "org"), + }, + checkError: require.NoError, + checkOutputContains: "is configured with Teleport for GitHub organization \"org\"", + }, + { + name: "check not configured", + cmd: &gitConfigCommand{}, + fakeRunner: fakeGitCommandRunner{ + coreSSHCommand: "", + }, + checkError: require.NoError, + checkOutputContains: "is not configured", + }, + { + name: "update success", + cmd: &gitConfigCommand{ + action: gitConfigActionUpdate, + }, + fakeRunner: fakeGitCommandRunner{ + coreSSHCommand: makeGitCoreSSHCommand("tsh", "org"), + remoteURL: "git@github.com:gravitational/teleport.git", + verifyCommand: func(cmd *exec.Cmd) error { + expect := []string{ + "git", "config", "--local", + "--replace-all", "core.sshcommand", + "\"tsh\" git ssh --github-org gravitational", + } + if !slices.Equal(expect, cmd.Args) { + return trace.CompareFailed("expect %v but got %v", expect, cmd.Args) + } + return nil + }, + }, + checkError: require.NoError, + }, + { + name: "update failed missing url", + cmd: &gitConfigCommand{ + action: gitConfigActionUpdate, + }, + fakeRunner: fakeGitCommandRunner{ + coreSSHCommand: makeGitCoreSSHCommand("tsh", "org"), + remoteURL: "", + }, + checkError: require.Error, + }, + { + name: "reset no-op", + cmd: &gitConfigCommand{ + action: gitConfigActionReset, + }, + fakeRunner: fakeGitCommandRunner{ + coreSSHCommand: "", + }, + checkError: require.NoError, + }, + { + name: "reset no-op", + cmd: &gitConfigCommand{ + action: gitConfigActionReset, + }, + fakeRunner: fakeGitCommandRunner{ + coreSSHCommand: makeGitCoreSSHCommand("tsh", "org"), + verifyCommand: func(cmd *exec.Cmd) error { + expect := []string{ + "git", "config", "--local", + "--unset-all", "core.sshcommand", + } + if !slices.Equal(expect, cmd.Args) { + return trace.CompareFailed("expect %v but got %v", expect, cmd.Args) + } + return nil + }, + }, + checkError: require.NoError, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var buf bytes.Buffer + cf := &CLIConf{ + Context: context.Background(), + OverrideStdout: &buf, + executablePath: "tsh", + cmdRunner: tt.fakeRunner.run, + lookPathOverride: "git", + } + tt.checkError(t, tt.cmd.run(cf)) + require.Contains(t, buf.String(), tt.checkOutputContains) + }) + } +} diff --git a/tool/tsh/common/git_list.go b/tool/tsh/common/git_list.go new file mode 100644 index 0000000000000..dc7838af2c70f --- /dev/null +++ b/tool/tsh/common/git_list.go @@ -0,0 +1,182 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package common + +import ( + "fmt" + "strings" + + "github.com/alecthomas/kingpin/v2" + "github.com/gravitational/trace" + + "github.com/gravitational/teleport" + apiclient "github.com/gravitational/teleport/api/client" + "github.com/gravitational/teleport/api/client/proto" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/asciitable" + "github.com/gravitational/teleport/lib/client" + "github.com/gravitational/teleport/lib/defaults" +) + +// gitListCommand implements `tsh git ls`. +type gitListCommand struct { + *kingpin.CmdClause + + format string + labels string + predicateExpression string + searchKeywords string + + // fetchFn is the function to fetch git servers. Defaults to c.doFetch. + // Can be set for testing. + fetchFn func(*CLIConf, *client.TeleportClient) ([]types.Server, error) +} + +func newGitListCommand(parent *kingpin.CmdClause) *gitListCommand { + cmd := &gitListCommand{ + CmdClause: parent.Command("ls", "List Git servers."), + } + cmd.Flag("format", defaults.FormatFlagDescription(defaults.DefaultFormats...)). + Short('f'). + Default(teleport.Text). + EnumVar(&cmd.format, defaults.DefaultFormats...) + + cmd.Flag("search", searchHelp).StringVar(&cmd.searchKeywords) + cmd.Flag("query", queryHelp).StringVar(&cmd.predicateExpression) + cmd.Arg("labels", labelHelp).StringVar(&cmd.labels) + return cmd +} + +func (c *gitListCommand) run(cf *CLIConf) error { + c.init(cf) + + tc, err := makeClient(cf) + if err != nil { + return trace.Wrap(err) + } + + servers, err := c.fetchFn(cf, tc) + if err != nil { + return trace.Wrap(err) + } + return printGitServers(cf, servers) +} + +func (c *gitListCommand) init(cf *CLIConf) { + cf.Format = c.format + cf.Labels = c.labels + cf.PredicateExpression = c.predicateExpression + cf.SearchKeywords = c.searchKeywords + + if c.fetchFn == nil { + c.fetchFn = c.doFetch + } +} + +func (c *gitListCommand) doFetch(cf *CLIConf, tc *client.TeleportClient) ([]types.Server, error) { + var resources types.EnrichedResources + err := client.RetryWithRelogin(cf.Context, tc, func() error { + client, err := tc.ConnectToCluster(cf.Context) + if err != nil { + return trace.Wrap(err) + } + defer client.Close() + + resources, err = apiclient.GetAllUnifiedResources(cf.Context, client.AuthClient, &proto.ListUnifiedResourcesRequest{ + Kinds: []string{types.KindGitServer}, + SortBy: types.SortBy{Field: types.ResourceMetadataName}, + SearchKeywords: tc.SearchKeywords, + PredicateExpression: tc.PredicateExpression, + }) + return trace.Wrap(err) + }) + if err != nil { + return nil, trace.Wrap(err) + } + return resources.ToResourcesWithLabels().AsServers() +} + +func printGitServers(cf *CLIConf, servers []types.Server) error { + format := strings.ToLower(cf.Format) + switch format { + case teleport.Text, "": + return printGitServersAsText(cf, servers) + case teleport.JSON, teleport.YAML: + out, err := serializeNodes(servers, format) + if err != nil { + return trace.Wrap(err) + } + if _, err := fmt.Fprintln(cf.Stdout(), out); err != nil { + return trace.Wrap(err) + } + return nil + default: + return trace.BadParameter("unsupported format %q", format) + } +} + +func printGitServersAsText(cf *CLIConf, servers []types.Server) error { + var rows [][]string + var showLoginNote bool + profileStatus, err := cf.ProfileStatus() + if err != nil { + return trace.Wrap(err) + } + for _, server := range servers { + login := "(n/a)*" + + if github := server.GetGitHub(); github != nil { + if profileStatus.GitHubIdentity != nil { + login = profileStatus.GitHubIdentity.Username + } else { + showLoginNote = true + } + + rows = append(rows, []string{ + "GitHub", + github.Organization, + login, + github.GetOrganizationURL(), + }) + } else { + return trace.BadParameter("expecting Git server but got %v", server.GetKind()) + } + } + + t := asciitable.MakeTable([]string{"Type", "Organization", "Username", "URL"}, rows...) + if _, err := fmt.Fprintln(cf.Stdout(), t.AsBuffer().String()); err != nil { + return trace.Wrap(err) + } + + if showLoginNote { + fmt.Fprint(cf.Stdout(), gitLoginNote) + } + + fmt.Fprint(cf.Stdout(), gitCommandsGeneralHint) + return nil +} + +const gitLoginNote = "" + + "(n/a)*: Username will be retrieved automatically upon running git commands.\n" + + " Alternatively, run `tsh git login --github-org `.\n\n" + +const gitCommandsGeneralHint = "" + + "hint: use 'tsh git clone ' to clone a new repository\n" + + " use 'tsh git config update' to configure an existing repository to use Teleport\n" + + " once the repository is cloned or configured, use 'git' as normal\n\n" diff --git a/tool/tsh/common/git_list_test.go b/tool/tsh/common/git_list_test.go new file mode 100644 index 0000000000000..cf4d52e318043 --- /dev/null +++ b/tool/tsh/common/git_list_test.go @@ -0,0 +1,156 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package common + +import ( + "bytes" + "fmt" + "testing" + + "github.com/gravitational/trace" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/api/profile" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/client" +) + +func makeGitServer(t *testing.T, gitHubOrg string) types.Server { + t.Helper() + server, err := types.NewGitHubServer( + types.GitHubServerMetadata{ + Integration: gitHubOrg, + Organization: gitHubOrg, + }) + require.NoError(t, err) + return server +} + +func TestGitListCommand(t *testing.T) { + server1 := makeGitServer(t, "org1") + server2 := makeGitServer(t, "org2") + + tests := []struct { + name string + format string + fetchFn func(*CLIConf, *client.TeleportClient) ([]types.Server, error) + profileStatus *client.ProfileStatus + wantError bool + containsOutput []string + }{ + { + name: "fetch error", + fetchFn: func(c *CLIConf, client *client.TeleportClient) ([]types.Server, error) { + return nil, trace.ConnectionProblem(fmt.Errorf("bad connection"), "bad connection") + }, + wantError: true, + }, + { + name: "text format", + fetchFn: func(c *CLIConf, client *client.TeleportClient) ([]types.Server, error) { + return []types.Server{server1, server2}, nil + }, + profileStatus: &client.ProfileStatus{}, + containsOutput: []string{ + "Type Organization Username URL", + "GitHub org1 (n/a)* https://github.com/org1", + "GitHub org2 (n/a)* https://github.com/org2", + }, + }, + { + name: "text format with GitHub identity", + fetchFn: func(c *CLIConf, client *client.TeleportClient) ([]types.Server, error) { + return []types.Server{server1, server2}, nil + }, + profileStatus: &client.ProfileStatus{ + GitHubIdentity: &client.GitHubIdentity{ + UserID: "1234567", + Username: "wow", + }, + }, + containsOutput: []string{ + "Type Organization Username URL", + "GitHub org1 wow https://github.com/org1", + "GitHub org2 wow https://github.com/org2", + }, + }, + { + name: "json format", + format: "json", + fetchFn: func(c *CLIConf, client *client.TeleportClient) ([]types.Server, error) { + return []types.Server{server1, server2}, nil + }, + containsOutput: []string{ + `"kind": "git_server"`, + `"hostname": "org1.teleport-github-org"`, + `"hostname": "org2.teleport-github-org"`, + }, + }, + { + name: "yaml format", + format: "yaml", + fetchFn: func(c *CLIConf, client *client.TeleportClient) ([]types.Server, error) { + return []types.Server{server1, server2}, nil + }, + containsOutput: []string{ + "- kind: git_server", + "hostname: org1.teleport-github-org", + "hostname: org2.teleport-github-org", + }, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + var capture bytes.Buffer + cf := &CLIConf{ + Proxy: "proxy", + Username: "alice", + OverrideStdout: &capture, + HomePath: t.TempDir(), + profileStatusOverride: test.profileStatus, + } + + // Create a empty profile so we don't ping proxy. + clientStore, err := initClientStore(cf, cf.Proxy) + require.NoError(t, err) + profile := &profile.Profile{ + SSHProxyAddr: "proxy:3023", + WebProxyAddr: "proxy:3080", + } + err = clientStore.SaveProfile(profile, true) + require.NoError(t, err) + + cmd := gitListCommand{ + format: test.format, + fetchFn: test.fetchFn, + } + + err = cmd.run(cf) + if test.wantError { + require.Error(t, err) + } else { + require.NoError(t, err) + for _, output := range test.containsOutput { + require.Contains(t, capture.String(), output) + } + } + }) + } +} diff --git a/tool/tsh/common/git_login.go b/tool/tsh/common/git_login.go new file mode 100644 index 0000000000000..fde5546471cd2 --- /dev/null +++ b/tool/tsh/common/git_login.go @@ -0,0 +1,124 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package common + +import ( + "fmt" + + "github.com/alecthomas/kingpin/v2" + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/lib/client" +) + +// gitLoginCommand implements `tsh git login`. +type gitLoginCommand struct { + *kingpin.CmdClause + + gitHubOrganization string + force bool +} + +func newGitLoginCommand(parent *kingpin.CmdClause) *gitLoginCommand { + cmd := &gitLoginCommand{ + CmdClause: parent.Command("login", "Opens a browser and retrieves your login from GitHub"), + } + + // TODO(greedy52) make "github-org" optional. Most likely there is only a + // single Git server configured anyway so do a "list" op then use the + // organization from that Git server. If more than one Git servers are + // found, prompt the user to pick one. + cmd.Flag("github-org", "GitHub organization").Required().StringVar(&cmd.gitHubOrganization) + cmd.Flag("force", "Force a login").BoolVar(&cmd.force) + return cmd +} + +func (c *gitLoginCommand) run(cf *CLIConf) error { + identity, err := getGitHubIdentity(cf, c.gitHubOrganization, withForceOAuthFlow(c.force)) + if err != nil { + return trace.Wrap(err) + } + fmt.Fprintf(cf.Stdout(), "Your GitHub username is %s.\n", identity.Username) + return nil +} + +func getGitHubIdentity(cf *CLIConf, org string, applyOpts ...getGitHubIdentityOption) (*client.GitHubIdentity, error) { + opts := getGitHubIdentityOptions{ + doOAuthFlow: doGitHubOAuthFlow, + } + for _, applyOpt := range applyOpts { + applyOpt(&opts) + } + + // See if GitHub identity already present. + profile, err := cf.ProfileStatus() + if err != nil { + return nil, trace.Wrap(err) + } + if profile.GitHubIdentity != nil && !opts.forceOAuthFlow { + return profile.GitHubIdentity, nil + } + + // Do GitHub OAuth flow to get GitHub identity. + if err := opts.doOAuthFlow(cf, org); err != nil { + return nil, trace.Wrap(err) + } + + // Check profile again. + profile, err = cf.ProfileStatus() + if err != nil { + return nil, trace.Wrap(err) + } + if profile.GitHubIdentity == nil { + // This should not happen if the OAuth is successful. + return nil, trace.NotFound("GitHub identity not found after GitHub OAuth flow") + } + return profile.GitHubIdentity, nil +} + +type getGitHubIdentityOptions struct { + forceOAuthFlow bool + doOAuthFlow func(cf *CLIConf, org string) error +} + +type getGitHubIdentityOption func(*getGitHubIdentityOptions) + +func withForceOAuthFlow(force bool) getGitHubIdentityOption { + return func(o *getGitHubIdentityOptions) { + o.forceOAuthFlow = force + } +} + +func withOAuthFlowOverride(override func(*CLIConf, string) error) getGitHubIdentityOption { + return func(o *getGitHubIdentityOptions) { + o.doOAuthFlow = override + } +} + +func doGitHubOAuthFlow(cf *CLIConf, org string) error { + tc, err := makeClient(cf) + if err != nil { + return trace.Wrap(err) + } + + err = client.RetryWithRelogin(cf.Context, tc, func() error { + return tc.ReissueWithGitHubOAuth(cf.Context, org) + }) + return trace.Wrap(err) +} diff --git a/tool/tsh/common/git_login_test.go b/tool/tsh/common/git_login_test.go new file mode 100644 index 0000000000000..7c3211b221b37 --- /dev/null +++ b/tool/tsh/common/git_login_test.go @@ -0,0 +1,131 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package common + +import ( + "context" + "testing" + + "github.com/gravitational/trace" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/lib/client" +) + +func Test_getGitHubIdentity(t *testing.T) { + cf := &CLIConf{ + Proxy: "proxy", + Username: "github-username", + HomePath: t.TempDir(), + Context: context.Background(), + } + + tests := []struct { + name string + initialProfileStatus *client.ProfileStatus + options []getGitHubIdentityOption + wantError bool + wantIdentity *client.GitHubIdentity + }{ + { + name: "GitHub identity already present", + initialProfileStatus: &client.ProfileStatus{ + GitHubIdentity: &client.GitHubIdentity{ + Username: "github-username", + UserID: "1234567", + }, + }, + wantIdentity: &client.GitHubIdentity{ + Username: "github-username", + UserID: "1234567", + }, + }, + { + name: "GitHub OAuth success", + initialProfileStatus: &client.ProfileStatus{ + GitHubIdentity: nil, + }, + options: []getGitHubIdentityOption{ + withOAuthFlowOverride(func(conf *CLIConf, org string) error { + conf.profileStatusOverride = &client.ProfileStatus{ + GitHubIdentity: &client.GitHubIdentity{ + Username: "github-username", + UserID: "1234567", + }, + } + return nil + }), + }, + wantIdentity: &client.GitHubIdentity{ + Username: "github-username", + UserID: "1234567", + }, + }, + { + name: "GitHub OAuth failure", + initialProfileStatus: &client.ProfileStatus{ + GitHubIdentity: nil, + }, + options: []getGitHubIdentityOption{ + withOAuthFlowOverride(func(conf *CLIConf, org string) error { + return trace.NotFound("%s not found", org) + }), + }, + wantError: true, + }, + { + name: "force GitHub OAuth", + initialProfileStatus: &client.ProfileStatus{ + GitHubIdentity: &client.GitHubIdentity{ + Username: "username-github", + UserID: "7654321", + }, + }, + options: []getGitHubIdentityOption{ + withForceOAuthFlow(true), + withOAuthFlowOverride(func(conf *CLIConf, org string) error { + conf.profileStatusOverride = &client.ProfileStatus{ + GitHubIdentity: &client.GitHubIdentity{ + Username: "github-username", + UserID: "1234567", + }, + } + return nil + }), + }, + wantIdentity: &client.GitHubIdentity{ + Username: "github-username", + UserID: "1234567", + }, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + cf.profileStatusOverride = test.initialProfileStatus + + identity, err := getGitHubIdentity(cf, "org", test.options...) + if test.wantError { + require.Error(t, err) + } else { + require.NoError(t, err) + require.Equal(t, test.wantIdentity, identity) + } + }) + } +} diff --git a/tool/tsh/common/git_ssh.go b/tool/tsh/common/git_ssh.go new file mode 100644 index 0000000000000..d4221d0f2f286 --- /dev/null +++ b/tool/tsh/common/git_ssh.go @@ -0,0 +1,86 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package common + +import ( + "fmt" + "os" + "strings" + + "github.com/alecthomas/kingpin/v2" + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/client" +) + +// gitSSHCommand implements `tsh git ssh`. +// +// Note that this is a hidden command as it is only meant for 'git` to call. +// TODO(greedy52) support Git protocol v2. +type gitSSHCommand struct { + *kingpin.CmdClause + + gitHubOrg string + userHost string + command []string + options []string +} + +func newGitSSHCommand(parent *kingpin.CmdClause) *gitSSHCommand { + cmd := &gitSSHCommand{ + CmdClause: parent.Command("ssh", "Proxy Git commands using SSH").Hidden(), + } + + cmd.Flag("github-org", "GitHub organization.").Required().StringVar(&cmd.gitHubOrg) + cmd.Arg("[user@]host", "Remote hostname and the login to use").Required().StringVar(&cmd.userHost) + cmd.Arg("command", "Command to execute on a remote host").StringsVar(&cmd.command) + cmd.Flag("option", "OpenSSH options in the format used in the configuration file").Short('o').AllowDuplicate().StringsVar(&cmd.options) + return cmd +} + +func (c *gitSSHCommand) run(cf *CLIConf) error { + _, host, ok := strings.Cut(c.userHost, "@") + if !ok || host != "github.com" { + return trace.BadParameter("user-host %q is not GitHub", c.userHost) + } + + // TODO(greedy52) when git calls tsh, tsh cannot prompt for password (e.g. + // user session expired) using provided stdin pipe. `tc.Login` should try + // hijacking "/dev/tty" and replace `prompt.Stdin` temporarily. + identity, err := getGitHubIdentity(cf, c.gitHubOrg) + if err != nil { + return trace.Wrap(err) + } + logger.DebugContext(cf.Context, "Proxying git command for GitHub user.", "command", c.command, "user", identity.Username) + + cf.RemoteCommand = c.command + cf.Options = c.options + cf.UserHost = fmt.Sprintf("git@%s", types.MakeGitHubOrgServerDomain(c.gitHubOrg)) + + tc, err := makeClient(cf) + if err != nil { + return trace.Wrap(err) + } + tc.Stdin = os.Stdin + err = client.RetryWithRelogin(cf.Context, tc, func() error { + return tc.SSH(cf.Context, cf.RemoteCommand) + }) + return trace.Wrap(convertSSHExitCode(tc, err)) +} diff --git a/tool/tsh/common/git_test.go b/tool/tsh/common/git_test.go new file mode 100644 index 0000000000000..501004abd141d --- /dev/null +++ b/tool/tsh/common/git_test.go @@ -0,0 +1,79 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package common + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func Test_parseGitSSHURL(t *testing.T) { + tests := []struct { + name string + input string + wantError bool + wantOut *gitSSHURL + }{ + { + name: "github ssh format", + input: "org-1234567@github.com:some-org/some-repo.git", + wantOut: &gitSSHURL{ + Protocol: "ssh", + Host: "github.com", + User: "org-1234567", + Path: "some-org/some-repo.git", + Port: 22, + }, + }, + { + name: "github ssh format invalid path", + input: "org-1234567@github.com:missing-org", + wantError: true, + }, + { + name: "ssh schema format", + input: "ssh://git@github.com/some-org/some-repo.git", + wantOut: &gitSSHURL{ + Protocol: "ssh", + Host: "github.com", + User: "git", + Path: "/some-org/some-repo.git", + }, + }, + { + name: "unsupported format", + input: "https://github.com/gravitational/teleport.git", + wantError: true, + }, + } + + for _, tt := range tests { + t.Run(tt.input, func(t *testing.T) { + out, err := parseGitSSHURL(tt.input) + t.Log(out, err) + if tt.wantError { + require.Error(t, err) + return + } + require.NoError(t, err) + require.Equal(t, tt.wantOut, out) + }) + } +} diff --git a/tool/tsh/common/tsh.go b/tool/tsh/common/tsh.go index 372db5f659a28..769acfd936b11 100644 --- a/tool/tsh/common/tsh.go +++ b/tool/tsh/common/tsh.go @@ -93,6 +93,7 @@ import ( "github.com/gravitational/teleport/lib/tlsca" "github.com/gravitational/teleport/lib/utils" "github.com/gravitational/teleport/lib/utils/diagnostics/latency" + logutils "github.com/gravitational/teleport/lib/utils/log" "github.com/gravitational/teleport/lib/utils/mlock" stacksignal "github.com/gravitational/teleport/lib/utils/signal" "github.com/gravitational/teleport/tool/common" @@ -105,6 +106,10 @@ var log = logrus.WithFields(logrus.Fields{ teleport.ComponentKey: teleport.ComponentTSH, }) +var ( + logger = logutils.NewPackageLogger(teleport.ComponentKey, teleport.ComponentTSH) +) + const ( // mfaModeAuto automatically chooses the best MFA device(s), without any // restrictions. @@ -572,6 +577,12 @@ type CLIConf struct { // allows users with potentially stale credentials preventing access to gain the required access // without having to manually run tsh login and the failed command again. Relogin bool + + // profileStatusOverride overrides return of ProfileStatus(). used in tests. + profileStatusOverride *client.ProfileStatus + + // lookPathOverride overrides return of LookPath(). used in tests. + lookPathOverride string } // Stdout returns the stdout writer. @@ -611,6 +622,14 @@ func (c *CLIConf) RunCommand(cmd *exec.Cmd) error { return trace.Wrap(cmd.Run()) } +// LookPath searches for an executable named file. +func (c *CLIConf) LookPath(file string) (string, error) { + if c.lookPathOverride != "" { + return c.lookPathOverride, nil + } + return exec.LookPath(file) +} + func Main() { cmdLineOrig := os.Args[1:] var cmdLine []string @@ -1248,6 +1267,8 @@ func Run(ctx context.Context, args []string, opts ...CliOption) error { vnetAdminSetupCmd := newVnetAdminSetupCommand(app) vnetDaemonCmd := newVnetDaemonCommand(app) + gitCmd := newGitCommands(app) + if runtime.GOOS == constants.WindowsOS { bench.Hidden() } @@ -1625,6 +1646,16 @@ func Run(ctx context.Context, args []string, opts ...CliOption) error { err = vnetAdminSetupCmd.run(&cf) case vnetDaemonCmd.FullCommand(): err = vnetDaemonCmd.run(&cf) + case gitCmd.list.FullCommand(): + err = gitCmd.list.run(&cf) + case gitCmd.login.FullCommand(): + err = gitCmd.login.run(&cf) + case gitCmd.ssh.FullCommand(): + err = gitCmd.ssh.run(&cf) + case gitCmd.config.FullCommand(): + err = gitCmd.config.run(&cf) + case gitCmd.clone.FullCommand(): + err = gitCmd.clone.run(&cf) default: // Handle commands that might not be available. switch { @@ -3941,7 +3972,12 @@ func onSSH(cf *CLIConf) error { accessRequestForSSH, fmt.Sprintf("%s@%s", tc.HostLogin, tc.Host), ) + // Exit with the same exit status as the failed command. + return trace.Wrap(convertSSHExitCode(tc, err)) +} + +func convertSSHExitCode(tc *client.TeleportClient, err error) error { if tc.ExitStatus != 0 { var exitErr *common.ExitCodeError if errors.As(err, &exitErr) { @@ -4533,6 +4569,10 @@ func initClientStore(cf *CLIConf, proxy string) (*client.Store, error) { } func (c *CLIConf) ProfileStatus() (*client.ProfileStatus, error) { + if c.profileStatusOverride != nil { + return c.profileStatusOverride, nil + } + clientStore, err := initClientStore(c, c.Proxy) if err != nil { return nil, trace.Wrap(err) @@ -4842,6 +4882,9 @@ func printStatus(debug bool, p *profileInfo, env map[string]string, isActive boo fmt.Printf(" Allowed Resources: %s\n", allowedResourcesStr) } } + if p.GitHubIdentity != nil { + fmt.Printf(" GitHub username: %s\n", p.GitHubIdentity.Username) + } fmt.Printf(" Valid until: %v [%v]\n", p.ValidUntil, humanDuration) fmt.Printf(" Extensions: %v\n", strings.Join(p.Extensions, ", ")) @@ -5005,22 +5048,23 @@ func onStatus(cf *CLIConf) error { } type profileInfo struct { - ProxyURL string `json:"profile_url"` - Username string `json:"username"` - ActiveRequests []string `json:"active_requests,omitempty"` - Cluster string `json:"cluster"` - Roles []string `json:"roles,omitempty"` - Traits wrappers.Traits `json:"traits,omitempty"` - Logins []string `json:"logins,omitempty"` - KubernetesEnabled bool `json:"kubernetes_enabled"` - KubernetesCluster string `json:"kubernetes_cluster,omitempty"` - KubernetesUsers []string `json:"kubernetes_users,omitempty"` - KubernetesGroups []string `json:"kubernetes_groups,omitempty"` - Databases []string `json:"databases,omitempty"` - ValidUntil time.Time `json:"valid_until"` - Extensions []string `json:"extensions,omitempty"` - CriticalOptions map[string]string `json:"critical_options,omitempty"` - AllowedResourceIDs []types.ResourceID `json:"allowed_resources,omitempty"` + ProxyURL string `json:"profile_url"` + Username string `json:"username"` + ActiveRequests []string `json:"active_requests,omitempty"` + Cluster string `json:"cluster"` + Roles []string `json:"roles,omitempty"` + Traits wrappers.Traits `json:"traits,omitempty"` + Logins []string `json:"logins,omitempty"` + KubernetesEnabled bool `json:"kubernetes_enabled"` + KubernetesCluster string `json:"kubernetes_cluster,omitempty"` + KubernetesUsers []string `json:"kubernetes_users,omitempty"` + KubernetesGroups []string `json:"kubernetes_groups,omitempty"` + Databases []string `json:"databases,omitempty"` + ValidUntil time.Time `json:"valid_until"` + Extensions []string `json:"extensions,omitempty"` + CriticalOptions map[string]string `json:"critical_options,omitempty"` + AllowedResourceIDs []types.ResourceID `json:"allowed_resources,omitempty"` + GitHubIdentity *client.GitHubIdentity `json:"github_identity,omitempty"` } func makeAllProfileInfo(active *client.ProfileStatus, others []*client.ProfileStatus, env map[string]string) (*profileInfo, []*profileInfo) { @@ -5070,6 +5114,7 @@ func makeProfileInfo(p *client.ProfileStatus, env map[string]string, isActive bo Extensions: p.Extensions, CriticalOptions: p.CriticalOptions, AllowedResourceIDs: p.AllowedResourceIDs, + GitHubIdentity: p.GitHubIdentity, } // update active profile info from env diff --git a/web/packages/teleport/src/Audit/EventList/EventTypeCell.tsx b/web/packages/teleport/src/Audit/EventList/EventTypeCell.tsx index 3186bf636b6ab..66d892595e50e 100644 --- a/web/packages/teleport/src/Audit/EventList/EventTypeCell.tsx +++ b/web/packages/teleport/src/Audit/EventList/EventTypeCell.tsx @@ -291,6 +291,8 @@ const EventIconMap: Record = { [eventCodes.CONTACT_CREATE]: Icons.Info, [eventCodes.CONTACT_DELETE]: Icons.Info, [eventCodes.UNKNOWN]: Icons.Question, + [eventCodes.GIT_COMMAND]: Icons.GitHub, + [eventCodes.GIT_COMMAND_FAILURE]: Icons.GitHub, }; export default function renderTypeCell(event: Event) { diff --git a/web/packages/teleport/src/Audit/fixtures/index.ts b/web/packages/teleport/src/Audit/fixtures/index.ts index ec9a18744a563..5ba80967ac5cf 100644 --- a/web/packages/teleport/src/Audit/fixtures/index.ts +++ b/web/packages/teleport/src/Audit/fixtures/index.ts @@ -3742,6 +3742,41 @@ export const events = [ user: '30a6b2e1-3b61-4965-92cf-b4f84e9dc683.lenix', user_kind: 1, }, + { + code: 'TGIT001E', + event: 'git.command', + time: '2024-12-07T11:11:11.111Z', + uid: '7699b806-e717-4821-85a5-d2f41acbe373', + user: 'Linus.Torvalds', + service: 'git-upload-pack', + exitError: 'some-error', + path: 'my-org/my-repo', + }, + { + code: 'TGIT001I', + event: 'git.command', + time: '2024-12-07T11:11:11.112Z', + uid: '7699b806-e717-4821-85a5-d2f41acbe373', + user: 'Linus.Torvalds', + service: 'git-upload-pack', + path: 'my-org/my-repo', + }, + { + code: 'TGIT001I', + event: 'git.command', + time: '2024-12-07T11:11:11.112Z', + uid: '7699b806-e717-4821-85a5-d2f41acbe373', + user: 'Linus.Torvalds', + service: 'git-receive-pack', + path: 'my-org/my-repo', + actions: [ + { + action: 'update', + reference: 'refs/heads/my-branch', + new: 'd3adb33f1234567890abcdef1234567890abcdef', + }, + ], + }, ].map(makeEvent); // Do not add new events to this array, add it to `events` list. diff --git a/web/packages/teleport/src/Integrations/IntegrationList.tsx b/web/packages/teleport/src/Integrations/IntegrationList.tsx index dea55d08f205f..4ae1ee07320f4 100644 --- a/web/packages/teleport/src/Integrations/IntegrationList.tsx +++ b/web/packages/teleport/src/Integrations/IntegrationList.tsx @@ -367,6 +367,10 @@ const IconCell = ({ item }: { item: IntegrationLike }) => { formattedText = 'Azure OIDC'; icon = ; break; + case IntegrationKind.GitHub: + formattedText = item.name; + icon = ; + break; } } diff --git a/web/packages/teleport/src/services/audit/makeEvent.ts b/web/packages/teleport/src/services/audit/makeEvent.ts index 64392b707544e..97675560e94af 100644 --- a/web/packages/teleport/src/services/audit/makeEvent.ts +++ b/web/packages/teleport/src/services/audit/makeEvent.ts @@ -1921,6 +1921,41 @@ export const formatters: Formatters = { format: ({ unknown_type, unknown_code }) => `Unknown '${unknown_type}' event (${unknown_code})`, }, + [eventCodes.GIT_COMMAND]: { + type: 'git.command', + desc: 'Git Command', + format: ({ user, service, path, actions }) => { + // "git-upload-pack" are fetches like "git fetch", "git pull". + if (service === 'git-upload-pack') { + return `User [${user}] has fetched from [${path}]`; + } + // "git-receive-pack" are pushes. Usually it should have one action. + if (service === 'git-receive-pack') { + if (actions && actions.length == 1) { + switch (actions[0].action) { + case 'delete': + return `User [${user}] has deleted [${actions[0].reference}] from [${path}]`; + case 'create': + return `User [${user}] has created [${actions[0].reference}] on [${path}]`; + case 'update': + return `User [${user}] has updated [${actions[0].reference}] to [${actions[0].new.substring(0, 7)}] on [${path}]`; + } + } + return `User [${user}] has attempted a push to [${path}]`; + } + if (service && path) { + return `User [${user}] has executed a Git Command [${service}] at [${path}]`; + } + return `User [${user}] has executed a Git Command`; + }, + }, + [eventCodes.GIT_COMMAND_FAILURE]: { + type: 'git.command', + desc: 'Git Command Failed', + format: ({ user, exitError, service, path }) => { + return `User [${user}] Git Command [${service}] at [${path}] failed [${exitError}]`; + }, + }, }; const unknownFormatter = { diff --git a/web/packages/teleport/src/services/audit/types.ts b/web/packages/teleport/src/services/audit/types.ts index c50b27a782df2..26c94f54e0b51 100644 --- a/web/packages/teleport/src/services/audit/types.ts +++ b/web/packages/teleport/src/services/audit/types.ts @@ -310,6 +310,8 @@ export const eventCodes = { PLUGIN_DELETE: 'PG003I', CONTACT_CREATE: 'TCTC001I', CONTACT_DELETE: 'TCTC002I', + GIT_COMMAND: 'TGIT001I', + GIT_COMMAND_FAILURE: 'TGIT001E', } as const; /** @@ -1762,6 +1764,27 @@ export type RawEvents = { contact_type: number; } >; + [eventCodes.GIT_COMMAND]: RawEvent< + typeof eventCodes.GIT_COMMAND, + { + service: string; + path: string; + actions?: { + action: string; + reference: string; + new?: string; + old?: string; + }[]; + } + >; + [eventCodes.GIT_COMMAND_FAILURE]: RawEvent< + typeof eventCodes.GIT_COMMAND_FAILURE, + { + service: string; + path: string; + exitError: string; + } + >; }; /** diff --git a/web/packages/teleport/src/services/integrations/integrations.test.ts b/web/packages/teleport/src/services/integrations/integrations.test.ts index 1398f9640999a..9c17ccae2f4fb 100644 --- a/web/packages/teleport/src/services/integrations/integrations.test.ts +++ b/web/packages/teleport/src/services/integrations/integrations.test.ts @@ -67,6 +67,7 @@ test('fetch integration list: fetchIntegrations()', async () => { items: [ awsOidcIntegration, awsOidcIntegrationWithAudience, + githubIntegration, nonAwsOidcIntegration, ], nextKey: 'some-key', @@ -97,6 +98,17 @@ test('fetch integration list: fetchIntegrations()', async () => { }, statusCode: IntegrationStatusCode.Running, }, + { + kind: 'github', + name: 'github-my-org', + resourceType: 'integration', + spec: { + roleArn: undefined, + audience: undefined, + }, + details: 'GitHub Organization "my-org"', + statusCode: IntegrationStatusCode.Running, + }, { kind: 'abc', name: 'non-aws-oidc-integration', @@ -236,6 +248,13 @@ const awsOidcIntegrationWithAudience = { audience: IntegrationAudience.AwsIdentityCenter, }, }; +const githubIntegration = { + name: 'github-my-org', + subKind: 'github', + github: { + organization: 'my-org', + }, +}; const mockAwsDbs = [ { diff --git a/web/packages/teleport/src/services/integrations/integrations.ts b/web/packages/teleport/src/services/integrations/integrations.ts index fe4a5b1361464..baaa45c9d9b45 100644 --- a/web/packages/teleport/src/services/integrations/integrations.ts +++ b/web/packages/teleport/src/services/integrations/integrations.ts @@ -474,7 +474,7 @@ export function makeIntegrations(json: any): Integration[] { function makeIntegration(json: any): Integration { json = json || {}; - const { name, subKind, awsoidc } = json; + const { name, subKind, awsoidc, github } = json; return { resourceType: 'integration', name, @@ -485,6 +485,9 @@ function makeIntegration(json: any): Integration { issuerS3Prefix: awsoidc?.issuerS3Prefix, audience: awsoidc?.audience, }, + details: github + ? `GitHub Organization "${github.organization}"` + : undefined, // The integration resource does not have a "status" field, but is // a required field for the table that lists both plugin and // integration resources together. As discussed, the only diff --git a/web/packages/teleport/src/services/integrations/types.ts b/web/packages/teleport/src/services/integrations/types.ts index 551dc86b77286..6fa11432c6af9 100644 --- a/web/packages/teleport/src/services/integrations/types.ts +++ b/web/packages/teleport/src/services/integrations/types.ts @@ -63,6 +63,7 @@ export enum IntegrationKind { AwsOidc = 'aws-oidc', AzureOidc = 'azure-oidc', ExternalAuditStorage = 'external-audit-storage', + GitHub = 'github', } /**