diff --git a/.github/ISSUE_TEMPLATE/testplan.md b/.github/ISSUE_TEMPLATE/testplan.md index 9699edc3cb46a..0da413f93da4c 100644 --- a/.github/ISSUE_TEMPLATE/testplan.md +++ b/.github/ISSUE_TEMPLATE/testplan.md @@ -267,7 +267,8 @@ as well as an upgrade of the previous version of Teleport. - [ ] `tsh ssh -X root@node xeyes` - [ ] Test untrusted vs trusted forwarding - [ ] `tsh ssh -Y server01 "echo Hello World | xclip -sel c && xclip -sel c -o"` should print "Hello World" - - [ ] `tsh ssh -X server01 "echo Hello World | xclip -sel c && xclip -sel c -o"` should fail with "BadAccess" X error + - [ ] (Linux) `tsh ssh -X server01 "echo Hello World | xclip -sel c && xclip -sel c -o"` should fail with "BadAccess" X error + - This test doesn't work with XQuartz as it doesn't seem to enable the X Security Extension. ### User accounting @@ -812,8 +813,6 @@ Set `auth_service.authentication.require_session_mfa: hardware_key_touch` in you Run the full test suite with each HSM/KMS: ```shell -$ make run-etcd # in background shell -$ $ # test YubiHSM $ yubihsm-connector -d # in a background shell $ cat /etc/yubihsm_pkcs11.conf @@ -821,23 +820,23 @@ $ cat /etc/yubihsm_pkcs11.conf connector = http://127.0.0.1:12345 debug $ TELEPORT_TEST_YUBIHSM_PKCS11_PATH=/usr/local/lib/pkcs11/yubihsm_pkcs11.dylib TELEPORT_TEST_YUBIHSM_PIN=0001password YUBIHSM_PKCS11_CONF=/etc/yubihsm_pkcs11.conf go test ./lib/auth/keystore -v --count 1 -$ TELEPORT_TEST_YUBIHSM_PKCS11_PATH=/usr/local/lib/pkcs11/yubihsm_pkcs11.dylib TELEPORT_TEST_YUBIHSM_PIN=0001password YUBIHSM_PKCS11_CONF=/etc/yubihsm_pkcs11.conf TELEPORT_ETCD_TEST=1 go test ./integration/hsm -v --count 1 --timeout 20m # this takes ~12 minutes +$ TELEPORT_TEST_YUBIHSM_PKCS11_PATH=/usr/local/lib/pkcs11/yubihsm_pkcs11.dylib TELEPORT_TEST_YUBIHSM_PIN=0001password YUBIHSM_PKCS11_CONF=/etc/yubihsm_pkcs11.conf go test ./integration/hsm -v --count 1 --timeout 20m # this takes ~12 minutes $ $ # test AWS KMS $ # login in to AWS locally $ AWS_ACCOUNT="$(aws sts get-caller-identity | jq -r '.Account')" $ TELEPORT_TEST_AWS_KMS_ACCOUNT="${AWS_ACCOUNT}" TELEPORT_TEST_AWS_KMS_REGION=us-west-2 go test ./lib/auth/keystore -v --count 1 -$ TELEPORT_TEST_AWS_KMS_ACCOUNT="${AWS_ACCOUNT}" TELEPORT_TEST_AWS_KMS_REGION=us-west-2 TELEPORT_ETCD_TEST=1 go test ./integration/hsm -v --count 1 +$ TELEPORT_TEST_AWS_KMS_ACCOUNT="${AWS_ACCOUNT}" TELEPORT_TEST_AWS_KMS_REGION=us-west-2 go test ./integration/hsm -v --count 1 $ $ # test AWS CloudHSM $ # set up the CloudHSM cluster and run this on an EC2 that can reach it $ TELEPORT_TEST_CLOUDHSM_PIN=":" go test ./lib/auth/keystore -v --count 1 -$ TELEPORT_TEST_CLOUDHSM_PIN=":" TELEPORT_ETCD_TEST=1 go test ./integration/hsm -v --count 1 +$ TELEPORT_TEST_CLOUDHSM_PIN=":" go test ./integration/hsm -v --count 1 $ $ # test GCP KMS $ # login in to GCP locally $ TELEPORT_TEST_GCP_KMS_KEYRING=projects//locations/us-west3/keyRings/ go test ./lib/auth/keystore -v --count 1 -$ TELEPORT_TEST_GCP_KMS_KEYRING=projects//locations/us-west3/keyRings/ TELEPORT_ETCD_TEST=1 go test ./integration/hsm -v --count 1 +$ TELEPORT_TEST_GCP_KMS_KEYRING=projects//locations/us-west3/keyRings/ go test ./integration/hsm -v --count 1 ``` ## Moderated session diff --git a/api/client/client.go b/api/client/client.go index 5f24aa66b9fc3..a9b8c665de599 100644 --- a/api/client/client.go +++ b/api/client/client.go @@ -77,6 +77,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" + 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" kubewaitingcontainerpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/kubewaitingcontainer/v1" @@ -86,6 +87,7 @@ import ( oktapb "github.com/gravitational/teleport/api/gen/proto/go/teleport/okta/v1" pluginspb "github.com/gravitational/teleport/api/gen/proto/go/teleport/plugins/v1" presencepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/presence/v1" + provisioningv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/provisioning/v1" resourceusagepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/resourceusage/v1" samlidppb "github.com/gravitational/teleport/api/gen/proto/go/teleport/samlidp/v1" secreportsv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/secreports/v1" @@ -5176,3 +5178,15 @@ func (c *Client) GetRemoteClusters(ctx context.Context) ([]types.RemoteCluster, pageToken = nextToken } } + +// IdentityCenterClient returns Identity Center service client using an underlying +// gRPC connection. +func (c *Client) IdentityCenterClient() identitycenterv1.IdentityCenterServiceClient { + return identitycenterv1.NewIdentityCenterServiceClient(c.conn) +} + +// ProvisioningServiceClient returns provisioning service client using +// an underlying gRPC connection. +func (c *Client) ProvisioningServiceClient() provisioningv1.ProvisioningServiceClient { + return provisioningv1.NewProvisioningServiceClient(c.conn) +} diff --git a/api/gen/proto/go/teleport/identitycenter/v1/identitycenter_service.pb.go b/api/gen/proto/go/teleport/identitycenter/v1/identitycenter_service.pb.go new file mode 100644 index 0000000000000..d6c0b413c3521 --- /dev/null +++ b/api/gen/proto/go/teleport/identitycenter/v1/identitycenter_service.pb.go @@ -0,0 +1,305 @@ +// 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/identitycenter/v1/identitycenter_service.proto + +package identitycenterv1 + +import ( + 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) +) + +// DeleteAllIdentityCenterAccountsRequest is a request to delete all Identity Center imported accounts. +type DeleteAllIdentityCenterAccountsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *DeleteAllIdentityCenterAccountsRequest) Reset() { + *x = DeleteAllIdentityCenterAccountsRequest{} + mi := &file_teleport_identitycenter_v1_identitycenter_service_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteAllIdentityCenterAccountsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteAllIdentityCenterAccountsRequest) ProtoMessage() {} + +func (x *DeleteAllIdentityCenterAccountsRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_identitycenter_v1_identitycenter_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 DeleteAllIdentityCenterAccountsRequest.ProtoReflect.Descriptor instead. +func (*DeleteAllIdentityCenterAccountsRequest) Descriptor() ([]byte, []int) { + return file_teleport_identitycenter_v1_identitycenter_service_proto_rawDescGZIP(), []int{0} +} + +// DeleteAllAccountAssignmentsRequest is a request to delete all Identity Center account assignments. +type DeleteAllAccountAssignmentsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *DeleteAllAccountAssignmentsRequest) Reset() { + *x = DeleteAllAccountAssignmentsRequest{} + mi := &file_teleport_identitycenter_v1_identitycenter_service_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteAllAccountAssignmentsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteAllAccountAssignmentsRequest) ProtoMessage() {} + +func (x *DeleteAllAccountAssignmentsRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_identitycenter_v1_identitycenter_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 DeleteAllAccountAssignmentsRequest.ProtoReflect.Descriptor instead. +func (*DeleteAllAccountAssignmentsRequest) Descriptor() ([]byte, []int) { + return file_teleport_identitycenter_v1_identitycenter_service_proto_rawDescGZIP(), []int{1} +} + +// DeleteAllPrincipalAssignmentsRequest is a request to delete all Identity Center principal assignments. +type DeleteAllPrincipalAssignmentsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *DeleteAllPrincipalAssignmentsRequest) Reset() { + *x = DeleteAllPrincipalAssignmentsRequest{} + mi := &file_teleport_identitycenter_v1_identitycenter_service_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteAllPrincipalAssignmentsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteAllPrincipalAssignmentsRequest) ProtoMessage() {} + +func (x *DeleteAllPrincipalAssignmentsRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_identitycenter_v1_identitycenter_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 DeleteAllPrincipalAssignmentsRequest.ProtoReflect.Descriptor instead. +func (*DeleteAllPrincipalAssignmentsRequest) Descriptor() ([]byte, []int) { + return file_teleport_identitycenter_v1_identitycenter_service_proto_rawDescGZIP(), []int{2} +} + +// DeleteAllPermissionSetsRequest is a request to delete all Identity Center permission sets. +type DeleteAllPermissionSetsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *DeleteAllPermissionSetsRequest) Reset() { + *x = DeleteAllPermissionSetsRequest{} + mi := &file_teleport_identitycenter_v1_identitycenter_service_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteAllPermissionSetsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteAllPermissionSetsRequest) ProtoMessage() {} + +func (x *DeleteAllPermissionSetsRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_identitycenter_v1_identitycenter_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 DeleteAllPermissionSetsRequest.ProtoReflect.Descriptor instead. +func (*DeleteAllPermissionSetsRequest) Descriptor() ([]byte, []int) { + return file_teleport_identitycenter_v1_identitycenter_service_proto_rawDescGZIP(), []int{3} +} + +var File_teleport_identitycenter_v1_identitycenter_service_proto protoreflect.FileDescriptor + +var file_teleport_identitycenter_v1_identitycenter_service_proto_rawDesc = []byte{ + 0x0a, 0x37, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1a, 0x74, 0x65, 0x6c, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x63, 0x65, 0x6e, 0x74, + 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, 0x22, 0x28, 0x0a, 0x26, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x41, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x24, 0x0a, 0x22, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x26, 0x0a, 0x24, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x50, + 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x20, 0x0a, 0x1e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0xf7, 0x03, 0x0a, + 0x15, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x7d, 0x0a, 0x1f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x41, 0x6c, 0x6c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x43, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x42, 0x2e, 0x74, 0x65, 0x6c, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x63, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x41, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 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, 0x75, 0x0a, 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, + 0x6c, 0x6c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x3e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 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, 0x79, 0x0a, 0x1d, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, + 0x61, 0x6c, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x40, 0x2e, + 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x41, 0x6c, 0x6c, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x41, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 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, 0x6d, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x41, 0x6c, 0x6c, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x65, + 0x74, 0x73, 0x12, 0x3a, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 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, 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, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x3b, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_teleport_identitycenter_v1_identitycenter_service_proto_rawDescOnce sync.Once + file_teleport_identitycenter_v1_identitycenter_service_proto_rawDescData = file_teleport_identitycenter_v1_identitycenter_service_proto_rawDesc +) + +func file_teleport_identitycenter_v1_identitycenter_service_proto_rawDescGZIP() []byte { + file_teleport_identitycenter_v1_identitycenter_service_proto_rawDescOnce.Do(func() { + file_teleport_identitycenter_v1_identitycenter_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_teleport_identitycenter_v1_identitycenter_service_proto_rawDescData) + }) + return file_teleport_identitycenter_v1_identitycenter_service_proto_rawDescData +} + +var file_teleport_identitycenter_v1_identitycenter_service_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_teleport_identitycenter_v1_identitycenter_service_proto_goTypes = []any{ + (*DeleteAllIdentityCenterAccountsRequest)(nil), // 0: teleport.identitycenter.v1.DeleteAllIdentityCenterAccountsRequest + (*DeleteAllAccountAssignmentsRequest)(nil), // 1: teleport.identitycenter.v1.DeleteAllAccountAssignmentsRequest + (*DeleteAllPrincipalAssignmentsRequest)(nil), // 2: teleport.identitycenter.v1.DeleteAllPrincipalAssignmentsRequest + (*DeleteAllPermissionSetsRequest)(nil), // 3: teleport.identitycenter.v1.DeleteAllPermissionSetsRequest + (*emptypb.Empty)(nil), // 4: google.protobuf.Empty +} +var file_teleport_identitycenter_v1_identitycenter_service_proto_depIdxs = []int32{ + 0, // 0: teleport.identitycenter.v1.IdentityCenterService.DeleteAllIdentityCenterAccounts:input_type -> teleport.identitycenter.v1.DeleteAllIdentityCenterAccountsRequest + 1, // 1: teleport.identitycenter.v1.IdentityCenterService.DeleteAllAccountAssignments:input_type -> teleport.identitycenter.v1.DeleteAllAccountAssignmentsRequest + 2, // 2: teleport.identitycenter.v1.IdentityCenterService.DeleteAllPrincipalAssignments:input_type -> teleport.identitycenter.v1.DeleteAllPrincipalAssignmentsRequest + 3, // 3: teleport.identitycenter.v1.IdentityCenterService.DeleteAllPermissionSets:input_type -> teleport.identitycenter.v1.DeleteAllPermissionSetsRequest + 4, // 4: teleport.identitycenter.v1.IdentityCenterService.DeleteAllIdentityCenterAccounts:output_type -> google.protobuf.Empty + 4, // 5: teleport.identitycenter.v1.IdentityCenterService.DeleteAllAccountAssignments:output_type -> google.protobuf.Empty + 4, // 6: teleport.identitycenter.v1.IdentityCenterService.DeleteAllPrincipalAssignments:output_type -> google.protobuf.Empty + 4, // 7: teleport.identitycenter.v1.IdentityCenterService.DeleteAllPermissionSets:output_type -> google.protobuf.Empty + 4, // [4:8] is the sub-list for method output_type + 0, // [0:4] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_teleport_identitycenter_v1_identitycenter_service_proto_init() } +func file_teleport_identitycenter_v1_identitycenter_service_proto_init() { + if File_teleport_identitycenter_v1_identitycenter_service_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_teleport_identitycenter_v1_identitycenter_service_proto_rawDesc, + NumEnums: 0, + NumMessages: 4, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_teleport_identitycenter_v1_identitycenter_service_proto_goTypes, + DependencyIndexes: file_teleport_identitycenter_v1_identitycenter_service_proto_depIdxs, + MessageInfos: file_teleport_identitycenter_v1_identitycenter_service_proto_msgTypes, + }.Build() + File_teleport_identitycenter_v1_identitycenter_service_proto = out.File + file_teleport_identitycenter_v1_identitycenter_service_proto_rawDesc = nil + file_teleport_identitycenter_v1_identitycenter_service_proto_goTypes = nil + file_teleport_identitycenter_v1_identitycenter_service_proto_depIdxs = nil +} diff --git a/api/gen/proto/go/teleport/identitycenter/v1/identitycenter_service_grpc.pb.go b/api/gen/proto/go/teleport/identitycenter/v1/identitycenter_service_grpc.pb.go new file mode 100644 index 0000000000000..de6e1b076ca42 --- /dev/null +++ b/api/gen/proto/go/teleport/identitycenter/v1/identitycenter_service_grpc.pb.go @@ -0,0 +1,264 @@ +// 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/identitycenter/v1/identitycenter_service.proto + +package identitycenterv1 + +import ( + context "context" + 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 ( + IdentityCenterService_DeleteAllIdentityCenterAccounts_FullMethodName = "/teleport.identitycenter.v1.IdentityCenterService/DeleteAllIdentityCenterAccounts" + IdentityCenterService_DeleteAllAccountAssignments_FullMethodName = "/teleport.identitycenter.v1.IdentityCenterService/DeleteAllAccountAssignments" + IdentityCenterService_DeleteAllPrincipalAssignments_FullMethodName = "/teleport.identitycenter.v1.IdentityCenterService/DeleteAllPrincipalAssignments" + IdentityCenterService_DeleteAllPermissionSets_FullMethodName = "/teleport.identitycenter.v1.IdentityCenterService/DeleteAllPermissionSets" +) + +// IdentityCenterServiceClient is the client API for IdentityCenterService 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. +// +// IdentityCenterService provides methods to manage Identity Center +// resources. +type IdentityCenterServiceClient interface { + // DeleteAllIdentityCenterAccounts deletes all Identity Center accounts. + DeleteAllIdentityCenterAccounts(ctx context.Context, in *DeleteAllIdentityCenterAccountsRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // DeleteAllAccountAssignments deletes all Identity Center Account assignments. + DeleteAllAccountAssignments(ctx context.Context, in *DeleteAllAccountAssignmentsRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // DeleteAllPrincipalAssignments deletes all Identity Center principal assignments. + DeleteAllPrincipalAssignments(ctx context.Context, in *DeleteAllPrincipalAssignmentsRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // DeleteAllPermissionSets deletes all Identity Center permission sets. + DeleteAllPermissionSets(ctx context.Context, in *DeleteAllPermissionSetsRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) +} + +type identityCenterServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewIdentityCenterServiceClient(cc grpc.ClientConnInterface) IdentityCenterServiceClient { + return &identityCenterServiceClient{cc} +} + +func (c *identityCenterServiceClient) DeleteAllIdentityCenterAccounts(ctx context.Context, in *DeleteAllIdentityCenterAccountsRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, IdentityCenterService_DeleteAllIdentityCenterAccounts_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *identityCenterServiceClient) DeleteAllAccountAssignments(ctx context.Context, in *DeleteAllAccountAssignmentsRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, IdentityCenterService_DeleteAllAccountAssignments_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *identityCenterServiceClient) DeleteAllPrincipalAssignments(ctx context.Context, in *DeleteAllPrincipalAssignmentsRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, IdentityCenterService_DeleteAllPrincipalAssignments_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *identityCenterServiceClient) DeleteAllPermissionSets(ctx context.Context, in *DeleteAllPermissionSetsRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, IdentityCenterService_DeleteAllPermissionSets_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// IdentityCenterServiceServer is the server API for IdentityCenterService service. +// All implementations must embed UnimplementedIdentityCenterServiceServer +// for forward compatibility. +// +// IdentityCenterService provides methods to manage Identity Center +// resources. +type IdentityCenterServiceServer interface { + // DeleteAllIdentityCenterAccounts deletes all Identity Center accounts. + DeleteAllIdentityCenterAccounts(context.Context, *DeleteAllIdentityCenterAccountsRequest) (*emptypb.Empty, error) + // DeleteAllAccountAssignments deletes all Identity Center Account assignments. + DeleteAllAccountAssignments(context.Context, *DeleteAllAccountAssignmentsRequest) (*emptypb.Empty, error) + // DeleteAllPrincipalAssignments deletes all Identity Center principal assignments. + DeleteAllPrincipalAssignments(context.Context, *DeleteAllPrincipalAssignmentsRequest) (*emptypb.Empty, error) + // DeleteAllPermissionSets deletes all Identity Center permission sets. + DeleteAllPermissionSets(context.Context, *DeleteAllPermissionSetsRequest) (*emptypb.Empty, error) + mustEmbedUnimplementedIdentityCenterServiceServer() +} + +// UnimplementedIdentityCenterServiceServer 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 UnimplementedIdentityCenterServiceServer struct{} + +func (UnimplementedIdentityCenterServiceServer) DeleteAllIdentityCenterAccounts(context.Context, *DeleteAllIdentityCenterAccountsRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteAllIdentityCenterAccounts not implemented") +} +func (UnimplementedIdentityCenterServiceServer) DeleteAllAccountAssignments(context.Context, *DeleteAllAccountAssignmentsRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteAllAccountAssignments not implemented") +} +func (UnimplementedIdentityCenterServiceServer) DeleteAllPrincipalAssignments(context.Context, *DeleteAllPrincipalAssignmentsRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteAllPrincipalAssignments not implemented") +} +func (UnimplementedIdentityCenterServiceServer) DeleteAllPermissionSets(context.Context, *DeleteAllPermissionSetsRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteAllPermissionSets not implemented") +} +func (UnimplementedIdentityCenterServiceServer) mustEmbedUnimplementedIdentityCenterServiceServer() {} +func (UnimplementedIdentityCenterServiceServer) testEmbeddedByValue() {} + +// UnsafeIdentityCenterServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to IdentityCenterServiceServer will +// result in compilation errors. +type UnsafeIdentityCenterServiceServer interface { + mustEmbedUnimplementedIdentityCenterServiceServer() +} + +func RegisterIdentityCenterServiceServer(s grpc.ServiceRegistrar, srv IdentityCenterServiceServer) { + // If the following call pancis, it indicates UnimplementedIdentityCenterServiceServer 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(&IdentityCenterService_ServiceDesc, srv) +} + +func _IdentityCenterService_DeleteAllIdentityCenterAccounts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteAllIdentityCenterAccountsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IdentityCenterServiceServer).DeleteAllIdentityCenterAccounts(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IdentityCenterService_DeleteAllIdentityCenterAccounts_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IdentityCenterServiceServer).DeleteAllIdentityCenterAccounts(ctx, req.(*DeleteAllIdentityCenterAccountsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _IdentityCenterService_DeleteAllAccountAssignments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteAllAccountAssignmentsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IdentityCenterServiceServer).DeleteAllAccountAssignments(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IdentityCenterService_DeleteAllAccountAssignments_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IdentityCenterServiceServer).DeleteAllAccountAssignments(ctx, req.(*DeleteAllAccountAssignmentsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _IdentityCenterService_DeleteAllPrincipalAssignments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteAllPrincipalAssignmentsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IdentityCenterServiceServer).DeleteAllPrincipalAssignments(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IdentityCenterService_DeleteAllPrincipalAssignments_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IdentityCenterServiceServer).DeleteAllPrincipalAssignments(ctx, req.(*DeleteAllPrincipalAssignmentsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _IdentityCenterService_DeleteAllPermissionSets_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteAllPermissionSetsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IdentityCenterServiceServer).DeleteAllPermissionSets(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IdentityCenterService_DeleteAllPermissionSets_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IdentityCenterServiceServer).DeleteAllPermissionSets(ctx, req.(*DeleteAllPermissionSetsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// IdentityCenterService_ServiceDesc is the grpc.ServiceDesc for IdentityCenterService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var IdentityCenterService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "teleport.identitycenter.v1.IdentityCenterService", + HandlerType: (*IdentityCenterServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "DeleteAllIdentityCenterAccounts", + Handler: _IdentityCenterService_DeleteAllIdentityCenterAccounts_Handler, + }, + { + MethodName: "DeleteAllAccountAssignments", + Handler: _IdentityCenterService_DeleteAllAccountAssignments_Handler, + }, + { + MethodName: "DeleteAllPrincipalAssignments", + Handler: _IdentityCenterService_DeleteAllPrincipalAssignments_Handler, + }, + { + MethodName: "DeleteAllPermissionSets", + Handler: _IdentityCenterService_DeleteAllPermissionSets_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "teleport/identitycenter/v1/identitycenter_service.proto", +} diff --git a/api/gen/proto/go/teleport/provisioning/v1/provisioning_service.pb.go b/api/gen/proto/go/teleport/provisioning/v1/provisioning_service.pb.go new file mode 100644 index 0000000000000..27972626d5da9 --- /dev/null +++ b/api/gen/proto/go/teleport/provisioning/v1/provisioning_service.pb.go @@ -0,0 +1,169 @@ +// 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/provisioning/v1/provisioning_service.proto + +package provisioningv1 + +import ( + 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) +) + +// DeleteDownstreamProvisioningStatesRequest is a request to delete all provisioning states for +// a given DownstreamId. +type DeleteDownstreamProvisioningStatesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // DownstreamId identifies the downstream service that this state applies to. + DownstreamId string `protobuf:"bytes,1,opt,name=downstream_id,json=downstreamId,proto3" json:"downstream_id,omitempty"` +} + +func (x *DeleteDownstreamProvisioningStatesRequest) Reset() { + *x = DeleteDownstreamProvisioningStatesRequest{} + mi := &file_teleport_provisioning_v1_provisioning_service_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteDownstreamProvisioningStatesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteDownstreamProvisioningStatesRequest) ProtoMessage() {} + +func (x *DeleteDownstreamProvisioningStatesRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_provisioning_v1_provisioning_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 DeleteDownstreamProvisioningStatesRequest.ProtoReflect.Descriptor instead. +func (*DeleteDownstreamProvisioningStatesRequest) Descriptor() ([]byte, []int) { + return file_teleport_provisioning_v1_provisioning_service_proto_rawDescGZIP(), []int{0} +} + +func (x *DeleteDownstreamProvisioningStatesRequest) GetDownstreamId() string { + if x != nil { + return x.DownstreamId + } + return "" +} + +var File_teleport_provisioning_v1_provisioning_service_proto protoreflect.FileDescriptor + +var file_teleport_provisioning_v1_provisioning_service_proto_rawDesc = []byte{ + 0x0a, 0x33, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x18, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 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, 0x22, 0x50, 0x0a, 0x29, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x6f, 0x77, + 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x32, 0x99, + 0x01, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x81, 0x01, 0x0a, 0x22, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x43, 0x2e, + 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, + 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 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, 0x42, 0x5c, 0x5a, 0x5a, 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, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x31, 0x3b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_teleport_provisioning_v1_provisioning_service_proto_rawDescOnce sync.Once + file_teleport_provisioning_v1_provisioning_service_proto_rawDescData = file_teleport_provisioning_v1_provisioning_service_proto_rawDesc +) + +func file_teleport_provisioning_v1_provisioning_service_proto_rawDescGZIP() []byte { + file_teleport_provisioning_v1_provisioning_service_proto_rawDescOnce.Do(func() { + file_teleport_provisioning_v1_provisioning_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_teleport_provisioning_v1_provisioning_service_proto_rawDescData) + }) + return file_teleport_provisioning_v1_provisioning_service_proto_rawDescData +} + +var file_teleport_provisioning_v1_provisioning_service_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_teleport_provisioning_v1_provisioning_service_proto_goTypes = []any{ + (*DeleteDownstreamProvisioningStatesRequest)(nil), // 0: teleport.provisioning.v1.DeleteDownstreamProvisioningStatesRequest + (*emptypb.Empty)(nil), // 1: google.protobuf.Empty +} +var file_teleport_provisioning_v1_provisioning_service_proto_depIdxs = []int32{ + 0, // 0: teleport.provisioning.v1.ProvisioningService.DeleteDownstreamProvisioningStates:input_type -> teleport.provisioning.v1.DeleteDownstreamProvisioningStatesRequest + 1, // 1: teleport.provisioning.v1.ProvisioningService.DeleteDownstreamProvisioningStates:output_type -> google.protobuf.Empty + 1, // [1:2] is the sub-list for method output_type + 0, // [0:1] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_teleport_provisioning_v1_provisioning_service_proto_init() } +func file_teleport_provisioning_v1_provisioning_service_proto_init() { + if File_teleport_provisioning_v1_provisioning_service_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_teleport_provisioning_v1_provisioning_service_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_teleport_provisioning_v1_provisioning_service_proto_goTypes, + DependencyIndexes: file_teleport_provisioning_v1_provisioning_service_proto_depIdxs, + MessageInfos: file_teleport_provisioning_v1_provisioning_service_proto_msgTypes, + }.Build() + File_teleport_provisioning_v1_provisioning_service_proto = out.File + file_teleport_provisioning_v1_provisioning_service_proto_rawDesc = nil + file_teleport_provisioning_v1_provisioning_service_proto_goTypes = nil + file_teleport_provisioning_v1_provisioning_service_proto_depIdxs = nil +} diff --git a/api/gen/proto/go/teleport/provisioning/v1/provisioning_service_grpc.pb.go b/api/gen/proto/go/teleport/provisioning/v1/provisioning_service_grpc.pb.go new file mode 100644 index 0000000000000..fdfe2a7bde4f4 --- /dev/null +++ b/api/gen/proto/go/teleport/provisioning/v1/provisioning_service_grpc.pb.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. + +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: teleport/provisioning/v1/provisioning_service.proto + +package provisioningv1 + +import ( + context "context" + 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 ( + ProvisioningService_DeleteDownstreamProvisioningStates_FullMethodName = "/teleport.provisioning.v1.ProvisioningService/DeleteDownstreamProvisioningStates" +) + +// ProvisioningServiceClient is the client API for ProvisioningService 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. +// +// ProvisioningService provides methods to manage Provisioning resources. +type ProvisioningServiceClient interface { + // DeleteDownstreamProvisioningStates deletes all Identity Center provisioning state for a given downstream. + DeleteDownstreamProvisioningStates(ctx context.Context, in *DeleteDownstreamProvisioningStatesRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) +} + +type provisioningServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewProvisioningServiceClient(cc grpc.ClientConnInterface) ProvisioningServiceClient { + return &provisioningServiceClient{cc} +} + +func (c *provisioningServiceClient) DeleteDownstreamProvisioningStates(ctx context.Context, in *DeleteDownstreamProvisioningStatesRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, ProvisioningService_DeleteDownstreamProvisioningStates_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ProvisioningServiceServer is the server API for ProvisioningService service. +// All implementations must embed UnimplementedProvisioningServiceServer +// for forward compatibility. +// +// ProvisioningService provides methods to manage Provisioning resources. +type ProvisioningServiceServer interface { + // DeleteDownstreamProvisioningStates deletes all Identity Center provisioning state for a given downstream. + DeleteDownstreamProvisioningStates(context.Context, *DeleteDownstreamProvisioningStatesRequest) (*emptypb.Empty, error) + mustEmbedUnimplementedProvisioningServiceServer() +} + +// UnimplementedProvisioningServiceServer 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 UnimplementedProvisioningServiceServer struct{} + +func (UnimplementedProvisioningServiceServer) DeleteDownstreamProvisioningStates(context.Context, *DeleteDownstreamProvisioningStatesRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteDownstreamProvisioningStates not implemented") +} +func (UnimplementedProvisioningServiceServer) mustEmbedUnimplementedProvisioningServiceServer() {} +func (UnimplementedProvisioningServiceServer) testEmbeddedByValue() {} + +// UnsafeProvisioningServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ProvisioningServiceServer will +// result in compilation errors. +type UnsafeProvisioningServiceServer interface { + mustEmbedUnimplementedProvisioningServiceServer() +} + +func RegisterProvisioningServiceServer(s grpc.ServiceRegistrar, srv ProvisioningServiceServer) { + // If the following call pancis, it indicates UnimplementedProvisioningServiceServer 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(&ProvisioningService_ServiceDesc, srv) +} + +func _ProvisioningService_DeleteDownstreamProvisioningStates_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteDownstreamProvisioningStatesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ProvisioningServiceServer).DeleteDownstreamProvisioningStates(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ProvisioningService_DeleteDownstreamProvisioningStates_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ProvisioningServiceServer).DeleteDownstreamProvisioningStates(ctx, req.(*DeleteDownstreamProvisioningStatesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// ProvisioningService_ServiceDesc is the grpc.ServiceDesc for ProvisioningService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var ProvisioningService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "teleport.provisioning.v1.ProvisioningService", + HandlerType: (*ProvisioningServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "DeleteDownstreamProvisioningStates", + Handler: _ProvisioningService_DeleteDownstreamProvisioningStates_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "teleport/provisioning/v1/provisioning_service.proto", +} diff --git a/api/proto/teleport/identitycenter/v1/identitycenter_service.proto b/api/proto/teleport/identitycenter/v1/identitycenter_service.proto new file mode 100644 index 0000000000000..5230c53040f60 --- /dev/null +++ b/api/proto/teleport/identitycenter/v1/identitycenter_service.proto @@ -0,0 +1,49 @@ +// 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.identitycenter.v1; + +import "google/protobuf/empty.proto"; + +option go_package = "github.com/gravitational/teleport/api/gen/proto/go/teleport/identitycenter/v1;identitycenterv1"; + +// IdentityCenterService provides methods to manage Identity Center +// resources. +service IdentityCenterService { + // DeleteAllIdentityCenterAccounts deletes all Identity Center accounts. + rpc DeleteAllIdentityCenterAccounts(DeleteAllIdentityCenterAccountsRequest) returns (google.protobuf.Empty); + + // DeleteAllAccountAssignments deletes all Identity Center Account assignments. + rpc DeleteAllAccountAssignments(DeleteAllAccountAssignmentsRequest) returns (google.protobuf.Empty); + + // DeleteAllPrincipalAssignments deletes all Identity Center principal assignments. + rpc DeleteAllPrincipalAssignments(DeleteAllPrincipalAssignmentsRequest) returns (google.protobuf.Empty); + + // DeleteAllPermissionSets deletes all Identity Center permission sets. + rpc DeleteAllPermissionSets(DeleteAllPermissionSetsRequest) returns (google.protobuf.Empty); +} + +// DeleteAllIdentityCenterAccountsRequest is a request to delete all Identity Center imported accounts. +message DeleteAllIdentityCenterAccountsRequest {} + +// DeleteAllAccountAssignmentsRequest is a request to delete all Identity Center account assignments. +message DeleteAllAccountAssignmentsRequest {} + +// DeleteAllPrincipalAssignmentsRequest is a request to delete all Identity Center principal assignments. +message DeleteAllPrincipalAssignmentsRequest {} + +// DeleteAllPermissionSetsRequest is a request to delete all Identity Center permission sets. +message DeleteAllPermissionSetsRequest {} diff --git a/api/proto/teleport/legacy/types/events/events.proto b/api/proto/teleport/legacy/types/events/events.proto index 123741d01493b..bd61c99381b62 100644 --- a/api/proto/teleport/legacy/types/events/events.proto +++ b/api/proto/teleport/legacy/types/events/events.proto @@ -1973,6 +1973,13 @@ message Subsystem { // Error contains error in case of unsucessfull attempt string Error = 5 [(gogoproto.jsontag) = "exitError"]; + + // ServerMetadata is a common server metadata + ServerMetadata Server = 6 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; } // ClientDisconnect is emitted when client is disconnected diff --git a/api/proto/teleport/provisioning/v1/provisioning_service.proto b/api/proto/teleport/provisioning/v1/provisioning_service.proto new file mode 100644 index 0000000000000..a477786bd0698 --- /dev/null +++ b/api/proto/teleport/provisioning/v1/provisioning_service.proto @@ -0,0 +1,34 @@ +// 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.provisioning.v1; + +import "google/protobuf/empty.proto"; + +option go_package = "github.com/gravitational/teleport/api/gen/proto/go/teleport/provisioning/v1;provisioningv1"; + +// ProvisioningService provides methods to manage Provisioning resources. +service ProvisioningService { + // DeleteDownstreamProvisioningStates deletes all Identity Center provisioning state for a given downstream. + rpc DeleteDownstreamProvisioningStates(DeleteDownstreamProvisioningStatesRequest) returns (google.protobuf.Empty); +} + +// DeleteDownstreamProvisioningStatesRequest is a request to delete all provisioning states for +// a given DownstreamId. +message DeleteDownstreamProvisioningStatesRequest { + // DownstreamId identifies the downstream service that this state applies to. + string downstream_id = 1; +} diff --git a/api/types/events/events.pb.go b/api/types/events/events.pb.go index faaa96efd083d..b386ffc8f6e20 100644 --- a/api/types/events/events.pb.go +++ b/api/types/events/events.pb.go @@ -3447,7 +3447,9 @@ type Subsystem struct { // Name is a subsystem name Name string `protobuf:"bytes,4,opt,name=Name,proto3" json:"name"` // Error contains error in case of unsucessfull attempt - Error string `protobuf:"bytes,5,opt,name=Error,proto3" json:"exitError"` + Error string `protobuf:"bytes,5,opt,name=Error,proto3" json:"exitError"` + // ServerMetadata is a common server metadata + ServerMetadata `protobuf:"bytes,6,opt,name=Server,proto3,embedded=Server" json:""` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -15137,16 +15139,16 @@ func init() { } var fileDescriptor_007ba1c3d6266d56 = []byte{ - // 16881 bytes of a gzipped FileDescriptorProto + // 16888 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x78, 0x24, 0x49, 0x72, 0x18, 0x86, 0x7e, 0xa0, 0x01, 0x04, 0x1e, 0x03, 0xe4, 0xbc, 0x6a, 0x67, 0x67, 0x17, 0xbb, 0xb5, 0x77, 0x73, 0x33, 0x7b, 0xbb, 0x98, 0xdb, 0xd9, 0xd9, 0xdd, 0xdb, 0xd7, 0xed, 0x35, 0xd0, 0xc0, 0xa0, 0x67, 0xf0, 0xda, 0x6a, 0xcc, 0xcc, 0xed, 0x91, 0x77, 0xcd, 0x42, 0x57, 0xa2, 0x51, 0x3b, 0xdd, 0x55, 0xcd, 0xaa, 0xea, 0xc1, 0x60, 0xfd, 0xe2, 0xd1, 0x14, 0x45, 0x8a, 0xc7, 0xd3, 0xf9, 0x68, 0x8a, 0xd4, 0xc3, 0xd6, 0x51, 0x0f, 0x9b, 0xa2, 0x28, 0x9e, 0x29, 0xd1, 0x24, 0x8f, - 0xe4, 0x59, 0x92, 0xe9, 0xc7, 0x49, 0xfc, 0xcc, 0x8f, 0x94, 0x6d, 0x7d, 0xfa, 0x6c, 0x19, 0x27, + 0xe4, 0x59, 0x92, 0xe9, 0xc7, 0x89, 0xfc, 0xcc, 0x8f, 0x94, 0x6d, 0x7d, 0xfa, 0x6c, 0x19, 0x27, 0xd3, 0xd6, 0x1f, 0x7c, 0xf6, 0xf7, 0xd1, 0xf6, 0x7d, 0xd6, 0x59, 0x96, 0xfd, 0xe9, 0xcb, 0xc8, - 0xac, 0xaa, 0xac, 0x57, 0xe3, 0xb9, 0xc4, 0xe2, 0x06, 0x7f, 0x66, 0xd0, 0x11, 0x91, 0x91, 0x59, + 0xac, 0xaa, 0xac, 0x57, 0xe3, 0xb9, 0xc2, 0xe2, 0x06, 0x7f, 0x66, 0xd0, 0x11, 0x91, 0x91, 0x59, 0x91, 0x91, 0x99, 0x91, 0x99, 0x91, 0x11, 0x70, 0xcd, 0xa3, 0x2d, 0xda, 0xb1, 0x1d, 0xef, 0x7a, 0x8b, 0x36, 0xf5, 0xc6, 0xd6, 0x75, 0x6f, 0xab, 0x43, 0xdd, 0xeb, 0xf4, 0x21, 0xb5, 0x3c, 0xff, 0xbf, 0xa9, 0x8e, 0x63, 0x7b, 0x36, 0x29, 0xf1, 0x5f, 0x97, 0xce, 0x35, 0xed, 0xa6, 0x8d, 0xa0, @@ -15193,7 +15195,7 @@ var fileDescriptor_007ba1c3d6266d56 = []byte{ 0x4c, 0x07, 0xeb, 0x0f, 0x4c, 0x4b, 0x9e, 0x22, 0x82, 0xa2, 0x6c, 0x14, 0x4d, 0xdb, 0x1e, 0x0e, 0xdd, 0xe1, 0x70, 0x14, 0xad, 0xd9, 0x5e, 0x7c, 0xd8, 0xfa, 0x64, 0x64, 0x06, 0x46, 0xa7, 0x6d, 0xaf, 0x6a, 0xb9, 0x9e, 0x6e, 0x35, 0x68, 0xb5, 0xa2, 0x8c, 0x60, 0x39, 0x54, 0x0b, 0x56, 0xce, - 0x14, 0x98, 0x7a, 0x64, 0x52, 0x8a, 0x96, 0x51, 0xff, 0x45, 0x11, 0xc6, 0x58, 0x9f, 0x48, 0xc3, + 0x14, 0x98, 0x7a, 0x64, 0x52, 0x8a, 0x96, 0x51, 0xff, 0x79, 0x11, 0xc6, 0x58, 0x9f, 0x48, 0xc3, 0xa7, 0xcc, 0x66, 0x02, 0x06, 0x61, 0xb5, 0xb8, 0x1d, 0xbd, 0x41, 0xc5, 0x48, 0xc2, 0xaf, 0xb0, 0x7c, 0xa0, 0xc4, 0x33, 0x4e, 0x4f, 0xae, 0xc1, 0x20, 0x07, 0x55, 0x2b, 0x62, 0x70, 0x8d, 0xee, 0x6c, 0x4f, 0x0e, 0xb9, 0x08, 0xab, 0x9b, 0x86, 0x16, 0xa0, 0x99, 0x76, 0xf3, 0xbf, 0xe7, 0x6d, @@ -15214,7 +15216,7 @@ var fileDescriptor_007ba1c3d6266d56 = []byte{ 0x07, 0x51, 0xb2, 0x02, 0x84, 0xc4, 0xe4, 0x3a, 0x0c, 0xae, 0xb0, 0x75, 0xb6, 0x61, 0xb7, 0x84, 0xf2, 0xe1, 0x52, 0x80, 0x6b, 0xaf, 0x3c, 0x56, 0x7d, 0x22, 0x75, 0x1e, 0xc6, 0x66, 0x5a, 0x26, 0xb5, 0x3c, 0xb9, 0xd5, 0x6c, 0x24, 0x97, 0x9b, 0xd4, 0xf2, 0xe4, 0x56, 0xe3, 0x98, 0xd7, 0x19, - 0x54, 0x6e, 0x75, 0x40, 0xaa, 0xfe, 0x7e, 0x01, 0x9e, 0xb8, 0xd3, 0x5d, 0xa3, 0x8e, 0x45, 0x3d, + 0x54, 0x6e, 0x75, 0x40, 0xaa, 0xfe, 0x41, 0x01, 0x9e, 0xb8, 0xd3, 0x5d, 0xa3, 0x8e, 0x45, 0x3d, 0xea, 0x8a, 0x05, 0x39, 0xe0, 0xba, 0x04, 0x13, 0x09, 0xa4, 0xe0, 0x8e, 0x0b, 0xe5, 0x83, 0x00, 0x59, 0x17, 0x6b, 0xbc, 0x3c, 0xdb, 0x26, 0x8a, 0x92, 0x79, 0x38, 0x13, 0x02, 0x59, 0x23, 0x5c, 0x25, 0x8f, 0x4b, 0xc9, 0xd3, 0x3b, 0xdb, 0x93, 0x97, 0x24, 0x6e, 0xac, 0xd9, 0xb2, 0x06, 0xc7, @@ -15222,7 +15224,7 @@ var fileDescriptor_007ba1c3d6266d56 = []byte{ 0xb3, 0x3d, 0xf9, 0xa4, 0xc4, 0xaa, 0x89, 0x48, 0x79, 0x01, 0x8f, 0x17, 0x24, 0x3f, 0x96, 0x93, 0xb9, 0x89, 0x51, 0x58, 0xc4, 0x51, 0xf8, 0x9a, 0x3f, 0x0a, 0x33, 0x85, 0x34, 0x15, 0x2f, 0x29, 0x06, 0x65, 0xac, 0x19, 0x89, 0x41, 0x99, 0xa8, 0xf1, 0xd2, 0x0c, 0x9c, 0x4f, 0xe5, 0xb5, 0x2f, - 0xad, 0xfe, 0xe7, 0x05, 0x99, 0xcb, 0x8a, 0x6d, 0x04, 0x9d, 0xb9, 0x2c, 0x77, 0xe6, 0x8a, 0x6d, + 0xad, 0xfe, 0x67, 0x05, 0x99, 0xcb, 0x8a, 0x6d, 0x04, 0x9d, 0xb9, 0x2c, 0x77, 0xe6, 0x8a, 0x6d, 0xe0, 0x54, 0x9f, 0x0b, 0xd7, 0x4e, 0xa9, 0xb1, 0x1d, 0xdb, 0x88, 0xcf, 0xfa, 0xc9, 0xb2, 0xe4, 0x8b, 0x70, 0x21, 0x01, 0xe4, 0xd3, 0x35, 0xd7, 0xfe, 0x2b, 0x3b, 0xdb, 0x93, 0x6a, 0x0a, 0xd7, 0xf8, 0xec, 0x9d, 0xc1, 0x85, 0xe8, 0x70, 0x51, 0x92, 0xba, 0x6d, 0x79, 0xba, 0x69, 0x09, 0xe3, @@ -15284,7 +15286,7 @@ var fileDescriptor_007ba1c3d6266d56 = []byte{ 0xba, 0xd3, 0xa4, 0x1e, 0xca, 0x62, 0xf8, 0xc6, 0xc4, 0x14, 0x3f, 0xdd, 0x66, 0x44, 0x1c, 0x31, 0x3d, 0x26, 0x66, 0x9f, 0x92, 0x87, 0xbf, 0x35, 0x51, 0x40, 0xfd, 0x4e, 0x3f, 0x8c, 0x88, 0x93, 0x58, 0x5c, 0x3d, 0xc8, 0x1b, 0xe1, 0xd9, 0xb6, 0x98, 0x2e, 0x83, 0xd3, 0xa8, 0xe0, 0x14, 0x6d, - 0x84, 0x31, 0xfb, 0x83, 0xed, 0xc9, 0xdc, 0xce, 0xf6, 0x64, 0x9f, 0x36, 0x28, 0x6d, 0x62, 0xc3, + 0x84, 0x31, 0xfb, 0xc3, 0xed, 0xc9, 0xdc, 0xce, 0xf6, 0x64, 0x9f, 0x36, 0x28, 0x6d, 0x62, 0xc3, 0xf5, 0x4d, 0x5a, 0xd0, 0xe5, 0xb3, 0xd5, 0x58, 0x59, 0xbe, 0xde, 0xbd, 0x03, 0x03, 0xa2, 0x0d, 0x42, 0xe3, 0x2e, 0x86, 0x67, 0x27, 0x91, 0x13, 0xe5, 0x58, 0x69, 0xbf, 0x14, 0x79, 0x0b, 0x4a, 0xfc, 0x2c, 0x41, 0x08, 0xe0, 0x42, 0xfa, 0xd9, 0x4b, 0xac, 0xb8, 0x28, 0x43, 0xe6, 0x01, 0xc2, @@ -15306,7 +15308,7 @@ var fileDescriptor_007ba1c3d6266d56 = []byte{ 0xd7, 0x76, 0xb5, 0x24, 0x01, 0x51, 0xa1, 0xb4, 0xbc, 0xbe, 0xee, 0x52, 0x0f, 0xc5, 0x57, 0x98, 0x06, 0x36, 0x39, 0xdb, 0x08, 0xd1, 0x04, 0x46, 0xfd, 0x46, 0x8e, 0xed, 0x96, 0xdc, 0x07, 0x9e, 0xdd, 0x09, 0xb4, 0xfc, 0x50, 0x22, 0xb9, 0x16, 0xda, 0x15, 0x79, 0xfc, 0xda, 0x33, 0xe2, 0x6b, - 0x07, 0x84, 0x6d, 0x11, 0x5a, 0x14, 0xa9, 0x5f, 0x55, 0xd8, 0xe5, 0xab, 0xd4, 0x3f, 0xce, 0xc3, + 0x07, 0x84, 0x6d, 0x11, 0x5a, 0x14, 0xa9, 0x5f, 0x55, 0xd8, 0xe5, 0xab, 0xd4, 0x3f, 0xc9, 0xc3, 0x45, 0xd1, 0xe2, 0x99, 0x96, 0xd9, 0x59, 0xb3, 0x75, 0xc7, 0xd0, 0x68, 0x83, 0x9a, 0x0f, 0xe9, 0xc9, 0x1c, 0x78, 0xd1, 0xa1, 0x53, 0x3c, 0xc4, 0xd0, 0xb9, 0x81, 0x1b, 0x4f, 0x26, 0x19, 0x3c, 0x60, 0xe6, 0x46, 0xc5, 0xf8, 0xce, 0xf6, 0xe4, 0x88, 0xc1, 0xc1, 0x78, 0xc5, 0xa0, 0xc9, 0x44, @@ -15321,7 +15323,7 @@ var fileDescriptor_007ba1c3d6266d56 = []byte{ 0xf6, 0x3a, 0x79, 0x16, 0x8a, 0x2b, 0xba, 0xb7, 0x21, 0xae, 0xfb, 0xf1, 0x0e, 0x7a, 0xdd, 0x6c, 0xd1, 0x7a, 0x47, 0xf7, 0x36, 0x34, 0x44, 0x49, 0x73, 0x06, 0x20, 0xc7, 0x94, 0x39, 0x43, 0x5a, 0xec, 0x87, 0x9f, 0xc9, 0x5d, 0x2d, 0xa6, 0x2e, 0xf6, 0xdf, 0x29, 0x66, 0xcd, 0x2b, 0xf7, 0x1d, - 0xd3, 0xa3, 0xa7, 0x1a, 0x76, 0xaa, 0x61, 0x87, 0xd4, 0xb0, 0x7f, 0x94, 0x87, 0xd1, 0x60, 0xd3, + 0xd3, 0xa3, 0xa7, 0x1a, 0x76, 0xaa, 0x61, 0x87, 0xd4, 0xb0, 0x7f, 0x98, 0x87, 0xd1, 0x60, 0xd3, 0xf4, 0x3e, 0x6d, 0x1c, 0xcf, 0x5a, 0x15, 0x6e, 0x65, 0x0a, 0x87, 0xde, 0xca, 0x1c, 0x46, 0xa1, 0xd4, 0xe0, 0x88, 0x95, 0x9b, 0x06, 0x28, 0x31, 0x7e, 0xc4, 0x1a, 0x1c, 0xac, 0x3e, 0x0b, 0x03, 0x8b, 0xfa, 0x23, 0xb3, 0xdd, 0x6d, 0x0b, 0x2b, 0x1d, 0xdd, 0xd7, 0xda, 0xfa, 0x23, 0xcd, 0x87, @@ -15335,7 +15337,7 @@ var fileDescriptor_007ba1c3d6266d56 = []byte{ 0x2c, 0xa3, 0xac, 0xd8, 0x9b, 0x56, 0xcb, 0xd6, 0xb9, 0xb3, 0xcd, 0x20, 0xa7, 0x34, 0x04, 0x4c, 0x0b, 0xb0, 0x8c, 0x92, 0xc9, 0x1c, 0x9d, 0x98, 0x06, 0x43, 0x9e, 0xeb, 0x02, 0xa6, 0x05, 0x58, 0xf5, 0x1b, 0x45, 0xa6, 0xbd, 0xae, 0xf9, 0xc1, 0x63, 0xbf, 0x2e, 0x84, 0x03, 0xa6, 0xff, 0x00, - 0x03, 0xe6, 0xb1, 0x39, 0xb0, 0x53, 0xff, 0xc5, 0x00, 0x80, 0x90, 0xfe, 0xec, 0xe9, 0xe6, 0xf0, + 0x03, 0xe6, 0xb1, 0x39, 0xb0, 0x53, 0xff, 0xf9, 0x00, 0x80, 0x90, 0xfe, 0xec, 0xe9, 0xe6, 0xf0, 0x70, 0x5a, 0x53, 0x81, 0x89, 0x59, 0x6b, 0x43, 0xb7, 0x1a, 0xd4, 0x08, 0x8f, 0x2d, 0x4b, 0x38, 0xb4, 0xd1, 0xe9, 0x92, 0x0a, 0x64, 0x78, 0x6e, 0xa9, 0x25, 0x0b, 0x90, 0x97, 0x60, 0xb8, 0x6a, 0x79, 0xd4, 0xd1, 0x1b, 0x9e, 0xf9, 0x90, 0x8a, 0xa9, 0x01, 0x6f, 0xa2, 0xcd, 0x10, 0xac, 0xc9, @@ -15373,12 +15375,12 @@ var fileDescriptor_007ba1c3d6266d56 = []byte{ 0x76, 0xa9, 0x32, 0x9e, 0x53, 0x7f, 0x59, 0x9a, 0x41, 0x98, 0x6a, 0x9d, 0x5e, 0x0d, 0x1f, 0xea, 0xbe, 0x65, 0x1c, 0xef, 0x43, 0xf1, 0xc4, 0xa0, 0x6d, 0x7a, 0x1e, 0x35, 0xc4, 0x2a, 0x81, 0xf7, 0x85, 0xde, 0x23, 0x2d, 0x81, 0x27, 0x2f, 0xc0, 0x28, 0xc2, 0xc4, 0x15, 0x21, 0xdf, 0x1f, 0x8b, - 0x02, 0xce, 0x23, 0x2d, 0x8a, 0x54, 0x7f, 0x2f, 0xbc, 0x1d, 0x5e, 0xa0, 0xfa, 0x49, 0xbd, 0x51, - 0xfc, 0x88, 0xf4, 0x97, 0xfa, 0xaf, 0x8a, 0xfc, 0xc9, 0x09, 0x7f, 0x9f, 0x78, 0x1c, 0xa2, 0x0c, + 0x02, 0xce, 0x23, 0x2d, 0x8a, 0x54, 0x7f, 0x3f, 0xbc, 0x1d, 0x5e, 0xa0, 0xfa, 0x49, 0xbd, 0x51, + 0xfc, 0x88, 0xf4, 0x97, 0xfa, 0x2f, 0x8b, 0xfc, 0xc9, 0x09, 0x7f, 0x9f, 0x78, 0x1c, 0xa2, 0x0c, 0x8f, 0x74, 0x0b, 0xfb, 0x38, 0xd2, 0x7d, 0x01, 0x4a, 0x8b, 0xd4, 0xdb, 0xb0, 0x7d, 0xc7, 0x2f, 0xf4, 0xd0, 0x6b, 0x23, 0x44, 0xf6, 0xd0, 0xe3, 0x34, 0xe4, 0x01, 0x10, 0xff, 0xf1, 0x61, 0xe0, 0xf8, 0xed, 0x1f, 0x21, 0x5f, 0x4c, 0xec, 0x53, 0x6a, 0xf8, 0x44, 0x19, 0x7d, 0xfa, 0xcf, 0x05, - 0x8e, 0xe5, 0x92, 0x27, 0xd6, 0xbf, 0xdc, 0x9e, 0x2c, 0x71, 0x1a, 0x2d, 0x85, 0x2d, 0x79, 0x17, + 0x8e, 0xe5, 0x92, 0x27, 0xd6, 0xbf, 0xd8, 0x9e, 0x2c, 0x71, 0x1a, 0x2d, 0x85, 0x2d, 0x79, 0x17, 0x86, 0x16, 0xe7, 0xca, 0xe2, 0x21, 0x22, 0xf7, 0x8a, 0x78, 0x22, 0x90, 0xa2, 0x8f, 0x08, 0x44, 0x82, 0xef, 0x7b, 0xda, 0xeb, 0x7a, 0xf2, 0x1d, 0x62, 0xc8, 0x85, 0x69, 0x0b, 0x7f, 0x29, 0x24, 0x4e, 0x17, 0x02, 0x6d, 0x89, 0xbe, 0x1f, 0x8a, 0xcb, 0x8a, 0x63, 0x63, 0xda, 0x32, 0x78, 0x88, @@ -15396,12 +15398,12 @@ var fileDescriptor_007ba1c3d6266d56 = []byte{ 0x71, 0x5c, 0x32, 0x41, 0x79, 0x91, 0xc4, 0x49, 0x09, 0x07, 0xe3, 0xf3, 0x41, 0xfe, 0xd4, 0x62, 0xda, 0x7f, 0x09, 0xcf, 0x9f, 0x0f, 0x8a, 0x27, 0x19, 0x91, 0xf7, 0xa0, 0x21, 0x29, 0x79, 0x0e, 0x0a, 0xab, 0xab, 0x0b, 0x62, 0x26, 0xc5, 0x08, 0x04, 0x9e, 0x27, 0xbf, 0x8f, 0x64, 0x58, 0xf5, - 0x9f, 0xe6, 0x01, 0x98, 0x2a, 0xf0, 0xe1, 0x7a, 0x2c, 0x4a, 0x38, 0x0d, 0x83, 0xbe, 0xc0, 0x85, + 0x9f, 0xe4, 0x01, 0x98, 0x2a, 0xf0, 0xe1, 0x7a, 0x2c, 0x4a, 0x38, 0x0d, 0x83, 0xbe, 0xc0, 0x85, 0x1a, 0x06, 0xaf, 0x04, 0xe2, 0x1d, 0x11, 0xaf, 0x3b, 0x78, 0x11, 0x32, 0xe9, 0x3b, 0x92, 0xf3, 0x7b, 0x00, 0xdc, 0xd9, 0xa0, 0x23, 0xb9, 0xef, 0x3e, 0xfe, 0x49, 0x18, 0x12, 0x33, 0x9e, 0x1d, 0x39, 0xff, 0x6f, 0xf8, 0x40, 0x2d, 0xc4, 0xc7, 0xa6, 0xd6, 0xd2, 0x21, 0x16, 0x62, 0x5f, 0xbc, 0xbc, 0x57, 0x4e, 0xc5, 0x7b, 0xc4, 0xe2, 0xfd, 0x8a, 0x10, 0x2f, 0x7f, 0x31, 0x74, 0x62, 0xc5, - 0x7b, 0x64, 0x67, 0xdf, 0xea, 0x3f, 0xca, 0x01, 0x61, 0xcd, 0x5a, 0xd1, 0x5d, 0x77, 0xd3, 0x76, + 0x7b, 0x64, 0x67, 0xdf, 0xea, 0x3f, 0xcc, 0x01, 0x61, 0xcd, 0x5a, 0xd1, 0x5d, 0x77, 0xd3, 0x76, 0x0c, 0xee, 0x9c, 0x7e, 0x2c, 0x82, 0x39, 0xba, 0xfb, 0xca, 0xdf, 0x1d, 0x84, 0xb3, 0x11, 0xc7, 0xdf, 0x13, 0x3e, 0x59, 0x5d, 0x8b, 0x8e, 0xa6, 0x5e, 0xaf, 0x5e, 0x3e, 0x26, 0x5f, 0x88, 0xf6, 0x47, 0x1e, 0xbc, 0x49, 0x37, 0xa1, 0x2f, 0xc2, 0x88, 0xf8, 0xc1, 0x56, 0x68, 0xff, 0xa6, 0x0b, @@ -15458,742 +15460,742 @@ var fileDescriptor_007ba1c3d6266d56 = []byte{ 0xb9, 0x54, 0xdd, 0x7f, 0x01, 0x86, 0xc4, 0x15, 0xba, 0x6e, 0x08, 0x8f, 0xbe, 0xb1, 0x9d, 0xed, 0x49, 0xc0, 0xf7, 0xcb, 0x75, 0x87, 0xea, 0x86, 0x16, 0x12, 0x90, 0x57, 0x60, 0x04, 0x7f, 0xdc, 0x77, 0x4c, 0xcf, 0xa3, 0xbc, 0x33, 0x8a, 0xfc, 0x56, 0x80, 0x17, 0xd8, 0xe4, 0x08, 0x2d, 0x42, - 0xa6, 0x7e, 0x39, 0x0f, 0x43, 0xb5, 0xee, 0x9a, 0xbb, 0xe5, 0x7a, 0xb4, 0x7d, 0xc2, 0x75, 0xc8, - 0xdf, 0xa4, 0x17, 0x53, 0x37, 0xe9, 0xcf, 0xf9, 0x43, 0x4b, 0x3a, 0xbd, 0x0e, 0x36, 0x06, 0xfe, - 0xa0, 0xfa, 0xdb, 0x79, 0x18, 0xe7, 0xd7, 0xaf, 0x15, 0xd3, 0x6d, 0x1c, 0xc1, 0x93, 0x90, 0xe3, - 0x97, 0xca, 0xe1, 0x5c, 0x16, 0xf6, 0xf0, 0xd0, 0x46, 0xfd, 0x52, 0x1e, 0x86, 0xcb, 0x5d, 0x6f, - 0xa3, 0xec, 0xe1, 0x0c, 0xf5, 0x58, 0xee, 0x72, 0xff, 0x41, 0x0e, 0xce, 0xb0, 0x86, 0xac, 0xda, - 0x0f, 0xa8, 0x75, 0x04, 0xc7, 0xd7, 0xf2, 0x31, 0x74, 0xfe, 0x80, 0xc7, 0xd0, 0xbe, 0x2c, 0x0b, - 0xfb, 0x93, 0x25, 0x5e, 0xba, 0x68, 0x76, 0x8b, 0x9e, 0xec, 0xcf, 0x38, 0xc2, 0x4b, 0x17, 0x5f, - 0x20, 0x47, 0x70, 0xc9, 0xf7, 0xfd, 0x25, 0x90, 0x23, 0x38, 0xa1, 0xfc, 0xfe, 0x10, 0xc8, 0xef, - 0xe6, 0x60, 0x68, 0xda, 0xf6, 0x4e, 0xf8, 0xc0, 0x17, 0x5f, 0x71, 0xb2, 0xd5, 0xdc, 0xff, 0x8a, - 0x93, 0xad, 0x9b, 0xea, 0xcf, 0xe7, 0xe1, 0x9c, 0x88, 0x68, 0x2f, 0x4e, 0xb1, 0x4e, 0xa7, 0x63, - 0x31, 0xd8, 0x92, 0xa2, 0x39, 0x9d, 0x87, 0x84, 0x68, 0x7e, 0xb1, 0x00, 0xe7, 0x30, 0x00, 0x2f, - 0xdb, 0x13, 0x7d, 0x1f, 0xd8, 0x22, 0xa4, 0x11, 0xbd, 0x4a, 0x5f, 0x4c, 0xb9, 0x4a, 0xff, 0x97, - 0xdb, 0x93, 0xaf, 0x36, 0x4d, 0x6f, 0xa3, 0xbb, 0x36, 0xd5, 0xb0, 0xdb, 0xd7, 0x9b, 0x8e, 0xfe, - 0xd0, 0xe4, 0x97, 0xc8, 0x7a, 0xeb, 0x7a, 0x98, 0x68, 0xa6, 0x63, 0x8a, 0xb4, 0x31, 0x35, 0xdc, - 0xeb, 0x30, 0xae, 0xfe, 0x25, 0xbc, 0x0b, 0x70, 0xdb, 0x36, 0x2d, 0xe1, 0x99, 0xca, 0x0d, 0xdd, - 0xda, 0xce, 0xf6, 0xe4, 0xf9, 0xf7, 0x6d, 0xd3, 0xaa, 0xc7, 0xdd, 0x53, 0xf7, 0x5b, 0x5f, 0xc8, - 0x5a, 0x93, 0xaa, 0x51, 0xff, 0xdb, 0x1c, 0x3c, 0x11, 0xd5, 0xe2, 0xef, 0x07, 0xdb, 0xf1, 0xcf, - 0xe7, 0xe1, 0xfc, 0x2d, 0x14, 0x4e, 0xe0, 0x0e, 0x74, 0x3a, 0x6f, 0x89, 0xc1, 0x99, 0x22, 0x9b, - 0x53, 0x8b, 0x32, 0x5b, 0x36, 0xa7, 0x93, 0xba, 0x90, 0xcd, 0x7f, 0x93, 0x83, 0xb3, 0xcb, 0xd5, - 0xca, 0xcc, 0xf7, 0xc9, 0x88, 0x4a, 0x7e, 0xcf, 0x09, 0x37, 0x38, 0x13, 0xdf, 0x73, 0xc2, 0x4d, - 0xcf, 0xaf, 0xe5, 0xe1, 0x6c, 0xad, 0xbc, 0xb8, 0xf0, 0xfd, 0x32, 0x83, 0xcf, 0xc8, 0xbe, 0xab, - 0xfe, 0x21, 0x98, 0xb0, 0x05, 0xe4, 0xcf, 0xbc, 0x77, 0x23, 0xdb, 0xa7, 0x35, 0x29, 0x94, 0x13, - 0x3e, 0x75, 0x1f, 0x89, 0x50, 0x98, 0xe6, 0x47, 0xa8, 0x4f, 0xb8, 0xe6, 0xff, 0x17, 0x25, 0x18, - 0xbe, 0xd3, 0x5d, 0xa3, 0xc2, 0xc5, 0xe9, 0xb1, 0x3e, 0xf9, 0xbd, 0x01, 0xc3, 0x42, 0x0c, 0x78, - 0x47, 0x21, 0x85, 0x60, 0x14, 0x21, 0x75, 0x78, 0x94, 0x2b, 0x99, 0x88, 0x5c, 0x86, 0xe2, 0x3d, - 0xea, 0xac, 0xc9, 0xaf, 0x93, 0x1f, 0x52, 0x67, 0x4d, 0x43, 0x28, 0x59, 0x08, 0x1f, 0x5e, 0x94, - 0x57, 0xaa, 0x98, 0xfe, 0x47, 0x5c, 0xfb, 0x61, 0x3e, 0xa3, 0xc0, 0x7b, 0x52, 0xef, 0x98, 0x3c, - 0x71, 0x90, 0x1c, 0x19, 0x21, 0x5e, 0x92, 0x2c, 0xc1, 0x84, 0xec, 0x3e, 0xc7, 0x73, 0xdf, 0x0c, - 0xa6, 0xb0, 0x4b, 0xcb, 0x7a, 0x93, 0x2c, 0x4a, 0xde, 0x81, 0x11, 0x1f, 0x88, 0x8e, 0x80, 0x43, - 0x61, 0xc2, 0x85, 0x80, 0x55, 0x2c, 0x3e, 0x7e, 0xa4, 0x80, 0xcc, 0x00, 0xaf, 0x21, 0x20, 0x85, - 0x41, 0xcc, 0xb1, 0x32, 0x52, 0x80, 0xbc, 0x82, 0x0c, 0xf0, 0xb1, 0x10, 0xba, 0x3c, 0x0d, 0xe3, - 0xd3, 0x5d, 0xbc, 0xc2, 0x71, 0x04, 0x9c, 0x3f, 0xd0, 0x8e, 0x90, 0x91, 0x65, 0x80, 0xd0, 0x35, - 0x45, 0x84, 0xc1, 0xd8, 0xb7, 0xd3, 0x8c, 0xc4, 0x42, 0xbe, 0x8b, 0x1b, 0x3d, 0xc8, 0x5d, 0x9c, - 0xfa, 0x87, 0x79, 0x18, 0x2e, 0x77, 0x3a, 0xc1, 0x50, 0x78, 0x11, 0x4a, 0xe5, 0x4e, 0xe7, 0xae, - 0x56, 0x95, 0x03, 0xe2, 0xeb, 0x9d, 0x4e, 0xbd, 0xeb, 0x98, 0xb2, 0x67, 0x31, 0x27, 0x22, 0x33, - 0x30, 0x5a, 0xee, 0x74, 0x56, 0xba, 0x6b, 0x2d, 0xb3, 0x21, 0xe5, 0xf3, 0xe2, 0x19, 0x0f, 0x3b, - 0x9d, 0x7a, 0x07, 0x31, 0xf1, 0xa4, 0x6e, 0xd1, 0x32, 0xe4, 0x8b, 0x18, 0x3c, 0x4a, 0xa4, 0x93, - 0xe2, 0x09, 0x6b, 0xd4, 0x20, 0x14, 0x7e, 0xd8, 0xb6, 0xa9, 0x80, 0x88, 0xa7, 0x0c, 0xb8, 0xec, - 0x27, 0x7a, 0x60, 0x15, 0x25, 0xd2, 0x46, 0x85, 0x2c, 0xc9, 0xa7, 0x60, 0xa0, 0xdc, 0xe9, 0x48, - 0xf7, 0x4d, 0xe8, 0x9a, 0xc6, 0x4a, 0xc5, 0x33, 0xf6, 0x09, 0xb2, 0x4b, 0x6f, 0xc1, 0x58, 0xb4, - 0xb2, 0x7d, 0xa5, 0x1c, 0xf8, 0x5e, 0x0e, 0x3f, 0xe8, 0x84, 0x7b, 0xc6, 0xbf, 0x0c, 0x85, 0x72, - 0xa7, 0x23, 0xe6, 0xa3, 0xb3, 0x29, 0xfd, 0x11, 0x7f, 0x48, 0x5f, 0xee, 0x74, 0xfc, 0x4f, 0x3f, - 0xe1, 0x4f, 0x6c, 0x0e, 0xf4, 0xe9, 0xbf, 0xcb, 0x3f, 0xfd, 0x64, 0x3f, 0x7f, 0x51, 0x7f, 0xbd, - 0x00, 0x67, 0xca, 0x9d, 0xce, 0x69, 0xaa, 0x82, 0xa3, 0x7a, 0xae, 0xff, 0x12, 0x80, 0x34, 0x3d, - 0x0e, 0x04, 0x0f, 0x00, 0x87, 0xa5, 0xa9, 0x51, 0xc9, 0x69, 0x12, 0x91, 0xaf, 0x7e, 0x83, 0xfb, - 0x52, 0xbf, 0x2f, 0x15, 0x70, 0x2a, 0x3e, 0xe9, 0xa1, 0xc7, 0x3e, 0x2a, 0xdd, 0x26, 0xfa, 0xa0, - 0xb4, 0xaf, 0x3e, 0xf8, 0xfb, 0x91, 0xc1, 0x83, 0xa1, 0xef, 0x4f, 0x7b, 0xa1, 0xff, 0x50, 0x66, - 0xf1, 0x98, 0x2c, 0x4c, 0x11, 0x0f, 0xc9, 0x4f, 0xff, 0x25, 0xa2, 0x73, 0x35, 0x18, 0xaa, 0x6e, - 0x1a, 0x5a, 0x8c, 0xd6, 0xef, 0xc3, 0x81, 0x7d, 0xf5, 0xe1, 0x76, 0x1e, 0x5f, 0xe0, 0x07, 0xd1, - 0xbd, 0x0e, 0xbf, 0xbb, 0xb8, 0x0e, 0xc0, 0x3d, 0x0f, 0x02, 0xe7, 0xf8, 0x51, 0x1e, 0xc8, 0x87, - 0x67, 0x05, 0x13, 0x81, 0x7c, 0x42, 0x92, 0xc0, 0xd7, 0xa8, 0x90, 0xea, 0x6b, 0x74, 0x0d, 0x06, - 0x35, 0x7d, 0xf3, 0xdd, 0x2e, 0x75, 0xb6, 0x84, 0x39, 0xc3, 0x83, 0x67, 0xea, 0x9b, 0xf5, 0x1f, - 0x66, 0x40, 0x2d, 0x40, 0x13, 0x35, 0x08, 0xe1, 0x20, 0x79, 0x84, 0xf0, 0x33, 0xf2, 0x20, 0x70, - 0xc3, 0x41, 0x14, 0x9d, 0xbc, 0x01, 0x85, 0xf2, 0xfd, 0x9a, 0x90, 0x6c, 0xd0, 0xb5, 0xe5, 0xfb, - 0x35, 0x21, 0xaf, 0xcc, 0xb2, 0xf7, 0x6b, 0xea, 0x97, 0xf2, 0x40, 0x92, 0x94, 0xe4, 0x55, 0x18, - 0x42, 0x68, 0x93, 0xe9, 0x8c, 0x9c, 0x4e, 0x76, 0xd3, 0xad, 0x3b, 0x08, 0x8d, 0x18, 0x77, 0x3e, - 0x29, 0x79, 0x1d, 0x13, 0x76, 0x8b, 0x84, 0x86, 0x91, 0x74, 0xb2, 0x9b, 0xae, 0x9f, 0xe2, 0x3a, - 0x96, 0xaf, 0x5b, 0x10, 0xa3, 0x5d, 0x78, 0xbf, 0x36, 0x6f, 0xbb, 0x9e, 0x10, 0x35, 0xb7, 0x0b, - 0x37, 0x5d, 0xcc, 0x63, 0x1c, 0xb1, 0x0b, 0x39, 0x19, 0xe6, 0x62, 0xbb, 0x5f, 0xe3, 0x8f, 0x9d, - 0x0c, 0xcd, 0x6e, 0xf9, 0x06, 0x25, 0xcf, 0xc5, 0xb6, 0xe9, 0xd6, 0xf9, 0x43, 0x29, 0x03, 0x33, - 0x85, 0x47, 0x72, 0xb1, 0x45, 0x4a, 0xa9, 0x3f, 0x3d, 0x08, 0xe3, 0x15, 0xdd, 0xd3, 0xd7, 0x74, - 0x97, 0x4a, 0xbb, 0xe9, 0x33, 0x3e, 0xcc, 0xff, 0x1c, 0x49, 0x0e, 0xc6, 0x5a, 0xca, 0xd7, 0xc4, - 0x0b, 0x90, 0x37, 0x43, 0xbe, 0x41, 0xa6, 0x5c, 0x39, 0xf5, 0xde, 0x5a, 0xbd, 0x23, 0xc0, 0x5a, - 0x82, 0x90, 0xbc, 0x00, 0xc3, 0x3e, 0x8c, 0x6d, 0x00, 0x0a, 0xa1, 0xce, 0x18, 0x6b, 0xcc, 0xfe, - 0xd7, 0x64, 0x34, 0x79, 0x1d, 0x46, 0xfc, 0x9f, 0x92, 0x69, 0xcd, 0xf3, 0x08, 0xae, 0x25, 0x76, - 0x4f, 0x32, 0xa9, 0x5c, 0x14, 0xe7, 0xb7, 0xfe, 0x48, 0xd1, 0x58, 0xaa, 0xbe, 0x08, 0x29, 0xf9, - 0x61, 0x18, 0xf3, 0x7f, 0x8b, 0x0d, 0x03, 0x77, 0xfd, 0x7b, 0x21, 0x48, 0x44, 0x1e, 0x13, 0xeb, - 0x54, 0x94, 0x9c, 0x6f, 0x1d, 0x9e, 0xf4, 0xb3, 0xcf, 0x19, 0x6b, 0xc9, 0x9d, 0x43, 0xac, 0x02, - 0x52, 0x85, 0x09, 0x1f, 0x12, 0x6a, 0xe8, 0x40, 0xb8, 0x63, 0x34, 0xd6, 0xea, 0xa9, 0x4a, 0x9a, - 0x2c, 0x45, 0x5a, 0x70, 0x39, 0x02, 0x34, 0xdc, 0x0d, 0x73, 0xdd, 0x13, 0xdb, 0x3d, 0x11, 0xc9, - 0x5a, 0xa4, 0x1b, 0x0d, 0xb8, 0x72, 0x1a, 0x3f, 0x6f, 0x70, 0x34, 0xc7, 0x58, 0x4f, 0x6e, 0xa4, - 0x06, 0xe7, 0x7c, 0xfc, 0xad, 0x99, 0x95, 0x15, 0xc7, 0x7e, 0x9f, 0x36, 0xbc, 0x6a, 0x45, 0x6c, - 0x97, 0x31, 0xc2, 0xa1, 0xb1, 0x56, 0x6f, 0x36, 0x3a, 0x4c, 0x29, 0x18, 0x2e, 0xca, 0x3c, 0xb5, - 0x30, 0xb9, 0x07, 0xe7, 0x25, 0xb8, 0x94, 0xd4, 0x1c, 0xc2, 0xfd, 0xbc, 0xe0, 0x9a, 0x9e, 0xd7, - 0x3c, 0xbd, 0x38, 0x79, 0x0b, 0x46, 0x7d, 0x04, 0xbf, 0x45, 0x1c, 0xc6, 0x5b, 0x44, 0x1c, 0x92, - 0xc6, 0x5a, 0x3d, 0xfe, 0x26, 0x37, 0x4a, 0x2c, 0x6b, 0xd4, 0xea, 0x56, 0x87, 0x0a, 0x9f, 0x5c, - 0x5f, 0xa3, 0xbc, 0xad, 0x4e, 0xaa, 0x32, 0x32, 0x52, 0xf2, 0x4e, 0xa8, 0x51, 0xcb, 0x8e, 0xd9, - 0x34, 0xf9, 0x4e, 0xda, 0x7f, 0x86, 0xbb, 0x56, 0xb7, 0x11, 0x98, 0xa6, 0x1f, 0x9c, 0xfc, 0x52, - 0x19, 0xce, 0xa6, 0xe8, 0xd8, 0xbe, 0x76, 0x8c, 0x5f, 0xce, 0x87, 0x8d, 0x38, 0xe1, 0xdb, 0xc6, - 0x69, 0x18, 0xf4, 0xbf, 0x44, 0x18, 0x0f, 0x4a, 0xd6, 0xd0, 0x8c, 0xf3, 0xf0, 0xf1, 0x11, 0x71, - 0x9c, 0xf0, 0xad, 0xe4, 0x51, 0x88, 0xe3, 0xdb, 0xb9, 0x50, 0x1c, 0x27, 0x7c, 0x7b, 0xf9, 0x53, - 0xc5, 0x70, 0x4e, 0x3a, 0xdd, 0x63, 0x1e, 0x95, 0x99, 0x1c, 0xfa, 0xc1, 0x96, 0xf6, 0xf1, 0x1c, - 0x56, 0x56, 0xcd, 0x81, 0x83, 0xa9, 0x26, 0x79, 0x0b, 0x86, 0x57, 0x6c, 0xd7, 0x6b, 0x3a, 0xd4, - 0x5d, 0x09, 0x32, 0x31, 0xe0, 0x53, 0xea, 0x8e, 0x00, 0xd7, 0x3b, 0x91, 0xd9, 0x5f, 0x26, 0x57, - 0xff, 0x71, 0x21, 0xa1, 0x0d, 0xdc, 0x70, 0x3d, 0x91, 0xda, 0x70, 0x04, 0x43, 0x9d, 0xdc, 0x08, - 0x57, 0x41, 0x6e, 0xe1, 0xf7, 0x4b, 0x61, 0x26, 0xd7, 0x84, 0x81, 0x1f, 0x25, 0x21, 0x3f, 0x00, - 0x17, 0x23, 0x80, 0x15, 0xdd, 0xd1, 0xdb, 0xd4, 0x0b, 0xb3, 0x5e, 0x62, 0xe0, 0x30, 0xbf, 0x74, - 0xbd, 0x13, 0xa0, 0xe5, 0x4c, 0x9a, 0x19, 0x1c, 0x24, 0xd5, 0x1a, 0xd8, 0x87, 0x8b, 0xf5, 0xcf, - 0x15, 0x42, 0x43, 0x27, 0x1a, 0x00, 0x58, 0xa3, 0x6e, 0xb7, 0xe5, 0x3d, 0xbe, 0x1d, 0x7c, 0xb0, - 0xf4, 0x2a, 0xf3, 0x70, 0xa6, 0xbc, 0xbe, 0x4e, 0x1b, 0x9e, 0x1f, 0xd7, 0xdc, 0x15, 0x21, 0x1f, - 0xf9, 0xc6, 0x43, 0xa0, 0x44, 0x9c, 0x6a, 0xb9, 0x5f, 0xe3, 0xc5, 0xd4, 0x7f, 0x52, 0x04, 0x25, - 0x30, 0xfc, 0x83, 0xc7, 0x82, 0xc7, 0xb8, 0xc8, 0x7e, 0x24, 0x7a, 0xc5, 0x84, 0x89, 0x50, 0x18, - 0xe2, 0x95, 0x96, 0xc8, 0xc3, 0x3e, 0x19, 0x67, 0x16, 0x12, 0xf2, 0xbd, 0xc4, 0x25, 0xb1, 0x97, - 0x20, 0xe1, 0x63, 0xcc, 0xba, 0xcb, 0x59, 0x68, 0x49, 0xae, 0xe4, 0x2b, 0x39, 0x38, 0xe7, 0x77, - 0xca, 0xf2, 0x1a, 0x33, 0xaa, 0x67, 0xec, 0xae, 0x15, 0x3c, 0x61, 0x7a, 0x23, 0xbb, 0x3a, 0xde, - 0x49, 0x53, 0x69, 0x85, 0x79, 0x4b, 0x82, 0xe0, 0x26, 0x81, 0x42, 0xd8, 0x48, 0x53, 0x6f, 0x20, - 0x91, 0x96, 0x5a, 0xef, 0xa5, 0x5b, 0xf0, 0x44, 0x26, 0xcb, 0xdd, 0x8c, 0xd8, 0x7e, 0xd9, 0x88, - 0xfd, 0xef, 0x73, 0xe1, 0x44, 0x14, 0x13, 0x12, 0x99, 0x02, 0x08, 0x41, 0x62, 0x5b, 0x8b, 0x2f, - 0xa4, 0x42, 0xa1, 0x69, 0x12, 0x05, 0x59, 0x86, 0x92, 0x10, 0x0b, 0xcf, 0x30, 0xfd, 0xc9, 0x5d, - 0x7a, 0x61, 0x4a, 0x96, 0x03, 0x6e, 0x59, 0xc5, 0x37, 0x0b, 0x36, 0x97, 0x5e, 0x87, 0xe1, 0x83, - 0x7e, 0xd7, 0x57, 0x0a, 0x40, 0xe4, 0x3d, 0xe8, 0x31, 0x1a, 0xe8, 0x27, 0x78, 0x0a, 0xbb, 0x0a, - 0x83, 0xec, 0x13, 0x30, 0xe7, 0x8a, 0x14, 0x63, 0xb9, 0x2b, 0x60, 0x5a, 0x80, 0x0d, 0x03, 0x9c, - 0x0d, 0xa4, 0x07, 0x38, 0x53, 0x7f, 0xb6, 0x00, 0x17, 0xe4, 0x0e, 0xa9, 0x50, 0x4c, 0xdb, 0x70, - 0xda, 0x29, 0x1f, 0x62, 0xa7, 0xa8, 0x50, 0xe2, 0x5b, 0x0f, 0x91, 0x3f, 0x83, 0x1f, 0x0b, 0x21, - 0x44, 0x13, 0x18, 0xf5, 0x7f, 0xc9, 0xc3, 0x68, 0x60, 0xde, 0xe9, 0x8e, 0xfb, 0x18, 0x77, 0xc7, - 0xa7, 0x61, 0x14, 0x43, 0x54, 0xb5, 0xa9, 0xc5, 0xc3, 0x38, 0xf5, 0x4b, 0x09, 0x6f, 0x7c, 0x84, - 0xc8, 0x6d, 0x16, 0x21, 0x64, 0xda, 0xcf, 0x2d, 0x3f, 0x29, 0x70, 0x18, 0x37, 0xfb, 0x38, 0x5c, - 0xfd, 0x2b, 0x05, 0x18, 0xf1, 0xa5, 0x3c, 0x6d, 0x9e, 0xd4, 0x7b, 0x9e, 0xe3, 0x15, 0xf2, 0x75, - 0x80, 0x15, 0xdb, 0xf1, 0xf4, 0xd6, 0x52, 0xa8, 0xf9, 0x78, 0x40, 0xda, 0x41, 0x28, 0x2f, 0x23, - 0x91, 0xe0, 0xfa, 0x15, 0x9a, 0xd5, 0x7c, 0x62, 0xe2, 0xeb, 0x57, 0x00, 0xd5, 0x24, 0x0a, 0xf5, - 0xb7, 0xf3, 0x70, 0xc6, 0xef, 0xa4, 0xd9, 0x47, 0xb4, 0xd1, 0x7d, 0x9c, 0xe7, 0xa6, 0xa8, 0xb4, - 0xfb, 0x77, 0x95, 0xb6, 0xfa, 0x7f, 0x49, 0x13, 0xc9, 0x4c, 0xcb, 0x3e, 0x9d, 0x48, 0xfe, 0x24, - 0x74, 0x5c, 0xfd, 0xb1, 0x02, 0x9c, 0xf3, 0xa5, 0x3e, 0xd7, 0xb5, 0xf0, 0x68, 0x61, 0x46, 0x6f, - 0xb5, 0x1e, 0xe7, 0xdd, 0xf8, 0xb0, 0x2f, 0x88, 0x65, 0x11, 0xf3, 0x51, 0xe4, 0x99, 0x5c, 0x17, - 0xe0, 0xba, 0x6d, 0x1a, 0x9a, 0x4c, 0x44, 0xde, 0x81, 0x11, 0xff, 0x67, 0xd9, 0x69, 0xfa, 0x5b, - 0x70, 0xbc, 0x28, 0x08, 0x0a, 0xe9, 0x4e, 0x24, 0xb4, 0x45, 0xa4, 0x80, 0xfa, 0xa5, 0x01, 0xb8, - 0x74, 0xdf, 0xb4, 0x0c, 0x7b, 0xd3, 0xf5, 0xd3, 0x94, 0x9e, 0xf8, 0x83, 0xb2, 0xe3, 0x4e, 0x4f, - 0xfa, 0x2e, 0x9c, 0x8f, 0x8b, 0xd4, 0x09, 0x82, 0xc7, 0x8b, 0xde, 0xd9, 0xe4, 0x04, 0x75, 0x3f, - 0x61, 0xa9, 0xb8, 0x6d, 0xd3, 0xd2, 0x4b, 0xc6, 0x33, 0x9e, 0x0e, 0xec, 0x25, 0xe3, 0xe9, 0xf3, - 0x50, 0xaa, 0xd8, 0x6d, 0xdd, 0xf4, 0x83, 0x1c, 0xe1, 0x28, 0x0e, 0xea, 0x45, 0x8c, 0x26, 0x28, - 0x18, 0x7f, 0x51, 0x31, 0x76, 0xd9, 0x50, 0xc8, 0xdf, 0x2f, 0xc0, 0xac, 0x34, 0x4d, 0x26, 0x22, - 0x36, 0x8c, 0x8a, 0xea, 0xc4, 0xdd, 0x18, 0xe0, 0xe6, 0xe9, 0x15, 0x5f, 0x46, 0xd9, 0x6a, 0x35, - 0x15, 0x29, 0xc7, 0xb7, 0x51, 0x3c, 0x11, 0xab, 0xf8, 0x18, 0x7e, 0x4b, 0xa6, 0x45, 0xf9, 0x4b, - 0x42, 0xc0, 0x49, 0x66, 0x38, 0x29, 0x04, 0x9c, 0x65, 0x64, 0x22, 0x32, 0x0b, 0x13, 0x18, 0xe2, - 0x3b, 0xd8, 0x4a, 0x31, 0x95, 0x18, 0x41, 0xa3, 0x12, 0xaf, 0x5c, 0x78, 0x54, 0x70, 0xf6, 0x71, - 0xf5, 0x86, 0x40, 0x6b, 0xc9, 0x12, 0xe4, 0x09, 0x28, 0x2c, 0x2d, 0x94, 0xf1, 0xae, 0x66, 0x90, - 0xa7, 0xd7, 0xb2, 0x5a, 0xba, 0xc6, 0x60, 0x97, 0x3e, 0x0b, 0x24, 0xf9, 0x39, 0xfb, 0xba, 0x8f, - 0xf9, 0xaf, 0xa4, 0x2d, 0xdf, 0x49, 0xf7, 0xa8, 0x39, 0x8a, 0x89, 0x30, 0x92, 0xd9, 0xae, 0xff, - 0xc3, 0xcc, 0x6c, 0x57, 0x3a, 0xd2, 0xcc, 0x76, 0xea, 0xaf, 0xe4, 0x60, 0x22, 0x11, 0x06, 0x9f, - 0xbc, 0x0c, 0xc0, 0x21, 0x52, 0xb8, 0x51, 0x8c, 0xdf, 0x13, 0x86, 0xc6, 0x17, 0xcb, 0x63, 0x48, - 0x46, 0xae, 0xc3, 0x20, 0xff, 0x25, 0x42, 0x84, 0x25, 0x8b, 0x74, 0xbb, 0xa6, 0xa1, 0x05, 0x44, - 0x61, 0x2d, 0x78, 0x23, 0x59, 0x48, 0x2d, 0xe2, 0x6d, 0x75, 0x82, 0x5a, 0x18, 0x99, 0xfa, 0xd3, - 0x79, 0x18, 0x09, 0x1a, 0x5c, 0x36, 0x8e, 0x4b, 0xe7, 0x4a, 0x22, 0xa3, 0x40, 0x61, 0xb7, 0x8c, - 0x02, 0xb1, 0xf9, 0x56, 0xa4, 0x10, 0x38, 0xba, 0x07, 0x55, 0x5f, 0xcd, 0xc3, 0x99, 0xa0, 0xd6, - 0x63, 0xbc, 0xfc, 0xfa, 0x08, 0x89, 0xe4, 0x2b, 0x39, 0x50, 0xa6, 0xcd, 0x56, 0xcb, 0xb4, 0x9a, - 0x55, 0x6b, 0xdd, 0x76, 0xda, 0x38, 0x21, 0x1e, 0xdf, 0x11, 0xae, 0xfa, 0xa7, 0x73, 0x30, 0x21, - 0x1a, 0x34, 0xa3, 0x3b, 0xc6, 0xf1, 0x9d, 0x8f, 0xc5, 0x5b, 0x72, 0x7c, 0xfa, 0xa2, 0x7e, 0x33, - 0x0f, 0xb0, 0x60, 0x37, 0x1e, 0x9c, 0xf0, 0xf7, 0x58, 0x6f, 0x42, 0x89, 0xc7, 0x69, 0x13, 0x1a, - 0x3b, 0x21, 0xde, 0x1d, 0xb1, 0x4f, 0xe3, 0x88, 0xe9, 0x71, 0x31, 0x1f, 0x97, 0x78, 0x9c, 0x37, - 0x25, 0xa7, 0x89, 0x22, 0xac, 0x52, 0x46, 0x27, 0x16, 0x8c, 0xa0, 0x52, 0x06, 0x8b, 0x56, 0xba, - 0xb3, 0x3d, 0x59, 0x6c, 0xd9, 0x8d, 0x07, 0x1a, 0xd2, 0xab, 0xff, 0x2a, 0xc7, 0x65, 0x77, 0xc2, - 0x5f, 0x95, 0xfa, 0x9f, 0x5f, 0xdc, 0xe7, 0xe7, 0xff, 0x99, 0x1c, 0x9c, 0xd3, 0x68, 0xc3, 0x7e, - 0x48, 0x9d, 0xad, 0x19, 0xdb, 0xa0, 0xb7, 0xa8, 0x45, 0x9d, 0xe3, 0x1a, 0x51, 0xbf, 0x83, 0x29, - 0x58, 0xc2, 0xc6, 0xdc, 0x75, 0xa9, 0x71, 0x72, 0xd2, 0xe3, 0xa8, 0xbf, 0x36, 0x00, 0x4a, 0xaa, - 0xd5, 0x7b, 0x62, 0xcd, 0xb9, 0xcc, 0xad, 0x4c, 0xf1, 0xa8, 0xb6, 0x32, 0xfd, 0xfb, 0xdb, 0xca, - 0x94, 0xf6, 0xbb, 0x95, 0x19, 0xd8, 0xcb, 0x56, 0xa6, 0x1d, 0xdf, 0xca, 0x0c, 0xe2, 0x56, 0xe6, - 0xe5, 0x9e, 0x5b, 0x99, 0x59, 0xcb, 0x38, 0xe0, 0x46, 0xe6, 0xc4, 0xa6, 0x6e, 0x3e, 0xc8, 0x0e, - 0xec, 0x2a, 0x9b, 0x14, 0x1b, 0xb6, 0x63, 0x50, 0x43, 0x6c, 0xbc, 0xf0, 0xd4, 0xdf, 0x11, 0x30, - 0x2d, 0xc0, 0x26, 0xf2, 0x60, 0x8f, 0xee, 0x25, 0x0f, 0xf6, 0x11, 0xec, 0xbf, 0xbe, 0x9c, 0x87, - 0x89, 0x19, 0xea, 0x78, 0x3c, 0x10, 0xec, 0x51, 0xb8, 0xc4, 0x95, 0xe1, 0x8c, 0xc4, 0x10, 0x2d, - 0xf2, 0x7c, 0xe8, 0xe6, 0xd7, 0xa0, 0x8e, 0x17, 0xf7, 0x12, 0x8c, 0xd3, 0xb3, 0xea, 0xfd, 0x5c, - 0x74, 0x62, 0xec, 0x06, 0xd5, 0xfb, 0x70, 0x2e, 0x48, 0x53, 0xfc, 0xd2, 0x02, 0x7a, 0x29, 0xbd, - 0x5c, 0x71, 0xff, 0xe9, 0xe5, 0xd4, 0x5f, 0xce, 0xc1, 0x15, 0x8d, 0x5a, 0x74, 0x53, 0x5f, 0x6b, - 0x51, 0xa9, 0x59, 0x62, 0x65, 0x60, 0xb3, 0x86, 0xe9, 0xb6, 0x75, 0xaf, 0xb1, 0x71, 0x28, 0x19, - 0xcd, 0xc1, 0x88, 0x3c, 0x7f, 0xed, 0x63, 0x6e, 0x8b, 0x94, 0x53, 0x7f, 0xad, 0x08, 0x03, 0xd3, - 0xb6, 0x77, 0xdb, 0x3e, 0x64, 0xbe, 0xc3, 0x70, 0xca, 0xcf, 0xef, 0xe3, 0xac, 0xe7, 0x53, 0x58, - 0xb9, 0x94, 0x02, 0x02, 0x5d, 0x48, 0xd7, 0xec, 0x44, 0xaa, 0x0c, 0x9f, 0x6c, 0x9f, 0x99, 0x0e, - 0x5f, 0x85, 0x21, 0x8c, 0xfe, 0x22, 0x9d, 0xc6, 0xa2, 0x83, 0xb6, 0xc7, 0x80, 0xf1, 0x3a, 0x42, - 0x52, 0xf2, 0x03, 0x91, 0xc8, 0xb5, 0xa5, 0xc3, 0x67, 0x46, 0x94, 0x83, 0xd8, 0xbe, 0xcc, 0x2f, - 0xf2, 0xb0, 0x4d, 0x52, 0x16, 0x19, 0x3c, 0x45, 0x89, 0x35, 0x29, 0x20, 0x3c, 0xc2, 0xac, 0x85, - 0x33, 0x30, 0x3a, 0x6d, 0x7b, 0x92, 0x33, 0xf0, 0x50, 0xf8, 0x0c, 0x94, 0x49, 0x3e, 0xdd, 0x13, - 0x38, 0x5a, 0x46, 0xfd, 0x6e, 0x11, 0x46, 0xfc, 0x9f, 0xc7, 0xa4, 0x3b, 0x2f, 0x42, 0x69, 0xde, - 0x96, 0x12, 0x69, 0xa0, 0x03, 0xf1, 0x86, 0xed, 0xc6, 0x3c, 0xa3, 0x05, 0x11, 0x93, 0xfa, 0x92, - 0x6d, 0xc8, 0xee, 0xef, 0x28, 0x75, 0xcb, 0x36, 0x12, 0xcf, 0x87, 0x03, 0x42, 0x72, 0x05, 0x8a, - 0xf8, 0x72, 0x40, 0x3a, 0xc8, 0x8f, 0xbd, 0x16, 0x40, 0xbc, 0xa4, 0x95, 0xa5, 0xfd, 0x6a, 0xe5, - 0xc0, 0x41, 0xb5, 0x72, 0xf0, 0x68, 0xb5, 0xf2, 0x3d, 0x18, 0xc1, 0x9a, 0xfc, 0x3c, 0x7c, 0xbb, - 0x2f, 0xac, 0x4f, 0x88, 0xb5, 0x6f, 0x94, 0xb7, 0x5b, 0x64, 0xe3, 0xc3, 0x25, 0x2f, 0xc2, 0x2a, - 0xa6, 0xbb, 0x70, 0x88, 0xed, 0xf4, 0x3f, 0xce, 0xc1, 0xc0, 0x5d, 0xeb, 0x81, 0x65, 0x6f, 0x1e, - 0x4e, 0xe3, 0x5e, 0x86, 0x61, 0xc1, 0x46, 0x5a, 0x5d, 0xf0, 0x45, 0x78, 0x97, 0x83, 0xeb, 0xc8, - 0x49, 0x93, 0xa9, 0xc8, 0x5b, 0x41, 0x21, 0x7c, 0x1c, 0x54, 0x08, 0x53, 0xd1, 0xf8, 0x85, 0x1a, - 0xd1, 0xec, 0x19, 0x32, 0x39, 0xb9, 0x0c, 0xc5, 0x0a, 0x6b, 0xaa, 0x14, 0x45, 0x97, 0x35, 0x45, - 0x43, 0xa8, 0xfa, 0xe5, 0x22, 0x8c, 0xc5, 0x0e, 0xbe, 0x9e, 0x87, 0x21, 0x71, 0xf0, 0x64, 0xfa, - 0xe9, 0x3c, 0xf0, 0xf1, 0x50, 0x00, 0xd4, 0x06, 0xf9, 0x9f, 0x55, 0x83, 0x7c, 0x06, 0x06, 0x6c, - 0x17, 0x17, 0x45, 0xfc, 0x96, 0xb1, 0x70, 0x08, 0x2d, 0xd7, 0x58, 0xdb, 0xf9, 0xe0, 0x10, 0x24, - 0xb2, 0x46, 0xda, 0x2e, 0x7e, 0xda, 0x4d, 0x18, 0xd2, 0x5d, 0x97, 0x7a, 0x75, 0x4f, 0x6f, 0xca, - 0x19, 0x3e, 0x02, 0xa0, 0x3c, 0x3a, 0x10, 0xb8, 0xaa, 0x37, 0xc9, 0x67, 0x61, 0xb4, 0xe1, 0x50, - 0x5c, 0x36, 0xf5, 0x16, 0x6b, 0xa5, 0x64, 0xd6, 0x46, 0x10, 0xf2, 0xfd, 0x49, 0x88, 0xa8, 0x1a, - 0xe4, 0x1e, 0x8c, 0x8a, 0xcf, 0xe1, 0x9e, 0xfb, 0x38, 0xd0, 0xc6, 0xc2, 0x65, 0x8c, 0x8b, 0x84, - 0xfb, 0xee, 0x8b, 0x07, 0x1c, 0x32, 0xb9, 0xcc, 0xd7, 0x90, 0x48, 0xc9, 0x32, 0x90, 0x4d, 0xba, - 0x56, 0xd7, 0xbb, 0xde, 0x06, 0xab, 0x8b, 0x07, 0xa8, 0x17, 0x89, 0x2d, 0xf1, 0xd5, 0x43, 0x12, - 0x2b, 0x3f, 0x06, 0xd9, 0xa4, 0x6b, 0xe5, 0x08, 0x92, 0xdc, 0x87, 0xf3, 0xc9, 0x22, 0xec, 0x93, - 0xf9, 0xe5, 0xc0, 0x73, 0x3b, 0xdb, 0x93, 0x93, 0xa9, 0x04, 0x12, 0xdb, 0xb3, 0x09, 0xb6, 0x55, - 0xe3, 0x76, 0x71, 0x70, 0x60, 0x7c, 0x50, 0x1b, 0x63, 0x65, 0x7d, 0x13, 0xd2, 0x34, 0xd4, 0xdf, - 0xcb, 0x31, 0x53, 0x91, 0x7d, 0x10, 0x66, 0xf6, 0x66, 0xba, 0xde, 0xde, 0xa7, 0xae, 0xb7, 0xc3, - 0x1c, 0x9c, 0x25, 0xb7, 0xc7, 0xec, 0xaa, 0x09, 0x2c, 0x99, 0x82, 0x92, 0x21, 0x9f, 0x9a, 0x5d, - 0x88, 0x76, 0x82, 0x5f, 0x8f, 0x26, 0xa8, 0xc8, 0x55, 0x28, 0xb2, 0x25, 0x2b, 0xbe, 0x65, 0x96, - 0xad, 0x0b, 0x0d, 0x29, 0xd4, 0x1f, 0xc9, 0xc3, 0x88, 0xf4, 0x35, 0x37, 0x0e, 0xf5, 0x39, 0x6f, - 0xec, 0xad, 0x99, 0xbe, 0xd3, 0x0b, 0xee, 0xa5, 0xfc, 0x26, 0xdf, 0x0c, 0x44, 0xb1, 0xa7, 0x0b, - 0x29, 0x21, 0x98, 0x57, 0xc5, 0x87, 0x96, 0xf6, 0xbe, 0x7d, 0x64, 0xf4, 0xb7, 0x8b, 0x83, 0xf9, - 0xf1, 0xc2, 0xed, 0xe2, 0x60, 0x71, 0xbc, 0x1f, 0xe3, 0x70, 0x61, 0xe8, 0x6b, 0xbe, 0x37, 0xb7, - 0xd6, 0xcd, 0xe6, 0x09, 0x7f, 0x3b, 0x72, 0xb4, 0x31, 0xca, 0x62, 0xb2, 0x39, 0xe1, 0x0f, 0x49, - 0x3e, 0x54, 0xd9, 0x9c, 0xe6, 0xec, 0x14, 0xb2, 0xf9, 0x27, 0x39, 0x50, 0x52, 0x65, 0x53, 0x3e, - 0x26, 0x3f, 0x88, 0xa3, 0xcb, 0xdc, 0xf9, 0x47, 0x79, 0x98, 0xa8, 0x5a, 0x1e, 0x6d, 0xf2, 0x1d, - 0xe3, 0x09, 0x9f, 0x2a, 0xee, 0xc0, 0xb0, 0xf4, 0x31, 0xa2, 0xcf, 0x9f, 0x0c, 0xf6, 0xe3, 0x21, - 0x2a, 0x83, 0x93, 0x5c, 0xfa, 0x08, 0x93, 0xfd, 0xc7, 0x84, 0x7c, 0xc2, 0xe7, 0x9c, 0x93, 0x21, - 0xe4, 0x13, 0x3e, 0x79, 0x7d, 0x44, 0x85, 0xfc, 0x7f, 0xe4, 0xe0, 0x6c, 0x4a, 0xe5, 0xe4, 0x0a, - 0x0c, 0xd4, 0xba, 0x6b, 0x18, 0x76, 0x2b, 0x17, 0x7a, 0x0c, 0xbb, 0xdd, 0x35, 0x8c, 0xb8, 0xa5, - 0xf9, 0x48, 0xb2, 0x8a, 0x8f, 0xeb, 0x97, 0xab, 0x95, 0x19, 0x21, 0x55, 0x55, 0x0a, 0x13, 0xc0, - 0xc0, 0x69, 0x5f, 0x16, 0x3c, 0xc0, 0xb7, 0x4d, 0xa3, 0x11, 0x7b, 0x80, 0xcf, 0xca, 0x90, 0x1f, - 0x84, 0xa1, 0xf2, 0x07, 0x5d, 0x87, 0x22, 0x5f, 0x2e, 0xf1, 0x8f, 0x05, 0x7c, 0x7d, 0x44, 0x1a, - 0x67, 0x1e, 0x4b, 0x80, 0x51, 0xc4, 0x79, 0x87, 0x0c, 0xd5, 0x9f, 0xce, 0xc1, 0xa5, 0xec, 0xd6, - 0x91, 0x4f, 0xc1, 0x00, 0xdb, 0x99, 0x97, 0xb5, 0x25, 0xf1, 0xe9, 0x3c, 0xcb, 0xad, 0xdd, 0xa2, - 0x75, 0xdd, 0x91, 0x8d, 0x7d, 0x9f, 0x8c, 0xbc, 0x0d, 0xc3, 0x55, 0xd7, 0xed, 0x52, 0xa7, 0xf6, - 0xf2, 0x5d, 0xad, 0x2a, 0xf6, 0x84, 0xb8, 0xe7, 0x30, 0x11, 0x5c, 0x77, 0x5f, 0x8e, 0x05, 0xd6, - 0x92, 0xe9, 0xd5, 0x9f, 0xc8, 0xc1, 0xe5, 0x5e, 0x5f, 0x45, 0x5e, 0x86, 0xc1, 0x55, 0x6a, 0xe9, - 0x96, 0x57, 0xad, 0x88, 0x26, 0xe1, 0x16, 0xcb, 0x43, 0x58, 0x74, 0xa7, 0x10, 0x10, 0xb2, 0x42, - 0xfc, 0x5c, 0x31, 0x70, 0x64, 0xe0, 0x67, 0xa0, 0x08, 0x8b, 0x15, 0xf2, 0x09, 0xd5, 0xdf, 0xcf, - 0xc3, 0xc8, 0x4a, 0xab, 0xdb, 0x34, 0xa5, 0x85, 0xe3, 0xc0, 0xf6, 0xb6, 0x6f, 0xfd, 0xe6, 0xf7, - 0x67, 0xfd, 0xb2, 0xe1, 0xe6, 0x1c, 0x70, 0xb8, 0xf9, 0xe5, 0xc8, 0x5b, 0x50, 0xea, 0xe0, 0x77, - 0xc4, 0x4f, 0x62, 0xf9, 0xd7, 0x65, 0x9d, 0xc4, 0xf2, 0x32, 0x6c, 0x7c, 0x35, 0x0e, 0x31, 0xbe, - 0xc2, 0xb2, 0x92, 0x40, 0xc3, 0x45, 0xe2, 0x54, 0xa0, 0x47, 0x22, 0xd0, 0x70, 0x41, 0x38, 0x15, - 0xe8, 0x21, 0x04, 0xfa, 0x6b, 0x79, 0x18, 0x8b, 0x56, 0x49, 0x3e, 0x05, 0xc3, 0xbc, 0x1a, 0x7e, - 0x2e, 0x94, 0x93, 0x9c, 0x8a, 0x43, 0xb0, 0x06, 0xfc, 0x87, 0x38, 0xe0, 0x3a, 0xb3, 0xa1, 0xbb, - 0xf5, 0xf0, 0x84, 0x86, 0xdf, 0xdf, 0x0e, 0x72, 0x4f, 0xa8, 0x18, 0x4a, 0x1b, 0xdb, 0xd0, 0xdd, - 0x99, 0xf0, 0x37, 0x99, 0x05, 0xe2, 0xd0, 0xae, 0x4b, 0xa3, 0x0c, 0x8a, 0xc8, 0x40, 0xa4, 0x18, - 0x8f, 0x63, 0xb5, 0x09, 0x0e, 0x93, 0xd9, 0x7c, 0x21, 0x68, 0x36, 0x2a, 0x43, 0xff, 0x1e, 0xf2, - 0x9f, 0x4b, 0xf4, 0xe9, 0xc7, 0x9c, 0x9c, 0xa0, 0xa2, 0x7b, 0x3a, 0xdf, 0x94, 0xfb, 0x1d, 0xa0, - 0xfe, 0x68, 0x07, 0xfa, 0x97, 0x2d, 0xba, 0xbc, 0x4e, 0x5e, 0x82, 0x21, 0xa6, 0x30, 0x0b, 0x36, - 0xeb, 0xcb, 0x9c, 0xf0, 0x9f, 0x90, 0x34, 0x09, 0x11, 0xf3, 0x7d, 0x5a, 0x48, 0x45, 0x6e, 0x02, - 0x84, 0x4f, 0xcc, 0x84, 0xf6, 0x11, 0xb9, 0x0c, 0xc7, 0xcc, 0xf7, 0x69, 0x12, 0x9d, 0x5f, 0x4a, - 0x3c, 0xd0, 0x29, 0x24, 0x4b, 0x71, 0x8c, 0x5f, 0x4a, 0x8c, 0x8f, 0x05, 0x20, 0xec, 0xd7, 0x8a, - 0xee, 0xba, 0x9b, 0xb6, 0x63, 0xcc, 0x6c, 0xe8, 0x56, 0x93, 0xc6, 0x77, 0x4f, 0x49, 0x8a, 0xf9, - 0x3e, 0x2d, 0xa5, 0x1c, 0x79, 0x03, 0x46, 0x64, 0x87, 0xd2, 0xb8, 0xd3, 0x87, 0x8c, 0x9b, 0xef, - 0xd3, 0x22, 0xb4, 0xe4, 0x35, 0x18, 0x16, 0xbf, 0x6f, 0xdb, 0xe2, 0x46, 0x59, 0x8a, 0x45, 0x24, - 0xa1, 0xe6, 0xfb, 0x34, 0x99, 0x52, 0xaa, 0x74, 0xc5, 0x31, 0x2d, 0x4f, 0xbc, 0x51, 0x8e, 0x57, - 0x8a, 0x38, 0xa9, 0x52, 0xfc, 0x4d, 0xde, 0x86, 0xd1, 0x20, 0xc8, 0xd3, 0xfb, 0xb4, 0xe1, 0x89, - 0xc3, 0xef, 0xf3, 0xb1, 0xc2, 0x1c, 0x39, 0xdf, 0xa7, 0x45, 0xa9, 0xc9, 0x55, 0x28, 0x69, 0xd4, - 0x35, 0x3f, 0xf0, 0xaf, 0x8b, 0xc7, 0xa4, 0x71, 0x6e, 0x7e, 0xc0, 0xa4, 0x24, 0xf0, 0xac, 0x77, - 0xc2, 0xfb, 0x69, 0x71, 0x54, 0x4d, 0x62, 0xb5, 0xcc, 0x5a, 0x06, 0xeb, 0x1d, 0xc9, 0x39, 0xe1, - 0xb3, 0x61, 0xe8, 0x2b, 0x91, 0x76, 0x75, 0x38, 0x1e, 0x63, 0x40, 0xc6, 0xce, 0xf7, 0x69, 0x31, - 0x7a, 0x49, 0xaa, 0x15, 0xd3, 0x7d, 0x20, 0xa2, 0x8d, 0xc6, 0xa5, 0xca, 0x50, 0x92, 0x54, 0xd9, - 0x4f, 0xa9, 0xea, 0x25, 0xea, 0x6d, 0xda, 0xce, 0x03, 0x11, 0x5b, 0x34, 0x5e, 0xb5, 0xc0, 0x4a, - 0x55, 0x0b, 0x88, 0x5c, 0x35, 0x1b, 0x70, 0x63, 0xe9, 0x55, 0xeb, 0x9e, 0x2e, 0x57, 0xcd, 0x4f, - 0xe2, 0xfc, 0x4e, 0x5a, 0xa0, 0xfa, 0x43, 0x9e, 0xfd, 0x3e, 0xd9, 0xa1, 0x88, 0x93, 0x3a, 0x14, - 0x7f, 0xb3, 0x4a, 0xa5, 0x0c, 0xe7, 0x22, 0xbd, 0x7d, 0x50, 0xa9, 0x84, 0x62, 0x95, 0xca, 0xb9, - 0xd0, 0x6f, 0xca, 0x89, 0xbf, 0x95, 0x89, 0x68, 0x07, 0x85, 0x18, 0xd6, 0x41, 0x52, 0x82, 0xf0, - 0x49, 0x4c, 0x2a, 0xac, 0x10, 0x24, 0x1f, 0x0e, 0x5a, 0x38, 0xb3, 0x32, 0xdf, 0xa7, 0x61, 0xba, - 0x61, 0x95, 0xa7, 0xab, 0x56, 0xce, 0x22, 0xc5, 0x88, 0x4f, 0xc1, 0x60, 0xf3, 0x7d, 0x1a, 0x4f, - 0x65, 0xfd, 0x92, 0x94, 0xd2, 0x4f, 0x39, 0x17, 0x9d, 0x22, 0x02, 0x04, 0x9b, 0x22, 0xc2, 0xc4, - 0x7f, 0x73, 0xc9, 0xb4, 0x77, 0xca, 0xf9, 0xe8, 0x52, 0x13, 0xc7, 0xcf, 0xf7, 0x69, 0xc9, 0x54, - 0x79, 0xaf, 0x45, 0x32, 0xc1, 0x29, 0x17, 0x62, 0x01, 0xc0, 0x42, 0x14, 0x13, 0x97, 0x9c, 0x33, - 0x6e, 0x39, 0x96, 0xfb, 0x5e, 0x4c, 0x56, 0x17, 0xa3, 0x1b, 0x97, 0x14, 0x92, 0xf9, 0x3e, 0x2d, - 0xad, 0x24, 0x99, 0x49, 0xe4, 0x63, 0x53, 0x94, 0xa8, 0x6f, 0x4c, 0x0c, 0x3d, 0xdf, 0xa7, 0x25, - 0x32, 0xb8, 0xdd, 0x94, 0x13, 0xa1, 0x29, 0x4f, 0x44, 0x3b, 0x31, 0xc4, 0xb0, 0x4e, 0x94, 0x12, - 0xa6, 0xdd, 0x94, 0x93, 0x63, 0x29, 0x97, 0x92, 0xa5, 0xc2, 0x99, 0x53, 0x4a, 0xa2, 0xa5, 0xa5, - 0xe7, 0xfb, 0x51, 0x9e, 0x14, 0x79, 0x7b, 0x45, 0xf9, 0x34, 0x9a, 0xf9, 0x3e, 0x2d, 0x3d, 0x57, - 0x90, 0x96, 0x9e, 0x28, 0x47, 0xb9, 0xdc, 0x8b, 0x67, 0xd0, 0xba, 0xf4, 0x24, 0x3b, 0x7a, 0x8f, - 0xb4, 0x25, 0xca, 0x53, 0xd1, 0xe8, 0xc3, 0x99, 0x84, 0xf3, 0x7d, 0x5a, 0x8f, 0xe4, 0x27, 0x77, - 0x33, 0x72, 0x88, 0x28, 0x4f, 0x47, 0xd3, 0x76, 0xa7, 0x12, 0xcd, 0xf7, 0x69, 0x19, 0x19, 0x48, - 0xee, 0x66, 0xa4, 0x98, 0x50, 0x26, 0x7b, 0xb2, 0x0d, 0xe4, 0x91, 0x91, 0xa0, 0x62, 0x39, 0x35, - 0x3b, 0x83, 0xf2, 0x4c, 0x54, 0x75, 0x53, 0x48, 0x98, 0xea, 0xa6, 0xe5, 0x75, 0x58, 0x4e, 0x4d, - 0x27, 0xa0, 0x3c, 0xdb, 0x83, 0x61, 0xd0, 0xc6, 0xd4, 0x44, 0x04, 0xcb, 0xa9, 0xf1, 0xfc, 0x15, - 0x35, 0xca, 0x30, 0x85, 0x84, 0x31, 0x4c, 0xcb, 0x04, 0xb0, 0x9c, 0x1a, 0xf6, 0x5d, 0x79, 0xae, - 0x07, 0xc3, 0xb0, 0x85, 0x69, 0x01, 0xe3, 0x5f, 0x8b, 0xc4, 0x5d, 0x57, 0x3e, 0x16, 0x9d, 0x37, - 0x24, 0x14, 0x9b, 0x37, 0xe4, 0x08, 0xed, 0x33, 0x89, 0xc8, 0xb2, 0xca, 0xc7, 0xa3, 0xc3, 0x3c, - 0x86, 0x66, 0xc3, 0x3c, 0x1e, 0x8b, 0x76, 0x26, 0x11, 0x61, 0x53, 0xb9, 0x92, 0xc5, 0x04, 0xd1, - 0x51, 0x26, 0x3c, 0x26, 0x67, 0x35, 0x25, 0xc4, 0xa3, 0xf2, 0x89, 0xa8, 0x5f, 0x77, 0x82, 0x60, - 0xbe, 0x4f, 0x4b, 0x09, 0x0c, 0xa9, 0xa5, 0xc7, 0x33, 0x52, 0xae, 0x46, 0x87, 0x6d, 0x1a, 0x0d, - 0x1b, 0xb6, 0xa9, 0xb1, 0x90, 0x16, 0xd2, 0x1e, 0x9f, 0x28, 0xd7, 0xa2, 0x86, 0x59, 0x92, 0x82, - 0x19, 0x66, 0x29, 0x8f, 0x56, 0xb4, 0xf4, 0x18, 0x3b, 0xca, 0xf3, 0x3d, 0x5b, 0x88, 0x34, 0x29, - 0x2d, 0xe4, 0x21, 0x67, 0x42, 0xdb, 0xe9, 0x6e, 0xa7, 0x65, 0xeb, 0x86, 0xf2, 0xc9, 0x54, 0xdb, - 0x89, 0x23, 0x25, 0xdb, 0x89, 0x03, 0xd8, 0x2a, 0x2f, 0xbf, 0x71, 0x50, 0x5e, 0x88, 0xae, 0xf2, - 0x32, 0x8e, 0xad, 0xf2, 0x91, 0xf7, 0x10, 0x33, 0x89, 0xf7, 0x00, 0xca, 0x8b, 0x51, 0x05, 0x88, - 0xa1, 0x99, 0x02, 0xc4, 0x5f, 0x10, 0x7c, 0x31, 0xdb, 0x83, 0x5e, 0x99, 0x42, 0x6e, 0xcf, 0xf8, - 0xdc, 0xb2, 0xe8, 0xe6, 0xfb, 0xb4, 0x6c, 0x2f, 0xfc, 0x6a, 0x8a, 0x43, 0xbc, 0x72, 0x3d, 0xaa, - 0x60, 0x09, 0x02, 0xa6, 0x60, 0x49, 0x37, 0xfa, 0x6a, 0x8a, 0x47, 0xbb, 0xf2, 0xa9, 0x4c, 0x56, - 0xc1, 0x37, 0xa7, 0xf8, 0xc1, 0xdf, 0x94, 0x5d, 0xd2, 0x95, 0x97, 0xa2, 0x8b, 0x5d, 0x88, 0x61, - 0x8b, 0x9d, 0xe4, 0xba, 0x7e, 0x53, 0x76, 0xc6, 0x56, 0x6e, 0x24, 0x4b, 0x85, 0x4b, 0xa4, 0xe4, - 0xb4, 0xad, 0xa5, 0xfb, 0x30, 0x2b, 0x2f, 0x47, 0xb5, 0x2e, 0x8d, 0x86, 0x69, 0x5d, 0xaa, 0xff, - 0xf3, 0x5c, 0xd2, 0x15, 0x59, 0xb9, 0x19, 0xdf, 0x64, 0x47, 0xf1, 0xcc, 0xf2, 0x49, 0xb8, 0x2f, - 0x7f, 0x36, 0x1e, 0x6c, 0x4f, 0x79, 0x25, 0x76, 0xed, 0x1b, 0xc1, 0x32, 0xfb, 0x36, 0x16, 0x9c, - 0xef, 0xb3, 0xf1, 0xf8, 0x74, 0xca, 0xab, 0xe9, 0x1c, 0x02, 0x5d, 0x89, 0xc7, 0xb3, 0xfb, 0x6c, - 0x3c, 0xa4, 0x9b, 0xf2, 0x5a, 0x3a, 0x87, 0x40, 0xba, 0xf1, 0x10, 0x70, 0x2f, 0x49, 0x41, 0xe6, - 0x95, 0x4f, 0x47, 0x4d, 0xc7, 0x00, 0xc1, 0x4c, 0xc7, 0x30, 0x14, 0xfd, 0x4b, 0x52, 0x70, 0x76, - 0xe5, 0xf5, 0x44, 0x91, 0xa0, 0xb1, 0x52, 0x08, 0xf7, 0x97, 0xa4, 0xa0, 0xe6, 0xca, 0x1b, 0x89, - 0x22, 0x41, 0xeb, 0xa4, 0xd0, 0xe7, 0x46, 0xaf, 0xf7, 0xab, 0xca, 0x9b, 0xd1, 0xc3, 0xe0, 0x6c, - 0xca, 0xf9, 0x3e, 0xad, 0xd7, 0x3b, 0xd8, 0x2f, 0x66, 0x3b, 0x76, 0x2b, 0x6f, 0x45, 0x87, 0x70, - 0x16, 0x1d, 0x1b, 0xc2, 0x99, 0xce, 0xe1, 0x6f, 0xc7, 0x62, 0x59, 0x28, 0x6f, 0x47, 0xa7, 0xb8, - 0x08, 0x92, 0x4d, 0x71, 0xf1, 0xc8, 0x17, 0x91, 0x20, 0x0d, 0xca, 0x67, 0xa2, 0x53, 0x9c, 0x8c, - 0x63, 0x53, 0x5c, 0x24, 0xa0, 0xc3, 0x4c, 0x22, 0x76, 0x80, 0xf2, 0x4e, 0x74, 0x8a, 0x8b, 0xa1, - 0xd9, 0x14, 0x17, 0x8f, 0x36, 0xf0, 0x76, 0xec, 0x09, 0xbd, 0xf2, 0xd9, 0xf4, 0xf6, 0x23, 0x52, - 0x6e, 0x3f, 0x7f, 0x70, 0xaf, 0xa5, 0xbf, 0x05, 0x57, 0xca, 0xd1, 0xf1, 0x9b, 0x46, 0xc3, 0xc6, - 0x6f, 0xea, 0x3b, 0xf2, 0xf8, 0xc6, 0x41, 0x68, 0xd5, 0x74, 0x8f, 0x8d, 0x43, 0x68, 0x8a, 0xa4, - 0x80, 0x23, 0x7b, 0x64, 0xbe, 0x11, 0x9a, 0xc9, 0xd8, 0x23, 0xfb, 0xdb, 0xa0, 0x18, 0x3d, 0x9b, - 0x5d, 0x13, 0x7e, 0xc6, 0x4a, 0x25, 0x3a, 0xbb, 0x26, 0x08, 0xd8, 0xec, 0x9a, 0xf4, 0x4e, 0x9e, - 0x83, 0x71, 0xa1, 0x45, 0xdc, 0x7d, 0xda, 0xb4, 0x9a, 0xca, 0x6c, 0xec, 0xbd, 0x65, 0x0c, 0xcf, - 0x66, 0xa7, 0x38, 0x0c, 0xd7, 0x6b, 0x0e, 0x9b, 0x69, 0x99, 0x9d, 0x35, 0x5b, 0x77, 0x8c, 0x1a, - 0xb5, 0x0c, 0x65, 0x2e, 0xb6, 0x5e, 0xa7, 0xd0, 0xe0, 0x7a, 0x9d, 0x02, 0xc7, 0x10, 0x71, 0x31, - 0xb8, 0x46, 0x1b, 0xd4, 0x7c, 0x48, 0x95, 0x5b, 0xc8, 0x76, 0x32, 0x8b, 0xad, 0x20, 0x9b, 0xef, - 0xd3, 0xb2, 0x38, 0x30, 0x5b, 0x7d, 0x71, 0xab, 0xf6, 0xee, 0x42, 0x10, 0x7e, 0x60, 0xc5, 0xa1, - 0x1d, 0xdd, 0xa1, 0xca, 0x7c, 0xd4, 0x56, 0x4f, 0x25, 0x62, 0xb6, 0x7a, 0x2a, 0x22, 0xc9, 0xd6, - 0x1f, 0x0b, 0xd5, 0x5e, 0x6c, 0xc3, 0x11, 0x91, 0x5e, 0x9a, 0xcd, 0x4e, 0x51, 0x04, 0x13, 0xd0, - 0x82, 0x6d, 0x35, 0xf1, 0xa4, 0xe2, 0x76, 0x74, 0x76, 0xca, 0xa6, 0x64, 0xb3, 0x53, 0x36, 0x96, - 0xa9, 0x7a, 0x14, 0xcb, 0xc7, 0xe0, 0x9d, 0xa8, 0xaa, 0xa7, 0x90, 0x30, 0x55, 0x4f, 0x01, 0x27, - 0x19, 0x6a, 0xd4, 0xa5, 0x9e, 0xb2, 0xd0, 0x8b, 0x21, 0x92, 0x24, 0x19, 0x22, 0x38, 0xc9, 0x70, - 0x8e, 0x7a, 0x8d, 0x0d, 0x65, 0xb1, 0x17, 0x43, 0x24, 0x49, 0x32, 0x44, 0x30, 0xdb, 0x6c, 0x46, - 0xc1, 0xd3, 0xdd, 0xd6, 0x03, 0xbf, 0xcf, 0x96, 0xa2, 0x9b, 0xcd, 0x4c, 0x42, 0xb6, 0xd9, 0xcc, - 0x44, 0x92, 0x9f, 0xd8, 0xb3, 0x1f, 0xbc, 0xb2, 0x8c, 0x15, 0x4e, 0x85, 0x76, 0xc1, 0x5e, 0x4a, - 0xcd, 0xf7, 0x69, 0x7b, 0xf5, 0xb3, 0xff, 0x64, 0xe0, 0x34, 0xaa, 0xac, 0x60, 0x55, 0x67, 0x82, - 0xb3, 0x0a, 0x0e, 0x9e, 0xef, 0xd3, 0x02, 0xb7, 0xd2, 0xd7, 0x60, 0x18, 0x3f, 0xaa, 0x6a, 0x99, - 0x5e, 0x65, 0x5a, 0x79, 0x37, 0xba, 0x65, 0x92, 0x50, 0x6c, 0xcb, 0x24, 0xfd, 0x64, 0x93, 0x38, - 0xfe, 0xe4, 0x53, 0x4c, 0x65, 0x5a, 0xd1, 0xa2, 0x93, 0x78, 0x04, 0xc9, 0x26, 0xf1, 0x08, 0x20, - 0xa8, 0xb7, 0xe2, 0xd8, 0x9d, 0xca, 0xb4, 0x52, 0x4b, 0xa9, 0x97, 0xa3, 0x82, 0x7a, 0xf9, 0xcf, - 0xa0, 0xde, 0xda, 0x46, 0xd7, 0xab, 0xb0, 0x6f, 0x5c, 0x4d, 0xa9, 0xd7, 0x47, 0x06, 0xf5, 0xfa, - 0x00, 0x36, 0x15, 0x22, 0x60, 0xc5, 0xb1, 0xd9, 0xa4, 0x7d, 0xc7, 0x6c, 0xb5, 0x94, 0xbb, 0xd1, - 0xa9, 0x30, 0x8e, 0x67, 0x53, 0x61, 0x1c, 0xc6, 0x4c, 0x4f, 0xde, 0x2a, 0xba, 0xd6, 0x6d, 0x2a, - 0xf7, 0xa2, 0xa6, 0x67, 0x88, 0x61, 0xa6, 0x67, 0xf8, 0x0b, 0x77, 0x17, 0xec, 0x97, 0x46, 0xd7, - 0x1d, 0xea, 0x6e, 0x28, 0xf7, 0x63, 0xbb, 0x0b, 0x09, 0x87, 0xbb, 0x0b, 0xe9, 0x37, 0x69, 0xc2, - 0x93, 0x91, 0x85, 0xc6, 0xbf, 0xb4, 0xa9, 0x51, 0xdd, 0x69, 0x6c, 0x28, 0x9f, 0x43, 0x56, 0xcf, - 0xa5, 0x2e, 0x55, 0x51, 0xd2, 0xf9, 0x3e, 0xad, 0x17, 0x27, 0xdc, 0x96, 0xbf, 0xbb, 0xc0, 0x23, - 0xc1, 0x6a, 0x2b, 0x33, 0xfe, 0x26, 0xf4, 0xbd, 0xd8, 0xb6, 0x3c, 0x49, 0x82, 0xdb, 0xf2, 0x24, - 0x98, 0x74, 0xe0, 0xe9, 0xd8, 0x56, 0x6d, 0x51, 0x6f, 0xb1, 0x7d, 0x09, 0x35, 0x56, 0xf4, 0xc6, - 0x03, 0xea, 0x29, 0x9f, 0x47, 0xde, 0x57, 0x32, 0x36, 0x7c, 0x31, 0xea, 0xf9, 0x3e, 0x6d, 0x17, - 0x7e, 0x44, 0x85, 0x62, 0x6d, 0x6e, 0x75, 0x45, 0xf9, 0x81, 0xe8, 0xf9, 0x26, 0x83, 0xcd, 0xf7, - 0x69, 0x88, 0x63, 0x56, 0xda, 0xdd, 0x4e, 0xd3, 0xd1, 0x0d, 0xca, 0x0d, 0x2d, 0xb4, 0xdd, 0x84, - 0x01, 0xfa, 0x83, 0x51, 0x2b, 0x2d, 0x8b, 0x8e, 0x59, 0x69, 0x59, 0x38, 0xa6, 0xa8, 0x91, 0xa4, - 0x27, 0xca, 0x17, 0xa2, 0x8a, 0x1a, 0x41, 0x32, 0x45, 0x8d, 0xa6, 0x48, 0xf9, 0x1c, 0x5c, 0x08, - 0xf6, 0xf3, 0x62, 0xfd, 0xe5, 0x9d, 0xa6, 0x7c, 0x11, 0xf9, 0x3c, 0x9d, 0xb8, 0x0c, 0x88, 0x50, - 0xcd, 0xf7, 0x69, 0x19, 0xe5, 0xd9, 0x8a, 0x9b, 0xc8, 0xe7, 0x25, 0xcc, 0x8b, 0x1f, 0x8a, 0xae, - 0xb8, 0x19, 0x64, 0x6c, 0xc5, 0xcd, 0x40, 0xa5, 0x32, 0x17, 0x42, 0xd5, 0x77, 0x61, 0x1e, 0xc8, - 0x34, 0x8b, 0x43, 0x2a, 0x73, 0x61, 0xa9, 0xad, 0xed, 0xc2, 0x3c, 0xb0, 0xd6, 0xb2, 0x38, 0x90, - 0xab, 0x50, 0xaa, 0xd5, 0x16, 0xb5, 0xae, 0xa5, 0x34, 0x62, 0xde, 0xb2, 0x08, 0x9d, 0xef, 0xd3, - 0x04, 0x9e, 0x99, 0x41, 0xb3, 0x2d, 0xdd, 0xf5, 0xcc, 0x86, 0x8b, 0x23, 0xc6, 0x1f, 0x21, 0x46, - 0xd4, 0x0c, 0x4a, 0xa3, 0x61, 0x66, 0x50, 0x1a, 0x9c, 0xd9, 0x8b, 0x33, 0xba, 0xeb, 0xea, 0x96, - 0xe1, 0xe8, 0xd3, 0xb8, 0x4c, 0xd0, 0xd8, 0x6b, 0xac, 0x08, 0x96, 0xd9, 0x8b, 0x51, 0x08, 0x1e, - 0xbe, 0xfb, 0x10, 0xdf, 0xcc, 0x59, 0x8f, 0x1d, 0xbe, 0xc7, 0xf0, 0x78, 0xf8, 0x1e, 0x83, 0xa1, - 0xdd, 0xe9, 0xc3, 0x34, 0xda, 0x34, 0x99, 0x88, 0x94, 0x66, 0xcc, 0xee, 0x8c, 0x13, 0xa0, 0xdd, - 0x19, 0x07, 0x46, 0x9a, 0xe4, 0x2f, 0xb7, 0x1b, 0x19, 0x4d, 0x0a, 0x57, 0xd9, 0x44, 0x19, 0xb6, - 0x7e, 0x87, 0x83, 0xa3, 0xb2, 0x65, 0xe9, 0x6d, 0xbb, 0x32, 0xed, 0x4b, 0xdd, 0x8c, 0xae, 0xdf, - 0x99, 0x84, 0x6c, 0xfd, 0xce, 0x44, 0xb2, 0xd9, 0xd5, 0xdf, 0x68, 0x6d, 0xe8, 0x0e, 0x35, 0x2a, - 0xa6, 0x83, 0x27, 0x8b, 0x5b, 0x7c, 0x6b, 0xf8, 0x7e, 0x74, 0x76, 0xed, 0x41, 0xca, 0x66, 0xd7, - 0x1e, 0x68, 0x66, 0xe4, 0xa5, 0xa3, 0x35, 0xaa, 0x1b, 0xca, 0x83, 0xa8, 0x91, 0x97, 0x4d, 0xc9, - 0x8c, 0xbc, 0x6c, 0x6c, 0xf6, 0xe7, 0xdc, 0x77, 0x4c, 0x8f, 0x2a, 0xad, 0xbd, 0x7c, 0x0e, 0x92, - 0x66, 0x7f, 0x0e, 0xa2, 0xd9, 0x86, 0x30, 0xde, 0x21, 0xed, 0xe8, 0x86, 0x30, 0xd9, 0x0d, 0xf1, - 0x12, 0xcc, 0x62, 0x11, 0x8f, 0xf2, 0x14, 0x2b, 0x6a, 0xb1, 0x08, 0x30, 0xb3, 0x58, 0xc2, 0x67, - 0x7b, 0x91, 0xa7, 0x58, 0x8a, 0x1d, 0x5d, 0x43, 0x65, 0x1c, 0x5b, 0x43, 0x23, 0xcf, 0xb6, 0x5e, - 0x8b, 0xbc, 0x33, 0x50, 0x3a, 0x51, 0xab, 0x43, 0x42, 0x31, 0xab, 0x43, 0x7e, 0x91, 0x30, 0x03, - 0x67, 0xf0, 0x16, 0x5c, 0xeb, 0x06, 0xf7, 0x38, 0x3f, 0x1c, 0xfd, 0xcc, 0x18, 0x9a, 0x7d, 0x66, - 0x0c, 0x14, 0x61, 0x22, 0xa6, 0x2d, 0x27, 0x83, 0x49, 0x78, 0x3e, 0x18, 0x03, 0x91, 0x05, 0x20, - 0xb5, 0xf2, 0xe2, 0x42, 0xd5, 0x58, 0x91, 0xaf, 0xc8, 0xdc, 0xe8, 0x09, 0x6c, 0x92, 0x62, 0xbe, - 0x4f, 0x4b, 0x29, 0x47, 0xde, 0x87, 0xcb, 0x02, 0x2a, 0x5e, 0x5c, 0x63, 0xda, 0x7f, 0x23, 0x58, - 0x10, 0xbc, 0xa8, 0x1f, 0x5b, 0x2f, 0xda, 0xf9, 0x3e, 0xad, 0x27, 0xaf, 0xec, 0xba, 0xc4, 0xfa, - 0xd0, 0xdd, 0x4b, 0x5d, 0xc1, 0x22, 0xd1, 0x93, 0x57, 0x76, 0x5d, 0x42, 0xee, 0x0f, 0xf7, 0x52, - 0x57, 0xd0, 0x09, 0x3d, 0x79, 0x11, 0x17, 0x26, 0x7b, 0xe1, 0xcb, 0xad, 0x96, 0xb2, 0x89, 0xd5, - 0x7d, 0x62, 0x2f, 0xd5, 0x95, 0xd1, 0xe0, 0xdc, 0x8d, 0x23, 0x9b, 0xa5, 0x97, 0x3b, 0xd4, 0xaa, - 0x45, 0x16, 0xa0, 0x47, 0xd1, 0x59, 0x3a, 0x41, 0xc0, 0x66, 0xe9, 0x04, 0x90, 0x0d, 0x28, 0xf9, - 0xb9, 0x8a, 0xb2, 0x15, 0x1d, 0x50, 0x32, 0x8e, 0x0d, 0xa8, 0xc8, 0xd3, 0x96, 0x65, 0x38, 0xbb, - 0xfc, 0xc0, 0xd3, 0x7d, 0x0b, 0xd2, 0x15, 0x5d, 0xf9, 0x41, 0xec, 0x92, 0x29, 0x49, 0x82, 0x97, - 0x4c, 0x49, 0x30, 0x1b, 0x23, 0x0c, 0x5c, 0xdb, 0xb2, 0x1a, 0x73, 0xba, 0xd9, 0xea, 0x3a, 0x54, - 0xf9, 0x37, 0xa2, 0x63, 0x24, 0x86, 0x66, 0x63, 0x24, 0x06, 0x62, 0x0b, 0x34, 0x03, 0x95, 0x5d, - 0xd7, 0x6c, 0x5a, 0x62, 0x5f, 0xd9, 0x6d, 0x79, 0xca, 0xbf, 0x19, 0x5d, 0xa0, 0xd3, 0x68, 0xd8, - 0x02, 0x9d, 0x06, 0xc7, 0x53, 0x27, 0xd6, 0x0b, 0x6c, 0xf1, 0x90, 0xef, 0x2a, 0xff, 0xad, 0xd8, - 0xa9, 0x53, 0x0a, 0x0d, 0x9e, 0x3a, 0xa5, 0xc0, 0xd9, 0xfa, 0xc8, 0x6d, 0xb2, 0x05, 0x33, 0xb8, - 0xab, 0xfe, 0xb7, 0xa3, 0xeb, 0x63, 0x1c, 0xcf, 0xd6, 0xc7, 0x38, 0x2c, 0xca, 0x47, 0x74, 0xc1, - 0xbf, 0x93, 0xc5, 0x27, 0x90, 0x7f, 0xa2, 0x0c, 0xb9, 0x25, 0xf3, 0x11, 0x23, 0xe5, 0x47, 0x72, - 0x59, 0x8c, 0x82, 0xe1, 0x91, 0x28, 0x14, 0x65, 0xa4, 0xd1, 0x87, 0x26, 0xdd, 0x54, 0xbe, 0x94, - 0xc9, 0x88, 0x13, 0x44, 0x19, 0x71, 0x18, 0x79, 0x0f, 0x2e, 0x84, 0xb0, 0x45, 0xda, 0x5e, 0x0b, - 0x66, 0xa6, 0x1f, 0xcd, 0x45, 0xcd, 0xe0, 0x74, 0x32, 0x66, 0x06, 0xa7, 0x63, 0xd2, 0x58, 0x0b, - 0xd1, 0xfd, 0xbb, 0xbb, 0xb0, 0x0e, 0x24, 0x98, 0xc1, 0x20, 0x8d, 0xb5, 0x90, 0xe6, 0x8f, 0xed, - 0xc2, 0x3a, 0x90, 0x69, 0x06, 0x03, 0xf2, 0x93, 0x39, 0xb8, 0x92, 0x8e, 0x2a, 0xb7, 0x5a, 0x73, - 0xb6, 0x13, 0xe2, 0x94, 0x3f, 0x95, 0x8b, 0x1e, 0x34, 0xec, 0xad, 0xd8, 0x7c, 0x9f, 0xb6, 0xc7, - 0x0a, 0xc8, 0x67, 0x60, 0xb4, 0xdc, 0x35, 0x4c, 0x0f, 0x2f, 0xde, 0x98, 0xe1, 0xfc, 0xe3, 0xb9, - 0xd8, 0x16, 0x47, 0xc6, 0xe2, 0x16, 0x47, 0x06, 0x90, 0xdb, 0x30, 0x51, 0xa3, 0x8d, 0xae, 0x63, - 0x7a, 0x5b, 0x1a, 0xed, 0xd8, 0x8e, 0xc7, 0x78, 0xfc, 0xe9, 0x5c, 0x74, 0x12, 0x4b, 0x50, 0xb0, - 0x49, 0x2c, 0x01, 0x24, 0xf7, 0x12, 0xb7, 0xf2, 0xa2, 0x33, 0x7f, 0x22, 0xd7, 0xf3, 0x5a, 0x3e, - 0xe8, 0xcb, 0xf4, 0xe2, 0x64, 0x25, 0x76, 0x8b, 0x2e, 0xb8, 0xfe, 0x64, 0xae, 0xc7, 0x35, 0xba, - 0x34, 0xc3, 0x25, 0xc1, 0x8c, 0x63, 0x4a, 0x06, 0x78, 0xe5, 0xcf, 0xe4, 0x7a, 0x5c, 0x7b, 0x87, - 0x1c, 0xd3, 0x92, 0xc7, 0xbf, 0xc2, 0x3d, 0x45, 0x04, 0xa3, 0x9f, 0xca, 0x25, 0x5d, 0x45, 0x82, - 0xf2, 0x12, 0x21, 0x2b, 0x76, 0xd7, 0x0d, 0x94, 0xfe, 0xcb, 0xb9, 0xa4, 0x6f, 0x5e, 0x58, 0x2c, - 0xfc, 0x45, 0x28, 0x5c, 0x9a, 0x7d, 0xe4, 0x51, 0xc7, 0xd2, 0x5b, 0xd8, 0x9d, 0x35, 0xcf, 0x76, - 0xf4, 0x26, 0x9d, 0xb5, 0xf4, 0xb5, 0x16, 0x55, 0x7e, 0x3a, 0x17, 0xb5, 0x60, 0xb3, 0x49, 0x99, - 0x05, 0x9b, 0x8d, 0x25, 0x1b, 0xf0, 0x64, 0x1a, 0xb6, 0x62, 0xba, 0x58, 0xcf, 0x57, 0x72, 0x51, - 0x13, 0xb6, 0x07, 0x2d, 0x33, 0x61, 0x7b, 0xa0, 0xc9, 0x0d, 0x18, 0x9a, 0xb6, 0xfd, 0xe9, 0xf7, - 0xcf, 0xc6, 0x9c, 0x21, 0x03, 0xcc, 0x7c, 0x9f, 0x16, 0x92, 0x89, 0x32, 0x62, 0x50, 0x7f, 0x35, - 0x59, 0x26, 0xbc, 0x7c, 0x0a, 0x7e, 0x88, 0x32, 0x42, 0xdc, 0xff, 0x5e, 0xb2, 0x4c, 0x78, 0xc7, - 0x15, 0xfc, 0x60, 0x33, 0x09, 0xaf, 0x71, 0x71, 0xae, 0xcc, 0xec, 0xb6, 0x99, 0x0d, 0xbd, 0xd5, - 0xa2, 0x56, 0x93, 0x2a, 0x5f, 0x8b, 0xcd, 0x24, 0xe9, 0x64, 0x6c, 0x26, 0x49, 0xc7, 0x90, 0x1f, - 0x84, 0x8b, 0xf7, 0xf4, 0x96, 0x69, 0x84, 0x38, 0x3f, 0x1f, 0xb8, 0xf2, 0x33, 0xb9, 0xe8, 0x6e, - 0x3a, 0x83, 0x8e, 0xed, 0xa6, 0x33, 0x50, 0x64, 0x11, 0x08, 0x2e, 0xa3, 0xc1, 0x6c, 0xc1, 0xd6, - 0x67, 0xe5, 0xdf, 0xcf, 0x45, 0xed, 0xd4, 0x24, 0x09, 0xb3, 0x53, 0x93, 0x50, 0x52, 0xcf, 0x4e, - 0x0d, 0xa2, 0xfc, 0x6c, 0x2e, 0x7a, 0x5a, 0x93, 0x45, 0x38, 0xdf, 0xa7, 0x65, 0xe7, 0x17, 0xb9, - 0x05, 0xe3, 0xb5, 0x95, 0xea, 0xdc, 0xdc, 0x6c, 0xed, 0x5e, 0xb5, 0x82, 0x0f, 0x1d, 0x0c, 0xe5, - 0xcf, 0xc5, 0x56, 0xac, 0x38, 0x01, 0x5b, 0xb1, 0xe2, 0x30, 0xf2, 0x26, 0x8c, 0xb0, 0xf6, 0xb3, - 0x01, 0x83, 0x9f, 0xfc, 0x73, 0xb9, 0xa8, 0x39, 0x25, 0x23, 0x99, 0x39, 0x25, 0xff, 0x26, 0x35, - 0x38, 0xc7, 0xa4, 0xb8, 0xe2, 0xd0, 0x75, 0xea, 0x50, 0xab, 0xe1, 0x8f, 0xe9, 0x9f, 0xcf, 0x45, - 0xad, 0x8c, 0x34, 0x22, 0x66, 0x65, 0xa4, 0xc1, 0xc9, 0x03, 0xb8, 0x1c, 0x3f, 0x09, 0x92, 0x9f, - 0x9d, 0x2a, 0x7f, 0x3e, 0x17, 0x33, 0x86, 0x7b, 0x10, 0xa3, 0x31, 0xdc, 0x03, 0x4f, 0x2c, 0x78, - 0x4a, 0x1c, 0xab, 0x08, 0x87, 0xcb, 0x78, 0x6d, 0x7f, 0x81, 0xd7, 0xf6, 0xf1, 0xd0, 0x21, 0xb0, - 0x07, 0xf5, 0x7c, 0x9f, 0xd6, 0x9b, 0x1d, 0xd3, 0xb3, 0x64, 0x02, 0x0c, 0xe5, 0x2f, 0xe6, 0xd2, - 0x3d, 0x52, 0x22, 0x6e, 0xca, 0x69, 0x99, 0x33, 0xde, 0xcb, 0x4a, 0xdf, 0xa0, 0xfc, 0xa5, 0xd8, - 0x78, 0x4b, 0x27, 0x63, 0xe3, 0x2d, 0x23, 0xff, 0xc3, 0x6d, 0x98, 0xe0, 0x4a, 0xbd, 0xa2, 0xe3, - 0x30, 0xb4, 0x9a, 0xd4, 0x50, 0xfe, 0x83, 0xd8, 0x6a, 0x97, 0xa0, 0x40, 0xd7, 0x9e, 0x38, 0x90, - 0x4d, 0xdd, 0xb5, 0x8e, 0x6e, 0x59, 0x78, 0xcc, 0xaa, 0xfc, 0x87, 0xb1, 0xa9, 0x3b, 0x44, 0xa1, - 0xe3, 0x6e, 0xf0, 0x8b, 0x69, 0x42, 0xaf, 0xd4, 0x47, 0xca, 0x5f, 0x8e, 0x69, 0x42, 0x2f, 0x62, - 0xa6, 0x09, 0x3d, 0xf3, 0x28, 0xdd, 0xcb, 0x78, 0x02, 0xae, 0x7c, 0x3d, 0xb6, 0x22, 0xa7, 0x52, - 0xb1, 0x15, 0x39, 0xfd, 0x05, 0xf9, 0xbd, 0x8c, 0xe7, 0xd3, 0xca, 0x2f, 0xf4, 0xe6, 0x1b, 0xae, - 0xf4, 0xe9, 0xaf, 0xaf, 0xef, 0x65, 0x3c, 0x3d, 0x56, 0xfe, 0x4a, 0x6f, 0xbe, 0xa1, 0x63, 0x5f, - 0xfa, 0xcb, 0xe5, 0x7a, 0xf6, 0xb3, 0x5d, 0xe5, 0xaf, 0xc6, 0xa7, 0xae, 0x0c, 0x42, 0x9c, 0xba, - 0xb2, 0xde, 0xfe, 0xae, 0xc1, 0x13, 0x5c, 0x43, 0x6e, 0x39, 0x7a, 0x67, 0xa3, 0x46, 0x3d, 0xcf, - 0xb4, 0x9a, 0xfe, 0x4e, 0xec, 0xaf, 0xe5, 0x62, 0xc7, 0x63, 0x59, 0x94, 0x78, 0x3c, 0x96, 0x85, - 0x64, 0xca, 0x9b, 0x78, 0xa0, 0xab, 0xfc, 0xf5, 0x98, 0xf2, 0x26, 0x28, 0x98, 0xf2, 0x26, 0xdf, - 0xf5, 0xde, 0x4e, 0x79, 0x87, 0xaa, 0xfc, 0x47, 0xd9, 0xbc, 0x82, 0xf6, 0xa5, 0x3c, 0x5f, 0xbd, - 0x9d, 0xf2, 0xdc, 0x52, 0xf9, 0x8f, 0xb3, 0x79, 0x85, 0x3e, 0x48, 0xc9, 0x57, 0x9a, 0xef, 0xc1, - 0x05, 0x3e, 0x9b, 0xcf, 0x51, 0x83, 0x46, 0x3e, 0xf4, 0x17, 0x63, 0x63, 0x3f, 0x9d, 0x0c, 0x8f, - 0xdc, 0x53, 0x31, 0x69, 0xac, 0x45, 0x5b, 0xff, 0xc6, 0x2e, 0xac, 0xc3, 0x0d, 0x41, 0x3a, 0x86, - 0xad, 0x37, 0xf2, 0xe3, 0x37, 0xe5, 0x97, 0x62, 0xeb, 0x8d, 0x8c, 0x44, 0x77, 0x0e, 0xf9, 0xa5, - 0xdc, 0x9b, 0xd1, 0x87, 0x5e, 0xca, 0xdf, 0x4c, 0x2d, 0x1c, 0x74, 0x40, 0xf4, 0x55, 0xd8, 0x9b, - 0xd1, 0x47, 0x4d, 0xca, 0x2f, 0xa7, 0x16, 0x0e, 0x3e, 0x20, 0xfa, 0x02, 0x8a, 0x6d, 0x91, 0xba, - 0x9e, 0xcd, 0x59, 0x45, 0xa6, 0x87, 0xbf, 0x15, 0xdf, 0x22, 0xa5, 0x92, 0xe1, 0x16, 0x29, 0x15, - 0x93, 0xc6, 0x5a, 0x7c, 0xde, 0xaf, 0xec, 0xc2, 0x5a, 0xda, 0xd8, 0xa5, 0x62, 0xd2, 0x58, 0x8b, - 0x8f, 0xff, 0xc6, 0x2e, 0xac, 0xa5, 0x8d, 0x5d, 0x2a, 0x86, 0x99, 0x63, 0x21, 0xe6, 0x1e, 0x75, - 0xdc, 0x50, 0xfd, 0xfe, 0x93, 0x98, 0x39, 0x96, 0x41, 0xc7, 0xcc, 0xb1, 0x0c, 0x54, 0x2a, 0x77, - 0x21, 0x94, 0x5f, 0xdd, 0x8d, 0x7b, 0x78, 0x2f, 0x93, 0x81, 0x4a, 0xe5, 0x2e, 0xe4, 0xf2, 0xb7, - 0x77, 0xe3, 0x1e, 0x5e, 0xcc, 0x64, 0xa0, 0x98, 0x51, 0x54, 0xf3, 0x74, 0xcf, 0x6c, 0xcc, 0xdb, - 0xae, 0x27, 0x2d, 0xf2, 0x7f, 0x27, 0x66, 0x14, 0xa5, 0x11, 0x31, 0xa3, 0x28, 0x0d, 0x9e, 0x64, - 0x2a, 0xa4, 0xf1, 0x6b, 0x3d, 0x99, 0x86, 0x96, 0x56, 0x1a, 0x3c, 0xc9, 0x54, 0x08, 0xe1, 0x3f, - 0xed, 0xc9, 0x34, 0xf4, 0x94, 0x4f, 0x83, 0x33, 0xcb, 0x74, 0xc6, 0xb1, 0x37, 0xad, 0xdb, 0x74, - 0x93, 0xb6, 0xc4, 0xa7, 0xff, 0x7a, 0xcc, 0x32, 0x8d, 0x13, 0xe0, 0x2d, 0x4a, 0x0c, 0x16, 0x65, - 0x24, 0x3e, 0xf7, 0x37, 0x32, 0x19, 0x85, 0xc7, 0x44, 0x71, 0x58, 0x94, 0x91, 0xf8, 0xc4, 0xdf, - 0xcc, 0x64, 0x14, 0x1e, 0x13, 0xc5, 0x61, 0xa4, 0x0c, 0x63, 0xf8, 0x56, 0x42, 0x77, 0x7d, 0xcf, - 0xcf, 0xdf, 0xc9, 0x45, 0x6f, 0xbd, 0xa2, 0xe8, 0xf9, 0x3e, 0x2d, 0x56, 0x40, 0x66, 0x21, 0x3e, - 0xe9, 0x5b, 0x19, 0x2c, 0x42, 0x7f, 0xc7, 0x28, 0x44, 0x66, 0x21, 0x3e, 0xe6, 0x3f, 0xcb, 0x60, - 0x11, 0x3a, 0x3c, 0x46, 0x21, 0xe4, 0xd3, 0x30, 0x5c, 0x9b, 0x5b, 0x5d, 0xf1, 0xd3, 0xf3, 0xfd, - 0xdd, 0x5c, 0xec, 0x55, 0x51, 0x88, 0xc3, 0x57, 0x45, 0xe1, 0xcf, 0xe9, 0x01, 0xe8, 0xc7, 0xa3, - 0xd4, 0xdb, 0xa5, 0xc1, 0x6f, 0xe6, 0xc6, 0x7f, 0x2b, 0x77, 0xbb, 0x34, 0xf8, 0x5b, 0xb9, 0xf1, - 0xdf, 0x66, 0xff, 0xff, 0x76, 0x6e, 0xfc, 0x77, 0x72, 0xda, 0x13, 0xe1, 0xb0, 0x28, 0x37, 0xa9, - 0xe5, 0xad, 0xb4, 0x74, 0x31, 0xa8, 0x53, 0x51, 0xfc, 0x67, 0x2a, 0x4a, 0xa4, 0xc2, 0xfa, 0x7a, - 0x0e, 0x46, 0x6a, 0x9e, 0x43, 0xf5, 0xb6, 0x88, 0x2c, 0x77, 0x09, 0x06, 0xb9, 0xf3, 0xb3, 0xff, - 0x52, 0x5b, 0x0b, 0x7e, 0x93, 0x2b, 0x30, 0xb6, 0xa0, 0xbb, 0x1e, 0x36, 0xb1, 0x6a, 0x19, 0xf4, - 0x11, 0x3e, 0xfc, 0x2b, 0x68, 0x31, 0x28, 0x59, 0xe0, 0x74, 0xbc, 0x1c, 0x06, 0x13, 0x2d, 0xec, - 0x1a, 0x50, 0x6d, 0xf0, 0xdb, 0xdb, 0x93, 0x7d, 0x18, 0x3f, 0x2d, 0x56, 0x56, 0xfd, 0xbd, 0x1c, - 0x24, 0xdc, 0xb2, 0x0f, 0x1e, 0x41, 0x61, 0x19, 0xce, 0xc4, 0x02, 0xd8, 0x8a, 0xd7, 0x8b, 0x7b, - 0x8c, 0x6f, 0x1b, 0x2f, 0x4d, 0x3e, 0x11, 0xbc, 0x9a, 0xbb, 0xab, 0x2d, 0x88, 0x60, 0x79, 0x98, - 0xe6, 0xa1, 0xeb, 0xb4, 0x34, 0x09, 0x25, 0x82, 0x21, 0x7d, 0x6f, 0x3c, 0x8c, 0xce, 0x49, 0xae, - 0x88, 0x70, 0x0e, 0xb9, 0x30, 0xc4, 0x5e, 0x2c, 0xa9, 0x3c, 0x0f, 0xdf, 0xf0, 0x19, 0x18, 0xa9, - 0xb6, 0x3b, 0xd4, 0x71, 0x6d, 0x4b, 0xf7, 0x6c, 0x47, 0xbc, 0x86, 0xc7, 0xf0, 0x6b, 0xa6, 0x04, - 0x97, 0x43, 0x82, 0xc9, 0xf4, 0xe4, 0x9a, 0x9f, 0xa9, 0xae, 0x80, 0x71, 0x51, 0xf1, 0x49, 0x6b, - 0x3c, 0x51, 0x39, 0xa7, 0x60, 0xa4, 0x77, 0x5d, 0x1d, 0xdf, 0x57, 0x06, 0xa4, 0x5d, 0x06, 0x90, - 0x49, 0x91, 0x82, 0xbc, 0x00, 0x25, 0xbc, 0x8f, 0x72, 0x31, 0x03, 0xa5, 0x08, 0xfc, 0xd7, 0x42, - 0x88, 0x1c, 0x66, 0x8d, 0xd3, 0x90, 0x3b, 0x30, 0x1e, 0x5e, 0xb6, 0xdf, 0x72, 0xec, 0x6e, 0xc7, - 0xcf, 0x39, 0x83, 0x09, 0xde, 0x1f, 0x04, 0xb8, 0x7a, 0x13, 0x91, 0x12, 0x8b, 0x44, 0x41, 0x32, - 0x0f, 0x67, 0x42, 0x18, 0x13, 0x91, 0x9f, 0xeb, 0x0a, 0xf3, 0x8c, 0x4a, 0xbc, 0x98, 0x38, 0x23, - 0x79, 0x46, 0x63, 0xc5, 0x48, 0x15, 0x06, 0xfc, 0xa8, 0x7f, 0x83, 0xbb, 0x2a, 0xe9, 0x59, 0x11, - 0xf5, 0x6f, 0x40, 0x8e, 0xf7, 0xe7, 0x97, 0x27, 0x73, 0x30, 0xa6, 0xd9, 0x5d, 0x8f, 0xae, 0xda, - 0x62, 0x97, 0x2a, 0xa2, 0x4b, 0x62, 0x9b, 0x1c, 0x86, 0xa9, 0x7b, 0xb6, 0x9f, 0x1f, 0x5f, 0xce, - 0xd3, 0x1e, 0x2d, 0x45, 0x96, 0x60, 0x22, 0xe1, 0x96, 0x20, 0x67, 0xad, 0x97, 0x3e, 0x2f, 0xc9, - 0x2c, 0x59, 0x94, 0xfc, 0x78, 0x0e, 0x4a, 0xab, 0x8e, 0x6e, 0x7a, 0xae, 0x78, 0x9a, 0x79, 0x7e, - 0x6a, 0xd3, 0xd1, 0x3b, 0x4c, 0x3f, 0xa6, 0x30, 0xf0, 0xed, 0x3d, 0xbd, 0xd5, 0xa5, 0xee, 0xf4, - 0x7d, 0xf6, 0x75, 0xff, 0xc3, 0xf6, 0xe4, 0x9b, 0x4d, 0x3c, 0xfc, 0x9c, 0x6a, 0xd8, 0xed, 0xeb, - 0x4d, 0x47, 0x7f, 0x68, 0x7a, 0x68, 0x62, 0xea, 0xad, 0xeb, 0x1e, 0x6d, 0xe1, 0x19, 0xeb, 0x75, - 0xbd, 0x63, 0x5e, 0xc7, 0x00, 0xeb, 0xd7, 0x03, 0x4e, 0xbc, 0x06, 0xa6, 0x02, 0x1e, 0xfe, 0x25, - 0xab, 0x00, 0xc7, 0x91, 0x25, 0x00, 0xf1, 0xa9, 0xe5, 0x4e, 0x47, 0xbc, 0xf3, 0x94, 0x4e, 0x26, - 0x7d, 0x0c, 0x57, 0xec, 0x40, 0x60, 0x7a, 0x47, 0x0a, 0x2a, 0xac, 0x49, 0x1c, 0x98, 0x16, 0xac, - 0x8a, 0x16, 0xf9, 0x62, 0x1a, 0x0d, 0x25, 0xee, 0x37, 0x36, 0x45, 0x48, 0xf1, 0x62, 0x64, 0x0d, - 0xce, 0x08, 0xbe, 0x41, 0x0a, 0x92, 0xb1, 0xe8, 0xac, 0x10, 0x43, 0x73, 0xa5, 0x0d, 0xda, 0x68, - 0x08, 0xb0, 0x5c, 0x47, 0xac, 0x04, 0x99, 0x0e, 0x53, 0x26, 0x2f, 0xe9, 0x6d, 0xea, 0x2a, 0x67, - 0x50, 0x63, 0x2f, 0xef, 0x6c, 0x4f, 0x2a, 0x7e, 0x79, 0x0c, 0x80, 0x29, 0x8b, 0x2e, 0x5a, 0x44, - 0xe6, 0xc1, 0xb5, 0x7e, 0x3c, 0x85, 0x47, 0x5c, 0xe7, 0xa3, 0x45, 0xc8, 0x0c, 0x8c, 0x06, 0xcf, - 0x4c, 0xee, 0xde, 0xad, 0x56, 0xf0, 0x21, 0xa9, 0x88, 0x81, 0x1a, 0x4b, 0x12, 0x22, 0x33, 0x89, - 0x94, 0x91, 0x62, 0x73, 0xf0, 0x97, 0xa5, 0xb1, 0xd8, 0x1c, 0x9d, 0x94, 0xd8, 0x1c, 0x2b, 0xe4, - 0x6d, 0x18, 0x2e, 0xdf, 0xaf, 0x89, 0x98, 0x23, 0xae, 0x72, 0x36, 0xcc, 0x38, 0xa5, 0x6f, 0xba, - 0x75, 0x3f, 0x3e, 0x89, 0xdc, 0x74, 0x99, 0x9e, 0xcc, 0xc2, 0x58, 0xc4, 0x53, 0xcd, 0x55, 0xce, - 0x21, 0x07, 0x6c, 0xb9, 0x8e, 0x98, 0xba, 0x23, 0x50, 0xf2, 0xf0, 0x8a, 0x16, 0x62, 0x5a, 0x53, - 0x31, 0x5d, 0xcc, 0xde, 0xa3, 0x51, 0x0c, 0x6f, 0x82, 0xcf, 0x52, 0x07, 0xb9, 0xd6, 0x18, 0x02, - 0x55, 0x77, 0x38, 0x4e, 0xee, 0xd1, 0x58, 0x31, 0xf2, 0x3e, 0x10, 0xcc, 0xf7, 0x43, 0x0d, 0xff, - 0xe2, 0xb2, 0x5a, 0x71, 0x95, 0x0b, 0x18, 0x00, 0x9c, 0xc4, 0xc3, 0x29, 0x54, 0x2b, 0xd3, 0x57, - 0xc4, 0xf4, 0xf1, 0xb4, 0xce, 0x4b, 0xd5, 0xfd, 0x50, 0x0a, 0x75, 0x33, 0x92, 0x0c, 0x39, 0x85, - 0x2b, 0xd9, 0x84, 0x8b, 0x2b, 0x0e, 0x7d, 0x68, 0xda, 0x5d, 0xd7, 0x5f, 0x3e, 0xfc, 0x79, 0xeb, - 0xe2, 0xae, 0xf3, 0xd6, 0xb3, 0xa2, 0xe2, 0xf3, 0x1d, 0x87, 0x3e, 0xac, 0xfb, 0x61, 0x9f, 0x23, - 0x51, 0x4b, 0xb3, 0xb8, 0x63, 0x4a, 0xe7, 0x0f, 0xba, 0x0e, 0x15, 0x70, 0x93, 0xba, 0x8a, 0x12, - 0x4e, 0xb5, 0x3c, 0x52, 0x8d, 0x19, 0xe0, 0x22, 0x29, 0x9d, 0xa3, 0xc5, 0x88, 0x06, 0xe4, 0xd6, - 0x8c, 0x7f, 0x89, 0x5d, 0x6e, 0xf0, 0xc4, 0xb7, 0xca, 0x13, 0xc8, 0x4c, 0x65, 0x62, 0x69, 0x36, - 0x82, 0x10, 0xf0, 0x75, 0x5d, 0xe0, 0x65, 0xb1, 0x24, 0x4b, 0x93, 0x05, 0x18, 0x5f, 0x71, 0xf0, - 0x48, 0xed, 0x0e, 0xdd, 0x5a, 0xb1, 0x5b, 0x66, 0x63, 0x0b, 0x5f, 0xc7, 0x8a, 0xa9, 0xb2, 0xc3, - 0x71, 0xf5, 0x07, 0x74, 0xab, 0xde, 0x41, 0xac, 0xbc, 0xac, 0xc4, 0x4b, 0xca, 0x21, 0x99, 0x9f, - 0xdc, 0x5b, 0x48, 0x66, 0x0a, 0xe3, 0xe2, 0x0a, 0xfc, 0x91, 0x47, 0x2d, 0xb6, 0xd4, 0xbb, 0xe2, - 0x25, 0xac, 0x12, 0xbb, 0x32, 0x0f, 0xf0, 0x7c, 0xea, 0x10, 0xa3, 0x8c, 0x06, 0x60, 0xb9, 0x61, - 0xf1, 0x22, 0xc9, 0xb8, 0xc5, 0x4f, 0x1d, 0x20, 0x6e, 0xf1, 0xdf, 0x29, 0xc8, 0xf3, 0x2f, 0xb9, - 0x0c, 0x45, 0x29, 0xad, 0x10, 0x06, 0x65, 0xc5, 0x10, 0xec, 0x45, 0x11, 0x6b, 0x7a, 0x48, 0xd8, - 0x2e, 0x41, 0xf4, 0x1d, 0xcc, 0x23, 0x19, 0x06, 0xea, 0xd4, 0x42, 0x02, 0xcc, 0xe1, 0xd7, 0x5d, - 0x6b, 0x99, 0x0d, 0x0c, 0xcc, 0x5f, 0x90, 0xc2, 0x6d, 0x20, 0x94, 0xc7, 0xe5, 0x97, 0x48, 0xc8, - 0x0d, 0x18, 0xf6, 0x8f, 0x72, 0xc3, 0xa0, 0xc4, 0x18, 0xaf, 0x5d, 0xcc, 0xd6, 0x22, 0x1c, 0xbc, - 0x44, 0x44, 0xde, 0x00, 0x08, 0xa7, 0x03, 0x61, 0x69, 0xe1, 0x52, 0x21, 0xcf, 0x1e, 0xf2, 0x52, - 0x11, 0x52, 0xb3, 0x89, 0x53, 0x56, 0x47, 0x3f, 0x6b, 0x29, 0x4e, 0x9c, 0x11, 0x1d, 0x96, 0x15, - 0x24, 0x5a, 0x84, 0x2c, 0xc3, 0x44, 0x42, 0x03, 0x45, 0x08, 0x63, 0xcc, 0x5c, 0x9f, 0xa2, 0xbe, - 0xf2, 0xc2, 0x9c, 0x28, 0x4b, 0x9e, 0x83, 0xc2, 0x5d, 0xad, 0x2a, 0xc2, 0xa8, 0xf2, 0x08, 0xbc, - 0x91, 0x18, 0x4b, 0x0c, 0xab, 0xfe, 0x68, 0x3e, 0xb1, 0x36, 0x31, 0xe9, 0x09, 0x56, 0x52, 0x0f, - 0xa2, 0xf4, 0xfc, 0xfa, 0xb9, 0xf4, 0x24, 0x22, 0x72, 0x15, 0x06, 0x57, 0xd8, 0xcc, 0xd0, 0xb0, - 0x5b, 0xa2, 0x3f, 0x31, 0x20, 0x56, 0x47, 0xc0, 0xb4, 0x00, 0x4b, 0x6e, 0x48, 0xc9, 0x76, 0xa5, - 0xc8, 0xe4, 0x7e, 0xb2, 0xdd, 0x78, 0x88, 0x6e, 0x4c, 0xbb, 0x7b, 0x23, 0x96, 0xbc, 0x4b, 0x94, - 0x49, 0x59, 0x17, 0xc3, 0x64, 0x5d, 0x81, 0x55, 0xda, 0xbf, 0x9b, 0x55, 0xaa, 0xfe, 0xbd, 0x5c, - 0x72, 0x9c, 0x91, 0x9b, 0xc9, 0x20, 0xc1, 0xb8, 0x08, 0x05, 0x40, 0xb9, 0xd6, 0x20, 0x5c, 0x70, - 0x24, 0xdc, 0x6f, 0xfe, 0xc0, 0xe1, 0x7e, 0x0b, 0xfb, 0x0c, 0xf7, 0xab, 0xfe, 0xbf, 0xc5, 0x9e, - 0x2e, 0xdb, 0xc7, 0x12, 0x16, 0xee, 0x75, 0xb6, 0xb3, 0x62, 0xb5, 0x97, 0xdd, 0xc4, 0xfe, 0x80, - 0x7b, 0xa4, 0xd6, 0x75, 0x3e, 0xb4, 0x5c, 0x2d, 0x4a, 0x49, 0xde, 0x81, 0x11, 0xff, 0x03, 0x30, - 0x8c, 0xb4, 0x14, 0xfe, 0x38, 0x58, 0xd5, 0x62, 0x01, 0x97, 0x23, 0x05, 0xc8, 0x2b, 0x30, 0x84, - 0x36, 0x4d, 0x47, 0x6f, 0xf8, 0x31, 0xc6, 0x79, 0x50, 0x72, 0x1f, 0x28, 0x87, 0x3e, 0x0b, 0x28, - 0xc9, 0x17, 0xa0, 0x24, 0x12, 0x6d, 0xf0, 0x3c, 0xf4, 0xd7, 0xf7, 0xe0, 0xe3, 0x3e, 0x25, 0x27, - 0xd9, 0xe0, 0xbb, 0x14, 0x04, 0x44, 0x76, 0x29, 0x3c, 0xbf, 0xc6, 0x2a, 0x9c, 0x5d, 0x71, 0xa8, - 0x81, 0xaf, 0x29, 0x66, 0x1f, 0x75, 0x1c, 0x91, 0x02, 0x85, 0x8f, 0x72, 0x5c, 0xa4, 0x3a, 0x3e, - 0x9a, 0x2d, 0x9f, 0x02, 0x2f, 0x07, 0x3a, 0x4e, 0x29, 0xce, 0x2c, 0x17, 0xde, 0x92, 0x3b, 0x74, - 0x6b, 0xd3, 0x76, 0x0c, 0x9e, 0x25, 0x44, 0xcc, 0xdf, 0x42, 0xd0, 0x0f, 0x04, 0x4a, 0xb6, 0x5c, - 0xa2, 0x85, 0x2e, 0xbd, 0x0e, 0xc3, 0x07, 0x4d, 0x54, 0xf1, 0xab, 0xf9, 0x8c, 0xc7, 0x4f, 0x8f, - 0x6f, 0xae, 0xc0, 0x20, 0x81, 0x75, 0x7f, 0x46, 0x02, 0xeb, 0xef, 0xe6, 0x33, 0x5e, 0x76, 0x3d, - 0xd6, 0x89, 0x66, 0x03, 0x61, 0x44, 0x13, 0xcd, 0x86, 0x39, 0x7e, 0x4d, 0x43, 0x93, 0x89, 0x62, - 0x29, 0xa9, 0x4b, 0xbb, 0xa6, 0xa4, 0xfe, 0xc5, 0x42, 0xaf, 0x97, 0x6f, 0xa7, 0xb2, 0xdf, 0x8f, - 0xec, 0x6f, 0xc0, 0x70, 0x20, 0xd9, 0x6a, 0x05, 0x8d, 0x9e, 0xd1, 0x20, 0x2d, 0x0e, 0x07, 0x63, - 0x19, 0x89, 0x88, 0x5c, 0xe3, 0x6d, 0xad, 0x99, 0x1f, 0xf0, 0x04, 0x0d, 0xa3, 0x22, 0xf4, 0xbe, - 0xee, 0xe9, 0x75, 0xd7, 0xfc, 0x80, 0x6a, 0x01, 0x5a, 0xfd, 0xcf, 0xf3, 0xa9, 0xcf, 0x07, 0x4f, - 0xfb, 0x68, 0x1f, 0x7d, 0x94, 0x22, 0x44, 0xfe, 0xf0, 0xf1, 0x54, 0x88, 0xfb, 0x10, 0xe2, 0x1f, - 0xe7, 0x53, 0x9f, 0x89, 0x9e, 0x0a, 0x71, 0x3f, 0xb3, 0xc5, 0x0b, 0x30, 0xa4, 0xd9, 0x9b, 0xee, - 0x0c, 0x6e, 0x6c, 0xf8, 0x5c, 0x81, 0x13, 0xb5, 0x63, 0x6f, 0xba, 0x75, 0xdc, 0xb2, 0x68, 0x21, - 0x81, 0xfa, 0xbd, 0x7c, 0x8f, 0x87, 0xb4, 0xa7, 0x82, 0xff, 0x30, 0x97, 0xc8, 0xdf, 0xc8, 0x47, - 0x1e, 0xea, 0x3e, 0xbe, 0xc2, 0xbe, 0x0e, 0x50, 0x6b, 0x6c, 0xd0, 0xb6, 0x2e, 0x25, 0xb9, 0xc2, - 0x73, 0x07, 0x17, 0xa1, 0x22, 0x39, 0x72, 0x48, 0xa2, 0x7e, 0x33, 0x1f, 0x7b, 0xa9, 0x7c, 0x2a, - 0xbb, 0x3d, 0xcb, 0x2e, 0xd0, 0x3a, 0xf1, 0xf8, 0xfa, 0x54, 0x72, 0x7b, 0x95, 0xdc, 0x4f, 0xe4, - 0x63, 0xef, 0xd4, 0x1f, 0x5b, 0xd9, 0xb1, 0x01, 0x98, 0x7c, 0x3f, 0xff, 0xd8, 0x6a, 0xd2, 0x0b, - 0x30, 0x24, 0xe4, 0x10, 0x2c, 0x15, 0x7c, 0xde, 0xe7, 0x40, 0x3c, 0x65, 0x0d, 0x08, 0xd4, 0x3f, - 0x95, 0x87, 0x68, 0xfc, 0x80, 0xc7, 0x54, 0x87, 0x7e, 0x23, 0x1f, 0x8d, 0x9c, 0xf0, 0xf8, 0xea, - 0xcf, 0x14, 0x40, 0xad, 0xbb, 0xd6, 0x10, 0x81, 0x77, 0xfb, 0xa5, 0x63, 0xfa, 0x00, 0xaa, 0x49, - 0x14, 0xea, 0xff, 0x97, 0x4f, 0x0d, 0xe7, 0xf0, 0xf8, 0x0a, 0xf0, 0x65, 0x3c, 0x15, 0x6f, 0x58, - 0xe1, 0x44, 0x8e, 0x87, 0x90, 0x6c, 0xfc, 0x25, 0x32, 0x23, 0xfa, 0x84, 0xe4, 0xd3, 0x29, 0xe6, - 0x1a, 0xe6, 0x6d, 0x08, 0xcd, 0x35, 0xf9, 0x1a, 0x42, 0x32, 0xdc, 0xfe, 0x61, 0x7e, 0xb7, 0xe8, - 0x17, 0x8f, 0xf3, 0xaa, 0x3a, 0xb0, 0xa2, 0x6f, 0x61, 0x94, 0x46, 0xd6, 0x13, 0x23, 0x3c, 0x6f, - 0x5f, 0x87, 0x83, 0xe4, 0xbb, 0x37, 0x41, 0xa5, 0xfe, 0xf3, 0xfe, 0xf4, 0xd0, 0x0b, 0x8f, 0xaf, - 0x08, 0x2f, 0x43, 0x71, 0x45, 0xf7, 0x36, 0x84, 0x26, 0xe3, 0x95, 0x5e, 0x47, 0xf7, 0x36, 0x34, - 0x84, 0x92, 0x6b, 0x30, 0xa8, 0xe9, 0x9b, 0xfc, 0xcc, 0xb3, 0x14, 0xe6, 0x54, 0x74, 0xf4, 0xcd, - 0x3a, 0x3f, 0xf7, 0x0c, 0xd0, 0x44, 0x0d, 0x72, 0x7a, 0xf2, 0x93, 0x6f, 0x4c, 0x28, 0xc7, 0x73, - 0x7a, 0x06, 0x99, 0x3c, 0x2f, 0x43, 0x71, 0xda, 0x36, 0xb6, 0xf0, 0xfa, 0x6a, 0x84, 0x57, 0xb6, - 0x66, 0x1b, 0x5b, 0x1a, 0x42, 0xc9, 0x4f, 0xe6, 0x60, 0x60, 0x9e, 0xea, 0x06, 0x1b, 0x21, 0x43, - 0xbd, 0xbc, 0x4e, 0x3e, 0x77, 0x34, 0x5e, 0x27, 0x13, 0x1b, 0xbc, 0x32, 0x59, 0x51, 0x44, 0xfd, - 0xe4, 0x16, 0x0c, 0xce, 0xe8, 0x1e, 0x6d, 0xda, 0xce, 0x16, 0xfa, 0xd1, 0x8c, 0x85, 0xee, 0xfb, - 0x11, 0xfd, 0xf1, 0x89, 0xf8, 0xcd, 0x58, 0x43, 0xfc, 0xd2, 0x82, 0xc2, 0x4c, 0x2c, 0xab, 0xba, - 0xd3, 0xa4, 0x9e, 0xc8, 0x5f, 0x8d, 0x62, 0xf1, 0x10, 0xa2, 0x09, 0x4c, 0x78, 0xac, 0x3c, 0x92, - 0x7e, 0xac, 0x8c, 0xd6, 0x23, 0xfa, 0xda, 0x61, 0x26, 0xcd, 0x51, 0x5c, 0xf4, 0xb9, 0xf5, 0x88, - 0x50, 0x4c, 0xa4, 0xa9, 0x49, 0x24, 0xea, 0x77, 0xfa, 0x21, 0xf5, 0xa1, 0xf6, 0xa9, 0x92, 0x9f, - 0x2a, 0x79, 0xa8, 0xe4, 0x95, 0x84, 0x92, 0x5f, 0x4a, 0x3e, 0xfd, 0xff, 0x88, 0x6a, 0xf8, 0xcf, - 0x15, 0x13, 0x81, 0x43, 0x1e, 0xef, 0xdd, 0x65, 0x28, 0xbd, 0xfe, 0x5d, 0xa5, 0x17, 0x0c, 0x88, - 0xd2, 0xae, 0x03, 0x62, 0x60, 0xaf, 0x03, 0x62, 0x30, 0x73, 0x40, 0x84, 0x0a, 0x32, 0x94, 0xa9, - 0x20, 0x55, 0x31, 0x68, 0xa0, 0x77, 0xfe, 0x92, 0xcb, 0x3b, 0xdb, 0x93, 0x63, 0x6c, 0x34, 0xa5, - 0x26, 0x2e, 0x41, 0x16, 0xea, 0xef, 0x15, 0x7b, 0x44, 0xfb, 0x39, 0x16, 0x1d, 0x79, 0x19, 0x0a, - 0xe5, 0x4e, 0x47, 0xe8, 0xc7, 0x59, 0x29, 0xd0, 0x50, 0x46, 0x29, 0x46, 0x4d, 0xde, 0x80, 0x42, - 0xf9, 0x7e, 0x2d, 0x9e, 0xb3, 0xa4, 0x7c, 0xbf, 0x26, 0xbe, 0x24, 0xb3, 0xec, 0xfd, 0x1a, 0x79, - 0x2b, 0x0c, 0x1e, 0xba, 0xd1, 0xb5, 0x1e, 0x88, 0x8d, 0xa2, 0x70, 0xb7, 0xf5, 0xdd, 0x71, 0x1a, - 0x0c, 0xc5, 0xb6, 0x8b, 0x31, 0xda, 0x98, 0x36, 0x95, 0xf6, 0xae, 0x4d, 0x03, 0xbb, 0x6a, 0xd3, - 0xe0, 0x5e, 0xb5, 0x69, 0x68, 0x0f, 0xda, 0x04, 0xbb, 0x6a, 0xd3, 0xf0, 0xe1, 0xb5, 0xa9, 0x03, - 0x97, 0x92, 0x11, 0xda, 0x02, 0x8d, 0xd0, 0x80, 0x24, 0xb1, 0xc2, 0xb1, 0x04, 0xaf, 0xfe, 0xbb, - 0x1c, 0x5b, 0xdf, 0x44, 0x74, 0xdd, 0x65, 0x78, 0xd9, 0x3f, 0x2d, 0x59, 0x5a, 0xfd, 0xd5, 0x7c, - 0x76, 0x60, 0xb9, 0x93, 0x39, 0xc5, 0xfd, 0x50, 0xaa, 0x94, 0x8a, 0xd1, 0x87, 0xfe, 0xd9, 0x52, - 0x8e, 0xb1, 0x4d, 0x93, 0xd9, 0x37, 0xf2, 0x59, 0xd1, 0xee, 0x0e, 0x25, 0xb1, 0x8f, 0x27, 0x3d, - 0xda, 0xd0, 0x4f, 0xdf, 0x8d, 0xba, 0xb2, 0xcd, 0xc1, 0x88, 0x2c, 0x44, 0x21, 0xa5, 0xbd, 0x08, - 0x38, 0x52, 0x8e, 0xbc, 0x15, 0xa4, 0x96, 0x91, 0xfc, 0x63, 0xd0, 0x5d, 0xcd, 0x1f, 0xb3, 0x31, - 0xf7, 0x18, 0x99, 0x9c, 0xbc, 0x00, 0xa5, 0x39, 0x8c, 0xd5, 0x2e, 0x0f, 0x76, 0x1e, 0xbd, 0x5d, - 0xf6, 0x5a, 0xe1, 0x34, 0xea, 0xdf, 0xcb, 0xc1, 0xd9, 0x3b, 0xdd, 0x35, 0x2a, 0xbc, 0xe5, 0x82, - 0x36, 0xbc, 0x0f, 0xc0, 0xc0, 0xc2, 0x61, 0x26, 0x87, 0x0e, 0x33, 0x9f, 0x94, 0xa3, 0xe2, 0xc5, - 0x0a, 0x4c, 0x85, 0xd4, 0xdc, 0x59, 0xe6, 0x29, 0xdf, 0x71, 0xf4, 0x41, 0x77, 0x8d, 0xd6, 0x13, - 0x5e, 0x33, 0x12, 0xf7, 0x4b, 0x6f, 0x73, 0x97, 0xfc, 0x83, 0x3a, 0xa8, 0xfc, 0x4a, 0x3e, 0x33, - 0x10, 0xe1, 0x89, 0xcd, 0x98, 0xf9, 0x03, 0xa9, 0xbd, 0x12, 0xcf, 0x9c, 0x99, 0x42, 0x12, 0xe3, - 0x98, 0xc6, 0x25, 0x5d, 0x60, 0x27, 0x3c, 0x8f, 0xeb, 0x87, 0x2a, 0xb0, 0x3f, 0xcc, 0x65, 0x06, - 0x8c, 0x3c, 0xa9, 0x02, 0x53, 0xff, 0xd7, 0x82, 0x1f, 0xa7, 0xf2, 0x50, 0x9f, 0xf0, 0x02, 0x0c, - 0x89, 0xe7, 0xfa, 0x51, 0x67, 0x5f, 0x71, 0x6c, 0x88, 0xc7, 0xd0, 0x01, 0x01, 0x33, 0x29, 0x24, - 0x4f, 0x64, 0xc9, 0xd9, 0x57, 0xf2, 0x42, 0xd6, 0x24, 0x12, 0x66, 0x34, 0xcc, 0x3e, 0x32, 0x3d, - 0xb4, 0x40, 0x58, 0x5f, 0x16, 0xb8, 0xd1, 0x40, 0x1f, 0x99, 0x1e, 0xb7, 0x3f, 0x02, 0x34, 0x33, - 0x08, 0x6a, 0x61, 0x96, 0x7a, 0x61, 0x10, 0xb8, 0x22, 0x59, 0xbf, 0x78, 0xa2, 0xf6, 0x02, 0x0c, - 0x09, 0x0f, 0x5a, 0xe1, 0xd2, 0x22, 0x5a, 0x2b, 0x7c, 0x6e, 0xb1, 0xb5, 0x01, 0x01, 0xe3, 0xa8, - 0xd1, 0x66, 0xe8, 0xc4, 0x87, 0x1c, 0x1d, 0x84, 0x68, 0x02, 0x43, 0x6e, 0xc0, 0x58, 0xcd, 0xd3, - 0x2d, 0x43, 0x77, 0x8c, 0xe5, 0xae, 0xd7, 0xe9, 0x7a, 0xb2, 0x01, 0xec, 0x7a, 0x86, 0xdd, 0xf5, - 0xb4, 0x18, 0x05, 0xf9, 0x14, 0x8c, 0xfa, 0x90, 0x59, 0xc7, 0xb1, 0x1d, 0xd9, 0xca, 0x71, 0x3d, - 0x83, 0x3a, 0x8e, 0x16, 0x25, 0x20, 0x9f, 0x86, 0xd1, 0xaa, 0xf5, 0xd0, 0x6e, 0xf0, 0x27, 0xeb, - 0xda, 0x82, 0xb0, 0x79, 0xf0, 0xd9, 0x97, 0x19, 0x20, 0xea, 0x5d, 0xa7, 0xa5, 0x45, 0x09, 0xd5, - 0x9d, 0x7c, 0x32, 0x9c, 0xe7, 0xe3, 0xbb, 0x41, 0xba, 0x16, 0x75, 0xdc, 0x43, 0x6f, 0x55, 0x34, - 0x3e, 0x65, 0xbf, 0x61, 0x6e, 0x83, 0xde, 0x80, 0xc1, 0x3b, 0x74, 0x8b, 0xfb, 0x98, 0x96, 0x42, - 0xb7, 0xe4, 0x07, 0x02, 0x26, 0x9f, 0xee, 0xfa, 0x74, 0xea, 0xb7, 0xf2, 0xc9, 0x40, 0xa5, 0x8f, - 0xaf, 0xb0, 0x3f, 0x05, 0x03, 0x28, 0xca, 0xaa, 0x7f, 0xbd, 0x80, 0x02, 0x44, 0x71, 0x47, 0xbd, - 0x9d, 0x7d, 0x32, 0xf5, 0x17, 0x4a, 0xf1, 0xe8, 0xb5, 0x8f, 0xaf, 0xf4, 0xde, 0x84, 0xe1, 0x19, - 0xdb, 0x72, 0x4d, 0xd7, 0xa3, 0x56, 0xc3, 0x57, 0xd8, 0x27, 0x98, 0x41, 0xd5, 0x08, 0xc1, 0xb2, - 0x0d, 0x28, 0x51, 0x1f, 0x44, 0x79, 0xc9, 0xab, 0x30, 0x84, 0x22, 0x47, 0x9b, 0x93, 0x4f, 0x78, - 0x78, 0x33, 0xb1, 0xc6, 0x80, 0x71, 0x8b, 0x33, 0x24, 0x25, 0x77, 0x61, 0x70, 0x66, 0xc3, 0x6c, - 0x19, 0x0e, 0xb5, 0xd0, 0x37, 0x59, 0x0a, 0x12, 0x12, 0xed, 0xcb, 0x29, 0xfc, 0x17, 0x69, 0x79, - 0x73, 0x1a, 0xa2, 0x58, 0xe4, 0xc5, 0x97, 0x80, 0x5d, 0xfa, 0xd9, 0x3c, 0x40, 0x58, 0x80, 0x3c, - 0x03, 0xf9, 0x20, 0x01, 0x34, 0xba, 0xc4, 0x44, 0x34, 0x28, 0x8f, 0x4b, 0x85, 0x18, 0xdb, 0xf9, - 0x5d, 0xc7, 0xf6, 0x5d, 0x28, 0xf1, 0xd3, 0x35, 0xf4, 0x5a, 0x97, 0x02, 0x6a, 0x66, 0x36, 0x78, - 0x0a, 0xe9, 0xb9, 0x2d, 0x8d, 0x96, 0x67, 0xc4, 0x03, 0x9c, 0x33, 0xbb, 0xd4, 0x80, 0x7e, 0xfc, - 0x8b, 0x5c, 0x81, 0xe2, 0xaa, 0x9f, 0x3c, 0x76, 0x94, 0xcf, 0xd2, 0x31, 0xf9, 0x21, 0x9e, 0x75, - 0xd3, 0x8c, 0x6d, 0x79, 0xac, 0x6a, 0x6c, 0xf5, 0x88, 0x90, 0x8b, 0x80, 0x45, 0xe4, 0x22, 0x60, - 0xea, 0x7f, 0x9d, 0x4f, 0x89, 0xab, 0xfc, 0xf8, 0x0e, 0x93, 0xd7, 0x01, 0xf0, 0xf9, 0x38, 0x93, - 0xa7, 0xff, 0x1c, 0x04, 0x47, 0x09, 0x32, 0x42, 0xb5, 0x8d, 0x6c, 0x3b, 0x42, 0x62, 0xf5, 0x1f, - 0xe4, 0x12, 0xc1, 0x78, 0x0f, 0x25, 0x47, 0xd9, 0x2a, 0xcb, 0x1f, 0xd0, 0x8c, 0xf5, 0xfb, 0xa2, - 0xb0, 0xbf, 0xbe, 0x88, 0x7e, 0xcb, 0x11, 0x58, 0xa6, 0xc7, 0xf9, 0x2d, 0xdf, 0xc9, 0xa7, 0x85, - 0x26, 0x3e, 0x99, 0x2a, 0x7e, 0x33, 0x30, 0x4a, 0x8b, 0xb1, 0x60, 0xf0, 0x08, 0x8d, 0x27, 0xb8, - 0x16, 0x66, 0xea, 0x17, 0xe1, 0x4c, 0x2c, 0x60, 0xaf, 0xc8, 0x35, 0x7c, 0xa5, 0x77, 0xe4, 0xdf, - 0xec, 0xc0, 0x03, 0x11, 0x32, 0xf5, 0xff, 0xcf, 0xf5, 0x0e, 0xd7, 0x7c, 0xec, 0xaa, 0x93, 0x22, - 0x80, 0xc2, 0x9f, 0x8c, 0x00, 0x8e, 0x60, 0x1b, 0x7c, 0xb2, 0x05, 0xf0, 0x11, 0x99, 0x3c, 0x3e, - 0x6c, 0x01, 0xfc, 0x42, 0x6e, 0xd7, 0x68, 0xdb, 0xc7, 0x2d, 0x03, 0xf5, 0x7f, 0xca, 0xa5, 0x46, - 0xc5, 0x3e, 0x54, 0xbb, 0xde, 0x82, 0x12, 0x77, 0xe1, 0x11, 0xad, 0x92, 0xf2, 0x88, 0x31, 0x68, - 0x56, 0xe6, 0x7d, 0x8e, 0x25, 0x0b, 0x30, 0xc0, 0xdb, 0x60, 0x88, 0xde, 0xf8, 0x58, 0x8f, 0xd0, - 0xdc, 0x46, 0xd6, 0xe4, 0x28, 0xd0, 0xea, 0xdf, 0xcf, 0x25, 0x82, 0x74, 0x1f, 0xe3, 0xb7, 0x85, - 0x53, 0x75, 0x61, 0xef, 0x53, 0xb5, 0xfa, 0xcf, 0xf2, 0xe9, 0x31, 0xc2, 0x8f, 0xf1, 0x43, 0x8e, - 0xe2, 0x38, 0xed, 0x60, 0xeb, 0xd6, 0x2a, 0x8c, 0x45, 0x65, 0x21, 0x96, 0xad, 0xa7, 0xd3, 0x23, - 0xa5, 0x67, 0xb4, 0x22, 0xc6, 0x43, 0xfd, 0x76, 0x2e, 0x19, 0xde, 0xfc, 0xd8, 0xe7, 0xa7, 0x83, - 0x69, 0x4b, 0xf4, 0x53, 0x3e, 0x22, 0x6b, 0xcd, 0x51, 0x7c, 0xca, 0x47, 0x64, 0xd5, 0x38, 0xd8, - 0xa7, 0xfc, 0x52, 0x3e, 0x2b, 0x3a, 0xfc, 0xb1, 0x7f, 0xd0, 0xe7, 0x65, 0x21, 0xf3, 0x96, 0x89, - 0x4f, 0x7b, 0x26, 0x2b, 0x1c, 0x7b, 0x06, 0xcf, 0x04, 0x9f, 0x83, 0x8d, 0xf1, 0x54, 0x61, 0x7d, - 0x44, 0x14, 0xf9, 0x64, 0x08, 0xeb, 0x23, 0x32, 0x54, 0x3e, 0x7a, 0xc2, 0xfa, 0xad, 0xfc, 0x5e, - 0x53, 0x12, 0x9c, 0x0a, 0x2f, 0x21, 0xbc, 0xaf, 0xe6, 0x93, 0xa9, 0x32, 0x8e, 0x5d, 0x4c, 0x73, - 0x50, 0x12, 0x49, 0x3b, 0x32, 0x85, 0xc3, 0xf1, 0x59, 0x16, 0x8d, 0xf8, 0x8e, 0x9b, 0x20, 0x2e, - 0x72, 0xf6, 0x26, 0x12, 0x4e, 0xab, 0x7e, 0x2f, 0x17, 0xcb, 0x2b, 0x71, 0x2c, 0x47, 0x08, 0x07, - 0x5a, 0x92, 0xc8, 0xdb, 0xfe, 0x61, 0x66, 0x31, 0x16, 0xd7, 0x3b, 0xf8, 0x9e, 0x0a, 0xf5, 0x74, - 0xb3, 0x15, 0x2f, 0x2f, 0xe2, 0x0f, 0x7c, 0x2b, 0x0f, 0x13, 0x09, 0x52, 0x72, 0x25, 0x12, 0xb6, - 0x07, 0x8f, 0x25, 0x63, 0x8e, 0xea, 0x3c, 0x80, 0xcf, 0x3e, 0x4e, 0x52, 0xaf, 0x40, 0xb1, 0xa2, - 0x6f, 0xf1, 0x6f, 0xeb, 0xe7, 0x2c, 0x0d, 0x7d, 0x4b, 0x3e, 0x71, 0x43, 0x3c, 0x59, 0x83, 0xf3, - 0xfc, 0x3e, 0xc4, 0xb4, 0xad, 0x55, 0xb3, 0x4d, 0xab, 0xd6, 0xa2, 0xd9, 0x6a, 0x99, 0xae, 0xb8, - 0xd4, 0x7b, 0x61, 0x67, 0x7b, 0xf2, 0xaa, 0x67, 0x7b, 0x7a, 0xab, 0x4e, 0x7d, 0xb2, 0xba, 0x67, - 0xb6, 0x69, 0xdd, 0xb4, 0xea, 0x6d, 0xa4, 0x94, 0x58, 0xa6, 0xb3, 0x22, 0x55, 0x1e, 0xc2, 0xbd, - 0xd6, 0xd0, 0x2d, 0x8b, 0x1a, 0x55, 0x6b, 0x7a, 0xcb, 0xa3, 0xfc, 0x32, 0xb0, 0xc0, 0x8f, 0x04, - 0xf9, 0x3b, 0x74, 0x8e, 0x66, 0x8c, 0xd7, 0x18, 0x81, 0x96, 0x52, 0x48, 0xfd, 0xed, 0x62, 0x4a, - 0x4a, 0x91, 0x13, 0xa4, 0x3e, 0x7e, 0x4f, 0x17, 0x77, 0xe9, 0xe9, 0xeb, 0x30, 0x20, 0x62, 0xe4, - 0x8a, 0x0b, 0x06, 0x74, 0x9c, 0x7f, 0xc8, 0x41, 0xf2, 0x0d, 0x8d, 0xa0, 0x22, 0x2d, 0xb8, 0xb4, - 0xca, 0xba, 0x29, 0xbd, 0x33, 0x4b, 0x07, 0xe8, 0xcc, 0x1e, 0xfc, 0xc8, 0x7b, 0x70, 0x11, 0xb1, - 0x29, 0xdd, 0x3a, 0x80, 0x55, 0x61, 0x3c, 0x2c, 0x5e, 0x55, 0x7a, 0xe7, 0x66, 0x95, 0x27, 0x9f, - 0x87, 0x91, 0x60, 0x80, 0x98, 0xd4, 0x15, 0x37, 0x17, 0x3d, 0xc6, 0x19, 0x0f, 0x36, 0xc7, 0xc0, - 0xe8, 0xae, 0x16, 0x0d, 0x58, 0x16, 0xe1, 0xa5, 0xfe, 0x8f, 0xb9, 0x5e, 0xa9, 0x4d, 0x8e, 0x7d, - 0x56, 0x7e, 0x1b, 0x06, 0x0c, 0xfe, 0x51, 0x42, 0xa7, 0x7a, 0x27, 0x3f, 0xe1, 0xa4, 0x9a, 0x5f, - 0x46, 0xfd, 0xa7, 0xb9, 0x9e, 0x19, 0x55, 0x4e, 0xfa, 0xe7, 0x7d, 0xb5, 0x90, 0xf1, 0x79, 0x62, - 0x12, 0xbd, 0x06, 0xe3, 0x66, 0x18, 0xf2, 0xbd, 0x1e, 0x86, 0xba, 0xd2, 0xce, 0x48, 0x70, 0x1c, - 0x5d, 0x37, 0x21, 0x70, 0xd8, 0x72, 0x7c, 0x6f, 0x34, 0xb7, 0xde, 0x75, 0x4c, 0x3e, 0x2e, 0xb5, - 0x73, 0x6e, 0xcc, 0x55, 0xcd, 0xbd, 0xeb, 0x98, 0xac, 0x02, 0xdd, 0xdb, 0xa0, 0x96, 0x5e, 0xdf, - 0xb4, 0x9d, 0x07, 0x18, 0xd1, 0x94, 0x0f, 0x4e, 0xed, 0x0c, 0x87, 0xdf, 0xf7, 0xc1, 0xe4, 0x39, - 0x18, 0x6d, 0xb6, 0xba, 0x34, 0x88, 0x21, 0xc9, 0xef, 0xfa, 0xb4, 0x11, 0x06, 0x0c, 0x6e, 0x48, - 0x9e, 0x02, 0x40, 0x22, 0x0f, 0xf3, 0xdd, 0xe0, 0xc5, 0x9e, 0x36, 0xc4, 0x20, 0xab, 0xa2, 0xbb, - 0x2e, 0x71, 0xad, 0xe6, 0x42, 0xaa, 0xb7, 0x6c, 0xab, 0x59, 0xf7, 0xa8, 0xd3, 0xc6, 0x86, 0xa2, - 0x33, 0x83, 0x76, 0x01, 0x29, 0xf0, 0xea, 0xc4, 0x5d, 0xb0, 0xad, 0xe6, 0x2a, 0x75, 0xda, 0xac, - 0xa9, 0x2f, 0x00, 0x11, 0x4d, 0x75, 0xf0, 0xd0, 0x83, 0x7f, 0x1c, 0x7a, 0x33, 0x68, 0xe2, 0x23, - 0xf8, 0x69, 0x08, 0x7e, 0xd8, 0x24, 0x0c, 0xf3, 0x40, 0x7a, 0x5c, 0x68, 0xe8, 0xc2, 0xa0, 0x01, - 0x07, 0xa1, 0xbc, 0x2e, 0x80, 0xf0, 0xae, 0xe0, 0x1e, 0xe4, 0x9a, 0xf8, 0xa5, 0x7e, 0xb9, 0x90, - 0x96, 0x04, 0xe6, 0x50, 0x8a, 0x16, 0x4e, 0xab, 0xf9, 0x7d, 0x4d, 0xab, 0x67, 0xac, 0x6e, 0xbb, - 0xae, 0x77, 0x3a, 0xf5, 0x75, 0xb3, 0x85, 0x4f, 0xb8, 0x70, 0xe1, 0xd3, 0x46, 0xad, 0x6e, 0xbb, - 0xdc, 0xe9, 0xcc, 0x71, 0x20, 0x79, 0x1e, 0x26, 0x18, 0x1d, 0x76, 0x52, 0x40, 0x59, 0x44, 0x4a, - 0xc6, 0x00, 0x23, 0xd1, 0xfa, 0xb4, 0x4f, 0xc0, 0xa0, 0xe0, 0xc9, 0xd7, 0xaa, 0x7e, 0x6d, 0x80, - 0x33, 0x73, 0x59, 0xcf, 0x05, 0x6c, 0xf8, 0xe4, 0xda, 0xaf, 0x0d, 0xf9, 0xe5, 0x31, 0xde, 0xb2, - 0xd5, 0x6d, 0xf3, 0xe8, 0x5b, 0x03, 0x88, 0x0c, 0x7e, 0x93, 0x2b, 0x30, 0xc6, 0xb8, 0x04, 0x02, - 0xe3, 0x21, 0x6a, 0xfb, 0xb5, 0x18, 0x94, 0xdc, 0x80, 0x73, 0x11, 0x08, 0xb7, 0x41, 0xf9, 0x93, - 0x84, 0x7e, 0x2d, 0x15, 0xa7, 0x7e, 0xb3, 0x10, 0x4d, 0x4d, 0x73, 0x0c, 0x1d, 0x71, 0x11, 0x06, - 0x6c, 0xa7, 0x59, 0xef, 0x3a, 0x2d, 0x31, 0xf6, 0x4a, 0xb6, 0xd3, 0xbc, 0xeb, 0xb4, 0xc8, 0x79, - 0x28, 0xb1, 0xde, 0x31, 0x0d, 0x31, 0xc4, 0xfa, 0xf5, 0x4e, 0xa7, 0x6a, 0x90, 0x32, 0xef, 0x10, - 0x0c, 0x6f, 0x5a, 0x6f, 0xe0, 0xd6, 0x9e, 0x3b, 0x25, 0xf4, 0xf3, 0x15, 0x2f, 0x81, 0xc4, 0x7e, - 0xc2, 0xa0, 0xa7, 0xfc, 0x20, 0x20, 0xc6, 0xc2, 0xc0, 0x6d, 0x89, 0xc1, 0xfb, 0x24, 0xce, 0x42, - 0x20, 0x43, 0x16, 0x7c, 0x13, 0x63, 0x90, 0x0a, 0x90, 0x90, 0xaa, 0x6d, 0x1b, 0xe6, 0xba, 0x49, - 0xf9, 0x0b, 0x92, 0x7e, 0x7e, 0xf1, 0x9b, 0xc4, 0x6a, 0xe3, 0x3e, 0x93, 0x45, 0x01, 0x21, 0x6f, - 0x72, 0x25, 0xe4, 0x74, 0xb8, 0xf6, 0xf1, 0xbe, 0xe5, 0x76, 0x5a, 0x0c, 0x85, 0x9a, 0x89, 0xe5, - 0x71, 0x21, 0x54, 0xff, 0x5a, 0x31, 0x99, 0x9f, 0xe8, 0x58, 0xec, 0x9a, 0x79, 0x00, 0x91, 0x7e, - 0x2c, 0xbc, 0x5c, 0x0b, 0xbc, 0xdb, 0x43, 0x4c, 0x06, 0x0f, 0xa9, 0x2c, 0xb9, 0x06, 0x83, 0xfc, - 0x8b, 0xaa, 0x15, 0x61, 0xef, 0xa0, 0x8b, 0x98, 0xdb, 0x31, 0xd7, 0xd7, 0xd1, 0x9f, 0x2c, 0x40, - 0x93, 0x2b, 0x30, 0x50, 0x59, 0xaa, 0xd5, 0xca, 0x4b, 0xfe, 0x4d, 0x31, 0xbe, 0x65, 0x31, 0x2c, - 0xb7, 0xee, 0xea, 0x96, 0xab, 0xf9, 0x48, 0xf2, 0x1c, 0x94, 0xaa, 0x2b, 0x48, 0xc6, 0x5f, 0x68, - 0x0e, 0xef, 0x6c, 0x4f, 0x0e, 0x98, 0x1d, 0x4e, 0x25, 0x50, 0x58, 0xef, 0xbd, 0x6a, 0x45, 0x72, - 0x97, 0xe0, 0xf5, 0x3e, 0x34, 0x0d, 0xbc, 0x76, 0xd6, 0x02, 0x34, 0x79, 0x05, 0x46, 0x6a, 0xd4, - 0x31, 0xf5, 0xd6, 0x52, 0x17, 0xb7, 0x8a, 0x52, 0xd8, 0x46, 0x17, 0xe1, 0x75, 0x0b, 0x11, 0x5a, - 0x84, 0x8c, 0x5c, 0x86, 0xe2, 0xbc, 0x69, 0xf9, 0xcf, 0x25, 0xd0, 0x9f, 0x7e, 0xc3, 0xb4, 0x3c, - 0x0d, 0xa1, 0xe4, 0x39, 0x28, 0xdc, 0x5e, 0xad, 0x0a, 0x4f, 0x30, 0xe4, 0xf5, 0xbe, 0x17, 0x09, - 0x01, 0x79, 0x7b, 0xb5, 0x4a, 0x5e, 0x81, 0x21, 0xb6, 0x88, 0x51, 0xab, 0x41, 0x5d, 0x65, 0x18, - 0x3f, 0x86, 0x87, 0x2c, 0xf4, 0x81, 0xb2, 0x4f, 0x47, 0x40, 0xa9, 0xfe, 0x9f, 0xf9, 0xf4, 0x04, - 0x52, 0xc7, 0x30, 0xd4, 0x0f, 0x78, 0x8b, 0x1c, 0x53, 0xb0, 0xe2, 0x21, 0x14, 0x6c, 0x1d, 0xce, - 0x94, 0x8d, 0xb6, 0x69, 0x95, 0xf1, 0xa7, 0xbb, 0x38, 0x57, 0xc6, 0xa9, 0x43, 0x7a, 0x0a, 0x18, - 0x43, 0x8b, 0xef, 0xe1, 0xc1, 0x85, 0x19, 0xaa, 0xae, 0x73, 0x5c, 0xbd, 0xbd, 0xae, 0xd7, 0x1b, - 0x3c, 0xf7, 0x92, 0x16, 0x67, 0xaa, 0xfe, 0x4c, 0x7e, 0x97, 0x9c, 0x57, 0x8f, 0xa3, 0xf4, 0xd5, - 0xaf, 0xe5, 0x7b, 0xa7, 0x1d, 0x7b, 0x2c, 0x85, 0xf2, 0xc7, 0xf9, 0x94, 0x24, 0x60, 0x87, 0x92, - 0xc4, 0x35, 0x18, 0xe4, 0x6c, 0x02, 0x37, 0x5e, 0x9c, 0xcd, 0xb8, 0xb2, 0xe2, 0x2c, 0xea, 0xa3, - 0xc9, 0x12, 0x9c, 0x2b, 0xaf, 0xaf, 0xd3, 0x86, 0x17, 0x86, 0x99, 0x5e, 0x0a, 0x03, 0xbe, 0xf2, - 0xb0, 0xba, 0x02, 0x1f, 0x86, 0xa9, 0xc6, 0xc0, 0x26, 0xa9, 0xe5, 0xc8, 0x2a, 0x5c, 0x88, 0xc3, - 0x6b, 0x7c, 0x0b, 0x50, 0x94, 0x22, 0xed, 0x26, 0x38, 0xf2, 0xff, 0xb4, 0x8c, 0xb2, 0x69, 0xad, - 0xc4, 0xa9, 0xba, 0xbf, 0x57, 0x2b, 0x71, 0xde, 0x4e, 0x2d, 0xa7, 0x7e, 0xab, 0x20, 0xe7, 0x4a, - 0x7b, 0x7c, 0x1d, 0xae, 0x6e, 0x46, 0xdc, 0xac, 0xf7, 0x3a, 0x64, 0x5e, 0x11, 0xd1, 0x4a, 0x8c, - 0xae, 0xe3, 0x7b, 0x24, 0x06, 0xd1, 0x12, 0x10, 0x28, 0xaf, 0x43, 0x01, 0x25, 0xa9, 0x42, 0xb1, - 0xec, 0x34, 0xb9, 0x79, 0xbb, 0xdb, 0x03, 0x2e, 0xdd, 0x69, 0xba, 0xe9, 0x0f, 0xb8, 0x18, 0x0b, - 0xf5, 0xcf, 0xe6, 0x7b, 0xa4, 0x37, 0x7b, 0x2c, 0x27, 0x91, 0xbf, 0x90, 0xcf, 0x4a, 0x54, 0x76, - 0x52, 0x5d, 0xc7, 0x3e, 0x64, 0xe1, 0x9c, 0x6c, 0xbf, 0xba, 0x23, 0x14, 0xce, 0x1f, 0xe4, 0xb3, - 0xb2, 0xae, 0x9d, 0x0a, 0xe7, 0x60, 0x13, 0x64, 0xaa, 0x48, 0x1f, 0x63, 0x9b, 0x5b, 0x56, 0x85, - 0xfe, 0x03, 0xba, 0x4f, 0xa5, 0x89, 0xf4, 0x74, 0x08, 0x1f, 0x4a, 0x4b, 0xff, 0x30, 0x9f, 0x99, - 0x5d, 0xf0, 0x54, 0xa6, 0x47, 0x29, 0xd3, 0xd3, 0xa1, 0x7f, 0xa8, 0xa1, 0x9f, 0x2a, 0xd3, 0xd3, - 0xb1, 0x7f, 0x28, 0x3d, 0xfd, 0xfd, 0x7c, 0x7a, 0xfe, 0xcc, 0x63, 0x50, 0xd2, 0xa3, 0xf0, 0x70, - 0xf4, 0xbb, 0xa1, 0x78, 0xa8, 0x6e, 0xe8, 0x3f, 0x84, 0x15, 0x95, 0x14, 0xe8, 0xb1, 0x8d, 0xfa, - 0xef, 0x57, 0x81, 0x1e, 0xc1, 0x90, 0x7f, 0x9c, 0x05, 0xfa, 0x53, 0x85, 0x64, 0xce, 0xd8, 0xc7, - 0x75, 0x4d, 0x72, 0x0e, 0xb8, 0x26, 0xf9, 0xe5, 0xc8, 0x3b, 0x70, 0x26, 0x94, 0xa5, 0x1c, 0x65, - 0x0c, 0xaf, 0x8f, 0x1a, 0x0c, 0x55, 0x7f, 0x9f, 0xe1, 0x44, 0x38, 0x9c, 0x38, 0xb5, 0xfa, 0xbd, - 0x42, 0x32, 0xf1, 0xee, 0x69, 0x6f, 0x1c, 0xb0, 0x37, 0xee, 0xc2, 0x85, 0x99, 0xae, 0xe3, 0x50, - 0xcb, 0x4b, 0xef, 0x14, 0x3c, 0xbc, 0x6f, 0x70, 0x8a, 0x7a, 0xb2, 0x73, 0x32, 0x0a, 0x33, 0xb6, - 0xe2, 0x75, 0x43, 0x9c, 0xed, 0x40, 0xc8, 0xb6, 0xcb, 0x29, 0xd2, 0xd8, 0xa6, 0x17, 0x56, 0xff, - 0x61, 0x3e, 0x99, 0x2a, 0xf9, 0xb4, 0xeb, 0x0f, 0xd6, 0xf5, 0xea, 0x97, 0x0b, 0xf1, 0x74, 0xd1, - 0xa7, 0x0b, 0xc4, 0xc1, 0xbb, 0xc3, 0x97, 0x24, 0x8e, 0x1b, 0xe9, 0x2b, 0x7c, 0x78, 0xd6, 0x57, - 0xf8, 0x78, 0xf5, 0x57, 0x8a, 0xf1, 0xd4, 0xdb, 0xa7, 0xdd, 0x71, 0x7c, 0xdd, 0x41, 0x96, 0xe1, - 0x9c, 0x98, 0xdb, 0x7c, 0x10, 0xa6, 0x9b, 0x10, 0xf3, 0x17, 0xcf, 0x5a, 0x27, 0xa6, 0xc5, 0xae, - 0x4b, 0x9d, 0xba, 0xa7, 0xbb, 0x0f, 0xea, 0x98, 0x9f, 0x42, 0x4b, 0x2d, 0xc8, 0x18, 0x8a, 0x59, - 0x2d, 0xca, 0x70, 0x30, 0x64, 0xe8, 0x4f, 0x88, 0x09, 0x86, 0x69, 0x05, 0xd5, 0xdf, 0xc8, 0xc1, - 0x78, 0xfc, 0x73, 0xc8, 0x14, 0x0c, 0xb2, 0xdf, 0xc1, 0xb3, 0x7b, 0x29, 0x27, 0x36, 0xe7, 0xc8, - 0xaf, 0xe4, 0x7d, 0x1a, 0xf2, 0x2a, 0x0c, 0xa1, 0xf7, 0x03, 0x16, 0xc8, 0x87, 0xd1, 0x0e, 0xc2, - 0x02, 0x98, 0xa8, 0x95, 0x17, 0x0b, 0x49, 0xc9, 0x9b, 0x30, 0x5c, 0x0d, 0xdd, 0xbc, 0xc4, 0x9d, - 0x17, 0x7a, 0x97, 0x4a, 0x25, 0x43, 0x02, 0x4d, 0xa6, 0x56, 0xbf, 0x9d, 0x8f, 0xa7, 0x88, 0x3f, - 0x55, 0xf5, 0x83, 0xa9, 0xfa, 0xf3, 0x8b, 0x5c, 0xd5, 0xef, 0x98, 0x96, 0x41, 0x9e, 0x80, 0xf3, - 0x77, 0x6b, 0xb3, 0x5a, 0xfd, 0x4e, 0x75, 0xa9, 0x52, 0xbf, 0xbb, 0x54, 0x5b, 0x99, 0x9d, 0xa9, - 0xce, 0x55, 0x67, 0x2b, 0xe3, 0x7d, 0xe4, 0x2c, 0x9c, 0x09, 0x51, 0xf3, 0x77, 0x17, 0xcb, 0x4b, - 0xe3, 0x39, 0x32, 0x01, 0xa3, 0x21, 0x70, 0x7a, 0x79, 0x75, 0x3c, 0xff, 0xfc, 0x27, 0x60, 0x18, - 0xdd, 0xdb, 0xf8, 0x75, 0x3c, 0x19, 0x81, 0xc1, 0xe5, 0xe9, 0xda, 0xac, 0x76, 0x0f, 0x99, 0x00, - 0x94, 0x2a, 0xb3, 0x4b, 0x8c, 0x61, 0xee, 0xf9, 0xff, 0x27, 0x07, 0x50, 0x9b, 0x5b, 0x5d, 0x11, - 0x84, 0xc3, 0x30, 0x50, 0x5d, 0xba, 0x57, 0x5e, 0xa8, 0x32, 0xba, 0x41, 0x28, 0x2e, 0xaf, 0xcc, - 0xb2, 0x1a, 0x86, 0xa0, 0x7f, 0x66, 0x61, 0xb9, 0x36, 0x3b, 0x9e, 0x67, 0x40, 0x6d, 0xb6, 0x5c, - 0x19, 0x2f, 0x30, 0xe0, 0x7d, 0xad, 0xba, 0x3a, 0x3b, 0x5e, 0x64, 0x7f, 0x2e, 0xd4, 0x56, 0xcb, - 0xab, 0xe3, 0xfd, 0xec, 0xcf, 0x39, 0xfc, 0xb3, 0xc4, 0x98, 0xd5, 0x66, 0x57, 0xf1, 0xc7, 0x00, - 0x6b, 0xc2, 0x9c, 0xff, 0x6b, 0x90, 0xa1, 0x18, 0xeb, 0x4a, 0x55, 0x1b, 0x1f, 0x62, 0x3f, 0x18, - 0x4b, 0xf6, 0x03, 0x58, 0xe3, 0xb4, 0xd9, 0xc5, 0xe5, 0x7b, 0xb3, 0xe3, 0xc3, 0x8c, 0xd7, 0xe2, - 0x1d, 0x06, 0x1e, 0x61, 0x7f, 0x6a, 0x8b, 0xec, 0xcf, 0x51, 0xc6, 0x49, 0x9b, 0x2d, 0x2f, 0xac, - 0x94, 0x57, 0xe7, 0xc7, 0xc7, 0x58, 0x7b, 0x90, 0xe7, 0x19, 0x5e, 0x72, 0xa9, 0xbc, 0x38, 0x3b, - 0x3e, 0x2e, 0x68, 0x2a, 0x0b, 0xd5, 0xa5, 0x3b, 0xe3, 0x13, 0xd8, 0x90, 0xf7, 0x16, 0xf1, 0x07, - 0x61, 0x05, 0xf0, 0xaf, 0xb3, 0xcf, 0xff, 0x20, 0x94, 0x96, 0x6b, 0x38, 0x0a, 0x2e, 0xc2, 0xd9, - 0xe5, 0x5a, 0x7d, 0xf5, 0xbd, 0x95, 0xd9, 0x98, 0xbc, 0x27, 0x60, 0xd4, 0x47, 0x2c, 0x54, 0x97, - 0xee, 0x7e, 0x8e, 0x4b, 0xdb, 0x07, 0x2d, 0x96, 0x67, 0x96, 0x6b, 0xe3, 0x79, 0xd6, 0x2b, 0x3e, - 0xe8, 0x7e, 0x75, 0xa9, 0xb2, 0x7c, 0xbf, 0x36, 0x5e, 0x78, 0xfe, 0x21, 0x8c, 0xf0, 0x3c, 0x9d, - 0xcb, 0x8e, 0xd9, 0x34, 0x2d, 0xf2, 0x14, 0x3c, 0x51, 0x99, 0xbd, 0x57, 0x9d, 0x99, 0xad, 0x2f, - 0x6b, 0xd5, 0x5b, 0xd5, 0xa5, 0x58, 0x4d, 0xe7, 0x61, 0x22, 0x8a, 0x2e, 0xaf, 0x54, 0xc7, 0x73, - 0xe4, 0x02, 0x90, 0x28, 0xf8, 0x76, 0x79, 0x71, 0x6e, 0x3c, 0x4f, 0x14, 0x38, 0x17, 0x85, 0x57, - 0x97, 0x56, 0xef, 0x2e, 0xcd, 0x8e, 0x17, 0x9e, 0xff, 0xab, 0x39, 0x38, 0x9f, 0x1a, 0xcb, 0x99, - 0xa8, 0xf0, 0xf4, 0xec, 0x42, 0xb9, 0xb6, 0x5a, 0x9d, 0xa9, 0xcd, 0x96, 0xb5, 0x99, 0xf9, 0xfa, - 0x4c, 0x79, 0x75, 0xf6, 0xd6, 0xb2, 0xf6, 0x5e, 0xfd, 0xd6, 0xec, 0xd2, 0xac, 0x56, 0x5e, 0x18, - 0xef, 0x23, 0xcf, 0xc1, 0x64, 0x06, 0x4d, 0x6d, 0x76, 0xe6, 0xae, 0x56, 0x5d, 0x7d, 0x6f, 0x3c, - 0x47, 0x9e, 0x85, 0xa7, 0x32, 0x89, 0xd8, 0xef, 0xf1, 0x3c, 0x79, 0x1a, 0x2e, 0x65, 0x91, 0xbc, - 0xbb, 0x30, 0x5e, 0x78, 0xfe, 0xe7, 0x73, 0x40, 0x92, 0xc1, 0x78, 0xc9, 0x33, 0x70, 0x99, 0xe9, - 0x45, 0x3d, 0xbb, 0x81, 0xcf, 0xc2, 0x53, 0xa9, 0x14, 0x52, 0xf3, 0x26, 0xe1, 0xc9, 0x0c, 0x12, - 0xd1, 0xb8, 0xcb, 0xa0, 0xa4, 0x13, 0x60, 0xd3, 0x7e, 0x3d, 0x07, 0xe7, 0x53, 0x3d, 0x60, 0xc8, - 0x55, 0xf8, 0x58, 0xb9, 0xb2, 0xc8, 0xfa, 0x66, 0x66, 0xb5, 0xba, 0xbc, 0x54, 0xab, 0x2f, 0xce, - 0x95, 0xeb, 0x4c, 0xfb, 0xee, 0xd6, 0x62, 0xbd, 0x79, 0x05, 0xd4, 0x1e, 0x94, 0x33, 0xf3, 0xe5, - 0xa5, 0x5b, 0x6c, 0xf8, 0x91, 0x8f, 0xc1, 0x33, 0x99, 0x74, 0xb3, 0x4b, 0xe5, 0xe9, 0x85, 0xd9, - 0xca, 0x78, 0x9e, 0x7c, 0x1c, 0x9e, 0xcd, 0xa4, 0xaa, 0x54, 0x6b, 0x9c, 0xac, 0x30, 0x5d, 0xf9, - 0xf6, 0xff, 0xfc, 0x74, 0xdf, 0xb7, 0xff, 0xe8, 0xe9, 0xdc, 0x1f, 0xfc, 0xd1, 0xd3, 0xb9, 0x7f, - 0xf6, 0x47, 0x4f, 0xe7, 0x3e, 0x7f, 0x63, 0x3f, 0x41, 0x96, 0xf9, 0xb4, 0xb5, 0x56, 0xc2, 0xdb, - 0xe8, 0x97, 0xff, 0x75, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x7b, 0x3f, 0x2d, 0xee, 0x80, 0x01, - 0x00, + 0xa6, 0xfe, 0x5e, 0x1e, 0x86, 0x6a, 0xdd, 0x35, 0x77, 0xcb, 0xf5, 0x68, 0xfb, 0x84, 0xeb, 0x90, + 0xbf, 0x49, 0x2f, 0xa6, 0x6e, 0xd2, 0x9f, 0xf3, 0x87, 0x96, 0x74, 0x7a, 0x1d, 0x6c, 0x0c, 0x7c, + 0xaf, 0xc4, 0x50, 0x8b, 0x4a, 0xfb, 0xd7, 0x22, 0xf5, 0x6f, 0xe7, 0x61, 0x9c, 0x5f, 0xde, 0x56, + 0x4c, 0xb7, 0x71, 0x04, 0x0f, 0x4a, 0x8e, 0x5f, 0xa6, 0x87, 0x73, 0x78, 0xd8, 0xc3, 0x33, 0x1d, + 0xf5, 0x4b, 0x79, 0x18, 0x2e, 0x77, 0xbd, 0x8d, 0xb2, 0x87, 0xf3, 0xdb, 0x63, 0xb9, 0x47, 0xfe, + 0x07, 0x39, 0x38, 0xc3, 0x1a, 0xb2, 0x6a, 0x3f, 0xa0, 0xd6, 0x11, 0x1c, 0x7e, 0xcb, 0x87, 0xd8, + 0xf9, 0x03, 0x1e, 0x62, 0xfb, 0xb2, 0x2c, 0xec, 0x4f, 0x96, 0x78, 0x65, 0xa3, 0xd9, 0x2d, 0x7a, + 0xb2, 0x3f, 0xe3, 0x08, 0xaf, 0x6c, 0x7c, 0x81, 0x1c, 0xc1, 0x15, 0xe1, 0xf7, 0x97, 0x40, 0x8e, + 0xe0, 0x7c, 0xf3, 0xfb, 0x43, 0x20, 0xbf, 0x9b, 0x83, 0xa1, 0x69, 0xdb, 0x3b, 0xe1, 0x03, 0x5f, + 0x7c, 0xc5, 0xc9, 0x56, 0x73, 0xff, 0x2b, 0x4e, 0xb6, 0x6e, 0xaa, 0x3f, 0x9f, 0x87, 0x73, 0x22, + 0x1e, 0xbe, 0x38, 0x03, 0x3b, 0x9d, 0x8e, 0xc5, 0x60, 0x4b, 0x8a, 0xe6, 0x74, 0x1e, 0x12, 0xa2, + 0xf9, 0xc5, 0x02, 0x9c, 0xc3, 0xf0, 0xbd, 0x6c, 0x47, 0xf5, 0x7d, 0x60, 0x8b, 0x90, 0x46, 0xf4, + 0x22, 0x7e, 0x31, 0xe5, 0x22, 0xfe, 0x5f, 0x6c, 0x4f, 0xbe, 0xda, 0x34, 0xbd, 0x8d, 0xee, 0xda, + 0x54, 0xc3, 0x6e, 0x5f, 0x6f, 0x3a, 0xfa, 0x43, 0x93, 0x5f, 0x41, 0xeb, 0xad, 0xeb, 0x61, 0x9a, + 0x9a, 0x8e, 0x29, 0x92, 0xce, 0xd4, 0x70, 0xa7, 0xc4, 0xb8, 0xfa, 0x57, 0xf8, 0x2e, 0xc0, 0x6d, + 0xdb, 0xb4, 0x84, 0x5f, 0x2b, 0x37, 0x74, 0x6b, 0x3b, 0xdb, 0x93, 0xe7, 0xdf, 0xb7, 0x4d, 0xab, + 0x1e, 0x77, 0x6e, 0xdd, 0x6f, 0x7d, 0x21, 0x6b, 0x4d, 0xaa, 0x46, 0xfd, 0x6f, 0x73, 0xf0, 0x44, + 0x54, 0x8b, 0xbf, 0x1f, 0x6c, 0xc7, 0x3f, 0x9f, 0x87, 0xf3, 0xb7, 0x50, 0x38, 0x81, 0x33, 0xd1, + 0xe9, 0xbc, 0x25, 0x06, 0x67, 0x8a, 0x6c, 0x4e, 0x2d, 0xca, 0x6c, 0xd9, 0x9c, 0x4e, 0xea, 0x42, + 0x36, 0xff, 0x4d, 0x0e, 0xce, 0x2e, 0x57, 0x2b, 0x33, 0xdf, 0x27, 0x23, 0x2a, 0xf9, 0x3d, 0x27, + 0xdc, 0xe0, 0x4c, 0x7c, 0xcf, 0x09, 0x37, 0x3d, 0xbf, 0x96, 0x87, 0xb3, 0xb5, 0xf2, 0xe2, 0xc2, + 0xf7, 0xcb, 0x0c, 0x3e, 0x23, 0x7b, 0xbe, 0xfa, 0x87, 0x60, 0xc2, 0x16, 0x90, 0x3f, 0xf3, 0xde, + 0x8d, 0x6c, 0x8f, 0xd8, 0xa4, 0x50, 0x4e, 0xf8, 0xd4, 0x7d, 0x24, 0x42, 0x61, 0x9a, 0x1f, 0xa1, + 0x3e, 0xe1, 0x9a, 0xff, 0x5f, 0x94, 0x60, 0xf8, 0x4e, 0x77, 0x8d, 0x0a, 0x07, 0xa9, 0xc7, 0xfa, + 0xe4, 0xf7, 0x06, 0x0c, 0x0b, 0x31, 0xe0, 0x0d, 0x87, 0x14, 0xc0, 0x51, 0x04, 0xe4, 0xe1, 0x31, + 0xb2, 0x64, 0x22, 0x72, 0x19, 0x8a, 0xf7, 0xa8, 0xb3, 0x26, 0xbf, 0x6d, 0x7e, 0x48, 0x9d, 0x35, + 0x0d, 0xa1, 0x64, 0x21, 0x7c, 0xb6, 0x51, 0x5e, 0xa9, 0x62, 0xf2, 0x20, 0x71, 0x69, 0x88, 0xd9, + 0x90, 0x02, 0xdf, 0x4b, 0xbd, 0x63, 0xf2, 0xb4, 0x43, 0x72, 0x5c, 0x85, 0x78, 0x49, 0xb2, 0x04, + 0x13, 0xb2, 0xf3, 0x1d, 0xcf, 0x9c, 0x33, 0x98, 0xc2, 0x2e, 0x2d, 0x67, 0x4e, 0xb2, 0x28, 0x79, + 0x07, 0x46, 0x7c, 0x20, 0xba, 0x11, 0x0e, 0x85, 0xe9, 0x1a, 0x02, 0x56, 0xb1, 0xe8, 0xfa, 0x91, + 0x02, 0x32, 0x03, 0xbc, 0xc4, 0x80, 0x14, 0x06, 0x31, 0xb7, 0xcc, 0x48, 0x01, 0xf2, 0x0a, 0x32, + 0xc0, 0xa7, 0x46, 0xe8, 0x30, 0x35, 0x8c, 0x0f, 0x7f, 0xf1, 0x02, 0xc8, 0x11, 0x70, 0xfe, 0xbc, + 0x3b, 0x42, 0x46, 0x96, 0x01, 0x42, 0xc7, 0x16, 0x11, 0x44, 0x63, 0xdf, 0x2e, 0x37, 0x12, 0x0b, + 0xf9, 0x26, 0x6f, 0xf4, 0x20, 0x37, 0x79, 0xea, 0x1f, 0xe5, 0x61, 0xb8, 0xdc, 0xe9, 0x04, 0x43, + 0xe1, 0x45, 0x28, 0x95, 0x3b, 0x9d, 0xbb, 0x5a, 0x55, 0x0e, 0xa7, 0xaf, 0x77, 0x3a, 0xf5, 0xae, + 0x63, 0xca, 0x7e, 0xc9, 0x9c, 0x88, 0xcc, 0xc0, 0x68, 0xb9, 0xd3, 0x59, 0xe9, 0xae, 0xb5, 0xcc, + 0x86, 0x94, 0x0d, 0x8c, 0xe7, 0x4b, 0xec, 0x74, 0xea, 0x1d, 0xc4, 0xc4, 0x53, 0xc2, 0x45, 0xcb, + 0x90, 0x2f, 0x62, 0xe8, 0x29, 0x91, 0x8c, 0x8a, 0xa7, 0xbb, 0x51, 0x83, 0x40, 0xfa, 0x61, 0xdb, + 0xa6, 0x02, 0x22, 0x9e, 0x70, 0xe0, 0xb2, 0x9f, 0x26, 0x82, 0x55, 0x94, 0x48, 0x3a, 0x15, 0xb2, + 0x24, 0x9f, 0x82, 0x81, 0x72, 0xa7, 0x23, 0xdd, 0x56, 0xa1, 0x63, 0x1b, 0x2b, 0x15, 0xcf, 0xf7, + 0x27, 0xc8, 0x2e, 0xbd, 0x05, 0x63, 0xd1, 0xca, 0xf6, 0x95, 0xb0, 0xe0, 0x7b, 0x39, 0xfc, 0xa0, + 0x13, 0xee, 0x57, 0xff, 0x32, 0x14, 0xca, 0x9d, 0x8e, 0x98, 0x8f, 0xce, 0xa6, 0xf4, 0x47, 0xfc, + 0x19, 0x7e, 0xb9, 0xd3, 0xf1, 0x3f, 0xfd, 0x84, 0x3f, 0xd0, 0x39, 0xd0, 0xa7, 0xff, 0x2e, 0xff, + 0xf4, 0x93, 0xfd, 0x78, 0x46, 0xfd, 0xf5, 0x02, 0x9c, 0x29, 0x77, 0x3a, 0xa7, 0x89, 0x0e, 0x8e, + 0xea, 0xb1, 0xff, 0x4b, 0x00, 0xd2, 0xf4, 0x38, 0x10, 0x3c, 0x1f, 0x1c, 0x96, 0xa6, 0x46, 0x25, + 0xa7, 0x49, 0x44, 0xbe, 0xfa, 0x0d, 0xee, 0x4b, 0xfd, 0xbe, 0x54, 0xc0, 0xa9, 0xf8, 0xa4, 0x07, + 0x2e, 0xfb, 0xa8, 0x74, 0x9b, 0xe8, 0x83, 0xd2, 0xbe, 0xfa, 0xe0, 0xef, 0x47, 0x06, 0x0f, 0x06, + 0xce, 0x3f, 0xed, 0x85, 0xfe, 0x43, 0x99, 0xc5, 0x63, 0xb2, 0x30, 0x45, 0x34, 0x25, 0x3f, 0x79, + 0x98, 0x88, 0xed, 0xd5, 0x60, 0xa8, 0xba, 0x69, 0x68, 0x31, 0x5a, 0xbf, 0x0f, 0x07, 0xf6, 0xd5, + 0x87, 0xdb, 0x79, 0x7c, 0xbf, 0x1f, 0xc4, 0x06, 0x3b, 0xfc, 0xee, 0xe2, 0x3a, 0x00, 0xf7, 0x3c, + 0x08, 0x5c, 0xeb, 0x47, 0x79, 0x18, 0x20, 0x9e, 0x53, 0x4c, 0x84, 0x01, 0x0a, 0x49, 0x02, 0x4f, + 0xa5, 0x42, 0xaa, 0xa7, 0xd2, 0x35, 0x18, 0xd4, 0xf4, 0xcd, 0x77, 0xbb, 0xd4, 0xd9, 0x12, 0xe6, + 0x0c, 0x0f, 0xbd, 0xa9, 0x6f, 0xd6, 0x7f, 0x98, 0x01, 0xb5, 0x00, 0x4d, 0xd4, 0x20, 0x00, 0x84, + 0xe4, 0x11, 0xc2, 0xcf, 0xc8, 0x83, 0xb0, 0x0f, 0x07, 0x51, 0x74, 0xf2, 0x06, 0x14, 0xca, 0xf7, + 0x6b, 0x42, 0xb2, 0x41, 0xd7, 0x96, 0xef, 0xd7, 0x84, 0xbc, 0x32, 0xcb, 0xde, 0xaf, 0xa9, 0x5f, + 0xca, 0x03, 0x49, 0x52, 0x92, 0x57, 0x61, 0x08, 0xa1, 0x4d, 0xa6, 0x33, 0x72, 0x32, 0xda, 0x4d, + 0xb7, 0xee, 0x20, 0x34, 0x62, 0xdc, 0xf9, 0xa4, 0xe4, 0x75, 0x4c, 0xf7, 0x2d, 0xd2, 0x21, 0x46, + 0x92, 0xd1, 0x6e, 0xba, 0x7e, 0x82, 0xec, 0x58, 0xb6, 0x6f, 0x41, 0x8c, 0x76, 0xe1, 0xfd, 0xda, + 0xbc, 0xed, 0x7a, 0x42, 0xd4, 0xdc, 0x2e, 0xdc, 0x74, 0x31, 0x0b, 0x72, 0xc4, 0x2e, 0xe4, 0x64, + 0x98, 0xc9, 0xed, 0x7e, 0x8d, 0x3f, 0x95, 0x32, 0x34, 0xbb, 0xe5, 0x1b, 0x94, 0x3c, 0x93, 0xdb, + 0xa6, 0x5b, 0xe7, 0xcf, 0xac, 0x0c, 0xcc, 0x33, 0x1e, 0xc9, 0xe4, 0x16, 0x29, 0xa5, 0xfe, 0xf4, + 0x20, 0x8c, 0x57, 0x74, 0x4f, 0x5f, 0xd3, 0x5d, 0x2a, 0xed, 0xa6, 0xcf, 0xf8, 0x30, 0xff, 0x73, + 0x24, 0x39, 0x18, 0x6b, 0x29, 0x5f, 0x13, 0x2f, 0x40, 0xde, 0x0c, 0xf9, 0x06, 0x79, 0x76, 0xe5, + 0xc4, 0x7d, 0x6b, 0xf5, 0x8e, 0x00, 0x6b, 0x09, 0x42, 0xf2, 0x02, 0x0c, 0xfb, 0x30, 0xb6, 0x01, + 0x28, 0x84, 0x3a, 0x63, 0xac, 0x31, 0xfb, 0x5f, 0x93, 0xd1, 0xe4, 0x75, 0x18, 0xf1, 0x7f, 0x4a, + 0xa6, 0x35, 0xcf, 0x42, 0xb8, 0x96, 0xd8, 0x3d, 0xc9, 0xa4, 0x72, 0x51, 0x9c, 0xdf, 0xfa, 0x23, + 0x45, 0x63, 0x89, 0xfe, 0x22, 0xa4, 0xe4, 0x87, 0x61, 0xcc, 0xff, 0x2d, 0x36, 0x0c, 0xdc, 0x71, + 0xf0, 0x85, 0x20, 0x8d, 0x79, 0x4c, 0xac, 0x53, 0x51, 0x72, 0xbe, 0x75, 0x78, 0xd2, 0xcf, 0x5d, + 0x67, 0xac, 0x25, 0x77, 0x0e, 0xb1, 0x0a, 0x48, 0x15, 0x26, 0x7c, 0x48, 0xa8, 0xa1, 0x03, 0xe1, + 0x8e, 0xd1, 0x58, 0xab, 0xa7, 0x2a, 0x69, 0xb2, 0x14, 0x69, 0xc1, 0xe5, 0x08, 0xd0, 0x70, 0x37, + 0xcc, 0x75, 0x4f, 0x6c, 0xf7, 0x44, 0x1c, 0x6c, 0x91, 0xac, 0x34, 0xe0, 0xca, 0x69, 0xfc, 0xac, + 0xc3, 0xd1, 0x0c, 0x65, 0x3d, 0xb9, 0x91, 0x1a, 0x9c, 0xf3, 0xf1, 0xb7, 0x66, 0x56, 0x56, 0x1c, + 0xfb, 0x7d, 0xda, 0xf0, 0xaa, 0x15, 0xb1, 0x5d, 0xc6, 0xf8, 0x88, 0xc6, 0x5a, 0xbd, 0xd9, 0xe8, + 0x30, 0xa5, 0x60, 0xb8, 0x28, 0xf3, 0xd4, 0xc2, 0xe4, 0x1e, 0x9c, 0x97, 0xe0, 0x52, 0x4a, 0x74, + 0x08, 0xf7, 0xf3, 0x82, 0x6b, 0x7a, 0x56, 0xf4, 0xf4, 0xe2, 0xe4, 0x2d, 0x18, 0xf5, 0x11, 0xfc, + 0x16, 0x71, 0x18, 0x6f, 0x11, 0x71, 0x48, 0x1a, 0x6b, 0xf5, 0xf8, 0x8b, 0xde, 0x28, 0xb1, 0xac, + 0x51, 0xab, 0x5b, 0x1d, 0x2a, 0x3c, 0x7a, 0x7d, 0x8d, 0xf2, 0xb6, 0x3a, 0xa9, 0xca, 0xc8, 0x48, + 0xc9, 0x3b, 0xa1, 0x46, 0x2d, 0x3b, 0x66, 0xd3, 0xe4, 0x3b, 0x69, 0xff, 0x11, 0xef, 0x5a, 0xdd, + 0x46, 0x60, 0x9a, 0x7e, 0x70, 0xf2, 0x4b, 0x65, 0x38, 0x9b, 0xa2, 0x63, 0xfb, 0xda, 0x31, 0x7e, + 0x39, 0x1f, 0x36, 0xe2, 0x84, 0x6f, 0x1b, 0xa7, 0x61, 0xd0, 0xff, 0x12, 0x61, 0x3c, 0x28, 0x59, + 0x43, 0x33, 0xce, 0xc3, 0xc7, 0x47, 0xc4, 0x71, 0xc2, 0xb7, 0x92, 0x47, 0x21, 0x8e, 0x6f, 0xe7, + 0x42, 0x71, 0x9c, 0xf0, 0xed, 0xe5, 0x4f, 0x15, 0xc3, 0x39, 0xe9, 0x74, 0x8f, 0x79, 0x54, 0x66, + 0x72, 0xe8, 0x07, 0x5b, 0xda, 0xc7, 0x63, 0x5a, 0x59, 0x35, 0x07, 0x0e, 0xa6, 0x9a, 0xe4, 0x2d, + 0x18, 0x5e, 0xb1, 0x5d, 0xaf, 0xe9, 0x50, 0x77, 0x25, 0xc8, 0xe3, 0x80, 0x0f, 0xb1, 0x3b, 0x02, + 0x5c, 0xef, 0x44, 0x66, 0x7f, 0x99, 0x5c, 0xfd, 0x47, 0x85, 0x84, 0x36, 0x70, 0xc3, 0xf5, 0x44, + 0x6a, 0xc3, 0x11, 0x0c, 0x75, 0x72, 0x23, 0x5c, 0x05, 0xb9, 0x85, 0xdf, 0x2f, 0x05, 0xa9, 0x5c, + 0x13, 0x06, 0x7e, 0x94, 0x84, 0xfc, 0x00, 0x5c, 0x8c, 0x00, 0x56, 0x74, 0x47, 0x6f, 0x53, 0x2f, + 0xcc, 0x99, 0x89, 0x61, 0xc7, 0xfc, 0xd2, 0xf5, 0x4e, 0x80, 0x96, 0xf3, 0x70, 0x66, 0x70, 0x90, + 0x54, 0x6b, 0x60, 0x1f, 0x2e, 0xd6, 0x3f, 0x57, 0x08, 0x0d, 0x9d, 0x68, 0xf8, 0x60, 0x8d, 0xba, + 0xdd, 0x96, 0xf7, 0xf8, 0x76, 0xf0, 0xc1, 0x92, 0xb3, 0xcc, 0xc3, 0x99, 0xf2, 0xfa, 0x3a, 0x6d, + 0x78, 0x7e, 0x54, 0x74, 0x57, 0x04, 0x8c, 0xe4, 0x1b, 0x0f, 0x81, 0x12, 0x51, 0xae, 0xe5, 0x7e, + 0x8d, 0x17, 0x53, 0xff, 0x71, 0x11, 0x94, 0xc0, 0xf0, 0x0f, 0x9e, 0x1a, 0x1e, 0xe3, 0x22, 0xfb, + 0x91, 0xe8, 0x15, 0x13, 0x26, 0x42, 0x61, 0x88, 0x37, 0x5e, 0x22, 0x8b, 0xfb, 0x64, 0x9c, 0x59, + 0x48, 0xc8, 0xf7, 0x12, 0x97, 0xc4, 0x5e, 0x82, 0x84, 0x4f, 0x39, 0xeb, 0x2e, 0x67, 0xa1, 0x25, + 0xb9, 0x92, 0xaf, 0xe4, 0xe0, 0x9c, 0xdf, 0x29, 0xcb, 0x6b, 0xcc, 0xa8, 0x9e, 0xb1, 0xbb, 0x56, + 0xf0, 0x00, 0xea, 0x8d, 0xec, 0xea, 0x78, 0x27, 0x4d, 0xa5, 0x15, 0xe6, 0x2d, 0x09, 0x42, 0xa3, + 0x04, 0x0a, 0x61, 0x23, 0x4d, 0xbd, 0x81, 0x44, 0x5a, 0x6a, 0xbd, 0x97, 0x6e, 0xc1, 0x13, 0x99, + 0x2c, 0x77, 0x33, 0x62, 0xfb, 0x65, 0x23, 0xf6, 0xbf, 0xcf, 0x85, 0x13, 0x51, 0x4c, 0x48, 0x64, + 0x0a, 0x20, 0x04, 0x89, 0x6d, 0x2d, 0xbe, 0xaf, 0x0a, 0x85, 0xa6, 0x49, 0x14, 0x64, 0x19, 0x4a, + 0x42, 0x2c, 0x3c, 0x3f, 0xf5, 0x27, 0x77, 0xe9, 0x85, 0x29, 0x59, 0x0e, 0xb8, 0x65, 0x15, 0xdf, + 0x2c, 0xd8, 0x5c, 0x7a, 0x1d, 0x86, 0x0f, 0xfa, 0x5d, 0x5f, 0x29, 0x00, 0x91, 0xf7, 0xa0, 0xc7, + 0x68, 0xa0, 0x9f, 0xe0, 0x29, 0xec, 0x2a, 0x0c, 0xb2, 0x4f, 0xc0, 0x8c, 0x2d, 0x52, 0x84, 0xe6, + 0xae, 0x80, 0x69, 0x01, 0x36, 0x0c, 0x8f, 0x36, 0x90, 0x1e, 0x1e, 0x4d, 0xfd, 0xd9, 0x02, 0x5c, + 0x90, 0x3b, 0xa4, 0x42, 0x31, 0xe9, 0xc3, 0x69, 0xa7, 0x7c, 0x88, 0x9d, 0xa2, 0x42, 0x89, 0x6f, + 0x3d, 0x44, 0xf6, 0x0d, 0x7e, 0x2c, 0x84, 0x10, 0x4d, 0x60, 0xd4, 0xff, 0x25, 0x0f, 0xa3, 0x81, + 0x79, 0xa7, 0x3b, 0xee, 0x63, 0xdc, 0x1d, 0x9f, 0x86, 0x51, 0x0c, 0x70, 0xd5, 0xa6, 0x16, 0x0f, + 0x02, 0xd5, 0x2f, 0xa5, 0xcb, 0xf1, 0x11, 0x22, 0x33, 0x5a, 0x84, 0x90, 0x69, 0x3f, 0xb7, 0xfc, + 0xa4, 0xb0, 0x63, 0xdc, 0xec, 0xe3, 0x70, 0xf5, 0xaf, 0x14, 0x60, 0xc4, 0x97, 0xf2, 0xb4, 0x79, + 0x52, 0xef, 0x79, 0x8e, 0x57, 0xc8, 0xd7, 0x01, 0x56, 0x6c, 0xc7, 0xd3, 0x5b, 0x4b, 0xa1, 0xe6, + 0xe3, 0x01, 0x69, 0x07, 0xa1, 0xbc, 0x8c, 0x44, 0x82, 0xeb, 0x57, 0x68, 0x56, 0xf3, 0x89, 0x89, + 0xaf, 0x5f, 0x01, 0x54, 0x93, 0x28, 0xd4, 0xdf, 0xce, 0xc3, 0x19, 0xbf, 0x93, 0x66, 0x1f, 0xd1, + 0x46, 0xf7, 0x71, 0x9e, 0x9b, 0xa2, 0xd2, 0xee, 0xdf, 0x55, 0xda, 0xea, 0xff, 0x25, 0x4d, 0x24, + 0x33, 0x2d, 0xfb, 0x74, 0x22, 0xf9, 0xd7, 0xa1, 0xe3, 0xea, 0x8f, 0x15, 0xe0, 0x9c, 0x2f, 0xf5, + 0xb9, 0xae, 0x85, 0x47, 0x0b, 0x33, 0x7a, 0xab, 0xf5, 0x38, 0xef, 0xc6, 0x87, 0x7d, 0x41, 0x2c, + 0x8b, 0x88, 0x91, 0x22, 0x4b, 0xe5, 0xba, 0x00, 0xd7, 0x6d, 0xd3, 0xd0, 0x64, 0x22, 0xf2, 0x0e, + 0x8c, 0xf8, 0x3f, 0xcb, 0x4e, 0xd3, 0xdf, 0x82, 0xe3, 0x45, 0x41, 0x50, 0x48, 0x77, 0x22, 0x81, + 0x31, 0x22, 0x05, 0xd4, 0x2f, 0x0d, 0xc0, 0xa5, 0xfb, 0xa6, 0x65, 0xd8, 0x9b, 0xae, 0x9f, 0xe4, + 0xf4, 0xc4, 0x1f, 0x94, 0x1d, 0x77, 0x72, 0xd3, 0x77, 0xe1, 0x7c, 0x5c, 0xa4, 0x4e, 0x10, 0x7a, + 0x5e, 0xf4, 0xce, 0x26, 0x27, 0xa8, 0xfb, 0xe9, 0x4e, 0xc5, 0x6d, 0x9b, 0x96, 0x5e, 0x32, 0x9e, + 0x2f, 0x75, 0x60, 0x2f, 0xf9, 0x52, 0x9f, 0x87, 0x52, 0xc5, 0x6e, 0xeb, 0xa6, 0x1f, 0x22, 0x09, + 0x47, 0x71, 0x50, 0x2f, 0x62, 0x34, 0x41, 0xc1, 0xf8, 0x8b, 0x8a, 0xb1, 0xcb, 0x86, 0x42, 0xfe, + 0x7e, 0x01, 0x66, 0xa5, 0x69, 0x32, 0x11, 0xb1, 0x61, 0x54, 0x54, 0x27, 0xee, 0xc6, 0x00, 0x37, + 0x4f, 0xaf, 0xf8, 0x32, 0xca, 0x56, 0xab, 0xa9, 0x48, 0x39, 0xbe, 0x8d, 0xe2, 0x69, 0x5c, 0xc5, + 0xc7, 0xf0, 0x5b, 0x32, 0x2d, 0xca, 0x5f, 0x12, 0x02, 0x4e, 0x32, 0xc3, 0x49, 0x21, 0xe0, 0x2c, + 0x23, 0x13, 0x91, 0x59, 0x98, 0xc0, 0x00, 0xe1, 0xc1, 0x56, 0x8a, 0xa9, 0xc4, 0x08, 0x1a, 0x95, + 0x78, 0xe5, 0xc2, 0x63, 0x8a, 0xb3, 0x8f, 0xab, 0x37, 0x04, 0x5a, 0x4b, 0x96, 0x20, 0x4f, 0x40, + 0x61, 0x69, 0xa1, 0x8c, 0x77, 0x35, 0x83, 0x3c, 0x39, 0x97, 0xd5, 0xd2, 0x35, 0x06, 0xbb, 0xf4, + 0x59, 0x20, 0xc9, 0xcf, 0xd9, 0xd7, 0x7d, 0xcc, 0x7f, 0x25, 0x6d, 0xf9, 0x4e, 0xba, 0x47, 0xcd, + 0x51, 0x4c, 0x84, 0x91, 0xbc, 0x78, 0xfd, 0x1f, 0x66, 0x5e, 0xbc, 0xd2, 0x91, 0xe6, 0xc5, 0x53, + 0x7f, 0x25, 0x07, 0x13, 0x89, 0x20, 0xfa, 0xe4, 0x65, 0x00, 0x0e, 0x91, 0x82, 0x95, 0x62, 0xf4, + 0x9f, 0x30, 0xb0, 0xbe, 0x58, 0x1e, 0x43, 0x32, 0x72, 0x1d, 0x06, 0xf9, 0x2f, 0x11, 0x60, 0x2c, + 0x59, 0xa4, 0xdb, 0x35, 0x0d, 0x2d, 0x20, 0x0a, 0x6b, 0xc1, 0x1b, 0xc9, 0x42, 0x6a, 0x11, 0x6f, + 0xab, 0x13, 0xd4, 0xc2, 0xc8, 0xd4, 0x9f, 0xce, 0xc3, 0x48, 0xd0, 0xe0, 0xb2, 0x71, 0x5c, 0x3a, + 0x57, 0x12, 0xf9, 0x08, 0x0a, 0xbb, 0xe5, 0x23, 0x88, 0xcd, 0xb7, 0x22, 0x01, 0xc1, 0xd1, 0x3d, + 0xa8, 0xfa, 0x6a, 0x1e, 0xce, 0x04, 0xb5, 0x1e, 0xe3, 0xe5, 0xd7, 0x47, 0x48, 0x24, 0x5f, 0xc9, + 0x81, 0x32, 0x6d, 0xb6, 0x5a, 0xa6, 0xd5, 0xac, 0x5a, 0xeb, 0xb6, 0xd3, 0xc6, 0x09, 0xf1, 0xf8, + 0x8e, 0x70, 0xd5, 0x3f, 0x9d, 0x83, 0x09, 0xd1, 0xa0, 0x19, 0xdd, 0x31, 0x8e, 0xef, 0x7c, 0x2c, + 0xde, 0x92, 0xe3, 0xd3, 0x17, 0xf5, 0x9b, 0x79, 0x80, 0x05, 0xbb, 0xf1, 0xe0, 0x84, 0xbf, 0xc7, + 0x7a, 0x13, 0x4a, 0x3c, 0xca, 0x9b, 0xd0, 0xd8, 0x09, 0xf1, 0xee, 0x88, 0x7d, 0x1a, 0x47, 0x4c, + 0x8f, 0x8b, 0xf9, 0xb8, 0xc4, 0xa3, 0xc4, 0x29, 0x39, 0x4d, 0x14, 0x61, 0x95, 0x32, 0x3a, 0xb1, + 0x60, 0x04, 0x95, 0x32, 0x58, 0xb4, 0xd2, 0x9d, 0xed, 0xc9, 0x62, 0xcb, 0x6e, 0x3c, 0xd0, 0x90, + 0x5e, 0xfd, 0x97, 0x39, 0x2e, 0xbb, 0x13, 0xfe, 0xaa, 0xd4, 0xff, 0xfc, 0xe2, 0x3e, 0x3f, 0xff, + 0xcf, 0xe4, 0xe0, 0x9c, 0x46, 0x1b, 0xf6, 0x43, 0xea, 0x6c, 0xcd, 0xd8, 0x06, 0xbd, 0x45, 0x2d, + 0xea, 0x1c, 0xd7, 0x88, 0xfa, 0x1d, 0x4c, 0xe0, 0x12, 0x36, 0xe6, 0xae, 0x4b, 0x8d, 0x93, 0x93, + 0x5c, 0x47, 0xfd, 0xb5, 0x01, 0x50, 0x52, 0xad, 0xde, 0x13, 0x6b, 0xce, 0x65, 0x6e, 0x65, 0x8a, + 0x47, 0xb5, 0x95, 0xe9, 0xdf, 0xdf, 0x56, 0xa6, 0xb4, 0xdf, 0xad, 0xcc, 0xc0, 0x5e, 0xb6, 0x32, + 0xed, 0xf8, 0x56, 0x66, 0x10, 0xb7, 0x32, 0x2f, 0xf7, 0xdc, 0xca, 0xcc, 0x5a, 0xc6, 0x01, 0x37, + 0x32, 0x27, 0x36, 0xf1, 0xf3, 0x41, 0x76, 0x60, 0x57, 0xd9, 0xa4, 0xd8, 0xb0, 0x1d, 0x83, 0x1a, + 0x62, 0xe3, 0x85, 0xa7, 0xfe, 0x8e, 0x80, 0x69, 0x01, 0x36, 0x91, 0x45, 0x7b, 0x74, 0x2f, 0x59, + 0xb4, 0x8f, 0x60, 0xff, 0xf5, 0xe5, 0x3c, 0x4c, 0xcc, 0x50, 0xc7, 0xe3, 0x61, 0x64, 0x8f, 0xc2, + 0x25, 0xae, 0x0c, 0x67, 0x24, 0x86, 0x68, 0x91, 0xe7, 0x43, 0x37, 0xbf, 0x06, 0x75, 0xbc, 0xb8, + 0x97, 0x60, 0x9c, 0x9e, 0x55, 0xef, 0x67, 0xb2, 0x13, 0x63, 0x37, 0xa8, 0xde, 0x87, 0x73, 0x41, + 0x9a, 0xe2, 0x97, 0x16, 0xd0, 0x4b, 0xc9, 0xe9, 0x8a, 0xfb, 0x4f, 0x4e, 0xa7, 0xfe, 0x72, 0x0e, + 0xae, 0x68, 0xd4, 0xa2, 0x9b, 0xfa, 0x5a, 0x8b, 0x4a, 0xcd, 0x12, 0x2b, 0x03, 0x9b, 0x35, 0x4c, + 0xb7, 0xad, 0x7b, 0x8d, 0x8d, 0x43, 0xc9, 0x68, 0x0e, 0x46, 0xe4, 0xf9, 0x6b, 0x1f, 0x73, 0x5b, + 0xa4, 0x9c, 0xfa, 0x6b, 0x45, 0x18, 0x98, 0xb6, 0xbd, 0xdb, 0xf6, 0x21, 0xb3, 0x25, 0x86, 0x53, + 0x7e, 0x7e, 0x1f, 0x67, 0x3d, 0x9f, 0xc2, 0xca, 0xa5, 0x04, 0x12, 0xe8, 0x42, 0xba, 0x66, 0x27, + 0x12, 0x6d, 0xf8, 0x64, 0xfb, 0xcc, 0x93, 0xf8, 0x2a, 0x0c, 0x61, 0xf4, 0x17, 0xe9, 0x34, 0x16, + 0x1d, 0xb4, 0x3d, 0x06, 0x8c, 0xd7, 0x11, 0x92, 0x92, 0x1f, 0x88, 0xc4, 0xbd, 0x2d, 0x1d, 0x3e, + 0xaf, 0xa2, 0x1c, 0x02, 0xf7, 0x65, 0x7e, 0x91, 0x87, 0x6d, 0x92, 0x72, 0xd0, 0xe0, 0x29, 0x4a, + 0xac, 0x49, 0x01, 0xe1, 0x11, 0xe6, 0x3c, 0x9c, 0x81, 0xd1, 0x69, 0xdb, 0x93, 0x9c, 0x81, 0x87, + 0xc2, 0x67, 0xa0, 0x4c, 0xf2, 0xe9, 0x9e, 0xc0, 0xd1, 0x32, 0xea, 0x77, 0x8b, 0x30, 0xe2, 0xff, + 0x3c, 0x26, 0xdd, 0x79, 0x11, 0x4a, 0xf3, 0xb6, 0x94, 0x86, 0x03, 0x1d, 0x88, 0x37, 0x6c, 0x37, + 0xe6, 0x19, 0x2d, 0x88, 0x98, 0xd4, 0x97, 0x6c, 0x43, 0x76, 0x7f, 0x47, 0xa9, 0x5b, 0xb6, 0x91, + 0x78, 0x3e, 0x1c, 0x10, 0x92, 0x2b, 0x50, 0xc4, 0x97, 0x03, 0xd2, 0x41, 0x7e, 0xec, 0xb5, 0x00, + 0xe2, 0x25, 0xad, 0x2c, 0xed, 0x57, 0x2b, 0x07, 0x0e, 0xaa, 0x95, 0x83, 0x47, 0xab, 0x95, 0xef, + 0xc1, 0x08, 0xd6, 0xe4, 0x67, 0xf1, 0xdb, 0x7d, 0x61, 0x7d, 0x42, 0xac, 0x7d, 0xa3, 0xbc, 0xdd, + 0x22, 0x97, 0x1f, 0x2e, 0x79, 0x11, 0x56, 0x31, 0xdd, 0x85, 0x43, 0x6c, 0xa7, 0xff, 0x51, 0x0e, + 0x06, 0xee, 0x5a, 0x0f, 0x2c, 0x7b, 0xf3, 0x70, 0x1a, 0xf7, 0x32, 0x0c, 0x0b, 0x36, 0xd2, 0xea, + 0x82, 0x2f, 0xc2, 0xbb, 0x1c, 0x5c, 0x47, 0x4e, 0x9a, 0x4c, 0x45, 0xde, 0x0a, 0x0a, 0xe1, 0xe3, + 0xa0, 0x42, 0x98, 0xc8, 0xc6, 0x2f, 0xd4, 0x88, 0xe6, 0xde, 0x90, 0xc9, 0xc9, 0x65, 0x28, 0x56, + 0x58, 0x53, 0xa5, 0x18, 0xbc, 0xac, 0x29, 0x1a, 0x42, 0xd5, 0x2f, 0x17, 0x61, 0x2c, 0x76, 0xf0, + 0xf5, 0x3c, 0x0c, 0x89, 0x83, 0x27, 0xd3, 0x4f, 0x06, 0x82, 0x8f, 0x87, 0x02, 0xa0, 0x36, 0xc8, + 0xff, 0xac, 0x1a, 0xe4, 0x33, 0x30, 0x60, 0xbb, 0xb8, 0x28, 0xe2, 0xb7, 0x8c, 0x85, 0x43, 0x68, + 0xb9, 0xc6, 0xda, 0xce, 0x07, 0x87, 0x20, 0x91, 0x35, 0xd2, 0x76, 0xf1, 0xd3, 0x6e, 0xc2, 0x90, + 0xee, 0xba, 0xd4, 0xab, 0x7b, 0x7a, 0x53, 0xce, 0x0f, 0x12, 0x00, 0xe5, 0xd1, 0x81, 0xc0, 0x55, + 0xbd, 0x49, 0x3e, 0x0b, 0xa3, 0x0d, 0x87, 0xe2, 0xb2, 0xa9, 0xb7, 0x58, 0x2b, 0x25, 0xb3, 0x36, + 0x82, 0x90, 0xef, 0x4f, 0x42, 0x44, 0xd5, 0x20, 0xf7, 0x60, 0x54, 0x7c, 0x0e, 0xf7, 0xdc, 0xc7, + 0x81, 0x36, 0x16, 0x2e, 0x63, 0x5c, 0x24, 0xdc, 0x77, 0x5f, 0x3c, 0xe0, 0x90, 0xc9, 0x65, 0xbe, + 0x86, 0x44, 0x4a, 0x96, 0x81, 0x6c, 0xd2, 0xb5, 0xba, 0xde, 0xf5, 0x36, 0x58, 0x5d, 0x3c, 0xbc, + 0xbd, 0x48, 0x8b, 0x89, 0xaf, 0x1e, 0x92, 0x58, 0xf9, 0x31, 0xc8, 0x26, 0x5d, 0x2b, 0x47, 0x90, + 0xe4, 0x3e, 0x9c, 0x4f, 0x16, 0x61, 0x9f, 0xcc, 0x2f, 0x07, 0x9e, 0xdb, 0xd9, 0x9e, 0x9c, 0x4c, + 0x25, 0x90, 0xd8, 0x9e, 0x4d, 0xb0, 0xad, 0x1a, 0xb7, 0x8b, 0x83, 0x03, 0xe3, 0x83, 0xda, 0x18, + 0x2b, 0xeb, 0x9b, 0x90, 0xa6, 0xa1, 0xfe, 0x7e, 0x8e, 0x99, 0x8a, 0xec, 0x83, 0x30, 0x2f, 0x38, + 0xd3, 0xf5, 0xf6, 0x3e, 0x75, 0xbd, 0x1d, 0x66, 0xf0, 0x2c, 0xb9, 0x3d, 0x66, 0x57, 0x4d, 0x60, + 0xc9, 0x14, 0x94, 0x0c, 0xf9, 0xd4, 0xec, 0x42, 0xb4, 0x13, 0xfc, 0x7a, 0x34, 0x41, 0x45, 0xae, + 0x42, 0x91, 0x2d, 0x59, 0xf1, 0x2d, 0xb3, 0x6c, 0x5d, 0x68, 0x48, 0xa1, 0xfe, 0x48, 0x1e, 0x46, + 0xa4, 0xaf, 0xb9, 0x71, 0xa8, 0xcf, 0x79, 0x63, 0x6f, 0xcd, 0xf4, 0x9d, 0x5e, 0x70, 0x2f, 0xe5, + 0x37, 0xf9, 0x66, 0x20, 0x8a, 0x3d, 0x5d, 0x48, 0x09, 0xc1, 0xbc, 0x2a, 0x3e, 0xb4, 0xb4, 0xf7, + 0xed, 0x23, 0xa3, 0xbf, 0x5d, 0x1c, 0xcc, 0x8f, 0x17, 0x6e, 0x17, 0x07, 0x8b, 0xe3, 0xfd, 0x18, + 0x87, 0x0b, 0x43, 0x5f, 0xf3, 0xbd, 0xb9, 0xb5, 0x6e, 0x36, 0x4f, 0xf8, 0xdb, 0x91, 0xa3, 0x8d, + 0x51, 0x16, 0x93, 0xcd, 0x09, 0x7f, 0x48, 0xf2, 0xa1, 0xca, 0xe6, 0x34, 0xe3, 0xa7, 0x90, 0xcd, + 0x3f, 0xce, 0x81, 0x92, 0x2a, 0x9b, 0xf2, 0x31, 0xf9, 0x41, 0x1c, 0x5d, 0xde, 0xcf, 0x3f, 0xce, + 0xc3, 0x44, 0xd5, 0xf2, 0x68, 0x93, 0xef, 0x18, 0x4f, 0xf8, 0x54, 0x71, 0x07, 0x86, 0xa5, 0x8f, + 0x11, 0x7d, 0xfe, 0x64, 0xb0, 0x1f, 0x0f, 0x51, 0x19, 0x9c, 0xe4, 0xd2, 0x47, 0xf7, 0x12, 0x27, + 0x2e, 0xe4, 0x13, 0x3e, 0xe7, 0x9c, 0x0c, 0x21, 0x9f, 0xf0, 0xc9, 0xeb, 0x23, 0x2a, 0xe4, 0xff, + 0x23, 0x07, 0x67, 0x53, 0x2a, 0x27, 0x57, 0x60, 0xa0, 0xd6, 0x5d, 0xc3, 0xb0, 0x5b, 0xb9, 0xd0, + 0x63, 0xd8, 0xed, 0xae, 0x61, 0xc4, 0x2d, 0xcd, 0x47, 0x92, 0x55, 0x7c, 0x5c, 0xbf, 0x5c, 0xad, + 0xcc, 0x08, 0xa9, 0xaa, 0x52, 0x98, 0x00, 0x06, 0x4e, 0xfb, 0xb2, 0xe0, 0x01, 0xbe, 0x6d, 0x1a, + 0x8d, 0xd8, 0x03, 0x7c, 0x56, 0x86, 0xfc, 0x20, 0x0c, 0x95, 0x3f, 0xe8, 0x3a, 0x14, 0xf9, 0x72, + 0x89, 0x7f, 0x2c, 0xe0, 0xeb, 0x23, 0xd2, 0x38, 0xf3, 0x58, 0x02, 0x8c, 0x22, 0xce, 0x3b, 0x64, + 0xa8, 0xfe, 0x74, 0x0e, 0x2e, 0x65, 0xb7, 0x8e, 0x7c, 0x0a, 0x06, 0xd8, 0xce, 0xbc, 0xac, 0x2d, + 0x89, 0x4f, 0xe7, 0x39, 0x72, 0xed, 0x16, 0xad, 0xeb, 0x8e, 0x6c, 0xec, 0xfb, 0x64, 0xe4, 0x6d, + 0x18, 0xae, 0xba, 0x6e, 0x97, 0x3a, 0xb5, 0x97, 0xef, 0x6a, 0x55, 0xb1, 0x27, 0xc4, 0x3d, 0x87, + 0x89, 0xe0, 0xba, 0xfb, 0x72, 0x2c, 0xb0, 0x96, 0x4c, 0xaf, 0xfe, 0x44, 0x0e, 0x2e, 0xf7, 0xfa, + 0x2a, 0xf2, 0x32, 0x0c, 0xae, 0x52, 0x4b, 0xb7, 0xbc, 0x6a, 0x45, 0x34, 0x09, 0xb7, 0x58, 0x1e, + 0xc2, 0xa2, 0x3b, 0x85, 0x80, 0x90, 0x15, 0xe2, 0xe7, 0x8a, 0x81, 0x23, 0x03, 0x3f, 0x03, 0x45, + 0x58, 0xac, 0x90, 0x4f, 0xa8, 0xfe, 0x41, 0x1e, 0x46, 0x56, 0x5a, 0xdd, 0xa6, 0x29, 0x2d, 0x1c, + 0x07, 0xb6, 0xb7, 0x7d, 0xeb, 0x37, 0xbf, 0x3f, 0xeb, 0x97, 0x0d, 0x37, 0xe7, 0x80, 0xc3, 0xcd, + 0x2f, 0x47, 0xde, 0x82, 0x52, 0x07, 0xbf, 0x23, 0x7e, 0x12, 0xcb, 0xbf, 0x2e, 0xeb, 0x24, 0x96, + 0x97, 0x61, 0xe3, 0xab, 0x71, 0x88, 0xf1, 0x15, 0x96, 0x95, 0x04, 0x1a, 0x2e, 0x12, 0xa7, 0x02, + 0x3d, 0x12, 0x81, 0x86, 0x0b, 0xc2, 0xa9, 0x40, 0x0f, 0x21, 0xd0, 0x5f, 0xcb, 0xc3, 0x58, 0xb4, + 0x4a, 0xf2, 0x29, 0x18, 0xe6, 0xd5, 0xf0, 0x73, 0xa1, 0x9c, 0xe4, 0x54, 0x1c, 0x82, 0x35, 0xe0, + 0x3f, 0xc4, 0x01, 0xd7, 0x99, 0x0d, 0xdd, 0xad, 0x87, 0x27, 0x34, 0xfc, 0xfe, 0x76, 0x90, 0x7b, + 0x42, 0xc5, 0x50, 0xda, 0xd8, 0x86, 0xee, 0xce, 0x84, 0xbf, 0xc9, 0x2c, 0x10, 0x87, 0x76, 0x5d, + 0x1a, 0x65, 0x50, 0x44, 0x06, 0x22, 0x41, 0x79, 0x1c, 0xab, 0x4d, 0x70, 0x98, 0xcc, 0xe6, 0x0b, + 0x41, 0xb3, 0x51, 0x19, 0xfa, 0xf7, 0x90, 0x3d, 0x5d, 0xa2, 0x4f, 0x3f, 0xe6, 0xe4, 0x04, 0x15, + 0xdd, 0xd3, 0xf9, 0xa6, 0xdc, 0xef, 0x00, 0xf5, 0x47, 0x3b, 0xd0, 0xbf, 0x6c, 0xd1, 0xe5, 0x75, + 0xf2, 0x12, 0x0c, 0x31, 0x85, 0x59, 0xb0, 0x59, 0x5f, 0xe6, 0x84, 0xff, 0x84, 0xa4, 0x49, 0x88, + 0x98, 0xef, 0xd3, 0x42, 0x2a, 0x72, 0x13, 0x20, 0x7c, 0x62, 0x26, 0xb4, 0x8f, 0xc8, 0x65, 0x38, + 0x66, 0xbe, 0x4f, 0x93, 0xe8, 0xfc, 0x52, 0xe2, 0x81, 0x4e, 0x21, 0x59, 0x8a, 0x63, 0xfc, 0x52, + 0x62, 0x7c, 0x2c, 0x00, 0x61, 0xbf, 0x56, 0x74, 0xd7, 0xdd, 0xb4, 0x1d, 0x63, 0x66, 0x43, 0xb7, + 0x9a, 0x34, 0xbe, 0x7b, 0x4a, 0x52, 0xcc, 0xf7, 0x69, 0x29, 0xe5, 0xc8, 0x1b, 0x30, 0x22, 0x3b, + 0x94, 0xc6, 0x9d, 0x3e, 0x64, 0xdc, 0x7c, 0x9f, 0x16, 0xa1, 0x25, 0xaf, 0xc1, 0xb0, 0xf8, 0x7d, + 0xdb, 0x16, 0x37, 0xca, 0x52, 0x2c, 0x22, 0x09, 0x35, 0xdf, 0xa7, 0xc9, 0x94, 0x52, 0xa5, 0x2b, + 0x8e, 0x69, 0x79, 0xe2, 0x8d, 0x72, 0xbc, 0x52, 0xc4, 0x49, 0x95, 0xe2, 0x6f, 0xf2, 0x36, 0x8c, + 0x06, 0x41, 0x9e, 0xde, 0xa7, 0x0d, 0x4f, 0x1c, 0x7e, 0x9f, 0x8f, 0x15, 0xe6, 0xc8, 0xf9, 0x3e, + 0x2d, 0x4a, 0x4d, 0xae, 0x42, 0x49, 0xa3, 0xae, 0xf9, 0x81, 0x7f, 0x5d, 0x3c, 0x26, 0x8d, 0x73, + 0xf3, 0x03, 0x26, 0x25, 0x81, 0x67, 0xbd, 0x13, 0xde, 0x4f, 0x8b, 0xa3, 0x6a, 0x12, 0xab, 0x65, + 0xd6, 0x32, 0x58, 0xef, 0x48, 0xce, 0x09, 0x9f, 0x0d, 0x43, 0x5f, 0x89, 0xa4, 0xad, 0xc3, 0xf1, + 0x18, 0x03, 0x32, 0x76, 0xbe, 0x4f, 0x8b, 0xd1, 0x4b, 0x52, 0xad, 0x98, 0xee, 0x03, 0x11, 0x6d, + 0x34, 0x2e, 0x55, 0x86, 0x92, 0xa4, 0xca, 0x7e, 0x4a, 0x55, 0x2f, 0x51, 0x6f, 0xd3, 0x76, 0x1e, + 0x88, 0xd8, 0xa2, 0xf1, 0xaa, 0x05, 0x56, 0xaa, 0x5a, 0x40, 0xe4, 0xaa, 0xd9, 0x80, 0x1b, 0x4b, + 0xaf, 0x5a, 0xf7, 0x74, 0xb9, 0x6a, 0x7e, 0x12, 0xe7, 0x77, 0xd2, 0x02, 0xd5, 0x1f, 0xf2, 0xdc, + 0xf9, 0xc9, 0x0e, 0x45, 0x9c, 0xd4, 0xa1, 0xf8, 0x9b, 0x55, 0x2a, 0xe5, 0x47, 0x17, 0xc9, 0xf1, + 0x83, 0x4a, 0x25, 0x14, 0xab, 0x54, 0xce, 0xa4, 0x7e, 0x53, 0x4e, 0x1b, 0xae, 0x4c, 0x44, 0x3b, + 0x28, 0xc4, 0xb0, 0x0e, 0x92, 0xd2, 0x8b, 0x4f, 0x62, 0x4a, 0x62, 0x85, 0x20, 0xf9, 0x70, 0xd0, + 0xc2, 0x99, 0x95, 0xf9, 0x3e, 0x0d, 0x93, 0x15, 0xab, 0x3c, 0xd9, 0xb5, 0x72, 0x16, 0x29, 0x46, + 0x7c, 0x0a, 0x06, 0x9b, 0xef, 0xd3, 0x78, 0x22, 0xec, 0x97, 0xa4, 0x84, 0x80, 0xca, 0xb9, 0xe8, + 0x14, 0x11, 0x20, 0xd8, 0x14, 0x11, 0xa6, 0x0d, 0x9c, 0x4b, 0xa6, 0xbd, 0x53, 0xce, 0x47, 0x97, + 0x9a, 0x38, 0x7e, 0xbe, 0x4f, 0x4b, 0xa6, 0xca, 0x7b, 0x2d, 0x92, 0x09, 0x4e, 0xb9, 0x10, 0x0b, + 0x00, 0x16, 0xa2, 0x98, 0xb8, 0xe4, 0x9c, 0x71, 0xcb, 0xb1, 0xcc, 0xf9, 0x62, 0xb2, 0xba, 0x18, + 0xdd, 0xb8, 0xa4, 0x90, 0xcc, 0xf7, 0x69, 0x69, 0x25, 0xc9, 0x4c, 0x22, 0x1f, 0x9b, 0xa2, 0x44, + 0x7d, 0x63, 0x62, 0xe8, 0xf9, 0x3e, 0x2d, 0x91, 0xc1, 0xed, 0xa6, 0x9c, 0x08, 0x4d, 0x79, 0x22, + 0xda, 0x89, 0x21, 0x86, 0x75, 0xa2, 0x94, 0x30, 0xed, 0xa6, 0x9c, 0x1c, 0x4b, 0xb9, 0x94, 0x2c, + 0x15, 0xce, 0x9c, 0x52, 0x12, 0x2d, 0x2d, 0x3d, 0xdf, 0x8f, 0xf2, 0xa4, 0xc8, 0xfa, 0x2b, 0xca, + 0xa7, 0xd1, 0xcc, 0xf7, 0x69, 0xe9, 0xb9, 0x82, 0xb4, 0xf4, 0x44, 0x39, 0xca, 0xe5, 0x5e, 0x3c, + 0x83, 0xd6, 0xa5, 0x27, 0xd9, 0xd1, 0x7b, 0xa4, 0x2d, 0x51, 0x9e, 0x8a, 0x46, 0x1f, 0xce, 0x24, + 0x9c, 0xef, 0xd3, 0x7a, 0x24, 0x3f, 0xb9, 0x9b, 0x91, 0x43, 0x44, 0x79, 0x3a, 0x9a, 0xf4, 0x3b, + 0x95, 0x68, 0xbe, 0x4f, 0xcb, 0xc8, 0x40, 0x72, 0x37, 0x23, 0xc5, 0x84, 0x32, 0xd9, 0x93, 0x6d, + 0x20, 0x8f, 0x8c, 0x04, 0x15, 0xcb, 0xa9, 0xd9, 0x19, 0x94, 0x67, 0xa2, 0xaa, 0x9b, 0x42, 0xc2, + 0x54, 0x37, 0x2d, 0xaf, 0xc3, 0x72, 0x6a, 0x3a, 0x01, 0xe5, 0xd9, 0x1e, 0x0c, 0x83, 0x36, 0xa6, + 0x26, 0x22, 0x58, 0x4e, 0x8d, 0xe7, 0xaf, 0xa8, 0x51, 0x86, 0x29, 0x24, 0x8c, 0x61, 0x5a, 0x26, + 0x80, 0xe5, 0xd4, 0xb0, 0xef, 0xca, 0x73, 0x3d, 0x18, 0x86, 0x2d, 0x4c, 0x0b, 0x18, 0xff, 0x5a, + 0x24, 0xee, 0xba, 0xf2, 0xb1, 0xe8, 0xbc, 0x21, 0xa1, 0xd8, 0xbc, 0x21, 0x47, 0x68, 0x9f, 0x49, + 0x44, 0x96, 0x55, 0x3e, 0x1e, 0x1d, 0xe6, 0x31, 0x34, 0x1b, 0xe6, 0xf1, 0x58, 0xb4, 0x33, 0x89, + 0x08, 0x9b, 0xca, 0x95, 0x2c, 0x26, 0x88, 0x8e, 0x32, 0xe1, 0x31, 0x39, 0xab, 0x29, 0x21, 0x1e, + 0x95, 0x4f, 0x44, 0xfd, 0xba, 0x13, 0x04, 0xf3, 0x7d, 0x5a, 0x4a, 0x60, 0x48, 0x2d, 0x3d, 0x9e, + 0x91, 0x72, 0x35, 0x3a, 0x6c, 0xd3, 0x68, 0xd8, 0xb0, 0x4d, 0x8d, 0x85, 0xb4, 0x90, 0xf6, 0xf8, + 0x44, 0xb9, 0x16, 0x35, 0xcc, 0x92, 0x14, 0xcc, 0x30, 0x4b, 0x79, 0xb4, 0xa2, 0xa5, 0xc7, 0xd8, + 0x51, 0x9e, 0xef, 0xd9, 0x42, 0xa4, 0x49, 0x69, 0x21, 0x0f, 0x39, 0x13, 0xda, 0x4e, 0x77, 0x3b, + 0x2d, 0x5b, 0x37, 0x94, 0x4f, 0xa6, 0xda, 0x4e, 0x1c, 0x29, 0xd9, 0x4e, 0x1c, 0xc0, 0x56, 0x79, + 0xf9, 0x8d, 0x83, 0xf2, 0x42, 0x74, 0x95, 0x97, 0x71, 0x6c, 0x95, 0x8f, 0xbc, 0x87, 0x98, 0x49, + 0xbc, 0x07, 0x50, 0x5e, 0x8c, 0x2a, 0x40, 0x0c, 0xcd, 0x14, 0x20, 0xfe, 0x82, 0xe0, 0x8b, 0xd9, + 0x1e, 0xf4, 0xca, 0x14, 0x72, 0x7b, 0xc6, 0xe7, 0x96, 0x45, 0x37, 0xdf, 0xa7, 0x65, 0x7b, 0xe1, + 0x57, 0x53, 0x1c, 0xe2, 0x95, 0xeb, 0x51, 0x05, 0x4b, 0x10, 0x30, 0x05, 0x4b, 0xba, 0xd1, 0x57, + 0x53, 0x3c, 0xda, 0x95, 0x4f, 0x65, 0xb2, 0x0a, 0xbe, 0x39, 0xc5, 0x0f, 0xfe, 0xa6, 0xec, 0x92, + 0xae, 0xbc, 0x14, 0x5d, 0xec, 0x42, 0x0c, 0x5b, 0xec, 0x24, 0xd7, 0xf5, 0x9b, 0xb2, 0x33, 0xb6, + 0x72, 0x23, 0x59, 0x2a, 0x5c, 0x22, 0x25, 0xa7, 0x6d, 0x2d, 0xdd, 0x87, 0x59, 0x79, 0x39, 0xaa, + 0x75, 0x69, 0x34, 0x4c, 0xeb, 0x52, 0xfd, 0x9f, 0xe7, 0x92, 0xae, 0xc8, 0xca, 0xcd, 0xf8, 0x26, + 0x3b, 0x8a, 0x67, 0x96, 0x4f, 0xc2, 0x7d, 0xf9, 0xb3, 0xf1, 0x60, 0x7b, 0xca, 0x2b, 0xb1, 0x6b, + 0xdf, 0x08, 0x96, 0xd9, 0xb7, 0xb1, 0xe0, 0x7c, 0x9f, 0x8d, 0xc7, 0xa7, 0x53, 0x5e, 0x4d, 0xe7, + 0x10, 0xe8, 0x4a, 0x3c, 0x9e, 0xdd, 0x67, 0xe3, 0x21, 0xdd, 0x94, 0xd7, 0xd2, 0x39, 0x04, 0xd2, + 0x8d, 0x87, 0x80, 0x7b, 0x49, 0x0a, 0x32, 0xaf, 0x7c, 0x3a, 0x6a, 0x3a, 0x06, 0x08, 0x66, 0x3a, + 0x86, 0xa1, 0xe8, 0x5f, 0x92, 0x82, 0xb3, 0x2b, 0xaf, 0x27, 0x8a, 0x04, 0x8d, 0x95, 0x42, 0xb8, + 0xbf, 0x24, 0x05, 0x35, 0x57, 0xde, 0x48, 0x14, 0x09, 0x5a, 0x27, 0x85, 0x3e, 0x37, 0x7a, 0xbd, + 0x5f, 0x55, 0xde, 0x8c, 0x1e, 0x06, 0x67, 0x53, 0xce, 0xf7, 0x69, 0xbd, 0xde, 0xc1, 0x7e, 0x31, + 0xdb, 0xb1, 0x5b, 0x79, 0x2b, 0x3a, 0x84, 0xb3, 0xe8, 0xd8, 0x10, 0xce, 0x74, 0x0e, 0x7f, 0x3b, + 0x16, 0xcb, 0x42, 0x79, 0x3b, 0x3a, 0xc5, 0x45, 0x90, 0x6c, 0x8a, 0x8b, 0x47, 0xbe, 0x88, 0x04, + 0x69, 0x50, 0x3e, 0x13, 0x9d, 0xe2, 0x64, 0x1c, 0x9b, 0xe2, 0x22, 0x01, 0x1d, 0x66, 0x12, 0xb1, + 0x03, 0x94, 0x77, 0xa2, 0x53, 0x5c, 0x0c, 0xcd, 0xa6, 0xb8, 0x78, 0xb4, 0x81, 0xb7, 0x63, 0x4f, + 0xe8, 0x95, 0xcf, 0xa6, 0xb7, 0x1f, 0x91, 0x72, 0xfb, 0xf9, 0x83, 0x7b, 0x2d, 0xfd, 0x2d, 0xb8, + 0x52, 0x8e, 0x8e, 0xdf, 0x34, 0x1a, 0x36, 0x7e, 0x53, 0xdf, 0x91, 0xc7, 0x37, 0x0e, 0x42, 0xab, + 0xa6, 0x7b, 0x6c, 0x1c, 0x42, 0x53, 0x24, 0x05, 0x1c, 0xd9, 0x23, 0xf3, 0x8d, 0xd0, 0x4c, 0xc6, + 0x1e, 0xd9, 0xdf, 0x06, 0xc5, 0xe8, 0xd9, 0xec, 0x9a, 0xf0, 0x33, 0x56, 0x2a, 0xd1, 0xd9, 0x35, + 0x41, 0xc0, 0x66, 0xd7, 0xa4, 0x77, 0xf2, 0x1c, 0x8c, 0x0b, 0x2d, 0xe2, 0xee, 0xd3, 0xa6, 0xd5, + 0x54, 0x66, 0x63, 0xef, 0x2d, 0x63, 0x78, 0x36, 0x3b, 0xc5, 0x61, 0xb8, 0x5e, 0x73, 0xd8, 0x4c, + 0xcb, 0xec, 0xac, 0xd9, 0xba, 0x63, 0xd4, 0xa8, 0x65, 0x28, 0x73, 0xb1, 0xf5, 0x3a, 0x85, 0x06, + 0xd7, 0xeb, 0x14, 0x38, 0x86, 0x88, 0x8b, 0xc1, 0x35, 0xda, 0xa0, 0xe6, 0x43, 0xaa, 0xdc, 0x42, + 0xb6, 0x93, 0x59, 0x6c, 0x05, 0xd9, 0x7c, 0x9f, 0x96, 0xc5, 0x81, 0xd9, 0xea, 0x8b, 0x5b, 0xb5, + 0x77, 0x17, 0x82, 0xf0, 0x03, 0x2b, 0x0e, 0xed, 0xe8, 0x0e, 0x55, 0xe6, 0xa3, 0xb6, 0x7a, 0x2a, + 0x11, 0xb3, 0xd5, 0x53, 0x11, 0x49, 0xb6, 0xfe, 0x58, 0xa8, 0xf6, 0x62, 0x1b, 0x8e, 0x88, 0xf4, + 0xd2, 0x6c, 0x76, 0x8a, 0x22, 0x98, 0x80, 0x16, 0x6c, 0xab, 0x89, 0x27, 0x15, 0xb7, 0xa3, 0xb3, + 0x53, 0x36, 0x25, 0x9b, 0x9d, 0xb2, 0xb1, 0x4c, 0xd5, 0xa3, 0x58, 0x3e, 0x06, 0xef, 0x44, 0x55, + 0x3d, 0x85, 0x84, 0xa9, 0x7a, 0x0a, 0x38, 0xc9, 0x50, 0xa3, 0x2e, 0xf5, 0x94, 0x85, 0x5e, 0x0c, + 0x91, 0x24, 0xc9, 0x10, 0xc1, 0x49, 0x86, 0x73, 0xd4, 0x6b, 0x6c, 0x28, 0x8b, 0xbd, 0x18, 0x22, + 0x49, 0x92, 0x21, 0x82, 0xd9, 0x66, 0x33, 0x0a, 0x9e, 0xee, 0xb6, 0x1e, 0xf8, 0x7d, 0xb6, 0x14, + 0xdd, 0x6c, 0x66, 0x12, 0xb2, 0xcd, 0x66, 0x26, 0x92, 0xfc, 0xc4, 0x9e, 0xfd, 0xe0, 0x95, 0x65, + 0xac, 0x70, 0x2a, 0xb4, 0x0b, 0xf6, 0x52, 0x6a, 0xbe, 0x4f, 0xdb, 0xab, 0x9f, 0xfd, 0x27, 0x03, + 0xa7, 0x51, 0x65, 0x05, 0xab, 0x3a, 0x13, 0x9c, 0x55, 0x70, 0xf0, 0x7c, 0x9f, 0x16, 0xb8, 0x95, + 0xbe, 0x06, 0xc3, 0xf8, 0x51, 0x55, 0xcb, 0xf4, 0x2a, 0xd3, 0xca, 0xbb, 0xd1, 0x2d, 0x93, 0x84, + 0x62, 0x5b, 0x26, 0xe9, 0x27, 0x9b, 0xc4, 0xf1, 0x27, 0x9f, 0x62, 0x2a, 0xd3, 0x8a, 0x16, 0x9d, + 0xc4, 0x23, 0x48, 0x36, 0x89, 0x47, 0x00, 0x41, 0xbd, 0x15, 0xc7, 0xee, 0x54, 0xa6, 0x95, 0x5a, + 0x4a, 0xbd, 0x1c, 0x15, 0xd4, 0xcb, 0x7f, 0x06, 0xf5, 0xd6, 0x36, 0xba, 0x5e, 0x85, 0x7d, 0xe3, + 0x6a, 0x4a, 0xbd, 0x3e, 0x32, 0xa8, 0xd7, 0x07, 0xb0, 0xa9, 0x10, 0x01, 0x2b, 0x8e, 0xcd, 0x26, + 0xed, 0x3b, 0x66, 0xab, 0xa5, 0xdc, 0x8d, 0x4e, 0x85, 0x71, 0x3c, 0x9b, 0x0a, 0xe3, 0x30, 0x66, + 0x7a, 0xf2, 0x56, 0xd1, 0xb5, 0x6e, 0x53, 0xb9, 0x17, 0x35, 0x3d, 0x43, 0x0c, 0x33, 0x3d, 0xc3, + 0x5f, 0xb8, 0xbb, 0x60, 0xbf, 0x34, 0xba, 0xee, 0x50, 0x77, 0x43, 0xb9, 0x1f, 0xdb, 0x5d, 0x48, + 0x38, 0xdc, 0x5d, 0x48, 0xbf, 0x49, 0x13, 0x9e, 0x8c, 0x2c, 0x34, 0xfe, 0xa5, 0x4d, 0x8d, 0xea, + 0x4e, 0x63, 0x43, 0xf9, 0x1c, 0xb2, 0x7a, 0x2e, 0x75, 0xa9, 0x8a, 0x92, 0xce, 0xf7, 0x69, 0xbd, + 0x38, 0xe1, 0xb6, 0xfc, 0xdd, 0x05, 0x1e, 0x09, 0x56, 0x5b, 0x99, 0xf1, 0x37, 0xa1, 0xef, 0xc5, + 0xb6, 0xe5, 0x49, 0x12, 0xdc, 0x96, 0x27, 0xc1, 0xa4, 0x03, 0x4f, 0xc7, 0xb6, 0x6a, 0x8b, 0x7a, + 0x8b, 0xed, 0x4b, 0xa8, 0xb1, 0xa2, 0x37, 0x1e, 0x50, 0x4f, 0xf9, 0x3c, 0xf2, 0xbe, 0x92, 0xb1, + 0xe1, 0x8b, 0x51, 0xcf, 0xf7, 0x69, 0xbb, 0xf0, 0x23, 0x2a, 0x14, 0x6b, 0x73, 0xab, 0x2b, 0xca, + 0x0f, 0x44, 0xcf, 0x37, 0x19, 0x6c, 0xbe, 0x4f, 0x43, 0x1c, 0xb3, 0xd2, 0xee, 0x76, 0x9a, 0x8e, + 0x6e, 0x50, 0x6e, 0x68, 0xa1, 0xed, 0x26, 0x0c, 0xd0, 0x1f, 0x8c, 0x5a, 0x69, 0x59, 0x74, 0xcc, + 0x4a, 0xcb, 0xc2, 0x31, 0x45, 0x8d, 0x24, 0x3d, 0x51, 0xbe, 0x10, 0x55, 0xd4, 0x08, 0x92, 0x29, + 0x6a, 0x34, 0x45, 0xca, 0xe7, 0xe0, 0x42, 0xb0, 0x9f, 0x17, 0xeb, 0x2f, 0xef, 0x34, 0xe5, 0x8b, + 0xc8, 0xe7, 0xe9, 0xc4, 0x65, 0x40, 0x84, 0x6a, 0xbe, 0x4f, 0xcb, 0x28, 0xcf, 0x56, 0xdc, 0x44, + 0x3e, 0x2f, 0x61, 0x5e, 0xfc, 0x50, 0x74, 0xc5, 0xcd, 0x20, 0x63, 0x2b, 0x6e, 0x06, 0x2a, 0x95, + 0xb9, 0x10, 0xaa, 0xbe, 0x0b, 0xf3, 0x40, 0xa6, 0x59, 0x1c, 0x52, 0x99, 0x0b, 0x4b, 0x6d, 0x6d, + 0x17, 0xe6, 0x81, 0xb5, 0x96, 0xc5, 0x81, 0x5c, 0x85, 0x52, 0xad, 0xb6, 0xa8, 0x75, 0x2d, 0xa5, + 0x11, 0xf3, 0x96, 0x45, 0xe8, 0x7c, 0x9f, 0x26, 0xf0, 0xcc, 0x0c, 0x9a, 0x6d, 0xe9, 0xae, 0x67, + 0x36, 0x5c, 0x1c, 0x31, 0xfe, 0x08, 0x31, 0xa2, 0x66, 0x50, 0x1a, 0x0d, 0x33, 0x83, 0xd2, 0xe0, + 0xcc, 0x5e, 0x9c, 0xd1, 0x5d, 0x57, 0xb7, 0x0c, 0x47, 0x9f, 0xc6, 0x65, 0x82, 0xc6, 0x5e, 0x63, + 0x45, 0xb0, 0xcc, 0x5e, 0x8c, 0x42, 0xf0, 0xf0, 0xdd, 0x87, 0xf8, 0x66, 0xce, 0x7a, 0xec, 0xf0, + 0x3d, 0x86, 0xc7, 0xc3, 0xf7, 0x18, 0x0c, 0xed, 0x4e, 0x1f, 0xa6, 0xd1, 0xa6, 0xc9, 0x44, 0xa4, + 0x34, 0x63, 0x76, 0x67, 0x9c, 0x00, 0xed, 0xce, 0x38, 0x30, 0xd2, 0x24, 0x7f, 0xb9, 0xdd, 0xc8, + 0x68, 0x52, 0xb8, 0xca, 0x26, 0xca, 0xb0, 0xf5, 0x3b, 0x1c, 0x1c, 0x95, 0x2d, 0x4b, 0x6f, 0xdb, + 0x95, 0x69, 0x5f, 0xea, 0x66, 0x74, 0xfd, 0xce, 0x24, 0x64, 0xeb, 0x77, 0x26, 0x92, 0xcd, 0xae, + 0xfe, 0x46, 0x6b, 0x43, 0x77, 0xa8, 0x51, 0x31, 0x1d, 0x3c, 0x59, 0xdc, 0xe2, 0x5b, 0xc3, 0xf7, + 0xa3, 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, 0xbe, 0x63, + 0x7a, 0x54, 0x69, 0xed, 0xe5, 0x73, 0x90, 0x34, 0xfb, 0x73, 0x10, 0xcd, 0x36, 0x84, 0xf1, 0x0e, + 0x69, 0x47, 0x37, 0x84, 0xc9, 0x6e, 0x88, 0x97, 0x60, 0x16, 0x8b, 0x78, 0x94, 0xa7, 0x58, 0x51, + 0x8b, 0x45, 0x80, 0x99, 0xc5, 0x12, 0x3e, 0xdb, 0x8b, 0x3c, 0xc5, 0x52, 0xec, 0xe8, 0x1a, 0x2a, + 0xe3, 0xd8, 0x1a, 0x1a, 0x79, 0xb6, 0xf5, 0x5a, 0xe4, 0x9d, 0x81, 0xd2, 0x89, 0x5a, 0x1d, 0x12, + 0x8a, 0x59, 0x1d, 0xf2, 0x8b, 0x84, 0x19, 0x38, 0x83, 0xb7, 0xe0, 0x5a, 0x37, 0xb8, 0xc7, 0xf9, + 0xe1, 0xe8, 0x67, 0xc6, 0xd0, 0xec, 0x33, 0x63, 0xa0, 0x08, 0x13, 0x31, 0x6d, 0x39, 0x19, 0x4c, + 0xc2, 0xf3, 0xc1, 0x18, 0x88, 0x2c, 0x00, 0xa9, 0x95, 0x17, 0x17, 0xaa, 0xc6, 0x8a, 0x7c, 0x45, + 0xe6, 0x46, 0x4f, 0x60, 0x93, 0x14, 0xf3, 0x7d, 0x5a, 0x4a, 0x39, 0xf2, 0x3e, 0x5c, 0x16, 0x50, + 0xf1, 0xe2, 0x1a, 0xd3, 0xfe, 0x1b, 0xc1, 0x82, 0xe0, 0x45, 0xfd, 0xd8, 0x7a, 0xd1, 0xce, 0xf7, + 0x69, 0x3d, 0x79, 0x65, 0xd7, 0x25, 0xd6, 0x87, 0xee, 0x5e, 0xea, 0x0a, 0x16, 0x89, 0x9e, 0xbc, + 0xb2, 0xeb, 0x12, 0x72, 0x7f, 0xb8, 0x97, 0xba, 0x82, 0x4e, 0xe8, 0xc9, 0x8b, 0xb8, 0x30, 0xd9, + 0x0b, 0x5f, 0x6e, 0xb5, 0x94, 0x4d, 0xac, 0xee, 0x13, 0x7b, 0xa9, 0xae, 0x8c, 0x06, 0xe7, 0x6e, + 0x1c, 0xd9, 0x2c, 0xbd, 0xdc, 0xa1, 0x56, 0x2d, 0xb2, 0x00, 0x3d, 0x8a, 0xce, 0xd2, 0x09, 0x02, + 0x36, 0x4b, 0x27, 0x80, 0x6c, 0x40, 0xc9, 0xcf, 0x55, 0x94, 0xad, 0xe8, 0x80, 0x92, 0x71, 0x6c, + 0x40, 0x45, 0x9e, 0xb6, 0x2c, 0xc3, 0xd9, 0xe5, 0x07, 0x9e, 0xee, 0x5b, 0x90, 0xae, 0xe8, 0xca, + 0x0f, 0x62, 0x97, 0x4c, 0x49, 0x12, 0xbc, 0x64, 0x4a, 0x82, 0xd9, 0x18, 0x61, 0xe0, 0xda, 0x96, + 0xd5, 0x98, 0xd3, 0xcd, 0x56, 0xd7, 0xa1, 0xca, 0xbf, 0x11, 0x1d, 0x23, 0x31, 0x34, 0x1b, 0x23, + 0x31, 0x10, 0x5b, 0xa0, 0x19, 0xa8, 0xec, 0xba, 0x66, 0xd3, 0x12, 0xfb, 0xca, 0x6e, 0xcb, 0x53, + 0xfe, 0xcd, 0xe8, 0x02, 0x9d, 0x46, 0xc3, 0x16, 0xe8, 0x34, 0x38, 0x9e, 0x3a, 0xb1, 0x5e, 0x60, + 0x8b, 0x87, 0x7c, 0x57, 0xf9, 0x6f, 0xc5, 0x4e, 0x9d, 0x52, 0x68, 0xf0, 0xd4, 0x29, 0x05, 0xce, + 0xd6, 0x47, 0x6e, 0x93, 0x2d, 0x98, 0xc1, 0x5d, 0xf5, 0xbf, 0x1d, 0x5d, 0x1f, 0xe3, 0x78, 0xb6, + 0x3e, 0xc6, 0x61, 0x51, 0x3e, 0xa2, 0x0b, 0xfe, 0x9d, 0x2c, 0x3e, 0x81, 0xfc, 0x13, 0x65, 0xc8, + 0x2d, 0x99, 0x8f, 0x18, 0x29, 0x3f, 0x92, 0xcb, 0x62, 0x14, 0x0c, 0x8f, 0x44, 0xa1, 0x28, 0x23, + 0x8d, 0x3e, 0x34, 0xe9, 0xa6, 0xf2, 0xa5, 0x4c, 0x46, 0x9c, 0x20, 0xca, 0x88, 0xc3, 0xc8, 0x7b, + 0x70, 0x21, 0x84, 0x2d, 0xd2, 0xf6, 0x5a, 0x30, 0x33, 0xfd, 0x68, 0x2e, 0x6a, 0x06, 0xa7, 0x93, + 0x31, 0x33, 0x38, 0x1d, 0x93, 0xc6, 0x5a, 0x88, 0xee, 0xdf, 0xdd, 0x85, 0x75, 0x20, 0xc1, 0x0c, + 0x06, 0x69, 0xac, 0x85, 0x34, 0x7f, 0x6c, 0x17, 0xd6, 0x81, 0x4c, 0x33, 0x18, 0x90, 0x9f, 0xcc, + 0xc1, 0x95, 0x74, 0x54, 0xb9, 0xd5, 0x9a, 0xb3, 0x9d, 0x10, 0xa7, 0xfc, 0xa9, 0x5c, 0xf4, 0xa0, + 0x61, 0x6f, 0xc5, 0xe6, 0xfb, 0xb4, 0x3d, 0x56, 0x40, 0x3e, 0x03, 0xa3, 0xe5, 0xae, 0x61, 0x7a, + 0x78, 0xf1, 0xc6, 0x0c, 0xe7, 0x1f, 0xcf, 0xc5, 0xb6, 0x38, 0x32, 0x16, 0xb7, 0x38, 0x32, 0x80, + 0xdc, 0x86, 0x89, 0x1a, 0x6d, 0x74, 0x1d, 0xd3, 0xdb, 0xd2, 0x68, 0xc7, 0x76, 0x3c, 0xc6, 0xe3, + 0x4f, 0xe7, 0xa2, 0x93, 0x58, 0x82, 0x82, 0x4d, 0x62, 0x09, 0x20, 0xb9, 0x97, 0xb8, 0x95, 0x17, + 0x9d, 0xf9, 0x13, 0xb9, 0x9e, 0xd7, 0xf2, 0x41, 0x5f, 0xa6, 0x17, 0x27, 0x2b, 0xb1, 0x5b, 0x74, + 0xc1, 0xf5, 0x27, 0x73, 0x3d, 0xae, 0xd1, 0xa5, 0x19, 0x2e, 0x09, 0x66, 0x1c, 0x53, 0x32, 0xc0, + 0x2b, 0x7f, 0x26, 0xd7, 0xe3, 0xda, 0x3b, 0xe4, 0x98, 0x96, 0x3c, 0xfe, 0x15, 0xee, 0x29, 0x22, + 0x18, 0xfd, 0x54, 0x2e, 0xe9, 0x2a, 0x12, 0x94, 0x97, 0x08, 0x59, 0xb1, 0xbb, 0x6e, 0xa0, 0xf4, + 0x5f, 0xce, 0x25, 0x7d, 0xf3, 0xc2, 0x62, 0xe1, 0x2f, 0x42, 0xe1, 0xd2, 0xec, 0x23, 0x8f, 0x3a, + 0x96, 0xde, 0xc2, 0xee, 0xac, 0x79, 0xb6, 0xa3, 0x37, 0xe9, 0xac, 0xa5, 0xaf, 0xb5, 0xa8, 0xf2, + 0xd3, 0xb9, 0xa8, 0x05, 0x9b, 0x4d, 0xca, 0x2c, 0xd8, 0x6c, 0x2c, 0xd9, 0x80, 0x27, 0xd3, 0xb0, + 0x15, 0xd3, 0xc5, 0x7a, 0xbe, 0x92, 0x8b, 0x9a, 0xb0, 0x3d, 0x68, 0x99, 0x09, 0xdb, 0x03, 0x4d, + 0x6e, 0xc0, 0xd0, 0xb4, 0xed, 0x4f, 0xbf, 0x7f, 0x36, 0xe6, 0x0c, 0x19, 0x60, 0xe6, 0xfb, 0xb4, + 0x90, 0x4c, 0x94, 0x11, 0x83, 0xfa, 0xab, 0xc9, 0x32, 0xe1, 0xe5, 0x53, 0xf0, 0x43, 0x94, 0x11, + 0xe2, 0xfe, 0xf7, 0x92, 0x65, 0xc2, 0x3b, 0xae, 0xe0, 0x07, 0x9b, 0x49, 0x78, 0x8d, 0x8b, 0x73, + 0x65, 0x66, 0xb7, 0xcd, 0x6c, 0xe8, 0xad, 0x16, 0xb5, 0x9a, 0x54, 0xf9, 0x5a, 0x6c, 0x26, 0x49, + 0x27, 0x63, 0x33, 0x49, 0x3a, 0x86, 0xfc, 0x20, 0x5c, 0xbc, 0xa7, 0xb7, 0x4c, 0x23, 0xc4, 0xf9, + 0xf9, 0xc0, 0x95, 0x9f, 0xc9, 0x45, 0x77, 0xd3, 0x19, 0x74, 0x6c, 0x37, 0x9d, 0x81, 0x22, 0x8b, + 0x40, 0x70, 0x19, 0x0d, 0x66, 0x0b, 0xb6, 0x3e, 0x2b, 0xff, 0x7e, 0x2e, 0x6a, 0xa7, 0x26, 0x49, + 0x98, 0x9d, 0x9a, 0x84, 0x92, 0x7a, 0x76, 0x6a, 0x10, 0xe5, 0x67, 0x73, 0xd1, 0xd3, 0x9a, 0x2c, + 0xc2, 0xf9, 0x3e, 0x2d, 0x3b, 0xbf, 0xc8, 0x2d, 0x18, 0xaf, 0xad, 0x54, 0xe7, 0xe6, 0x66, 0x6b, + 0xf7, 0xaa, 0x15, 0x7c, 0xe8, 0x60, 0x28, 0x7f, 0x2e, 0xb6, 0x62, 0xc5, 0x09, 0xd8, 0x8a, 0x15, + 0x87, 0x91, 0x37, 0x61, 0x84, 0xb5, 0x9f, 0x0d, 0x18, 0xfc, 0xe4, 0x9f, 0xcb, 0x45, 0xcd, 0x29, + 0x19, 0xc9, 0xcc, 0x29, 0xf9, 0x37, 0xa9, 0xc1, 0x39, 0x26, 0xc5, 0x15, 0x87, 0xae, 0x53, 0x87, + 0x5a, 0x0d, 0x7f, 0x4c, 0xff, 0x7c, 0x2e, 0x6a, 0x65, 0xa4, 0x11, 0x31, 0x2b, 0x23, 0x0d, 0x4e, + 0x1e, 0xc0, 0xe5, 0xf8, 0x49, 0x90, 0xfc, 0xec, 0x54, 0xf9, 0xf3, 0xb9, 0x98, 0x31, 0xdc, 0x83, + 0x18, 0x8d, 0xe1, 0x1e, 0x78, 0x62, 0xc1, 0x53, 0xe2, 0x58, 0x45, 0x38, 0x5c, 0xc6, 0x6b, 0xfb, + 0x0b, 0xbc, 0xb6, 0x8f, 0x87, 0x0e, 0x81, 0x3d, 0xa8, 0xe7, 0xfb, 0xb4, 0xde, 0xec, 0x98, 0x9e, + 0x25, 0x13, 0x60, 0x28, 0x7f, 0x31, 0x97, 0xee, 0x91, 0x12, 0x71, 0x53, 0x4e, 0xcb, 0x9c, 0xf1, + 0x5e, 0x56, 0xfa, 0x06, 0xe5, 0x2f, 0xc5, 0xc6, 0x5b, 0x3a, 0x19, 0x1b, 0x6f, 0x19, 0xf9, 0x1f, + 0x6e, 0xc3, 0x04, 0x57, 0xea, 0x15, 0x1d, 0x87, 0xa1, 0xd5, 0xa4, 0x86, 0xf2, 0x1f, 0xc4, 0x56, + 0xbb, 0x04, 0x05, 0xba, 0xf6, 0xc4, 0x81, 0x6c, 0xea, 0xae, 0x75, 0x74, 0xcb, 0xc2, 0x63, 0x56, + 0xe5, 0x3f, 0x8c, 0x4d, 0xdd, 0x21, 0x0a, 0x1d, 0x77, 0x83, 0x5f, 0x4c, 0x13, 0x7a, 0xa5, 0x3e, + 0x52, 0xfe, 0x72, 0x4c, 0x13, 0x7a, 0x11, 0x33, 0x4d, 0xe8, 0x99, 0x47, 0xe9, 0x5e, 0xc6, 0x13, + 0x70, 0xe5, 0xeb, 0xb1, 0x15, 0x39, 0x95, 0x8a, 0xad, 0xc8, 0xe9, 0x2f, 0xc8, 0xef, 0x65, 0x3c, + 0x9f, 0x56, 0x7e, 0xa1, 0x37, 0xdf, 0x70, 0xa5, 0x4f, 0x7f, 0x7d, 0x7d, 0x2f, 0xe3, 0xe9, 0xb1, + 0xf2, 0x57, 0x7a, 0xf3, 0x0d, 0x1d, 0xfb, 0xd2, 0x5f, 0x2e, 0xd7, 0xb3, 0x9f, 0xed, 0x2a, 0x7f, + 0x35, 0x3e, 0x75, 0x65, 0x10, 0xe2, 0xd4, 0x95, 0xf5, 0xf6, 0x77, 0x0d, 0x9e, 0xe0, 0x1a, 0x72, + 0xcb, 0xd1, 0x3b, 0x1b, 0x35, 0xea, 0x79, 0xa6, 0xd5, 0xf4, 0x77, 0x62, 0x7f, 0x2d, 0x17, 0x3b, + 0x1e, 0xcb, 0xa2, 0xc4, 0xe3, 0xb1, 0x2c, 0x24, 0x53, 0xde, 0xc4, 0x03, 0x5d, 0xe5, 0xaf, 0xc7, + 0x94, 0x37, 0x41, 0xc1, 0x94, 0x37, 0xf9, 0xae, 0xf7, 0x76, 0xca, 0x3b, 0x54, 0xe5, 0x3f, 0xca, + 0xe6, 0x15, 0xb4, 0x2f, 0xe5, 0xf9, 0xea, 0xed, 0x94, 0xe7, 0x96, 0xca, 0x7f, 0x9c, 0xcd, 0x2b, + 0xf4, 0x41, 0x4a, 0xbe, 0xd2, 0x7c, 0x0f, 0x2e, 0xf0, 0xd9, 0x7c, 0x8e, 0x1a, 0x34, 0xf2, 0xa1, + 0xbf, 0x18, 0x1b, 0xfb, 0xe9, 0x64, 0x78, 0xe4, 0x9e, 0x8a, 0x49, 0x63, 0x2d, 0xda, 0xfa, 0x37, + 0x76, 0x61, 0x1d, 0x6e, 0x08, 0xd2, 0x31, 0x6c, 0xbd, 0x91, 0x1f, 0xbf, 0x29, 0xbf, 0x14, 0x5b, + 0x6f, 0x64, 0x24, 0xba, 0x73, 0xc8, 0x2f, 0xe5, 0xde, 0x8c, 0x3e, 0xf4, 0x52, 0xfe, 0x66, 0x6a, + 0xe1, 0xa0, 0x03, 0xa2, 0xaf, 0xc2, 0xde, 0x8c, 0x3e, 0x6a, 0x52, 0x7e, 0x39, 0xb5, 0x70, 0xf0, + 0x01, 0xd1, 0x17, 0x50, 0x6c, 0x8b, 0xd4, 0xf5, 0x6c, 0xce, 0x2a, 0x32, 0x3d, 0xfc, 0xad, 0xf8, + 0x16, 0x29, 0x95, 0x0c, 0xb7, 0x48, 0xa9, 0x98, 0x34, 0xd6, 0xe2, 0xf3, 0x7e, 0x65, 0x17, 0xd6, + 0xd2, 0xc6, 0x2e, 0x15, 0x93, 0xc6, 0x5a, 0x7c, 0xfc, 0x37, 0x76, 0x61, 0x2d, 0x6d, 0xec, 0x52, + 0x31, 0xcc, 0x1c, 0x0b, 0x31, 0xf7, 0xa8, 0xe3, 0x86, 0xea, 0xf7, 0x9f, 0xc4, 0xcc, 0xb1, 0x0c, + 0x3a, 0x66, 0x8e, 0x65, 0xa0, 0x52, 0xb9, 0x0b, 0xa1, 0xfc, 0xea, 0x6e, 0xdc, 0xc3, 0x7b, 0x99, + 0x0c, 0x54, 0x2a, 0x77, 0x21, 0x97, 0xbf, 0xbd, 0x1b, 0xf7, 0xf0, 0x62, 0x26, 0x03, 0xc5, 0x8c, + 0xa2, 0x9a, 0xa7, 0x7b, 0x66, 0x63, 0xde, 0x76, 0x3d, 0x69, 0x91, 0xff, 0x3b, 0x31, 0xa3, 0x28, + 0x8d, 0x88, 0x19, 0x45, 0x69, 0xf0, 0x24, 0x53, 0x21, 0x8d, 0x5f, 0xeb, 0xc9, 0x34, 0xb4, 0xb4, + 0xd2, 0xe0, 0x49, 0xa6, 0x42, 0x08, 0xff, 0x69, 0x4f, 0xa6, 0xa1, 0xa7, 0x7c, 0x1a, 0x9c, 0x59, + 0xa6, 0x33, 0x8e, 0xbd, 0x69, 0xdd, 0xa6, 0x9b, 0xb4, 0x25, 0x3e, 0xfd, 0xd7, 0x63, 0x96, 0x69, + 0x9c, 0x00, 0x6f, 0x51, 0x62, 0xb0, 0x28, 0x23, 0xf1, 0xb9, 0xbf, 0x91, 0xc9, 0x28, 0x3c, 0x26, + 0x8a, 0xc3, 0xa2, 0x8c, 0xc4, 0x27, 0xfe, 0x66, 0x26, 0xa3, 0xf0, 0x98, 0x28, 0x0e, 0x23, 0x65, + 0x18, 0xc3, 0xb7, 0x12, 0xba, 0xeb, 0x7b, 0x7e, 0xfe, 0x4e, 0x2e, 0x7a, 0xeb, 0x15, 0x45, 0xcf, + 0xf7, 0x69, 0xb1, 0x02, 0x32, 0x0b, 0xf1, 0x49, 0xdf, 0xca, 0x60, 0x11, 0xfa, 0x3b, 0x46, 0x21, + 0x32, 0x0b, 0xf1, 0x31, 0xff, 0x59, 0x06, 0x8b, 0xd0, 0xe1, 0x31, 0x0a, 0x21, 0x9f, 0x86, 0xe1, + 0xda, 0xdc, 0xea, 0x8a, 0x9f, 0x9e, 0xef, 0xef, 0xe6, 0x62, 0xaf, 0x8a, 0x42, 0x1c, 0xbe, 0x2a, + 0x0a, 0x7f, 0x4e, 0x0f, 0x40, 0x3f, 0x1e, 0xa5, 0xde, 0x2e, 0x0d, 0x7e, 0x33, 0x37, 0xfe, 0x5b, + 0xb9, 0xdb, 0xa5, 0xc1, 0xdf, 0xca, 0x8d, 0xff, 0x36, 0xfb, 0xff, 0xb7, 0x73, 0xe3, 0xbf, 0x93, + 0xd3, 0x9e, 0x08, 0x87, 0x45, 0xb9, 0x49, 0x2d, 0x6f, 0xa5, 0xa5, 0x8b, 0x41, 0x9d, 0x8a, 0xe2, + 0x3f, 0x53, 0x51, 0x22, 0x15, 0xd6, 0xd7, 0x73, 0x30, 0x52, 0xf3, 0x1c, 0xaa, 0xb7, 0x45, 0x64, + 0xb9, 0x4b, 0x30, 0xc8, 0x9d, 0x9f, 0xfd, 0x97, 0xda, 0x5a, 0xf0, 0x9b, 0x5c, 0x81, 0xb1, 0x05, + 0xdd, 0xf5, 0xb0, 0x89, 0x55, 0xcb, 0xa0, 0x8f, 0xf0, 0xe1, 0x5f, 0x41, 0x8b, 0x41, 0xc9, 0x02, + 0xa7, 0xe3, 0xe5, 0x30, 0x98, 0x68, 0x61, 0xd7, 0x80, 0x6a, 0x83, 0xdf, 0xde, 0x9e, 0xec, 0xc3, + 0xf8, 0x69, 0xb1, 0xb2, 0xea, 0xef, 0xe7, 0x20, 0xe1, 0x96, 0x7d, 0xf0, 0x08, 0x0a, 0xcb, 0x70, + 0x26, 0x16, 0xc0, 0x56, 0xbc, 0x5e, 0xdc, 0x63, 0x7c, 0xdb, 0x78, 0x69, 0xf2, 0x89, 0xe0, 0xd5, + 0xdc, 0x5d, 0x6d, 0x41, 0x04, 0xcb, 0xc3, 0x34, 0x0f, 0x5d, 0xa7, 0xa5, 0x49, 0x28, 0x11, 0x0c, + 0xe9, 0x7b, 0xe3, 0x61, 0x74, 0x4e, 0x72, 0x45, 0x84, 0x73, 0xc8, 0x85, 0x21, 0xf6, 0x62, 0x49, + 0xe5, 0x79, 0xf8, 0x86, 0xcf, 0xc0, 0x48, 0xb5, 0xdd, 0xa1, 0x8e, 0x6b, 0x5b, 0xba, 0x67, 0x3b, + 0xe2, 0x35, 0x3c, 0x86, 0x5f, 0x33, 0x25, 0xb8, 0x1c, 0x12, 0x4c, 0xa6, 0x27, 0xd7, 0xfc, 0x4c, + 0x75, 0x05, 0x8c, 0x8b, 0x8a, 0x4f, 0x5a, 0xe3, 0x89, 0xca, 0x39, 0x05, 0x23, 0xbd, 0xeb, 0xea, + 0xf8, 0xbe, 0x32, 0x20, 0xed, 0x32, 0x80, 0x4c, 0x8a, 0x14, 0xe4, 0x05, 0x28, 0xe1, 0x7d, 0x94, + 0x8b, 0x19, 0x28, 0x45, 0xe0, 0xbf, 0x16, 0x42, 0xe4, 0x30, 0x6b, 0x9c, 0x86, 0xdc, 0x81, 0xf1, + 0xf0, 0xb2, 0xfd, 0x96, 0x63, 0x77, 0x3b, 0x7e, 0xce, 0x19, 0x4c, 0xf0, 0xfe, 0x20, 0xc0, 0xd5, + 0x9b, 0x88, 0x94, 0x58, 0x24, 0x0a, 0x92, 0x79, 0x38, 0x13, 0xc2, 0x98, 0x88, 0xfc, 0x5c, 0x57, + 0x98, 0x67, 0x54, 0xe2, 0xc5, 0xc4, 0x19, 0xc9, 0x33, 0x1a, 0x2b, 0x46, 0xaa, 0x30, 0xe0, 0x47, + 0xfd, 0x1b, 0xdc, 0x55, 0x49, 0xcf, 0x8a, 0xa8, 0x7f, 0x03, 0x72, 0xbc, 0x3f, 0xbf, 0x3c, 0x99, + 0x83, 0x31, 0xcd, 0xee, 0x7a, 0x74, 0xd5, 0x16, 0xbb, 0x54, 0x11, 0x5d, 0x12, 0xdb, 0xe4, 0x30, + 0x4c, 0xdd, 0xb3, 0xfd, 0xfc, 0xf8, 0x72, 0x9e, 0xf6, 0x68, 0x29, 0xb2, 0x04, 0x13, 0x09, 0xb7, + 0x04, 0x39, 0x6b, 0xbd, 0xf4, 0x79, 0x49, 0x66, 0xc9, 0xa2, 0xe4, 0xc7, 0x73, 0x50, 0x5a, 0x75, + 0x74, 0xd3, 0x73, 0xc5, 0xd3, 0xcc, 0xf3, 0x53, 0x9b, 0x8e, 0xde, 0x61, 0xfa, 0x31, 0x85, 0x81, + 0x6f, 0xef, 0xe9, 0xad, 0x2e, 0x75, 0xa7, 0xef, 0xb3, 0xaf, 0xfb, 0x1f, 0xb6, 0x27, 0xdf, 0x6c, + 0xe2, 0xe1, 0xe7, 0x54, 0xc3, 0x6e, 0x5f, 0x6f, 0x3a, 0xfa, 0x43, 0xd3, 0x43, 0x13, 0x53, 0x6f, + 0x5d, 0xf7, 0x68, 0x0b, 0xcf, 0x58, 0xaf, 0xeb, 0x1d, 0xf3, 0x3a, 0x06, 0x58, 0xbf, 0x1e, 0x70, + 0xe2, 0x35, 0x30, 0x15, 0xf0, 0xf0, 0x2f, 0x59, 0x05, 0x38, 0x8e, 0x2c, 0x01, 0x88, 0x4f, 0x2d, + 0x77, 0x3a, 0xe2, 0x9d, 0xa7, 0x74, 0x32, 0xe9, 0x63, 0xb8, 0x62, 0x07, 0x02, 0xd3, 0x3b, 0x52, + 0x50, 0x61, 0x4d, 0xe2, 0xc0, 0xb4, 0x60, 0x55, 0xb4, 0xc8, 0x17, 0xd3, 0x68, 0x28, 0x71, 0xbf, + 0xb1, 0x29, 0x42, 0x8a, 0x17, 0x23, 0x6b, 0x70, 0x46, 0xf0, 0x0d, 0x52, 0x90, 0x8c, 0x45, 0x67, + 0x85, 0x18, 0x9a, 0x2b, 0x6d, 0xd0, 0x46, 0x43, 0x80, 0xe5, 0x3a, 0x62, 0x25, 0xc8, 0x74, 0x98, + 0x32, 0x79, 0x49, 0x6f, 0x53, 0x57, 0x39, 0x83, 0x1a, 0x7b, 0x79, 0x67, 0x7b, 0x52, 0xf1, 0xcb, + 0x63, 0x00, 0x4c, 0x59, 0x74, 0xd1, 0x22, 0x32, 0x0f, 0xae, 0xf5, 0xe3, 0x29, 0x3c, 0xe2, 0x3a, + 0x1f, 0x2d, 0x42, 0x66, 0x60, 0x34, 0x78, 0x66, 0x72, 0xf7, 0x6e, 0xb5, 0x82, 0x0f, 0x49, 0x45, + 0x0c, 0xd4, 0x58, 0x92, 0x10, 0x99, 0x49, 0xa4, 0x8c, 0x14, 0x9b, 0x83, 0xbf, 0x2c, 0x8d, 0xc5, + 0xe6, 0xe8, 0xa4, 0xc4, 0xe6, 0x58, 0x21, 0x6f, 0xc3, 0x70, 0xf9, 0x7e, 0x4d, 0xc4, 0x1c, 0x71, + 0x95, 0xb3, 0x61, 0xc6, 0x29, 0x7d, 0xd3, 0xad, 0xfb, 0xf1, 0x49, 0xe4, 0xa6, 0xcb, 0xf4, 0x64, + 0x16, 0xc6, 0x22, 0x9e, 0x6a, 0xae, 0x72, 0x0e, 0x39, 0x60, 0xcb, 0x75, 0xc4, 0xd4, 0x1d, 0x81, + 0x92, 0x87, 0x57, 0xb4, 0x10, 0xd3, 0x9a, 0x8a, 0xe9, 0x62, 0xf6, 0x1e, 0x8d, 0x62, 0x78, 0x13, + 0x7c, 0x96, 0x3a, 0xc8, 0xb5, 0xc6, 0x10, 0xa8, 0xba, 0xc3, 0x71, 0x72, 0x8f, 0xc6, 0x8a, 0x91, + 0xf7, 0x81, 0x60, 0xbe, 0x1f, 0x6a, 0xf8, 0x17, 0x97, 0xd5, 0x8a, 0xab, 0x5c, 0xc0, 0x00, 0xe0, + 0x24, 0x1e, 0x4e, 0xa1, 0x5a, 0x99, 0xbe, 0x22, 0xa6, 0x8f, 0xa7, 0x75, 0x5e, 0xaa, 0xee, 0x87, + 0x52, 0xa8, 0x9b, 0x91, 0x64, 0xc8, 0x29, 0x5c, 0xc9, 0x26, 0x5c, 0x5c, 0x71, 0xe8, 0x43, 0xd3, + 0xee, 0xba, 0xfe, 0xf2, 0xe1, 0xcf, 0x5b, 0x17, 0x77, 0x9d, 0xb7, 0x9e, 0x15, 0x15, 0x9f, 0xef, + 0x38, 0xf4, 0x61, 0xdd, 0x0f, 0xfb, 0x1c, 0x89, 0x5a, 0x9a, 0xc5, 0x1d, 0x53, 0x3a, 0x7f, 0xd0, + 0x75, 0xa8, 0x80, 0x9b, 0xd4, 0x55, 0x94, 0x70, 0xaa, 0xe5, 0x91, 0x6a, 0xcc, 0x00, 0x17, 0x49, + 0xe9, 0x1c, 0x2d, 0x46, 0x34, 0x20, 0xb7, 0x66, 0xfc, 0x4b, 0xec, 0x72, 0x83, 0x27, 0xbe, 0x55, + 0x9e, 0x40, 0x66, 0x2a, 0x13, 0x4b, 0xb3, 0x11, 0x84, 0x80, 0xaf, 0xeb, 0x02, 0x2f, 0x8b, 0x25, + 0x59, 0x9a, 0x2c, 0xc0, 0xf8, 0x8a, 0x83, 0x47, 0x6a, 0x77, 0xe8, 0xd6, 0x8a, 0xdd, 0x32, 0x1b, + 0x5b, 0xf8, 0x3a, 0x56, 0x4c, 0x95, 0x1d, 0x8e, 0xab, 0x3f, 0xa0, 0x5b, 0xf5, 0x0e, 0x62, 0xe5, + 0x65, 0x25, 0x5e, 0x52, 0x0e, 0xc9, 0xfc, 0xe4, 0xde, 0x42, 0x32, 0x53, 0x18, 0x17, 0x57, 0xe0, + 0x8f, 0x3c, 0x6a, 0xb1, 0xa5, 0xde, 0x15, 0x2f, 0x61, 0x95, 0xd8, 0x95, 0x79, 0x80, 0xe7, 0x53, + 0x87, 0x18, 0x65, 0x34, 0x00, 0xcb, 0x0d, 0x8b, 0x17, 0x49, 0xc6, 0x2d, 0x7e, 0xea, 0x00, 0x71, + 0x8b, 0xff, 0x4e, 0x41, 0x9e, 0x7f, 0xc9, 0x65, 0x28, 0x4a, 0x69, 0x85, 0x30, 0x28, 0x2b, 0x86, + 0x60, 0x2f, 0x8a, 0x58, 0xd3, 0x43, 0xc2, 0x76, 0x09, 0xa2, 0xef, 0x60, 0x1e, 0xc9, 0x30, 0x50, + 0xa7, 0x16, 0x12, 0x60, 0x0e, 0xbf, 0xee, 0x5a, 0xcb, 0x6c, 0x60, 0x60, 0xfe, 0x82, 0x14, 0x6e, + 0x03, 0xa1, 0x3c, 0x2e, 0xbf, 0x44, 0x42, 0x6e, 0xc0, 0xb0, 0x7f, 0x94, 0x1b, 0x06, 0x25, 0xc6, + 0x78, 0xed, 0x62, 0xb6, 0x16, 0xe1, 0xe0, 0x25, 0x22, 0xf2, 0x06, 0x40, 0x38, 0x1d, 0x08, 0x4b, + 0x0b, 0x97, 0x0a, 0x79, 0xf6, 0x90, 0x97, 0x8a, 0x90, 0x9a, 0x4d, 0x9c, 0xb2, 0x3a, 0xfa, 0x59, + 0x4b, 0x71, 0xe2, 0x8c, 0xe8, 0xb0, 0xac, 0x20, 0xd1, 0x22, 0x64, 0x19, 0x26, 0x12, 0x1a, 0x28, + 0x42, 0x18, 0x63, 0xe6, 0xfa, 0x14, 0xf5, 0x95, 0x17, 0xe6, 0x44, 0x59, 0xf2, 0x1c, 0x14, 0xee, + 0x6a, 0x55, 0x11, 0x46, 0x95, 0x47, 0xe0, 0x8d, 0xc4, 0x58, 0x62, 0x58, 0xf5, 0x47, 0xf3, 0x89, + 0xb5, 0x89, 0x49, 0x4f, 0xb0, 0x92, 0x7a, 0x10, 0xa5, 0xe7, 0xd7, 0xcf, 0xa5, 0x27, 0x11, 0x91, + 0xab, 0x30, 0xb8, 0xc2, 0x66, 0x86, 0x86, 0xdd, 0x12, 0xfd, 0x89, 0x01, 0xb1, 0x3a, 0x02, 0xa6, + 0x05, 0x58, 0x72, 0x43, 0x4a, 0xb6, 0x2b, 0x45, 0x26, 0xf7, 0x93, 0xed, 0xc6, 0x43, 0x74, 0x63, + 0xda, 0xdd, 0x1b, 0xb1, 0xe4, 0x5d, 0xa2, 0x4c, 0xca, 0xba, 0x18, 0x26, 0xeb, 0x0a, 0xac, 0xd2, + 0xfe, 0xdd, 0xac, 0x52, 0xf5, 0xef, 0xe5, 0x92, 0xe3, 0x8c, 0xdc, 0x4c, 0x06, 0x09, 0xc6, 0x45, + 0x28, 0x00, 0xca, 0xb5, 0x06, 0xe1, 0x82, 0x23, 0xe1, 0x7e, 0xf3, 0x07, 0x0e, 0xf7, 0x5b, 0xd8, + 0x67, 0xb8, 0x5f, 0xf5, 0xff, 0x2d, 0xf6, 0x74, 0xd9, 0x3e, 0x96, 0xb0, 0x70, 0xaf, 0xb3, 0x9d, + 0x15, 0xab, 0xbd, 0xec, 0x26, 0xf6, 0x07, 0xdc, 0x23, 0xb5, 0xae, 0xf3, 0xa1, 0xe5, 0x6a, 0x51, + 0x4a, 0xf2, 0x0e, 0x8c, 0xf8, 0x1f, 0x80, 0x61, 0xa4, 0xa5, 0xf0, 0xc7, 0xc1, 0xaa, 0x16, 0x0b, + 0xb8, 0x1c, 0x29, 0x40, 0x5e, 0x81, 0x21, 0xb4, 0x69, 0x3a, 0x7a, 0xc3, 0x8f, 0x31, 0xce, 0x83, + 0x92, 0xfb, 0x40, 0x39, 0xf4, 0x59, 0x40, 0x49, 0xbe, 0x00, 0x25, 0x91, 0x68, 0x83, 0xe7, 0xa1, + 0xbf, 0xbe, 0x07, 0x1f, 0xf7, 0x29, 0x39, 0xc9, 0x06, 0xdf, 0xa5, 0x20, 0x20, 0xb2, 0x4b, 0xe1, + 0xf9, 0x35, 0x56, 0xe1, 0xec, 0x8a, 0x43, 0x0d, 0x7c, 0x4d, 0x31, 0xfb, 0xa8, 0xe3, 0x88, 0x14, + 0x28, 0x7c, 0x94, 0xe3, 0x22, 0xd5, 0xf1, 0xd1, 0x6c, 0xf9, 0x14, 0x78, 0x39, 0xd0, 0x71, 0x4a, + 0x71, 0x66, 0xb9, 0xf0, 0x96, 0xdc, 0xa1, 0x5b, 0x9b, 0xb6, 0x63, 0xf0, 0x2c, 0x21, 0x62, 0xfe, + 0x16, 0x82, 0x7e, 0x20, 0x50, 0xb2, 0xe5, 0x12, 0x2d, 0x74, 0xe9, 0x75, 0x18, 0x3e, 0x68, 0xa2, + 0x8a, 0x5f, 0xcd, 0x67, 0x3c, 0x7e, 0x7a, 0x7c, 0x73, 0x05, 0x06, 0x09, 0xac, 0xfb, 0x33, 0x12, + 0x58, 0x7f, 0x37, 0x9f, 0xf1, 0xb2, 0xeb, 0xb1, 0x4e, 0x34, 0x1b, 0x08, 0x23, 0x9a, 0x68, 0x36, + 0xcc, 0xf1, 0x6b, 0x1a, 0x9a, 0x4c, 0x14, 0x4b, 0x49, 0x5d, 0xda, 0x35, 0x25, 0xf5, 0x2f, 0x16, + 0x7a, 0xbd, 0x7c, 0x3b, 0x95, 0xfd, 0x7e, 0x64, 0x7f, 0x03, 0x86, 0x03, 0xc9, 0x56, 0x2b, 0x68, + 0xf4, 0x8c, 0x06, 0x69, 0x71, 0x38, 0x18, 0xcb, 0x48, 0x44, 0xe4, 0x1a, 0x6f, 0x6b, 0xcd, 0xfc, + 0x80, 0x27, 0x68, 0x18, 0x15, 0xa1, 0xf7, 0x75, 0x4f, 0xaf, 0xbb, 0xe6, 0x07, 0x54, 0x0b, 0xd0, + 0xea, 0x7f, 0x9e, 0x4f, 0x7d, 0x3e, 0x78, 0xda, 0x47, 0xfb, 0xe8, 0xa3, 0x14, 0x21, 0xf2, 0x87, + 0x8f, 0xa7, 0x42, 0xdc, 0x87, 0x10, 0xff, 0x24, 0x9f, 0xfa, 0x4c, 0xf4, 0x54, 0x88, 0xfb, 0x99, + 0x2d, 0x5e, 0x80, 0x21, 0xcd, 0xde, 0x74, 0x67, 0x70, 0x63, 0xc3, 0xe7, 0x0a, 0x9c, 0xa8, 0x1d, + 0x7b, 0xd3, 0xad, 0xe3, 0x96, 0x45, 0x0b, 0x09, 0xd4, 0xef, 0xe5, 0x7b, 0x3c, 0xa4, 0x3d, 0x15, + 0xfc, 0x87, 0xb9, 0x44, 0xfe, 0x46, 0x3e, 0xf2, 0x50, 0xf7, 0xf1, 0x15, 0xf6, 0x75, 0x80, 0x5a, + 0x63, 0x83, 0xb6, 0x75, 0x29, 0xc9, 0x15, 0x9e, 0x3b, 0xb8, 0x08, 0x15, 0xc9, 0x91, 0x43, 0x12, + 0xf5, 0x9b, 0xf9, 0xd8, 0x4b, 0xe5, 0x53, 0xd9, 0xed, 0x59, 0x76, 0x81, 0xd6, 0x89, 0xc7, 0xd7, + 0xa7, 0x92, 0xdb, 0xab, 0xe4, 0x7e, 0x22, 0x1f, 0x7b, 0xa7, 0xfe, 0xd8, 0xca, 0x8e, 0x0d, 0xc0, + 0xe4, 0xfb, 0xf9, 0xc7, 0x56, 0x93, 0x5e, 0x80, 0x21, 0x21, 0x87, 0x60, 0xa9, 0xe0, 0xf3, 0x3e, + 0x07, 0xe2, 0x29, 0x6b, 0x40, 0xa0, 0xfe, 0xa9, 0x3c, 0x44, 0xe3, 0x07, 0x3c, 0xa6, 0x3a, 0xf4, + 0x1b, 0xf9, 0x68, 0xe4, 0x84, 0xc7, 0x57, 0x7f, 0xa6, 0x00, 0x6a, 0xdd, 0xb5, 0x86, 0x08, 0xbc, + 0xdb, 0x2f, 0x1d, 0xd3, 0x07, 0x50, 0x4d, 0xa2, 0x50, 0xff, 0xbf, 0x7c, 0x6a, 0x38, 0x87, 0xc7, + 0x57, 0x80, 0x2f, 0xe3, 0xa9, 0x78, 0xc3, 0x0a, 0x27, 0x72, 0x3c, 0x84, 0x64, 0xe3, 0x2f, 0x91, + 0x19, 0xd1, 0x27, 0x24, 0x9f, 0x4e, 0x31, 0xd7, 0x30, 0x6f, 0x43, 0x68, 0xae, 0xc9, 0xd7, 0x10, + 0x92, 0xe1, 0xf6, 0x7b, 0xf9, 0xdd, 0xa2, 0x5f, 0x3c, 0xce, 0xab, 0xea, 0xc0, 0x8a, 0xbe, 0x85, + 0x51, 0x1a, 0x59, 0x4f, 0x8c, 0xf0, 0xbc, 0x7d, 0x1d, 0x0e, 0x92, 0xef, 0xde, 0x04, 0x95, 0xfa, + 0xcf, 0xfa, 0xd3, 0x43, 0x2f, 0x3c, 0xbe, 0x22, 0xbc, 0x0c, 0xc5, 0x15, 0xdd, 0xdb, 0x10, 0x9a, + 0x8c, 0x57, 0x7a, 0x1d, 0xdd, 0xdb, 0xd0, 0x10, 0x4a, 0xae, 0xc1, 0xa0, 0xa6, 0x6f, 0xf2, 0x33, + 0xcf, 0x52, 0x98, 0x53, 0xd1, 0xd1, 0x37, 0xeb, 0xfc, 0xdc, 0x33, 0x40, 0x13, 0x35, 0xc8, 0xe9, + 0xc9, 0x4f, 0xbe, 0x31, 0xa1, 0x1c, 0xcf, 0xe9, 0x19, 0x64, 0xf2, 0xbc, 0x0c, 0xc5, 0x69, 0xdb, + 0xd8, 0xc2, 0xeb, 0xab, 0x11, 0x5e, 0xd9, 0x9a, 0x6d, 0x6c, 0x69, 0x08, 0x25, 0x3f, 0x99, 0x83, + 0x81, 0x79, 0xaa, 0x1b, 0x6c, 0x84, 0x0c, 0xf5, 0xf2, 0x3a, 0xf9, 0xdc, 0xd1, 0x78, 0x9d, 0x4c, + 0x6c, 0xf0, 0xca, 0x64, 0x45, 0x11, 0xf5, 0x93, 0x5b, 0x30, 0x38, 0xa3, 0x7b, 0xb4, 0x69, 0x3b, + 0x5b, 0xe8, 0x47, 0x33, 0x16, 0xba, 0xef, 0x47, 0xf4, 0xc7, 0x27, 0xe2, 0x37, 0x63, 0x0d, 0xf1, + 0x4b, 0x0b, 0x0a, 0x33, 0xb1, 0xac, 0xea, 0x4e, 0x93, 0x7a, 0x22, 0x7f, 0x35, 0x8a, 0xc5, 0x43, + 0x88, 0x26, 0x30, 0xe1, 0xb1, 0xf2, 0x48, 0xfa, 0xb1, 0x32, 0x5a, 0x8f, 0xe8, 0x6b, 0x87, 0x99, + 0x34, 0x47, 0x71, 0xd1, 0xe7, 0xd6, 0x23, 0x42, 0x31, 0x91, 0xa6, 0x26, 0x91, 0xa8, 0xdf, 0xe9, + 0x87, 0xd4, 0x87, 0xda, 0xa7, 0x4a, 0x7e, 0xaa, 0xe4, 0xa1, 0x92, 0x57, 0x12, 0x4a, 0x7e, 0x29, + 0xf9, 0xf4, 0xff, 0x23, 0xaa, 0xe1, 0x3f, 0x57, 0x4c, 0x04, 0x0e, 0x79, 0xbc, 0x77, 0x97, 0xa1, + 0xf4, 0xfa, 0x77, 0x95, 0x5e, 0x30, 0x20, 0x4a, 0xbb, 0x0e, 0x88, 0x81, 0xbd, 0x0e, 0x88, 0xc1, + 0xcc, 0x01, 0x11, 0x2a, 0xc8, 0x50, 0xa6, 0x82, 0x54, 0xc5, 0xa0, 0x81, 0xde, 0xf9, 0x4b, 0x2e, + 0xef, 0x6c, 0x4f, 0x8e, 0xb1, 0xd1, 0x94, 0x9a, 0xb8, 0x04, 0x59, 0xa8, 0xbf, 0x5f, 0xec, 0x11, + 0xed, 0xe7, 0x58, 0x74, 0xe4, 0x65, 0x28, 0x94, 0x3b, 0x1d, 0xa1, 0x1f, 0x67, 0xa5, 0x40, 0x43, + 0x19, 0xa5, 0x18, 0x35, 0x79, 0x03, 0x0a, 0xe5, 0xfb, 0xb5, 0x78, 0xce, 0x92, 0xf2, 0xfd, 0x9a, + 0xf8, 0x92, 0xcc, 0xb2, 0xf7, 0x6b, 0xe4, 0xad, 0x30, 0x78, 0xe8, 0x46, 0xd7, 0x7a, 0x20, 0x36, + 0x8a, 0xc2, 0xdd, 0xd6, 0x77, 0xc7, 0x69, 0x30, 0x14, 0xdb, 0x2e, 0xc6, 0x68, 0x63, 0xda, 0x54, + 0xda, 0xbb, 0x36, 0x0d, 0xec, 0xaa, 0x4d, 0x83, 0x7b, 0xd5, 0xa6, 0xa1, 0x3d, 0x68, 0x13, 0xec, + 0xaa, 0x4d, 0xc3, 0x87, 0xd7, 0xa6, 0x0e, 0x5c, 0x4a, 0x46, 0x68, 0x0b, 0x34, 0x42, 0x03, 0x92, + 0xc4, 0x0a, 0xc7, 0x12, 0xbc, 0xfa, 0xef, 0x72, 0x6c, 0x7d, 0x13, 0xd1, 0x75, 0x97, 0xe1, 0x65, + 0xff, 0xb4, 0x64, 0x69, 0xf5, 0x57, 0xf3, 0xd9, 0x81, 0xe5, 0x4e, 0xe6, 0x14, 0xf7, 0x43, 0xa9, + 0x52, 0x2a, 0x46, 0x1f, 0xfa, 0x67, 0x4b, 0x39, 0xc6, 0x36, 0x4d, 0x66, 0xdf, 0xc8, 0x67, 0x45, + 0xbb, 0x3b, 0x94, 0xc4, 0x3e, 0x9e, 0xf4, 0x68, 0x43, 0x3f, 0x7d, 0x37, 0xea, 0xca, 0x36, 0x07, + 0x23, 0xb2, 0x10, 0x85, 0x94, 0xf6, 0x22, 0xe0, 0x48, 0x39, 0xf2, 0x56, 0x90, 0x5a, 0x46, 0xf2, + 0x8f, 0x41, 0x77, 0x35, 0x7f, 0xcc, 0xc6, 0xdc, 0x63, 0x64, 0x72, 0xf2, 0x02, 0x94, 0xe6, 0x30, + 0x56, 0xbb, 0x3c, 0xd8, 0x79, 0xf4, 0x76, 0xd9, 0x6b, 0x85, 0xd3, 0xa8, 0x7f, 0x2f, 0x07, 0x67, + 0xef, 0x74, 0xd7, 0xa8, 0xf0, 0x96, 0x0b, 0xda, 0xf0, 0x3e, 0x00, 0x03, 0x0b, 0x87, 0x99, 0x1c, + 0x3a, 0xcc, 0x7c, 0x52, 0x8e, 0x8a, 0x17, 0x2b, 0x30, 0x15, 0x52, 0x73, 0x67, 0x99, 0xa7, 0x7c, + 0xc7, 0xd1, 0x07, 0xdd, 0x35, 0x5a, 0x4f, 0x78, 0xcd, 0x48, 0xdc, 0x2f, 0xbd, 0xcd, 0x5d, 0xf2, + 0x0f, 0xea, 0xa0, 0xf2, 0x2b, 0xf9, 0xcc, 0x40, 0x84, 0x27, 0x36, 0x63, 0xe6, 0x0f, 0xa4, 0xf6, + 0x4a, 0x3c, 0x73, 0x66, 0x0a, 0x49, 0x8c, 0x63, 0x1a, 0x97, 0x74, 0x81, 0x9d, 0xf0, 0x3c, 0xae, + 0x1f, 0xaa, 0xc0, 0xfe, 0x28, 0x97, 0x19, 0x30, 0xf2, 0xa4, 0x0a, 0x4c, 0xfd, 0x5f, 0x0b, 0x7e, + 0x9c, 0xca, 0x43, 0x7d, 0xc2, 0x0b, 0x30, 0x24, 0x9e, 0xeb, 0x47, 0x9d, 0x7d, 0xc5, 0xb1, 0x21, + 0x1e, 0x43, 0x07, 0x04, 0xcc, 0xa4, 0x90, 0x3c, 0x91, 0x25, 0x67, 0x5f, 0xc9, 0x0b, 0x59, 0x93, + 0x48, 0x98, 0xd1, 0x30, 0xfb, 0xc8, 0xf4, 0xd0, 0x02, 0x61, 0x7d, 0x59, 0xe0, 0x46, 0x03, 0x7d, + 0x64, 0x7a, 0xdc, 0xfe, 0x08, 0xd0, 0xcc, 0x20, 0xa8, 0x85, 0x59, 0xea, 0x85, 0x41, 0xe0, 0x8a, + 0x64, 0xfd, 0xe2, 0x89, 0xda, 0x0b, 0x30, 0x24, 0x3c, 0x68, 0x85, 0x4b, 0x8b, 0x68, 0xad, 0xf0, + 0xb9, 0xc5, 0xd6, 0x06, 0x04, 0x8c, 0xa3, 0x46, 0x9b, 0xa1, 0x13, 0x1f, 0x72, 0x74, 0x10, 0xa2, + 0x09, 0x0c, 0xb9, 0x01, 0x63, 0x35, 0x4f, 0xb7, 0x0c, 0xdd, 0x31, 0x96, 0xbb, 0x5e, 0xa7, 0xeb, + 0xc9, 0x06, 0xb0, 0xeb, 0x19, 0x76, 0xd7, 0xd3, 0x62, 0x14, 0xe4, 0x53, 0x30, 0xea, 0x43, 0x66, + 0x1d, 0xc7, 0x76, 0x64, 0x2b, 0xc7, 0xf5, 0x0c, 0xea, 0x38, 0x5a, 0x94, 0x80, 0x7c, 0x1a, 0x46, + 0xab, 0xd6, 0x43, 0xbb, 0xc1, 0x9f, 0xac, 0x6b, 0x0b, 0xc2, 0xe6, 0xc1, 0x67, 0x5f, 0x66, 0x80, + 0xa8, 0x77, 0x9d, 0x96, 0x16, 0x25, 0x54, 0x77, 0xf2, 0xc9, 0x70, 0x9e, 0x8f, 0xef, 0x06, 0xe9, + 0x5a, 0xd4, 0x71, 0x0f, 0xbd, 0x55, 0xd1, 0xf8, 0x94, 0xfd, 0x86, 0xb9, 0x0d, 0x7a, 0x03, 0x06, + 0xef, 0xd0, 0x2d, 0xee, 0x63, 0x5a, 0x0a, 0xdd, 0x92, 0x1f, 0x08, 0x98, 0x7c, 0xba, 0xeb, 0xd3, + 0xa9, 0xdf, 0xca, 0x27, 0x03, 0x95, 0x3e, 0xbe, 0xc2, 0xfe, 0x14, 0x0c, 0xa0, 0x28, 0xab, 0xfe, + 0xf5, 0x02, 0x0a, 0x10, 0xc5, 0x1d, 0xf5, 0x76, 0xf6, 0xc9, 0xd4, 0x5f, 0x28, 0xc5, 0xa3, 0xd7, + 0x3e, 0xbe, 0xd2, 0x7b, 0x13, 0x86, 0x67, 0x6c, 0xcb, 0x35, 0x5d, 0x8f, 0x5a, 0x0d, 0x5f, 0x61, + 0x9f, 0x60, 0x06, 0x55, 0x23, 0x04, 0xcb, 0x36, 0xa0, 0x44, 0x7d, 0x10, 0xe5, 0x25, 0xaf, 0xc2, + 0x10, 0x8a, 0x1c, 0x6d, 0x4e, 0x3e, 0xe1, 0xe1, 0xcd, 0xc4, 0x1a, 0x03, 0xc6, 0x2d, 0xce, 0x90, + 0x94, 0xdc, 0x85, 0xc1, 0x99, 0x0d, 0xb3, 0x65, 0x38, 0xd4, 0x42, 0xdf, 0x64, 0x29, 0x48, 0x48, + 0xb4, 0x2f, 0xa7, 0xf0, 0x5f, 0xa4, 0xe5, 0xcd, 0x69, 0x88, 0x62, 0x91, 0x17, 0x5f, 0x02, 0x76, + 0xe9, 0x67, 0xf3, 0x00, 0x61, 0x01, 0xf2, 0x0c, 0xe4, 0x83, 0x04, 0xd0, 0xe8, 0x12, 0x13, 0xd1, + 0xa0, 0x3c, 0x2e, 0x15, 0x62, 0x6c, 0xe7, 0x77, 0x1d, 0xdb, 0x77, 0xa1, 0xc4, 0x4f, 0xd7, 0xd0, + 0x6b, 0x5d, 0x0a, 0xa8, 0x99, 0xd9, 0xe0, 0x29, 0xa4, 0xe7, 0xb6, 0x34, 0x5a, 0x9e, 0x11, 0x0f, + 0x70, 0xce, 0xec, 0x52, 0x03, 0xfa, 0xf1, 0x2f, 0x72, 0x05, 0x8a, 0xab, 0x7e, 0xf2, 0xd8, 0x51, + 0x3e, 0x4b, 0xc7, 0xe4, 0x87, 0x78, 0xd6, 0x4d, 0x33, 0xb6, 0xe5, 0xb1, 0xaa, 0xb1, 0xd5, 0x23, + 0x42, 0x2e, 0x02, 0x16, 0x91, 0x8b, 0x80, 0xa9, 0xff, 0x75, 0x3e, 0x25, 0xae, 0xf2, 0xe3, 0x3b, + 0x4c, 0x5e, 0x07, 0xc0, 0xe7, 0xe3, 0x4c, 0x9e, 0xfe, 0x73, 0x10, 0x1c, 0x25, 0xc8, 0x08, 0xd5, + 0x36, 0xb2, 0xed, 0x08, 0x89, 0xd5, 0x7f, 0x90, 0x4b, 0x04, 0xe3, 0x3d, 0x94, 0x1c, 0x65, 0xab, + 0x2c, 0x7f, 0x40, 0x33, 0xd6, 0xef, 0x8b, 0xc2, 0xfe, 0xfa, 0x22, 0xfa, 0x2d, 0x47, 0x60, 0x99, + 0x1e, 0xe7, 0xb7, 0x7c, 0x27, 0x9f, 0x16, 0x9a, 0xf8, 0x64, 0xaa, 0xf8, 0xcd, 0xc0, 0x28, 0x2d, + 0xc6, 0x82, 0xc1, 0x23, 0x34, 0x9e, 0xe0, 0x5a, 0x98, 0xa9, 0x5f, 0x84, 0x33, 0xb1, 0x80, 0xbd, + 0x22, 0xd7, 0xf0, 0x95, 0xde, 0x91, 0x7f, 0xb3, 0x03, 0x0f, 0x44, 0xc8, 0xd4, 0xff, 0x3f, 0xd7, + 0x3b, 0x5c, 0xf3, 0xb1, 0xab, 0x4e, 0x8a, 0x00, 0x0a, 0xff, 0x7a, 0x04, 0x70, 0x04, 0xdb, 0xe0, + 0x93, 0x2d, 0x80, 0x8f, 0xc8, 0xe4, 0xf1, 0x61, 0x0b, 0xe0, 0x17, 0x72, 0xbb, 0x46, 0xdb, 0x3e, + 0x6e, 0x19, 0xa8, 0xff, 0x53, 0x2e, 0x35, 0x2a, 0xf6, 0xa1, 0xda, 0xf5, 0x16, 0x94, 0xb8, 0x0b, + 0x8f, 0x68, 0x95, 0x94, 0x47, 0x8c, 0x41, 0xb3, 0x32, 0xef, 0x73, 0x2c, 0x59, 0x80, 0x01, 0xde, + 0x06, 0x43, 0xf4, 0xc6, 0xc7, 0x7a, 0x84, 0xe6, 0x36, 0xb2, 0x26, 0x47, 0x81, 0x56, 0xff, 0x7e, + 0x2e, 0x11, 0xa4, 0xfb, 0x18, 0xbf, 0x2d, 0x9c, 0xaa, 0x0b, 0x7b, 0x9f, 0xaa, 0xd5, 0x7f, 0x9a, + 0x4f, 0x8f, 0x11, 0x7e, 0x8c, 0x1f, 0x72, 0x14, 0xc7, 0x69, 0x07, 0x5b, 0xb7, 0x56, 0x61, 0x2c, + 0x2a, 0x0b, 0xb1, 0x6c, 0x3d, 0x9d, 0x1e, 0x29, 0x3d, 0xa3, 0x15, 0x31, 0x1e, 0xea, 0xb7, 0x73, + 0xc9, 0xf0, 0xe6, 0xc7, 0x3e, 0x3f, 0x1d, 0x4c, 0x5b, 0xa2, 0x9f, 0xf2, 0x11, 0x59, 0x6b, 0x8e, + 0xe2, 0x53, 0x3e, 0x22, 0xab, 0xc6, 0xc1, 0x3e, 0xe5, 0x97, 0xf2, 0x59, 0xd1, 0xe1, 0x8f, 0xfd, + 0x83, 0x3e, 0x2f, 0x0b, 0x99, 0xb7, 0x4c, 0x7c, 0xda, 0x33, 0x59, 0xe1, 0xd8, 0x33, 0x78, 0x26, + 0xf8, 0x1c, 0x6c, 0x8c, 0xa7, 0x0a, 0xeb, 0x23, 0xa2, 0xc8, 0x27, 0x43, 0x58, 0x1f, 0x91, 0xa1, + 0xf2, 0xd1, 0x13, 0xd6, 0x6f, 0xe5, 0xf7, 0x9a, 0x92, 0xe0, 0x54, 0x78, 0x09, 0xe1, 0x7d, 0x35, + 0x9f, 0x4c, 0x95, 0x71, 0xec, 0x62, 0x9a, 0x83, 0x92, 0x48, 0xda, 0x91, 0x29, 0x1c, 0x8e, 0xcf, + 0xb2, 0x68, 0xc4, 0x77, 0xdc, 0x04, 0x71, 0x91, 0xb3, 0x37, 0x91, 0x70, 0x5a, 0xf5, 0x7b, 0xb9, + 0x58, 0x5e, 0x89, 0x63, 0x39, 0x42, 0x38, 0xd0, 0x92, 0x44, 0xde, 0xf6, 0x0f, 0x33, 0x8b, 0xb1, + 0xb8, 0xde, 0xc1, 0xf7, 0x54, 0xa8, 0xa7, 0x9b, 0xad, 0x78, 0x79, 0x11, 0x7f, 0xe0, 0x5b, 0x79, + 0x98, 0x48, 0x90, 0x92, 0x2b, 0x91, 0xb0, 0x3d, 0x78, 0x2c, 0x19, 0x73, 0x54, 0xe7, 0x01, 0x7c, + 0xf6, 0x71, 0x92, 0x7a, 0x05, 0x8a, 0x15, 0x7d, 0x8b, 0x7f, 0x5b, 0x3f, 0x67, 0x69, 0xe8, 0x5b, + 0xf2, 0x89, 0x1b, 0xe2, 0xc9, 0x1a, 0x9c, 0xe7, 0xf7, 0x21, 0xa6, 0x6d, 0xad, 0x9a, 0x6d, 0x5a, + 0xb5, 0x16, 0xcd, 0x56, 0xcb, 0x74, 0xc5, 0xa5, 0xde, 0x0b, 0x3b, 0xdb, 0x93, 0x57, 0x3d, 0xdb, + 0xd3, 0x5b, 0x75, 0xea, 0x93, 0xd5, 0x3d, 0xb3, 0x4d, 0xeb, 0xa6, 0x55, 0x6f, 0x23, 0xa5, 0xc4, + 0x32, 0x9d, 0x15, 0xa9, 0xf2, 0x10, 0xee, 0xb5, 0x86, 0x6e, 0x59, 0xd4, 0xa8, 0x5a, 0xd3, 0x5b, + 0x1e, 0xe5, 0x97, 0x81, 0x05, 0x7e, 0x24, 0xc8, 0xdf, 0xa1, 0x73, 0x34, 0x63, 0xbc, 0xc6, 0x08, + 0xb4, 0x94, 0x42, 0xea, 0x6f, 0x17, 0x53, 0x52, 0x8a, 0x9c, 0x20, 0xf5, 0xf1, 0x7b, 0xba, 0xb8, + 0x4b, 0x4f, 0x5f, 0x87, 0x01, 0x11, 0x23, 0x57, 0x5c, 0x30, 0xa0, 0xe3, 0xfc, 0x43, 0x0e, 0x92, + 0x6f, 0x68, 0x04, 0x15, 0x69, 0xc1, 0xa5, 0x55, 0xd6, 0x4d, 0xe9, 0x9d, 0x59, 0x3a, 0x40, 0x67, + 0xf6, 0xe0, 0x47, 0xde, 0x83, 0x8b, 0x88, 0x4d, 0xe9, 0xd6, 0x01, 0xac, 0x0a, 0xe3, 0x61, 0xf1, + 0xaa, 0xd2, 0x3b, 0x37, 0xab, 0x3c, 0xf9, 0x3c, 0x8c, 0x04, 0x03, 0xc4, 0xa4, 0xae, 0xb8, 0xb9, + 0xe8, 0x31, 0xce, 0x78, 0xb0, 0x39, 0x06, 0x46, 0x77, 0xb5, 0x68, 0xc0, 0xb2, 0x08, 0x2f, 0xf5, + 0x7f, 0xcc, 0xf5, 0x4a, 0x6d, 0x72, 0xec, 0xb3, 0xf2, 0xdb, 0x30, 0x60, 0xf0, 0x8f, 0x12, 0x3a, + 0xd5, 0x3b, 0xf9, 0x09, 0x27, 0xd5, 0xfc, 0x32, 0xea, 0x3f, 0xc9, 0xf5, 0xcc, 0xa8, 0x72, 0xd2, + 0x3f, 0xef, 0xab, 0x85, 0x8c, 0xcf, 0x13, 0x93, 0xe8, 0x35, 0x18, 0x37, 0xc3, 0x90, 0xef, 0xf5, + 0x30, 0xd4, 0x95, 0x76, 0x46, 0x82, 0xe3, 0xe8, 0xba, 0x09, 0x81, 0xc3, 0x96, 0xe3, 0x7b, 0xa3, + 0xb9, 0xf5, 0xae, 0x63, 0xf2, 0x71, 0xa9, 0x9d, 0x73, 0x63, 0xae, 0x6a, 0xee, 0x5d, 0xc7, 0x64, + 0x15, 0xe8, 0xde, 0x06, 0xb5, 0xf4, 0xfa, 0xa6, 0xed, 0x3c, 0xc0, 0x88, 0xa6, 0x7c, 0x70, 0x6a, + 0x67, 0x38, 0xfc, 0xbe, 0x0f, 0x26, 0xcf, 0xc1, 0x68, 0xb3, 0xd5, 0xa5, 0x41, 0x0c, 0x49, 0x7e, + 0xd7, 0xa7, 0x8d, 0x30, 0x60, 0x70, 0x43, 0xf2, 0x14, 0x00, 0x12, 0x79, 0x98, 0xef, 0x06, 0x2f, + 0xf6, 0xb4, 0x21, 0x06, 0x59, 0x15, 0xdd, 0x75, 0x89, 0x6b, 0x35, 0x17, 0x52, 0xbd, 0x65, 0x5b, + 0xcd, 0xba, 0x47, 0x9d, 0x36, 0x36, 0x14, 0x9d, 0x19, 0xb4, 0x0b, 0x48, 0x81, 0x57, 0x27, 0xee, + 0x82, 0x6d, 0x35, 0x57, 0xa9, 0xd3, 0x66, 0x4d, 0x7d, 0x01, 0x88, 0x68, 0xaa, 0x83, 0x87, 0x1e, + 0xfc, 0xe3, 0xd0, 0x9b, 0x41, 0x13, 0x1f, 0xc1, 0x4f, 0x43, 0xf0, 0xc3, 0x26, 0x61, 0x98, 0x07, + 0xd2, 0xe3, 0x42, 0x43, 0x17, 0x06, 0x0d, 0x38, 0x08, 0xe5, 0x75, 0x01, 0x84, 0x77, 0x05, 0xf7, + 0x20, 0xd7, 0xc4, 0x2f, 0xf5, 0xcb, 0x85, 0xb4, 0x24, 0x30, 0x87, 0x52, 0xb4, 0x70, 0x5a, 0xcd, + 0xef, 0x6b, 0x5a, 0x3d, 0x63, 0x75, 0xdb, 0x75, 0xbd, 0xd3, 0xa9, 0xaf, 0x9b, 0x2d, 0x7c, 0xc2, + 0x85, 0x0b, 0x9f, 0x36, 0x6a, 0x75, 0xdb, 0xe5, 0x4e, 0x67, 0x8e, 0x03, 0xc9, 0xf3, 0x30, 0xc1, + 0xe8, 0xb0, 0x93, 0x02, 0xca, 0x22, 0x52, 0x32, 0x06, 0x18, 0x89, 0xd6, 0xa7, 0x7d, 0x02, 0x06, + 0x05, 0x4f, 0xbe, 0x56, 0xf5, 0x6b, 0x03, 0x9c, 0x99, 0xcb, 0x7a, 0x2e, 0x60, 0xc3, 0x27, 0xd7, + 0x7e, 0x6d, 0xc8, 0x2f, 0x8f, 0xf1, 0x96, 0xad, 0x6e, 0x9b, 0x47, 0xdf, 0x1a, 0x40, 0x64, 0xf0, + 0x9b, 0x5c, 0x81, 0x31, 0xc6, 0x25, 0x10, 0x18, 0x0f, 0x51, 0xdb, 0xaf, 0xc5, 0xa0, 0xe4, 0x06, + 0x9c, 0x8b, 0x40, 0xb8, 0x0d, 0xca, 0x9f, 0x24, 0xf4, 0x6b, 0xa9, 0x38, 0xf5, 0x9b, 0x85, 0x68, + 0x6a, 0x9a, 0x63, 0xe8, 0x88, 0x8b, 0x30, 0x60, 0x3b, 0xcd, 0x7a, 0xd7, 0x69, 0x89, 0xb1, 0x57, + 0xb2, 0x9d, 0xe6, 0x5d, 0xa7, 0x45, 0xce, 0x43, 0x89, 0xf5, 0x8e, 0x69, 0x88, 0x21, 0xd6, 0xaf, + 0x77, 0x3a, 0x55, 0x83, 0x94, 0x79, 0x87, 0x60, 0x78, 0xd3, 0x7a, 0x03, 0xb7, 0xf6, 0xdc, 0x29, + 0xa1, 0x9f, 0xaf, 0x78, 0x09, 0x24, 0xf6, 0x13, 0x06, 0x3d, 0xe5, 0x07, 0x01, 0x31, 0x16, 0x06, + 0x6e, 0x4b, 0x0c, 0xde, 0x27, 0x71, 0x16, 0x02, 0x19, 0xb2, 0xe0, 0x9b, 0x18, 0x83, 0x54, 0x80, + 0x84, 0x54, 0x6d, 0xdb, 0x30, 0xd7, 0x4d, 0xca, 0x5f, 0x90, 0xf4, 0xf3, 0x8b, 0xdf, 0x24, 0x56, + 0x1b, 0xf7, 0x99, 0x2c, 0x0a, 0x08, 0x79, 0x93, 0x2b, 0x21, 0xa7, 0xc3, 0xb5, 0x8f, 0xf7, 0x2d, + 0xb7, 0xd3, 0x62, 0x28, 0xd4, 0x4c, 0x2c, 0x8f, 0x0b, 0xa1, 0xfa, 0xd7, 0x8a, 0xc9, 0xfc, 0x44, + 0xc7, 0x62, 0xd7, 0xcc, 0x03, 0x88, 0xf4, 0x63, 0xe1, 0xe5, 0x5a, 0xe0, 0xdd, 0x1e, 0x62, 0x32, + 0x78, 0x48, 0x65, 0xc9, 0x35, 0x18, 0xe4, 0x5f, 0x54, 0xad, 0x08, 0x7b, 0x07, 0x5d, 0xc4, 0xdc, + 0x8e, 0xb9, 0xbe, 0x8e, 0xfe, 0x64, 0x01, 0x9a, 0x5c, 0x81, 0x81, 0xca, 0x52, 0xad, 0x56, 0x5e, + 0xf2, 0x6f, 0x8a, 0xf1, 0x2d, 0x8b, 0x61, 0xb9, 0x75, 0x57, 0xb7, 0x5c, 0xcd, 0x47, 0x92, 0xe7, + 0xa0, 0x54, 0x5d, 0x41, 0x32, 0xfe, 0x42, 0x73, 0x78, 0x67, 0x7b, 0x72, 0xc0, 0xec, 0x70, 0x2a, + 0x81, 0xc2, 0x7a, 0xef, 0x55, 0x2b, 0x92, 0xbb, 0x04, 0xaf, 0xf7, 0xa1, 0x69, 0xe0, 0xb5, 0xb3, + 0x16, 0xa0, 0xc9, 0x2b, 0x30, 0x52, 0xa3, 0x8e, 0xa9, 0xb7, 0x96, 0xba, 0xb8, 0x55, 0x94, 0xc2, + 0x36, 0xba, 0x08, 0xaf, 0x5b, 0x88, 0xd0, 0x22, 0x64, 0xe4, 0x32, 0x14, 0xe7, 0x4d, 0xcb, 0x7f, + 0x2e, 0x81, 0xfe, 0xf4, 0x1b, 0xa6, 0xe5, 0x69, 0x08, 0x25, 0xcf, 0x41, 0xe1, 0xf6, 0x6a, 0x55, + 0x78, 0x82, 0x21, 0xaf, 0xf7, 0xbd, 0x48, 0x08, 0xc8, 0xdb, 0xab, 0x55, 0xf2, 0x0a, 0x0c, 0xb1, + 0x45, 0x8c, 0x5a, 0x0d, 0xea, 0x2a, 0xc3, 0xf8, 0x31, 0x3c, 0x64, 0xa1, 0x0f, 0x94, 0x7d, 0x3a, + 0x02, 0x4a, 0xf5, 0xff, 0xcc, 0xa7, 0x27, 0x90, 0x3a, 0x86, 0xa1, 0x7e, 0xc0, 0x5b, 0xe4, 0x98, + 0x82, 0x15, 0x0f, 0xa1, 0x60, 0xeb, 0x70, 0xa6, 0x6c, 0xb4, 0x4d, 0xab, 0x8c, 0x3f, 0xdd, 0xc5, + 0xb9, 0x32, 0x4e, 0x1d, 0xd2, 0x53, 0xc0, 0x18, 0x5a, 0x7c, 0x0f, 0x0f, 0x2e, 0xcc, 0x50, 0x75, + 0x9d, 0xe3, 0xea, 0xed, 0x75, 0xbd, 0xde, 0xe0, 0xb9, 0x97, 0xb4, 0x38, 0x53, 0xf5, 0x67, 0xf2, + 0xbb, 0xe4, 0xbc, 0x7a, 0x1c, 0xa5, 0xaf, 0x7e, 0x2d, 0xdf, 0x3b, 0xed, 0xd8, 0x63, 0x29, 0x94, + 0x3f, 0xc9, 0xa7, 0x24, 0x01, 0x3b, 0x94, 0x24, 0xae, 0xc1, 0x20, 0x67, 0x13, 0xb8, 0xf1, 0xe2, + 0x6c, 0xc6, 0x95, 0x15, 0x67, 0x51, 0x1f, 0x4d, 0x96, 0xe0, 0x5c, 0x79, 0x7d, 0x9d, 0x36, 0xbc, + 0x30, 0xcc, 0xf4, 0x52, 0x18, 0xf0, 0x95, 0x87, 0xd5, 0x15, 0xf8, 0x30, 0x4c, 0x35, 0x06, 0x36, + 0x49, 0x2d, 0x47, 0x56, 0xe1, 0x42, 0x1c, 0x5e, 0xe3, 0x5b, 0x80, 0xa2, 0x14, 0x69, 0x37, 0xc1, + 0x91, 0xff, 0xa7, 0x65, 0x94, 0x4d, 0x6b, 0x25, 0x4e, 0xd5, 0xfd, 0xbd, 0x5a, 0x89, 0xf3, 0x76, + 0x6a, 0x39, 0xf5, 0x5b, 0x05, 0x39, 0x57, 0xda, 0xe3, 0xeb, 0x70, 0x75, 0x33, 0xe2, 0x66, 0xbd, + 0xd7, 0x21, 0xf3, 0x8a, 0x88, 0x56, 0x62, 0x74, 0x1d, 0xdf, 0x23, 0x31, 0x88, 0x96, 0x80, 0x40, + 0x79, 0x1d, 0x0a, 0x28, 0x49, 0x15, 0x8a, 0x65, 0xa7, 0xc9, 0xcd, 0xdb, 0xdd, 0x1e, 0x70, 0xe9, + 0x4e, 0xd3, 0x4d, 0x7f, 0xc0, 0xc5, 0x58, 0xa8, 0x7f, 0x36, 0xdf, 0x23, 0xbd, 0xd9, 0x63, 0x39, + 0x89, 0xfc, 0x85, 0x7c, 0x56, 0xa2, 0xb2, 0x93, 0xea, 0x3a, 0xf6, 0x21, 0x0b, 0xe7, 0x64, 0xfb, + 0xd5, 0x1d, 0xa1, 0x70, 0xfe, 0x30, 0x9f, 0x95, 0x75, 0xed, 0x54, 0x38, 0x07, 0x9b, 0x20, 0x53, + 0x45, 0xfa, 0x18, 0xdb, 0xdc, 0xb2, 0x2a, 0xf4, 0x1f, 0xd0, 0x7d, 0x2a, 0x4d, 0xa4, 0xa7, 0x43, + 0xf8, 0x50, 0x5a, 0xfa, 0x47, 0xf9, 0xcc, 0xec, 0x82, 0xa7, 0x32, 0x3d, 0x4a, 0x99, 0x9e, 0x0e, + 0xfd, 0x43, 0x0d, 0xfd, 0x54, 0x99, 0x9e, 0x8e, 0xfd, 0x43, 0xe9, 0xe9, 0x1f, 0xe4, 0xd3, 0xf3, + 0x67, 0x1e, 0x83, 0x92, 0x1e, 0x85, 0x87, 0xa3, 0xdf, 0x0d, 0xc5, 0x43, 0x75, 0x43, 0xff, 0x21, + 0xac, 0xa8, 0xa4, 0x40, 0x8f, 0x6d, 0xd4, 0x7f, 0xbf, 0x0a, 0xf4, 0x08, 0x86, 0xfc, 0xe3, 0x2c, + 0xd0, 0x9f, 0x2a, 0x24, 0x73, 0xc6, 0x3e, 0xae, 0x6b, 0x92, 0x73, 0xc0, 0x35, 0xc9, 0x2f, 0x47, + 0xde, 0x81, 0x33, 0xa1, 0x2c, 0xe5, 0x28, 0x63, 0x78, 0x7d, 0xd4, 0x60, 0xa8, 0xfa, 0xfb, 0x0c, + 0x27, 0xc2, 0xe1, 0xc4, 0xa9, 0xd5, 0xef, 0x15, 0x92, 0x89, 0x77, 0x4f, 0x7b, 0xe3, 0x80, 0xbd, + 0x71, 0x17, 0x2e, 0xcc, 0x74, 0x1d, 0x87, 0x5a, 0x5e, 0x7a, 0xa7, 0xe0, 0xe1, 0x7d, 0x83, 0x53, + 0xd4, 0x93, 0x9d, 0x93, 0x51, 0x98, 0xb1, 0x15, 0xaf, 0x1b, 0xe2, 0x6c, 0x07, 0x42, 0xb6, 0x5d, + 0x4e, 0x91, 0xc6, 0x36, 0xbd, 0xb0, 0xfa, 0x7b, 0xf9, 0x64, 0xaa, 0xe4, 0xd3, 0xae, 0x3f, 0x58, + 0xd7, 0xab, 0x5f, 0x2e, 0xc4, 0xd3, 0x45, 0x9f, 0x2e, 0x10, 0x07, 0xef, 0x0e, 0x5f, 0x92, 0x38, + 0x6e, 0xa4, 0xaf, 0xf0, 0xe1, 0x59, 0x5f, 0xe1, 0xe3, 0xd5, 0x5f, 0x29, 0xc6, 0x53, 0x6f, 0x9f, + 0x76, 0xc7, 0xf1, 0x75, 0x07, 0x59, 0x86, 0x73, 0x62, 0x6e, 0xf3, 0x41, 0x98, 0x6e, 0x42, 0xcc, + 0x5f, 0x3c, 0x6b, 0x9d, 0x98, 0x16, 0xbb, 0x2e, 0x75, 0xea, 0x9e, 0xee, 0x3e, 0xa8, 0x63, 0x7e, + 0x0a, 0x2d, 0xb5, 0x20, 0x63, 0x28, 0x66, 0xb5, 0x28, 0xc3, 0xc1, 0x90, 0xa1, 0x3f, 0x21, 0x26, + 0x18, 0xa6, 0x15, 0x54, 0x7f, 0x23, 0x07, 0xe3, 0xf1, 0xcf, 0x21, 0x53, 0x30, 0xc8, 0x7e, 0x07, + 0xcf, 0xee, 0xa5, 0x9c, 0xd8, 0x9c, 0x23, 0xbf, 0x92, 0xf7, 0x69, 0xc8, 0xab, 0x30, 0x84, 0xde, + 0x0f, 0x58, 0x20, 0x1f, 0x46, 0x3b, 0x08, 0x0b, 0x60, 0xa2, 0x56, 0x5e, 0x2c, 0x24, 0x25, 0x6f, + 0xc2, 0x70, 0x35, 0x74, 0xf3, 0x12, 0x77, 0x5e, 0xe8, 0x5d, 0x2a, 0x95, 0x0c, 0x09, 0x34, 0x99, + 0x5a, 0xfd, 0x76, 0x3e, 0x9e, 0x22, 0xfe, 0x54, 0xd5, 0x0f, 0xa6, 0xea, 0xcf, 0x2f, 0x72, 0x55, + 0xbf, 0x63, 0x5a, 0x06, 0x79, 0x02, 0xce, 0xdf, 0xad, 0xcd, 0x6a, 0xf5, 0x3b, 0xd5, 0xa5, 0x4a, + 0xfd, 0xee, 0x52, 0x6d, 0x65, 0x76, 0xa6, 0x3a, 0x57, 0x9d, 0xad, 0x8c, 0xf7, 0x91, 0xb3, 0x70, + 0x26, 0x44, 0xcd, 0xdf, 0x5d, 0x2c, 0x2f, 0x8d, 0xe7, 0xc8, 0x04, 0x8c, 0x86, 0xc0, 0xe9, 0xe5, + 0xd5, 0xf1, 0xfc, 0xf3, 0x9f, 0x80, 0x61, 0x74, 0x6f, 0xe3, 0xd7, 0xf1, 0x64, 0x04, 0x06, 0x97, + 0xa7, 0x6b, 0xb3, 0xda, 0x3d, 0x64, 0x02, 0x50, 0xaa, 0xcc, 0x2e, 0x31, 0x86, 0xb9, 0xe7, 0xff, + 0x9f, 0x1c, 0x40, 0x6d, 0x6e, 0x75, 0x45, 0x10, 0x0e, 0xc3, 0x40, 0x75, 0xe9, 0x5e, 0x79, 0xa1, + 0xca, 0xe8, 0x06, 0xa1, 0xb8, 0xbc, 0x32, 0xcb, 0x6a, 0x18, 0x82, 0xfe, 0x99, 0x85, 0xe5, 0xda, + 0xec, 0x78, 0x9e, 0x01, 0xb5, 0xd9, 0x72, 0x65, 0xbc, 0xc0, 0x80, 0xf7, 0xb5, 0xea, 0xea, 0xec, + 0x78, 0x91, 0xfd, 0xb9, 0x50, 0x5b, 0x2d, 0xaf, 0x8e, 0xf7, 0xb3, 0x3f, 0xe7, 0xf0, 0xcf, 0x12, + 0x63, 0x56, 0x9b, 0x5d, 0xc5, 0x1f, 0x03, 0xac, 0x09, 0x73, 0xfe, 0xaf, 0x41, 0x86, 0x62, 0xac, + 0x2b, 0x55, 0x6d, 0x7c, 0x88, 0xfd, 0x60, 0x2c, 0xd9, 0x0f, 0x60, 0x8d, 0xd3, 0x66, 0x17, 0x97, + 0xef, 0xcd, 0x8e, 0x0f, 0x33, 0x5e, 0x8b, 0x77, 0x18, 0x78, 0x84, 0xfd, 0xa9, 0x2d, 0xb2, 0x3f, + 0x47, 0x19, 0x27, 0x6d, 0xb6, 0xbc, 0xb0, 0x52, 0x5e, 0x9d, 0x1f, 0x1f, 0x63, 0xed, 0x41, 0x9e, + 0x67, 0x78, 0xc9, 0xa5, 0xf2, 0xe2, 0xec, 0xf8, 0xb8, 0xa0, 0xa9, 0x2c, 0x54, 0x97, 0xee, 0x8c, + 0x4f, 0x60, 0x43, 0xde, 0x5b, 0xc4, 0x1f, 0x84, 0x15, 0xc0, 0xbf, 0xce, 0x3e, 0xff, 0x83, 0x50, + 0x5a, 0xae, 0xe1, 0x28, 0xb8, 0x08, 0x67, 0x97, 0x6b, 0xf5, 0xd5, 0xf7, 0x56, 0x66, 0x63, 0xf2, + 0x9e, 0x80, 0x51, 0x1f, 0xb1, 0x50, 0x5d, 0xba, 0xfb, 0x39, 0x2e, 0x6d, 0x1f, 0xb4, 0x58, 0x9e, + 0x59, 0xae, 0x8d, 0xe7, 0x59, 0xaf, 0xf8, 0xa0, 0xfb, 0xd5, 0xa5, 0xca, 0xf2, 0xfd, 0xda, 0x78, + 0xe1, 0xf9, 0x87, 0x30, 0xc2, 0xf3, 0x74, 0x2e, 0x3b, 0x66, 0xd3, 0xb4, 0xc8, 0x53, 0xf0, 0x44, + 0x65, 0xf6, 0x5e, 0x75, 0x66, 0xb6, 0xbe, 0xac, 0x55, 0x6f, 0x55, 0x97, 0x62, 0x35, 0x9d, 0x87, + 0x89, 0x28, 0xba, 0xbc, 0x52, 0x1d, 0xcf, 0x91, 0x0b, 0x40, 0xa2, 0xe0, 0xdb, 0xe5, 0xc5, 0xb9, + 0xf1, 0x3c, 0x51, 0xe0, 0x5c, 0x14, 0x5e, 0x5d, 0x5a, 0xbd, 0xbb, 0x34, 0x3b, 0x5e, 0x78, 0xfe, + 0xaf, 0xe6, 0xe0, 0x7c, 0x6a, 0x2c, 0x67, 0xa2, 0xc2, 0xd3, 0xb3, 0x0b, 0xe5, 0xda, 0x6a, 0x75, + 0xa6, 0x36, 0x5b, 0xd6, 0x66, 0xe6, 0xeb, 0x33, 0xe5, 0xd5, 0xd9, 0x5b, 0xcb, 0xda, 0x7b, 0xf5, + 0x5b, 0xb3, 0x4b, 0xb3, 0x5a, 0x79, 0x61, 0xbc, 0x8f, 0x3c, 0x07, 0x93, 0x19, 0x34, 0xb5, 0xd9, + 0x99, 0xbb, 0x5a, 0x75, 0xf5, 0xbd, 0xf1, 0x1c, 0x79, 0x16, 0x9e, 0xca, 0x24, 0x62, 0xbf, 0xc7, + 0xf3, 0xe4, 0x69, 0xb8, 0x94, 0x45, 0xf2, 0xee, 0xc2, 0x78, 0xe1, 0xf9, 0x9f, 0xcf, 0x01, 0x49, + 0x06, 0xe3, 0x25, 0xcf, 0xc0, 0x65, 0xa6, 0x17, 0xf5, 0xec, 0x06, 0x3e, 0x0b, 0x4f, 0xa5, 0x52, + 0x48, 0xcd, 0x9b, 0x84, 0x27, 0x33, 0x48, 0x44, 0xe3, 0x2e, 0x83, 0x92, 0x4e, 0x80, 0x4d, 0xfb, + 0xf5, 0x1c, 0x9c, 0x4f, 0xf5, 0x80, 0x21, 0x57, 0xe1, 0x63, 0xe5, 0xca, 0x22, 0xeb, 0x9b, 0x99, + 0xd5, 0xea, 0xf2, 0x52, 0xad, 0xbe, 0x38, 0x57, 0xae, 0x33, 0xed, 0xbb, 0x5b, 0x8b, 0xf5, 0xe6, + 0x15, 0x50, 0x7b, 0x50, 0xce, 0xcc, 0x97, 0x97, 0x6e, 0xb1, 0xe1, 0x47, 0x3e, 0x06, 0xcf, 0x64, + 0xd2, 0xcd, 0x2e, 0x95, 0xa7, 0x17, 0x66, 0x2b, 0xe3, 0x79, 0xf2, 0x71, 0x78, 0x36, 0x93, 0xaa, + 0x52, 0xad, 0x71, 0xb2, 0xc2, 0x74, 0xe5, 0xdb, 0xff, 0xf3, 0xd3, 0x7d, 0xdf, 0xfe, 0xe3, 0xa7, + 0x73, 0x7f, 0xf8, 0xc7, 0x4f, 0xe7, 0xfe, 0xe9, 0x1f, 0x3f, 0x9d, 0xfb, 0xfc, 0x8d, 0xfd, 0x04, + 0x59, 0xe6, 0xd3, 0xd6, 0x5a, 0x09, 0x6f, 0xa3, 0x5f, 0xfe, 0x57, 0x01, 0x00, 0x00, 0xff, 0xff, + 0xcb, 0xba, 0x9e, 0x8e, 0x2c, 0x81, 0x01, 0x00, } func (m *Metadata) Marshal() (dAtA []byte, err error) { @@ -20768,6 +20770,16 @@ func (m *Subsystem) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + { + size, err := m.ServerMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 if len(m.Error) > 0 { i -= len(m.Error) copy(dAtA[i:], m.Error) @@ -24539,21 +24551,21 @@ func (m *DatabaseSessionEnd) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n357, err357 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.EndTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.EndTime):]) - if err357 != nil { - return 0, err357 - } - i -= n357 - i = encodeVarintEvents(dAtA, i, uint64(n357)) - i-- - dAtA[i] = 0x32 - n358, err358 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) + n358, err358 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.EndTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.EndTime):]) if err358 != nil { return 0, err358 } i -= n358 i = encodeVarintEvents(dAtA, i, uint64(n358)) i-- + dAtA[i] = 0x32 + n359, err359 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) + if err359 != nil { + return 0, err359 + } + i -= n359 + i = encodeVarintEvents(dAtA, i, uint64(n359)) + i-- dAtA[i] = 0x2a { size, err := m.DatabaseMetadata.MarshalToSizedBuffer(dAtA[:i]) @@ -25219,21 +25231,21 @@ func (m *WindowsDesktopSessionEnd) MarshalToSizedBuffer(dAtA []byte) (int, error i-- dAtA[i] = 0x5a } - n391, err391 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.EndTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.EndTime):]) - if err391 != nil { - return 0, err391 - } - i -= n391 - i = encodeVarintEvents(dAtA, i, uint64(n391)) - i-- - dAtA[i] = 0x52 - n392, err392 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) + n392, err392 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.EndTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.EndTime):]) if err392 != nil { return 0, err392 } i -= n392 i = encodeVarintEvents(dAtA, i, uint64(n392)) i-- + dAtA[i] = 0x52 + n393, err393 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) + if err393 != nil { + return 0, err393 + } + i -= n393 + i = encodeVarintEvents(dAtA, i, uint64(n393)) + i-- dAtA[i] = 0x4a if len(m.DesktopLabels) > 0 { for k := range m.DesktopLabels { @@ -25566,12 +25578,12 @@ func (m *InstanceJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x52 - n406, err406 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.TokenExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.TokenExpires):]) - if err406 != nil { - return 0, err406 + n407, err407 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.TokenExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.TokenExpires):]) + if err407 != nil { + return 0, err407 } - i -= n406 - i = encodeVarintEvents(dAtA, i, uint64(n406)) + i -= n407 + i = encodeVarintEvents(dAtA, i, uint64(n407)) i-- dAtA[i] = 0x4a if m.Attributes != nil { @@ -31176,12 +31188,12 @@ func (m *StreamStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n654, err654 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUploadTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUploadTime):]) - if err654 != nil { - return 0, err654 + n655, err655 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUploadTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUploadTime):]) + if err655 != nil { + return 0, err655 } - i -= n654 - i = encodeVarintEvents(dAtA, i, uint64(n654)) + i -= n655 + i = encodeVarintEvents(dAtA, i, uint64(n655)) i-- dAtA[i] = 0x1a if m.LastEventIndex != 0 { @@ -31340,12 +31352,12 @@ func (m *Identity) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0xc2 } } - n658, err658 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.PreviousIdentityExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.PreviousIdentityExpires):]) - if err658 != nil { - return 0, err658 + n659, err659 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.PreviousIdentityExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.PreviousIdentityExpires):]) + if err659 != nil { + return 0, err659 } - i -= n658 - i = encodeVarintEvents(dAtA, i, uint64(n658)) + i -= n659 + i = encodeVarintEvents(dAtA, i, uint64(n659)) i-- dAtA[i] = 0x1 i-- @@ -31493,12 +31505,12 @@ func (m *Identity) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x4a } - n662, err662 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err662 != nil { - return 0, err662 + n663, err663 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err663 != nil { + return 0, err663 } - i -= n662 - i = encodeVarintEvents(dAtA, i, uint64(n662)) + i -= n663 + i = encodeVarintEvents(dAtA, i, uint64(n663)) i-- dAtA[i] = 0x42 if len(m.KubernetesUsers) > 0 { @@ -39925,6 +39937,8 @@ func (m *Subsystem) Size() (n int) { if l > 0 { n += 1 + l + sovEvents(uint64(l)) } + l = m.ServerMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -60952,6 +60966,39 @@ func (m *Subsystem) Unmarshal(dAtA []byte) error { } m.Error = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ServerMetadata", 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.ServerMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) diff --git a/docs/pages/admin-guides/teleport-policy/integrations/aws-sync.mdx b/docs/pages/admin-guides/teleport-policy/integrations/aws-sync.mdx index 2aae7cd963fb5..5341c70af34b3 100644 --- a/docs/pages/admin-guides/teleport-policy/integrations/aws-sync.mdx +++ b/docs/pages/admin-guides/teleport-policy/integrations/aws-sync.mdx @@ -88,7 +88,6 @@ that are set up with the `discovery_group` matching discovery_service: enabled: true discovery_group: - ``` Notice that if you already operate a Discovery Service within your cluster, diff --git a/docs/pages/enroll-resources/auto-discovery/databases/databases.mdx b/docs/pages/enroll-resources/auto-discovery/databases/databases.mdx index fe893fa1a9787..2f153b4676086 100644 --- a/docs/pages/enroll-resources/auto-discovery/databases/databases.mdx +++ b/docs/pages/enroll-resources/auto-discovery/databases/databases.mdx @@ -75,14 +75,6 @@ Here's an example database discovery configuration for the Discovery Service: ```yaml discovery_service: enabled: true - # discovery_group is used to group discovered resources into different - # sets. This is required when you have multiple Teleport Discovery services - # running. It prevents discovered services from colliding in Teleport when - # managing discovered resources. - # If two Discovery Services match the same resources, they must be in the - # same discovery group. - # If two Discovery Services match different resources, they must be in - # different discovery groups. discovery_group: "disc-group" # poll_interval is the cadence at which the discovery server will run each of its # discovery cycles. The default is 5m. diff --git a/docs/pages/enroll-resources/auto-discovery/kubernetes/google-cloud.mdx b/docs/pages/enroll-resources/auto-discovery/kubernetes/google-cloud.mdx index b26f94f22566c..43a9eaa3d8161 100644 --- a/docs/pages/enroll-resources/auto-discovery/kubernetes/google-cloud.mdx +++ b/docs/pages/enroll-resources/auto-discovery/kubernetes/google-cloud.mdx @@ -396,6 +396,7 @@ ssh_service: enabled: off discovery_service: enabled: "yes" + discovery_group: "gke-myproject" gcp: - types: ["gke"] locations: ["*"] @@ -433,6 +434,7 @@ clusters in project `myproj-prod` running in `us-east2`, but *not* clusters in ```yaml discovery_service: enabled: "yes" + discovery_group: "gke-myproject" gcp: - types: ["gke"] locations: ["us-east1"] diff --git a/docs/pages/enroll-resources/auto-discovery/kubernetes/kubernetes.mdx b/docs/pages/enroll-resources/auto-discovery/kubernetes/kubernetes.mdx index 2f24fa39bd08b..f1d43d48870c2 100644 --- a/docs/pages/enroll-resources/auto-discovery/kubernetes/kubernetes.mdx +++ b/docs/pages/enroll-resources/auto-discovery/kubernetes/kubernetes.mdx @@ -62,11 +62,6 @@ and their default values. # This section configures the Discovery Service discovery_service: enabled: "yes" - # discovery_group is used to group discovered resources into different - # sets. This is useful when you have multiple Teleport Discovery services - # running in the same cluster but polling different cloud providers or cloud - # accounts. It prevents discovered services from colliding in Teleport when - # managing discovered resources. discovery_group: "prod" aws: # AWS resource types. Valid options are: diff --git a/docs/pages/enroll-resources/auto-discovery/servers/azure-discovery.mdx b/docs/pages/enroll-resources/auto-discovery/servers/azure-discovery.mdx index e9fcc2fef6a7d..e87d3ecc104a5 100644 --- a/docs/pages/enroll-resources/auto-discovery/servers/azure-discovery.mdx +++ b/docs/pages/enroll-resources/auto-discovery/servers/azure-discovery.mdx @@ -235,6 +235,8 @@ the Discovery Service. In order to enable Azure instance discovery the `discovery_service.azure` section of `teleport.yaml` must include at least one entry: +(!docs/pages/includes/discovery/discovery-group.mdx!) + ```yaml version: v3 teleport: @@ -250,6 +252,7 @@ ssh_service: enabled: off discovery_service: enabled: "yes" + discovery_group: "azure-prod" azure: - types: ["vm"] subscriptions: [""] diff --git a/docs/pages/enroll-resources/auto-discovery/servers/ec2-discovery.mdx b/docs/pages/enroll-resources/auto-discovery/servers/ec2-discovery.mdx index c85ed32e1e98f..e3fa7e2f86d3c 100644 --- a/docs/pages/enroll-resources/auto-discovery/servers/ec2-discovery.mdx +++ b/docs/pages/enroll-resources/auto-discovery/servers/ec2-discovery.mdx @@ -118,6 +118,8 @@ run the Discovery Service. In order to enable EC2 instance discovery the `discovery_service.aws` section of `teleport.yaml` must include at least one entry: +(!docs/pages/includes/discovery/discovery-group.mdx!) + ```yaml version: v3 teleport: @@ -133,6 +135,7 @@ ssh_service: enabled: off discovery_service: enabled: "yes" + discovery_group: "aws-prod" aws: - types: ["ec2"] regions: ["us-east-1","us-west-1"] diff --git a/docs/pages/enroll-resources/auto-discovery/servers/gcp-discovery.mdx b/docs/pages/enroll-resources/auto-discovery/servers/gcp-discovery.mdx index 3b050c5d9de26..bdd8d639c0ac7 100644 --- a/docs/pages/enroll-resources/auto-discovery/servers/gcp-discovery.mdx +++ b/docs/pages/enroll-resources/auto-discovery/servers/gcp-discovery.mdx @@ -231,6 +231,8 @@ the Discovery Service. In order to enable GCP instance discovery the `discovery_service.gcp` section of `teleport.yaml` must include at least one entry: +(!docs/pages/includes/discovery/discovery-group.mdx!) + ```yaml version: v3 teleport: @@ -246,6 +248,7 @@ ssh_service: enabled: off discovery_service: enabled: "yes" + discovery_group: "gcp-prod" gcp: - types: ["gce"] # The IDs of GCP projects that VMs can join from. diff --git a/docs/pages/includes/database-access/aws-troubleshooting-max-policy-size.mdx b/docs/pages/includes/database-access/aws-troubleshooting-max-policy-size.mdx index 55d0e8bad6a54..89b650b1a2bf2 100644 --- a/docs/pages/includes/database-access/aws-troubleshooting-max-policy-size.mdx +++ b/docs/pages/includes/database-access/aws-troubleshooting-max-policy-size.mdx @@ -23,8 +23,12 @@ You can reduce the policy size by separating them into multiple IAM roles. Use You can specify `assume_role_arn` in the AWS matchers of Discovery Service's configuration: + + (!docs/pages/includes/discovery/discovery-group.mdx!) + ```yaml discovery_service: + discovery_group: "prod" enabled: "yes" aws: - types: ["rds"] diff --git a/docs/pages/includes/server-access/custom-installer.mdx b/docs/pages/includes/server-access/custom-installer.mdx index c3f1bdc309133..4d046e5c5bc12 100644 --- a/docs/pages/includes/server-access/custom-installer.mdx +++ b/docs/pages/includes/server-access/custom-installer.mdx @@ -39,6 +39,7 @@ Multiple `installer` resources can exist and be specified in the ```yaml discovery_service: + # ... {{ matcher }}: - types: {{ matchTypes }} tags: diff --git a/docs/pages/reference/agent-services/kubernetes-application-discovery.mdx b/docs/pages/reference/agent-services/kubernetes-application-discovery.mdx index 723a005739aaf..4e5c673c26043 100644 --- a/docs/pages/reference/agent-services/kubernetes-application-discovery.mdx +++ b/docs/pages/reference/agent-services/kubernetes-application-discovery.mdx @@ -37,6 +37,8 @@ Discovery Service, then restart the agents running these services. Configuration for the Discovery Service is controlled by the `kubernetes` field, example: +(!docs/pages/includes/discovery/discovery-group.mdx!) + ```yaml # This section configures the Discovery Service discovery_service: diff --git a/go.mod b/go.mod index ba07ee06f1ac5..f221ec5ae1691 100644 --- a/go.mod +++ b/go.mod @@ -80,6 +80,7 @@ require ( github.com/charmbracelet/bubbletea v1.1.2 github.com/charmbracelet/lipgloss v1.0.0 github.com/coreos/go-oidc v2.2.1+incompatible // replaced + github.com/coreos/go-oidc/v3 v3.11.0 github.com/coreos/go-semver v0.3.1 github.com/creack/pty v1.1.24 github.com/crewjam/saml v0.4.14 diff --git a/lib/auth/authclient/clt.go b/lib/auth/authclient/clt.go index 4d3bdabd846b7..8c818c9015d80 100644 --- a/lib/auth/authclient/clt.go +++ b/lib/auth/authclient/clt.go @@ -43,11 +43,13 @@ import ( clusterconfigpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/clusterconfig/v1" dbobjectimportrulev1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/dbobjectimportrule/v1" devicepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/devicetrust/v1" + identitycenterv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/identitycenter/v1" integrationv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" loginrulepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/loginrule/v1" machineidv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" notificationsv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/notifications/v1" pluginspb "github.com/gravitational/teleport/api/gen/proto/go/teleport/plugins/v1" + provisioningv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/provisioning/v1" resourceusagepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/resourceusage/v1" samlidppb "github.com/gravitational/teleport/api/gen/proto/go/teleport/samlidp/v1" trustpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/trust/v1" @@ -1882,4 +1884,10 @@ type ClientI interface { // GenerateAppToken creates a JWT token with application access. GenerateAppToken(ctx context.Context, req types.GenerateAppTokenRequest) (string, error) + + // IdentityCenterClient returns Identity Center service client. + IdentityCenterClient() identitycenterv1.IdentityCenterServiceClient + + // ProvisioningServiceClient returns provisioning service client. + ProvisioningServiceClient() provisioningv1.ProvisioningServiceClient } diff --git a/lib/auth/grpcserver.go b/lib/auth/grpcserver.go index b4bd1d985ea97..d62476dbabaf1 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" + 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" loginrulev1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/loginrule/v1" @@ -65,6 +66,7 @@ import ( mfav1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/mfa/v1" notificationsv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/notifications/v1" presencev1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/presence/v1" + provisioningv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/provisioning/v1" trustv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/trust/v1" userloginstatev1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/userloginstate/v1" userprovisioningv2pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/userprovisioning/v2" @@ -5345,6 +5347,19 @@ func NewGRPCServer(cfg GRPCServerConfig) (*GRPCServer, error) { } autoupdatev1pb.RegisterAutoUpdateServiceServer(server, autoUpdateServiceServer) + identityCenterService, err := local.NewIdentityCenterService(local.IdentityCenterServiceConfig{ + Backend: cfg.AuthServer.bk}) + if err != nil { + return nil, trace.Wrap(err) + } + identitycenterv1.RegisterIdentityCenterServiceServer(server, identityCenterService) + + provisioningStateService, err := local.NewProvisioningStateService(cfg.AuthServer.bk) + if err != nil { + return nil, trace.Wrap(err) + } + provisioningv1.RegisterProvisioningServiceServer(server, provisioningStateService) + // 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/keystore/manager.go b/lib/auth/keystore/manager.go index 364685511ca44..3c8fcfc16498b 100644 --- a/lib/auth/keystore/manager.go +++ b/lib/auth/keystore/manager.go @@ -107,6 +107,7 @@ type Manager struct { usableSigningBackends []backend currentSuiteGetter cryptosuites.GetSuiteFunc + logger *slog.Logger } // backend is an interface that holds private keys and provides signing @@ -227,6 +228,7 @@ func NewManager(ctx context.Context, cfg *servicecfg.KeystoreConfig, opts *Optio backendForNewKeys: backendForNewKeys, usableSigningBackends: usableSigningBackends, currentSuiteGetter: cryptosuites.GetCurrentSuiteFromAuthPreference(opts.AuthPreferenceGetter), + logger: opts.Logger, }, nil } @@ -529,7 +531,29 @@ func (m *Manager) NewJWTKeyPair(ctx context.Context, purpose cryptosuites.KeyPur key, err := m.newJWTKeyPair(ctx, alg) if err != nil { createErrorCounter.WithLabelValues(keyTypeJWT, m.backendForNewKeys.name(), alg.String()).Inc() - return nil, trace.Wrap(err) + if alg == cryptosuites.RSA2048 { + return nil, trace.Wrap(err) + } + // Try to fall back to RSA if using the legacy suite. The HSM/KMS + // credentials may not have permission to create ECDSA keys, especially + // if set up before ECDSA support was added. + origErr := trace.Wrap(err, "generating %s key in %s", alg.String(), m.backendForNewKeys.name()) + m.logger.WarnContext(ctx, "Failed to generate key with default algorithm, falling back to RSA.", "error", origErr) + currentSuite, suiteErr := m.currentSuiteGetter(ctx) + if suiteErr != nil { + return nil, trace.NewAggregate(origErr, trace.Wrap(suiteErr, "finding current algorithm suite")) + } + switch currentSuite { + case types.SignatureAlgorithmSuite_SIGNATURE_ALGORITHM_SUITE_UNSPECIFIED, types.SignatureAlgorithmSuite_SIGNATURE_ALGORITHM_SUITE_LEGACY: + default: + // Not using the legacy suite, ECDSA key gen really should have + // worked, return the original error. + return nil, origErr + } + var rsaErr error + if key, rsaErr = m.newJWTKeyPair(ctx, cryptosuites.RSA2048); rsaErr != nil { + return nil, trace.NewAggregate(origErr, trace.Wrap(rsaErr, "attempting fallback to RSA key")) + } } return key, nil } diff --git a/lib/auth/keystore/pkcs11.go b/lib/auth/keystore/pkcs11.go index 7cc8597138864..73c224148f707 100644 --- a/lib/auth/keystore/pkcs11.go +++ b/lib/auth/keystore/pkcs11.go @@ -87,7 +87,7 @@ func (p *pkcs11KeyStore) keyTypeDescription() string { return fmt.Sprintf("PKCS#11 HSM keys created by %s", p.hostUUID) } -func (p *pkcs11KeyStore) findUnusedID() (keyID, error) { +func (p *pkcs11KeyStore) findUnusedID(ctx context.Context) (keyID, error) { if !p.isYubiHSM { id, err := uuid.NewRandom() if err != nil { @@ -124,14 +124,18 @@ func (p *pkcs11KeyStore) findUnusedID() (keyID, error) { // generateKey creates a new private key and returns its identifier and a crypto.Signer. The returned // identifier can be passed to getSigner later to get an equivalent crypto.Signer. func (p *pkcs11KeyStore) generateKey(ctx context.Context, alg cryptosuites.Algorithm) ([]byte, crypto.Signer, error) { - // the key identifiers are not created in a thread safe + // The key identifiers are not created in a thread safe // manner so all calls are serialized to prevent races. - p.semaphore <- struct{}{} + select { + case p.semaphore <- struct{}{}: + case <-ctx.Done(): + return nil, nil, trace.Wrap(ctx.Err()) + } defer func() { <-p.semaphore }() - id, err := p.findUnusedID() + id, err := p.findUnusedID(ctx) if err != nil { return nil, nil, trace.Wrap(err) } diff --git a/lib/cache/identitycenter.go b/lib/cache/identitycenter.go index 1b431cba57da2..953da7d4ce913 100644 --- a/lib/cache/identitycenter.go +++ b/lib/cache/identitycenter.go @@ -64,7 +64,8 @@ func (identityCenterAccountExecutor) delete(ctx context.Context, cache *Cache, r } func (identityCenterAccountExecutor) deleteAll(ctx context.Context, cache *Cache) error { - return trace.Wrap(cache.identityCenterCache.DeleteAllIdentityCenterAccounts(ctx)) + _, err := cache.identityCenterCache.DeleteAllIdentityCenterAccounts(ctx, &identitycenterv1.DeleteAllIdentityCenterAccountsRequest{}) + return trace.Wrap(err) } func (identityCenterAccountExecutor) getReader(cache *Cache, cacheOK bool) identityCenterAccountGetter { @@ -125,7 +126,8 @@ func (identityCenterPrincipalAssignmentExecutor) delete(ctx context.Context, cac } func (identityCenterPrincipalAssignmentExecutor) deleteAll(ctx context.Context, cache *Cache) error { - return trace.Wrap(cache.identityCenterCache.DeleteAllPrincipalAssignments(ctx)) + _, err := cache.identityCenterCache.DeleteAllPrincipalAssignments(ctx, &identitycenterv1.DeleteAllPrincipalAssignmentsRequest{}) + return trace.Wrap(err) } func (identityCenterPrincipalAssignmentExecutor) getReader(cache *Cache, cacheOK bool) identityCenterPrincipalAssignmentGetter { @@ -176,7 +178,8 @@ func (identityCenterAccountAssignmentExecutor) delete(ctx context.Context, cache } func (identityCenterAccountAssignmentExecutor) deleteAll(ctx context.Context, cache *Cache) error { - return trace.Wrap(cache.identityCenterCache.DeleteAllIdentityCenterAccounts(ctx)) + _, err := cache.identityCenterCache.DeleteAllIdentityCenterAccounts(ctx, &identitycenterv1.DeleteAllIdentityCenterAccountsRequest{}) + return trace.Wrap(err) } func (identityCenterAccountAssignmentExecutor) getReader(cache *Cache, cacheOK bool) identityCenterAccountAssignmentGetter { diff --git a/lib/cache/identitycenter_test.go b/lib/cache/identitycenter_test.go index c312d778aeafa..136c170d9475a 100644 --- a/lib/cache/identitycenter_test.go +++ b/lib/cache/identitycenter_test.go @@ -98,7 +98,8 @@ func TestIdentityCenterAccount(t *testing.T) { ctx, services.IdentityCenterAccountID(id))) }, deleteAll: func(ctx context.Context) error { - return trace.Wrap(fixturePack.identityCenter.DeleteAllIdentityCenterAccounts(ctx)) + _, err := fixturePack.identityCenter.DeleteAllIdentityCenterAccounts(ctx, &identitycenterv1.DeleteAllIdentityCenterAccountsRequest{}) + return trace.Wrap(err) }, cacheList: func(ctx context.Context) ([]services.IdentityCenterAccount, error) { return collect(ctx, fixturePack.cache.identityCenterCache) @@ -173,7 +174,8 @@ func TestIdentityCenterPrincipalAssignment(t *testing.T) { return trace.Wrap(fixturePack.identityCenter.DeletePrincipalAssignment(ctx, services.PrincipalAssignmentID(id))) }, deleteAll: func(ctx context.Context) error { - return trace.Wrap(fixturePack.identityCenter.DeleteAllPrincipalAssignments(ctx)) + _, err := fixturePack.identityCenter.DeleteAllPrincipalAssignments(ctx, &identitycenterv1.DeleteAllPrincipalAssignmentsRequest{}) + return trace.Wrap(err) }, cacheList: func(ctx context.Context) ([]*identitycenterv1.PrincipalAssignment, error) { return collect(ctx, fixturePack.cache.identityCenterCache) @@ -249,7 +251,8 @@ func TestIdentityCenterAccountAssignment(t *testing.T) { return trace.Wrap(fixturePack.identityCenter.DeleteAccountAssignment(ctx, services.IdentityCenterAccountAssignmentID(id))) }, deleteAll: func(ctx context.Context) error { - return trace.Wrap(fixturePack.identityCenter.DeleteAllAccountAssignments(ctx)) + _, err := fixturePack.identityCenter.DeleteAllAccountAssignments(ctx, &identitycenterv1.DeleteAllAccountAssignmentsRequest{}) + return trace.Wrap(err) }, cacheList: func(ctx context.Context) ([]services.IdentityCenterAccountAssignment, error) { return collect(ctx, fixturePack.cache.identityCenterCache) diff --git a/lib/config/configuration_test.go b/lib/config/configuration_test.go index bd618e5c61474..09a784bdbb9c3 100644 --- a/lib/config/configuration_test.go +++ b/lib/config/configuration_test.go @@ -3670,10 +3670,6 @@ func TestAuthHostedPlugins(t *testing.T) { applyErr: require.NoError, assert: func(t *testing.T, p servicecfg.HostedPluginsConfig) { require.True(t, p.Enabled) - require.NotNil(t, p.OAuthProviders.Slack) - require.Equal(t, "foo", p.OAuthProviders.Slack.ID) - require.Equal(t, "bar", p.OAuthProviders.Slack.Secret) - require.NotNil(t, p.OAuthProviders.SlackCredentials) require.Equal(t, "foo", p.OAuthProviders.SlackCredentials.ClientID) require.Equal(t, "bar", p.OAuthProviders.SlackCredentials.ClientSecret) diff --git a/lib/config/fileconf.go b/lib/config/fileconf.go index 32884f3fe098a..653545ab30b1b 100644 --- a/lib/config/fileconf.go +++ b/lib/config/fileconf.go @@ -33,7 +33,6 @@ import ( "strings" "time" - "github.com/coreos/go-oidc/oauth2" "github.com/gravitational/trace" log "github.com/sirupsen/logrus" "golang.org/x/crypto/acme" @@ -1326,10 +1325,6 @@ func (p *PluginOAuthProviders) Parse() (servicecfg.PluginOAuthProviders, error) if err != nil { return out, trace.Wrap(err) } - out.Slack = &oauth2.ClientCredentials{ - ID: slack.ClientID, - Secret: slack.ClientSecret, - } out.SlackCredentials = slack } return out, nil diff --git a/lib/cryptosuites/suites.go b/lib/cryptosuites/suites.go index d9f1ec8bf7d71..2449a589422ec 100644 --- a/lib/cryptosuites/suites.go +++ b/lib/cryptosuites/suites.go @@ -152,7 +152,9 @@ func (a Algorithm) String() string { type suite map[KeyPurpose]Algorithm var ( - // legacy is the original algorithm suite, which exclusively uses RSA2048. + // legacy is the original algorithm suite, which exclusively uses RSA2048 + // for features developed before ECDSA and Ed25519 support were added. New + // features should always use the new algorithms. legacy = suite{ UserCATLS: RSA2048, UserCASSH: RSA2048, diff --git a/lib/events/dynamoevents/dynamoevents.go b/lib/events/dynamoevents/dynamoevents.go index ba55ef5068768..dcfccc7713e20 100644 --- a/lib/events/dynamoevents/dynamoevents.go +++ b/lib/events/dynamoevents/dynamoevents.go @@ -43,7 +43,6 @@ import ( "github.com/aws/aws-sdk-go-v2/service/dynamodb" dynamodbtypes "github.com/aws/aws-sdk-go-v2/service/dynamodb/types" "github.com/aws/smithy-go" - smithyendpoints "github.com/aws/smithy-go/endpoints" "github.com/google/uuid" "github.com/gravitational/trace" "github.com/jonboulle/clockwork" @@ -148,6 +147,9 @@ type Config struct { // EnableAutoScaling is used to enable auto scaling policy. EnableAutoScaling bool + + // CredentialsProvider if supplied is used to override the credentials source. + CredentialsProvider aws.CredentialsProvider } // SetFromURL sets values on the Config from the supplied URI @@ -282,24 +284,20 @@ func New(ctx context.Context, cfg Config) (*Log, error) { config.WithAPIOptions(dynamometrics.MetricsMiddleware(dynamometrics.Backend)), } - awsConfig, err := config.LoadDefaultConfig(ctx, opts...) - if err != nil { - return nil, trace.Wrap(err) + if cfg.CredentialsProvider != nil { + opts = append(opts, config.WithCredentialsProvider(cfg.CredentialsProvider)) } - otelaws.AppendMiddlewares(&awsConfig.APIOptions, otelaws.WithAttributeSetter(otelaws.DynamoDBAttributeSetter)) - var dynamoOpts []func(*dynamodb.Options) // Override the service endpoint using the "endpoint" query parameter from // "audit_events_uri". This is for non-AWS DynamoDB-compatible backends. if cfg.Endpoint != "" { - u, err := url.Parse(cfg.Endpoint) - if err != nil { + if _, err := url.Parse(cfg.Endpoint); err != nil { return nil, trace.BadParameter("configured DynamoDB events endpoint is invalid: %s", err.Error()) } - dynamoOpts = append(dynamoOpts, dynamodb.WithEndpointResolverV2(&staticResolver{endpoint: u})) + opts = append(opts, config.WithBaseEndpoint(cfg.Endpoint)) } // FIPS settings are applied on the individual service instead of the aws config, @@ -311,6 +309,13 @@ func New(ctx context.Context, cfg Config) (*Log, error) { }) } + awsConfig, err := config.LoadDefaultConfig(ctx, opts...) + if err != nil { + return nil, trace.Wrap(err) + } + + otelaws.AppendMiddlewares(&awsConfig.APIOptions, otelaws.WithAttributeSetter(otelaws.DynamoDBAttributeSetter)) + b := &Log{ logger: l, Config: cfg, @@ -324,14 +329,6 @@ func New(ctx context.Context, cfg Config) (*Log, error) { return b, nil } -type staticResolver struct { - endpoint *url.URL -} - -func (s *staticResolver) ResolveEndpoint(ctx context.Context, params dynamodb.EndpointParameters) (smithyendpoints.Endpoint, error) { - return smithyendpoints.Endpoint{URI: *s.endpoint}, nil -} - type tableStatus int const ( diff --git a/lib/events/dynamoevents/dynamoevents_test.go b/lib/events/dynamoevents/dynamoevents_test.go index 27804a14143a8..c8aabdf39c497 100644 --- a/lib/events/dynamoevents/dynamoevents_test.go +++ b/lib/events/dynamoevents/dynamoevents_test.go @@ -32,6 +32,7 @@ import ( "testing" "time" + "github.com/aws/aws-sdk-go-v2/aws" "github.com/google/uuid" "github.com/gravitational/trace" "github.com/jonboulle/clockwork" @@ -43,6 +44,7 @@ import ( apievents "github.com/gravitational/teleport/api/types/events" "github.com/gravitational/teleport/lib/events" "github.com/gravitational/teleport/lib/events/test" + "github.com/gravitational/teleport/lib/modules" "github.com/gravitational/teleport/lib/session" "github.com/gravitational/teleport/lib/utils" ) @@ -604,24 +606,60 @@ func randStringAlpha(n int) string { return string(b) } -func TestCustomEndpoint(t *testing.T) { - ctx := context.Background() - t.Setenv("AWS_ACCESS_KEY", "llama") - t.Setenv("AWS_SECRET_KEY", "alpaca") +func TestEndpoints(t *testing.T) { + tests := []struct { + name string + fips bool + }{ + { + name: "fips", + fips: true, + }, + { + name: "without fips", + }, + } - mux := http.NewServeMux() - mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusTeapot) - }) - srv := httptest.NewServer(mux) - defer srv.Close() + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { - b, err := New(ctx, Config{ - Tablename: "teleport-test", - UIDGenerator: utils.NewFakeUID(), - Endpoint: srv.URL, - }) - assert.Error(t, err) - assert.Nil(t, b) - require.ErrorContains(t, err, fmt.Sprintf("StatusCode: %d", http.StatusTeapot)) + fips := types.ClusterAuditConfigSpecV2_FIPS_DISABLED + if tt.fips { + fips = types.ClusterAuditConfigSpecV2_FIPS_ENABLED + modules.SetTestModules(t, &modules.TestModules{ + FIPS: true, + }) + } + + mux := http.NewServeMux() + mux.Handle("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusTeapot) + })) + + server := httptest.NewServer(mux) + t.Cleanup(server.Close) + + b, err := New(context.Background(), Config{ + Region: "us-west-1", + Tablename: "teleport-test", + UIDGenerator: utils.NewFakeUID(), + Endpoint: server.URL, + UseFIPSEndpoint: fips, + CredentialsProvider: aws.CredentialsProviderFunc(func(ctx context.Context) (aws.Credentials, error) { + return aws.Credentials{}, nil + }), + }) + // FIPS mode should fail because it is a violation to enable FIPS + // while also setting a custom endpoint. + if tt.fips { + assert.Error(t, err) + require.ErrorContains(t, err, "FIPS") + return + } + + assert.Error(t, err) + assert.Nil(t, b) + require.ErrorContains(t, err, fmt.Sprintf("StatusCode: %d", http.StatusTeapot)) + }) + } } diff --git a/lib/events/events_test.go b/lib/events/events_test.go index c178aa3272d31..d304a65ddd4bc 100644 --- a/lib/events/events_test.go +++ b/lib/events/events_test.go @@ -634,7 +634,7 @@ func TestJSON(t *testing.T) { }, { name: "rejected subsystem", - json: `{"ei":0,"cluster_name":"test","addr.local":"127.0.0.1:57518","addr.remote":"127.0.0.1:3022","code":"T3001E","event":"subsystem","exitError":"some error","login":"alice","name":"proxy","time":"2020-04-15T20:28:18Z","uid":"3129a5ae-ee1e-4b39-8d7c-a0a3f218e7dc","user":"alice@example.com"}`, + json: `{"ei":0,"cluster_name":"test","addr.local":"127.0.0.1:57518","addr.remote":"127.0.0.1:3022","code":"T3001E","event":"subsystem","exitError":"some error","forwarded_by":"abc","login":"alice","name":"proxy","server_id":"123","time":"2020-04-15T20:28:18Z","uid":"3129a5ae-ee1e-4b39-8d7c-a0a3f218e7dc","user":"alice@example.com"}`, event: apievents.Subsystem{ Metadata: apievents.Metadata{ ID: "3129a5ae-ee1e-4b39-8d7c-a0a3f218e7dc", @@ -651,6 +651,10 @@ func TestJSON(t *testing.T) { LocalAddr: "127.0.0.1:57518", RemoteAddr: "127.0.0.1:3022", }, + ServerMetadata: apievents.ServerMetadata{ + ServerID: "123", + ForwardedBy: "abc", + }, Name: "proxy", Error: "some error", }, diff --git a/lib/events/s3sessions/s3handler.go b/lib/events/s3sessions/s3handler.go index 3aec6ab233774..b202e78422c8d 100644 --- a/lib/events/s3sessions/s3handler.go +++ b/lib/events/s3sessions/s3handler.go @@ -43,6 +43,7 @@ import ( "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/events" + "github.com/gravitational/teleport/lib/modules" awsmetrics "github.com/gravitational/teleport/lib/observability/metrics/aws" "github.com/gravitational/teleport/lib/session" awsutils "github.com/gravitational/teleport/lib/utils/aws" @@ -77,8 +78,6 @@ type Config struct { Endpoint string // ACL is the canned ACL to send to S3 ACL string - // AWSConfig is an optional existing AWS client configuration - AWSConfig *aws.Config // CredentialsProvider if supplied is used in tests or with External Audit Storage. CredentialsProvider aws.CredentialsProvider // SSEKMSKey specifies the optional custom CMK used for KMS SSE. @@ -157,55 +156,66 @@ func (s *Config) CheckAndSetDefaults() error { return trace.BadParameter("missing parameter Bucket") } - if s.AWSConfig == nil { - var err error - opts := []func(*config.LoadOptions) error{ - config.WithRegion(s.Region), - } + return nil +} - if s.Insecure { - opts = append(opts, config.WithHTTPClient(&http.Client{ - Transport: &http.Transport{ - TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, - }, - })) - } else { - hc, err := defaults.HTTPClient() - if err != nil { - return trace.Wrap(err) - } +// NewHandler returns new S3 uploader +func NewHandler(ctx context.Context, cfg Config) (*Handler, error) { + if err := cfg.CheckAndSetDefaults(); err != nil { + return nil, trace.Wrap(err) + } - opts = append(opts, config.WithHTTPClient(hc)) - } + opts := []func(*config.LoadOptions) error{ + config.WithRegion(cfg.Region), + } - if s.CredentialsProvider != nil { - opts = append(opts, config.WithCredentialsProvider(s.CredentialsProvider)) + if cfg.Insecure { + opts = append(opts, config.WithHTTPClient(&http.Client{ + Transport: &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, + }, + })) + } else { + hc, err := defaults.HTTPClient() + if err != nil { + return nil, trace.Wrap(err) } - opts = append(opts, config.WithAPIOptions(awsmetrics.MetricsMiddleware())) + opts = append(opts, config.WithHTTPClient(hc)) + } - awsConfig, err := config.LoadDefaultConfig(context.Background(), opts...) - if err != nil { - return trace.Wrap(err) + if cfg.CredentialsProvider != nil { + opts = append(opts, config.WithCredentialsProvider(cfg.CredentialsProvider)) + } + + opts = append(opts, config.WithAPIOptions(awsmetrics.MetricsMiddleware())) + + var s3Opts []func(*s3.Options) + if cfg.Endpoint != "" { + if _, err := url.Parse(cfg.Endpoint); err != nil { + return nil, trace.BadParameter("configured S3 endpoint is invalid: %s", err.Error()) } - s.AWSConfig = &awsConfig + opts = append(opts, config.WithBaseEndpoint(cfg.Endpoint)) + + s3Opts = append(s3Opts, func(options *s3.Options) { + options.UsePathStyle = true + }) } - return nil -} -// NewHandler returns new S3 uploader -func NewHandler(ctx context.Context, cfg Config) (*Handler, error) { - if err := cfg.CheckAndSetDefaults(); err != nil { + if modules.GetModules().IsBoringBinary() && cfg.UseFIPSEndpoint == types.ClusterAuditConfigSpecV2_FIPS_ENABLED { + s3Opts = append(s3Opts, func(options *s3.Options) { + options.EndpointOptions.UseFIPSEndpoint = aws.FIPSEndpointStateEnabled + }) + } + + awsConfig, err := config.LoadDefaultConfig(context.Background(), opts...) + if err != nil { return nil, trace.Wrap(err) } // Create S3 client with custom options - client := s3.NewFromConfig(*cfg.AWSConfig, func(o *s3.Options) { - if cfg.Endpoint != "" { - o.UsePathStyle = true - } - }) + client := s3.NewFromConfig(awsConfig, s3Opts...) uploader := manager.NewUploader(client) downloader := manager.NewDownloader(client) @@ -382,14 +392,17 @@ func (h *Handler) ensureBucket(ctx context.Context) error { Bucket: aws.String(h.Bucket), }) err = awsutils.ConvertS3Error(err) - // assumes that bucket is administered by other entity - if err == nil { + switch { + case err == nil: + // assumes that bucket is administered by other entity return nil - } - if !trace.IsNotFound(err) { + case trace.IsBadParameter(err): + return trace.Wrap(err) + case !trace.IsNotFound(err): h.logger.ErrorContext(ctx, "Failed to ensure that S3 bucket exists. S3 session uploads may fail. If you've set up the bucket already and gave Teleport write-only access, feel free to ignore this error.", "bucket", h.Bucket, "error", err) return nil } + input := &s3.CreateBucketInput{ Bucket: aws.String(h.Bucket), ACL: awstypes.BucketCannedACLPrivate, diff --git a/lib/events/s3sessions/s3handler_config_test.go b/lib/events/s3sessions/s3handler_config_test.go index fac2754afcb6d..3689f35229f43 100644 --- a/lib/events/s3sessions/s3handler_config_test.go +++ b/lib/events/s3sessions/s3handler_config_test.go @@ -20,13 +20,19 @@ package s3sessions import ( "context" + "net/http" + "net/http/httptest" "net/url" "os" + "sync" "testing" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/modules" "github.com/gravitational/teleport/lib/utils" ) @@ -122,10 +128,24 @@ func TestConfig_SetFromURL(t *testing.T) { } func TestUploadMetadata(t *testing.T) { + t.Parallel() + + mux := http.NewServeMux() + mux.Handle("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusTeapot) + })) + + server := httptest.NewServer(mux) + t.Cleanup(server.Close) + handler, err := NewHandler(context.Background(), Config{ - Region: "us-west-1", - Path: "/test/", - Bucket: "teleport-unit-tests", + Region: "us-west-1", + Path: "/test/", + Bucket: "teleport-unit-tests", + Endpoint: server.URL, + CredentialsProvider: aws.CredentialsProviderFunc(func(ctx context.Context) (aws.Credentials, error) { + return aws.Credentials{}, nil + }), }) require.NoError(t, err) defer handler.Close() @@ -133,3 +153,65 @@ func TestUploadMetadata(t *testing.T) { meta := handler.GetUploadMetadata("test-session-id") require.Equal(t, "s3://teleport-unit-tests/test/test-session-id", meta.URL) } + +func TestEndpoints(t *testing.T) { + tests := []struct { + name string + fips bool + }{ + { + name: "fips", + fips: true, + }, + { + name: "without fips", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + fips := types.ClusterAuditConfigSpecV2_FIPS_DISABLED + if tt.fips { + fips = types.ClusterAuditConfigSpecV2_FIPS_ENABLED + modules.SetTestModules(t, &modules.TestModules{ + FIPS: true, + }) + } + + var request *http.Request + var once sync.Once + mux := http.NewServeMux() + mux.Handle("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + once.Do(func() { request = r.Clone(context.Background()) }) + w.WriteHeader(http.StatusTeapot) + })) + + server := httptest.NewServer(mux) + t.Cleanup(server.Close) + + handler, err := NewHandler(context.Background(), Config{ + Region: "us-west-1", + Path: "/test/", + Bucket: "teleport-unit-tests", + Endpoint: server.URL, + UseFIPSEndpoint: fips, + Insecure: true, + CredentialsProvider: aws.CredentialsProviderFunc(func(ctx context.Context) (aws.Credentials, error) { + return aws.Credentials{}, nil + }), + }) + // FIPS mode should fail because it is a violation to enable FIPS + // while also setting a custom endpoint. + if tt.fips { + assert.Error(t, err) + require.ErrorContains(t, err, "FIPS") + return + } + + require.NoError(t, err) + defer handler.Close() + require.NotNil(t, request.URL) + require.Equal(t, "/teleport-unit-tests", request.URL.Path) + }) + } +} diff --git a/lib/events/s3sessions/s3handler_test.go b/lib/events/s3sessions/s3handler_test.go index 4058b168bda4d..08c8c37b5719b 100644 --- a/lib/events/s3sessions/s3handler_test.go +++ b/lib/events/s3sessions/s3handler_test.go @@ -25,20 +25,13 @@ import ( "context" "fmt" "net/url" - "os" "testing" "github.com/stretchr/testify/require" "github.com/gravitational/teleport/lib/events/test" - "github.com/gravitational/teleport/lib/utils" ) -func TestMain(m *testing.M) { - utils.InitLoggerForTests() - os.Exit(m.Run()) -} - // TestStreams tests various streaming upload scenarios func TestStreams(t *testing.T) { handler, err := NewHandler(context.Background(), Config{ diff --git a/lib/events/s3sessions/s3handler_thirdparty_test.go b/lib/events/s3sessions/s3handler_thirdparty_test.go index 9ee89adbb30ac..a3882121d0548 100644 --- a/lib/events/s3sessions/s3handler_thirdparty_test.go +++ b/lib/events/s3sessions/s3handler_thirdparty_test.go @@ -25,7 +25,6 @@ import ( "testing" "github.com/aws/aws-sdk-go-v2/aws" - "github.com/aws/aws-sdk-go-v2/credentials" "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/google/uuid" "github.com/gravitational/trace" @@ -39,6 +38,8 @@ import ( // TestThirdpartyStreams tests various streaming upload scenarios // implemented by third party backends using fake backend func TestThirdpartyStreams(t *testing.T) { + t.Parallel() + var timeSource gofakes3.TimeSource backend := s3mem.New(s3mem.WithTimeSource(timeSource)) faker := gofakes3.New(backend, gofakes3.WithLogger(gofakes3.GlobalLog())) @@ -48,7 +49,9 @@ func TestThirdpartyStreams(t *testing.T) { bucketName := fmt.Sprintf("teleport-test-%v", uuid.New().String()) config := aws.Config{ - Credentials: credentials.NewStaticCredentialsProvider("YOUR-ACCESSKEYID", "YOUR-SECRETACCESSKEY", ""), + Credentials: aws.CredentialsProviderFunc(func(ctx context.Context) (aws.Credentials, error) { + return aws.Credentials{}, nil + }), Region: "us-west-1", BaseEndpoint: aws.String(server.URL), } @@ -64,12 +67,14 @@ func TestThirdpartyStreams(t *testing.T) { require.NoError(t, err) handler, err := NewHandler(context.Background(), Config{ - AWSConfig: &config, Region: "us-west-1", Path: "/test/", Bucket: bucketName, Endpoint: server.URL, DisableServerSideEncryption: true, + CredentialsProvider: aws.CredentialsProviderFunc(func(ctx context.Context) (aws.Credentials, error) { + return aws.Credentials{}, nil + }), }) require.NoError(t, err) diff --git a/lib/modules/test.go b/lib/modules/test.go index ac25205d47895..82a4afd24d53f 100644 --- a/lib/modules/test.go +++ b/lib/modules/test.go @@ -41,6 +41,8 @@ type TestModules struct { TestBuildType string // TestFeatures is returned from the Features function. TestFeatures Features + // FIPS allows tests to toggle fips behavior. + FIPS bool defaultModules @@ -80,7 +82,7 @@ func (m *TestModules) PrintVersion() { // IsBoringBinary checks if the binary was compiled with BoringCrypto. func (m *TestModules) IsBoringBinary() bool { - return m.defaultModules.IsBoringBinary() + return m.FIPS } // Features returns supported features. diff --git a/lib/service/servicecfg/auth.go b/lib/service/servicecfg/auth.go index 810515f49a757..1b09042215aed 100644 --- a/lib/service/servicecfg/auth.go +++ b/lib/service/servicecfg/auth.go @@ -21,7 +21,6 @@ package servicecfg import ( "slices" - "github.com/coreos/go-oidc/oauth2" "github.com/dustin/go-humanize" "github.com/gravitational/trace" "github.com/jonboulle/clockwork" @@ -178,10 +177,6 @@ type HostedPluginsConfig struct { // PluginOAuthProviders holds application credentials for each // 3rd party API provider type PluginOAuthProviders struct { - // TODO(tross) delete once teleport.e has been converted. - // Deprecated: use SlackCredentials instead. - Slack *oauth2.ClientCredentials - SlackCredentials *OAuthClientCredentials } diff --git a/lib/services/identitycenter.go b/lib/services/identitycenter.go index e256ab9941025..d3053b544e005 100644 --- a/lib/services/identitycenter.go +++ b/lib/services/identitycenter.go @@ -20,6 +20,7 @@ import ( "context" "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/emptypb" identitycenterv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/identitycenter/v1" "github.com/gravitational/teleport/lib/utils/pagination" @@ -90,7 +91,7 @@ type IdentityCenterAccounts interface { DeleteIdentityCenterAccount(context.Context, IdentityCenterAccountID) error // DeleteAllIdentityCenterAccounts deletes all Identity Center Account records - DeleteAllIdentityCenterAccounts(context.Context) error + DeleteAllIdentityCenterAccounts(context.Context, *identitycenterv1.DeleteAllIdentityCenterAccountsRequest) (*emptypb.Empty, error) } // PrincipalAssignmentID is a strongly-typed ID for Identity Center Principal @@ -124,7 +125,7 @@ type IdentityCenterPrincipalAssignments interface { DeletePrincipalAssignment(context.Context, PrincipalAssignmentID) error // DeleteAllPrincipalAssignments deletes all assignment record - DeleteAllPrincipalAssignments(context.Context) error + DeleteAllPrincipalAssignments(context.Context, *identitycenterv1.DeleteAllPrincipalAssignmentsRequest) (*emptypb.Empty, error) } // PermissionSetID is a strongly typed ID for an identitycenterv1.PermissionSet @@ -150,6 +151,9 @@ type IdentityCenterPermissionSets interface { // DeletePermissionSet deletes a specific Identity Center PermissionSet DeletePermissionSet(context.Context, PermissionSetID) error + + // DeleteAllPermissionSets deletes all Identity Center PermissionSets. + DeleteAllPermissionSets(context.Context, *identitycenterv1.DeleteAllPermissionSetsRequest) (*emptypb.Empty, error) } // IdentityCenterAccountAssignment wraps a raw identitycenterv1.AccountAssignment @@ -212,7 +216,7 @@ type IdentityCenterAccountAssignments interface { DeleteAccountAssignment(context.Context, IdentityCenterAccountAssignmentID) error // DeleteAllAccountAssignments deletes all known account assignments - DeleteAllAccountAssignments(context.Context) error + DeleteAllAccountAssignments(context.Context, *identitycenterv1.DeleteAllAccountAssignmentsRequest) (*emptypb.Empty, error) } // IdentityCenter combines all the resource managers used by the Identity Center plugin diff --git a/lib/services/local/identitycenter.go b/lib/services/local/identitycenter.go index 10cdf7777e33b..92904a5b9fa42 100644 --- a/lib/services/local/identitycenter.go +++ b/lib/services/local/identitycenter.go @@ -21,6 +21,7 @@ import ( "log/slog" "github.com/gravitational/trace" + "google.golang.org/protobuf/types/known/emptypb" "github.com/gravitational/teleport" identitycenterv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/identitycenter/v1" @@ -71,6 +72,7 @@ func (cfg *IdentityCenterServiceConfig) CheckAndSetDefaults() error { // IdentityCenterService handles low-level CRUD operations for the identity- // center related resources type IdentityCenterService struct { + identitycenterv1.UnimplementedIdentityCenterServiceServer accounts *generic.ServiceWrapper[*identitycenterv1.Account] permissionSets *generic.ServiceWrapper[*identitycenterv1.PermissionSet] principalAssignments *generic.ServiceWrapper[*identitycenterv1.PrincipalAssignment] @@ -213,8 +215,8 @@ func (svc *IdentityCenterService) DeleteIdentityCenterAccount(ctx context.Contex } // DeleteAllIdentityCenterAccounts deletes all Identity Center Account records -func (svc *IdentityCenterService) DeleteAllIdentityCenterAccounts(ctx context.Context) error { - return trace.Wrap(svc.accounts.DeleteAllResources(ctx)) +func (svc *IdentityCenterService) DeleteAllIdentityCenterAccounts(ctx context.Context, req *identitycenterv1.DeleteAllIdentityCenterAccountsRequest) (*emptypb.Empty, error) { + return &emptypb.Empty{}, trace.Wrap(svc.accounts.DeleteAllResources(ctx)) } // ListPrincipalAssignments lists all PrincipalAssignment records in the service @@ -281,8 +283,8 @@ func (svc *IdentityCenterService) DeletePrincipalAssignment(ctx context.Context, } // DeleteAllPrincipalAssignments deletes all assignment record -func (svc *IdentityCenterService) DeleteAllPrincipalAssignments(ctx context.Context) error { - return trace.Wrap(svc.principalAssignments.DeleteAllResources(ctx)) +func (svc *IdentityCenterService) DeleteAllPrincipalAssignments(ctx context.Context, req *identitycenterv1.DeleteAllPrincipalAssignmentsRequest) (*emptypb.Empty, error) { + return &emptypb.Empty{}, trace.Wrap(svc.principalAssignments.DeleteAllResources(ctx)) } // ListPermissionSets list the known Permission Sets in the managed Identity Center @@ -335,6 +337,11 @@ func (svc *IdentityCenterService) DeletePermissionSet(ctx context.Context, name return trace.Wrap(svc.permissionSets.DeleteResource(ctx, string(name))) } +// DeleteAllPermissionSets deletes all Identity Center PermissionSet +func (svc *IdentityCenterService) DeleteAllPermissionSets(ctx context.Context, req *identitycenterv1.DeleteAllPermissionSetsRequest) (*emptypb.Empty, error) { + return &emptypb.Empty{}, trace.Wrap(svc.permissionSets.DeleteAllResources(ctx)) +} + // ListAccountAssignments lists all IdentityCenterAccountAssignment record // known to the service func (svc *IdentityCenterService) ListAccountAssignments(ctx context.Context, pageSize int, page *pagination.PageRequestToken) ([]services.IdentityCenterAccountAssignment, pagination.NextPageToken, error) { @@ -404,6 +411,6 @@ func (svc *IdentityCenterService) DeleteAccountAssignment(ctx context.Context, n } // DeleteAllAccountAssignments deletes all known account assignments -func (svc *IdentityCenterService) DeleteAllAccountAssignments(ctx context.Context) error { - return trace.Wrap(svc.accountAssignments.DeleteAllResources(ctx)) +func (svc *IdentityCenterService) DeleteAllAccountAssignments(ctx context.Context, req *identitycenterv1.DeleteAllAccountAssignmentsRequest) (*emptypb.Empty, error) { + return &emptypb.Empty{}, trace.Wrap(svc.accountAssignments.DeleteAllResources(ctx)) } diff --git a/lib/services/local/identitycenter_test.go b/lib/services/local/identitycenter_test.go index b64a98eda5df6..0a2c085fa76ce 100644 --- a/lib/services/local/identitycenter_test.go +++ b/lib/services/local/identitycenter_test.go @@ -24,6 +24,7 @@ import ( "github.com/gravitational/trace" "github.com/jonboulle/clockwork" "github.com/stretchr/testify/require" + "google.golang.org/protobuf/types/known/emptypb" headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" identitycenterv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/identitycenter/v1" @@ -52,11 +53,12 @@ func TestIdentityCenterResourceCRUD(t *testing.T) { const resourceID = "alpha" testCases := []struct { - name string - createResource func(*testing.T, context.Context, services.IdentityCenter, string) types.Resource153 - getResource func(context.Context, services.IdentityCenter, string) (types.Resource153, error) - updateResource func(context.Context, services.IdentityCenter, types.Resource153) (types.Resource153, error) - upsertResource func(context.Context, services.IdentityCenter, types.Resource153) (types.Resource153, error) + name string + createResource func(*testing.T, context.Context, services.IdentityCenter, string) types.Resource153 + getResource func(context.Context, services.IdentityCenter, string) (types.Resource153, error) + updateResource func(context.Context, services.IdentityCenter, types.Resource153) (types.Resource153, error) + upsertResource func(context.Context, services.IdentityCenter, types.Resource153) (types.Resource153, error) + deleteAllResources func(context.Context, services.IdentityCenter) (*emptypb.Empty, error) }{ { name: "Account", @@ -74,6 +76,9 @@ func TestIdentityCenterResourceCRUD(t *testing.T) { acct := r.(services.IdentityCenterAccount) return svc.UpsertIdentityCenterAccount(subtestCtx, acct) }, + deleteAllResources: func(subtestCtx context.Context, svc services.IdentityCenter) (*emptypb.Empty, error) { + return svc.DeleteAllIdentityCenterAccounts(subtestCtx, &identitycenterv1.DeleteAllIdentityCenterAccountsRequest{}) + }, }, { name: "PermissionSet", @@ -87,6 +92,9 @@ func TestIdentityCenterResourceCRUD(t *testing.T) { ps := r.(*identitycenterv1.PermissionSet) return svc.UpdatePermissionSet(subtestCtx, ps) }, + deleteAllResources: func(subtestCtx context.Context, svc services.IdentityCenter) (*emptypb.Empty, error) { + return svc.DeleteAllPermissionSets(subtestCtx, &identitycenterv1.DeleteAllPermissionSetsRequest{}) + }, }, { name: "AccountAssignment", @@ -104,6 +112,9 @@ func TestIdentityCenterResourceCRUD(t *testing.T) { asmt := r.(services.IdentityCenterAccountAssignment) return svc.UpsertAccountAssignment(subtestCtx, asmt) }, + deleteAllResources: func(subtestCtx context.Context, svc services.IdentityCenter) (*emptypb.Empty, error) { + return svc.DeleteAllAccountAssignments(subtestCtx, &identitycenterv1.DeleteAllAccountAssignmentsRequest{}) + }, }, { name: "PrincipalAssignment", @@ -121,6 +132,9 @@ func TestIdentityCenterResourceCRUD(t *testing.T) { asmt := r.(*identitycenterv1.PrincipalAssignment) return svc.UpsertPrincipalAssignment(subtestCtx, asmt) }, + deleteAllResources: func(subtestCtx context.Context, svc services.IdentityCenter) (*emptypb.Empty, error) { + return svc.DeleteAllPrincipalAssignments(subtestCtx, &identitycenterv1.DeleteAllPrincipalAssignmentsRequest{}) + }, }, } @@ -215,6 +229,43 @@ func TestIdentityCenterResourceCRUD(t *testing.T) { require.NoError(t, err) require.Equal(t, "2", r.GetMetadata().Labels["update"]) }) + + t.Run("DeleteAllResources", func(t *testing.T) { + t.Parallel() + + ctx := newTestContext(t) + clock := clockwork.NewFakeClock() + backend := newTestBackend(t, ctx, clock) + defer backend.Close() + + // GIVEN an IdentityCenter service populated with a resource + uut, err := NewIdentityCenterService(IdentityCenterServiceConfig{Backend: backend}) + require.NoError(t, err) + + resourceTestNames := []string{"r1", "r2"} + for _, v := range resourceTestNames { + test.createResource(t, ctx, uut, v) + } + + // EXPECT that the backend records for the resources created above can be fetched + var resourceNamesFromBackend []string + for _, v := range resourceTestNames { + r, err := test.getResource(ctx, uut, v) + require.NoError(t, err) + resourceNamesFromBackend = append(resourceNamesFromBackend, r.GetMetadata().GetName()) + } + require.ElementsMatch(t, resourceTestNames, resourceNamesFromBackend) + + // WHEN I attempt to Delete resources + _, err = test.deleteAllResources(ctx, uut) + require.NoError(t, err) + + // EXPECT that the backend reflects the resource were deleted. + for _, v := range resourceTestNames { + _, err := test.getResource(ctx, uut, v) + require.ErrorContains(t, err, "doesn't exist") + } + }) }) } } diff --git a/lib/services/local/provisioningstates.go b/lib/services/local/provisioningstates.go index 407c964fa3855..d28a9f4fb244e 100644 --- a/lib/services/local/provisioningstates.go +++ b/lib/services/local/provisioningstates.go @@ -20,6 +20,7 @@ import ( "context" "github.com/gravitational/trace" + "google.golang.org/protobuf/types/known/emptypb" provisioningv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/provisioning/v1" "github.com/gravitational/teleport/api/types" @@ -36,6 +37,7 @@ const ( // ProvisioningStateService handles low-level CRUD operations for the provisioning status type ProvisioningStateService struct { + provisioningv1.UnimplementedProvisioningServiceServer service *generic.ServiceWrapper[*provisioningv1.PrincipalState] } @@ -172,8 +174,8 @@ func (ss *ProvisioningStateService) DeleteProvisioningState(ctx context.Context, // DeleteDownstreamProvisioningStates deletes *all* provisioning records for // a given downstream -func (ss *ProvisioningStateService) DeleteDownstreamProvisioningStates(ctx context.Context, downstreamID services.DownstreamID) error { - return trace.Wrap(ss.service.WithPrefix(string(downstreamID)).DeleteAllResources(ctx)) +func (ss *ProvisioningStateService) DeleteDownstreamProvisioningStates(ctx context.Context, req *provisioningv1.DeleteDownstreamProvisioningStatesRequest) (*emptypb.Empty, error) { + return &emptypb.Empty{}, trace.Wrap(ss.service.WithPrefix(req.GetDownstreamId()).DeleteAllResources(ctx)) } // DeleteAllProvisioningStates deletes *all* provisioning records for a *all* diff --git a/lib/services/provisioningstates.go b/lib/services/provisioningstates.go index 8d1e1c0de5497..0a141cc115f2f 100644 --- a/lib/services/provisioningstates.go +++ b/lib/services/provisioningstates.go @@ -19,6 +19,8 @@ package services import ( "context" + "google.golang.org/protobuf/types/known/emptypb" + provisioningv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/provisioning/v1" "github.com/gravitational/teleport/lib/utils/pagination" ) @@ -69,7 +71,7 @@ type DownstreamProvisioningStates interface { // DeleteDownstreamProvisioningStates deletes *all* provisioning records for // a given downstream - DeleteDownstreamProvisioningStates(context.Context, DownstreamID) error + DeleteDownstreamProvisioningStates(context.Context, *provisioningv1.DeleteDownstreamProvisioningStatesRequest) (*emptypb.Empty, error) } // ProvisioningStates defines an interface for managing a Provisioning Principal diff --git a/lib/services/useracl.go b/lib/services/useracl.go index 241bde207b702..5ec6fe73f1ce8 100644 --- a/lib/services/useracl.go +++ b/lib/services/useracl.go @@ -114,6 +114,8 @@ type UserACL struct { CrownJewel ResourceAccess `json:"crownJewel"` // AccessGraphSettings defines access to manage access graph settings. AccessGraphSettings ResourceAccess `json:"accessGraphSettings"` + // ReviewRequests defines the ability to review requests + ReviewRequests bool `json:"reviewRequests"` } func hasAccess(roleSet RoleSet, ctx *Context, kind string, verbs ...string) bool { @@ -205,6 +207,7 @@ func NewUserACL(user types.User, userRoles RoleSet, features proto.Features, des botInstances := newAccess(userRoles, ctx, types.KindBotInstance) crownJewelAccess := newAccess(userRoles, ctx, types.KindCrownJewel) userTasksAccess := newAccess(userRoles, ctx, types.KindUserTask) + reviewRequests := userRoles.MaybeCanReviewRequests() var auditQuery ResourceAccess var securityReports ResourceAccess @@ -218,6 +221,7 @@ func NewUserACL(user types.User, userRoles RoleSet, features proto.Features, des AppServers: appServerAccess, DBServers: dbServerAccess, DB: dbAccess, + ReviewRequests: reviewRequests, KubeServers: kubeServerAccess, Desktops: desktopAccess, AuthConnectors: authConnectors, diff --git a/lib/services/useracl_test.go b/lib/services/useracl_test.go index 23251b04d1f3f..4bcb6a75763da 100644 --- a/lib/services/useracl_test.go +++ b/lib/services/useracl_test.go @@ -114,6 +114,8 @@ func TestNewUserACL(t *testing.T) { // test that desktopRecordingEnabled being false overrides the roleSet.RecordDesktopSession() returning true userContext = NewUserACL(user, roleSet, proto.Features{}, false, false) require.False(t, userContext.DesktopSessionRecording) + + require.False(t, userContext.ReviewRequests) } func TestNewUserACLCloud(t *testing.T) { diff --git a/lib/srv/ctx.go b/lib/srv/ctx.go index 2cb68d8384c5a..2a0dfb6f8db48 100644 --- a/lib/srv/ctx.go +++ b/lib/srv/ctx.go @@ -862,7 +862,7 @@ func (c *ServerContext) reportStats(conn utils.Stater) { Type: events.SessionDataEvent, Code: events.SessionDataCode, }, - ServerMetadata: c.GetServerMetadata(), + ServerMetadata: c.srv.TargetMetadata(), SessionMetadata: c.GetSessionMetadata(), UserMetadata: c.Identity.GetUserMetadata(), ConnectionMetadata: apievents.ConnectionMetadata{ @@ -1247,15 +1247,6 @@ func (c *ServerContext) GetExecRequest() (Exec, error) { return c.execRequest, nil } -func (c *ServerContext) GetServerMetadata() apievents.ServerMetadata { - return apievents.ServerMetadata{ - ServerVersion: teleport.Version, - ServerID: c.srv.HostUUID(), - ServerHostname: c.srv.GetInfo().GetHostname(), - ServerNamespace: c.srv.GetNamespace(), - } -} - func (c *ServerContext) GetSessionMetadata() apievents.SessionMetadata { return apievents.SessionMetadata{ SessionID: string(c.SessionID()), diff --git a/lib/srv/exec.go b/lib/srv/exec.go index dd1a15457b7d1..694bd6ddb1776 100644 --- a/lib/srv/exec.go +++ b/lib/srv/exec.go @@ -262,7 +262,7 @@ func (e *localExec) transformSecureCopy() error { Time: time.Now(), }, UserMetadata: e.Ctx.Identity.GetUserMetadata(), - ServerMetadata: e.Ctx.GetServerMetadata(), + ServerMetadata: e.Ctx.GetServer().TargetMetadata(), Error: err.Error(), }) return trace.Wrap(err) @@ -367,7 +367,7 @@ func (e *remoteExec) Start(ctx context.Context, ch ssh.Channel) (*ExecResult, er Time: time.Now(), }, UserMetadata: e.ctx.Identity.GetUserMetadata(), - ServerMetadata: e.ctx.GetServerMetadata(), + ServerMetadata: e.ctx.GetServer().TargetMetadata(), Error: err.Error(), }) return nil, trace.Wrap(err) @@ -433,7 +433,7 @@ func (e *remoteExec) PID() int { // instead of ctx.srv. func emitExecAuditEvent(ctx *ServerContext, cmd string, execErr error) { // Create common fields for event. - serverMeta := ctx.GetServerMetadata() + serverMeta := ctx.GetServer().TargetMetadata() sessionMeta := ctx.GetSessionMetadata() userMeta := ctx.Identity.GetUserMetadata() diff --git a/lib/srv/exec_test.go b/lib/srv/exec_test.go index a9f658eba8234..fffa01dd0891b 100644 --- a/lib/srv/exec_test.go +++ b/lib/srv/exec_test.go @@ -64,12 +64,12 @@ func TestEmitExecAuditEvent(t *testing.T) { rec, ok := scx.session.recorder.(*mockRecorder) require.True(t, ok) + scx.GetServer().TargetMetadata() + expectedUsr, err := user.Current() require.NoError(t, err) - expectedHostname, err := os.Hostname() - if err != nil { - expectedHostname = "localhost" - } + expectedHostname := "testHost" + expectedMeta := apievents.UserMetadata{ User: "teleportUser", Login: expectedUsr.Username, @@ -116,7 +116,8 @@ func TestEmitExecAuditEvent(t *testing.T) { require.Equal(t, tt.outCommand, execEvent.Command) require.Equal(t, tt.outCode, execEvent.ExitCode) require.Equal(t, expectedMeta, execEvent.UserMetadata) - require.Equal(t, "testHostUUID", execEvent.ServerID) + require.Equal(t, "123", execEvent.ServerID) + require.Equal(t, "abc", execEvent.ForwardedBy) require.Equal(t, expectedHostname, execEvent.ServerHostname) require.Equal(t, "testNamespace", execEvent.ServerNamespace) require.Equal(t, "xxx", execEvent.SessionID) diff --git a/lib/srv/forward/sshserver.go b/lib/srv/forward/sshserver.go index 0e20e9d8434d6..978be8c89ea32 100644 --- a/lib/srv/forward/sshserver.go +++ b/lib/srv/forward/sshserver.go @@ -1459,7 +1459,7 @@ func (s *Server) handleSubsystem(ctx context.Context, ch ssh.Channel, req *ssh.R } // if SFTP was requested, check that - if subsystem.subsytemName == teleport.SFTPSubsystem { + if subsystem.subsystemName == teleport.SFTPSubsystem { err := serverContext.CheckSFTPAllowed(s.sessionRegistry) if err != nil { s.EmitAuditEvent(context.WithoutCancel(ctx), &apievents.SFTP{ @@ -1469,7 +1469,7 @@ func (s *Server) handleSubsystem(ctx context.Context, ch ssh.Channel, req *ssh.R Time: time.Now(), }, UserMetadata: serverContext.Identity.GetUserMetadata(), - ServerMetadata: serverContext.GetServerMetadata(), + ServerMetadata: serverContext.GetServer().TargetMetadata(), Error: err.Error(), }) return trace.Wrap(err) @@ -1480,7 +1480,7 @@ func (s *Server) handleSubsystem(ctx context.Context, ch ssh.Channel, req *ssh.R err = subsystem.Start(ctx, ch) if err != nil { serverContext.SendSubsystemResult(srv.SubsystemResult{ - Name: subsystem.subsytemName, + Name: subsystem.subsystemName, Err: trace.Wrap(err), }) return trace.Wrap(err) @@ -1490,7 +1490,7 @@ func (s *Server) handleSubsystem(ctx context.Context, ch ssh.Channel, req *ssh.R go func() { err := subsystem.Wait() serverContext.SendSubsystemResult(srv.SubsystemResult{ - Name: subsystem.subsytemName, + Name: subsystem.subsystemName, Err: trace.Wrap(err), }) }() diff --git a/lib/srv/forward/subsystem.go b/lib/srv/forward/subsystem.go index 98d3f5a6590fb..f97d8fd3123e8 100644 --- a/lib/srv/forward/subsystem.go +++ b/lib/srv/forward/subsystem.go @@ -38,23 +38,23 @@ type remoteSubsystem struct { log *log.Entry serverContext *srv.ServerContext - subsytemName string + subsystemName string ctx context.Context errorCh chan error } // parseRemoteSubsystem returns *remoteSubsystem which can be used to run a subsystem on a remote node. -func parseRemoteSubsystem(ctx context.Context, subsytemName string, serverContext *srv.ServerContext) *remoteSubsystem { +func parseRemoteSubsystem(ctx context.Context, subsystemName string, serverContext *srv.ServerContext) *remoteSubsystem { return &remoteSubsystem{ log: log.WithFields(log.Fields{ teleport.ComponentKey: teleport.ComponentRemoteSubsystem, teleport.ComponentFields: map[string]string{ - "name": subsytemName, + "name": subsystemName, }, }), serverContext: serverContext, - subsytemName: subsytemName, + subsystemName: subsystemName, ctx: ctx, errorCh: make(chan error, 3), } @@ -79,10 +79,10 @@ func (r *remoteSubsystem) Start(ctx context.Context, channel ssh.Channel) error // request the subsystem from the remote node. if successful, the user can // interact with the remote subsystem with stdin, stdout, and stderr. - err = session.RequestSubsystem(ctx, r.subsytemName) + err = session.RequestSubsystem(ctx, r.subsystemName) if err != nil { // emit an event to the audit log with the reason remote execution failed - r.emitAuditEvent(err) + r.emitAuditEvent(ctx, err) return trace.Wrap(err) } @@ -127,13 +127,12 @@ func (r *remoteSubsystem) Wait() error { } // emit an event to the audit log with the result of execution - r.emitAuditEvent(lastErr) + r.emitAuditEvent(r.ctx, lastErr) return lastErr } -func (r *remoteSubsystem) emitAuditEvent(err error) { - srv := r.serverContext.GetServer() +func (r *remoteSubsystem) emitAuditEvent(ctx context.Context, err error) { subsystemEvent := &apievents.Subsystem{ Metadata: apievents.Metadata{ Type: events.SubsystemEvent, @@ -143,7 +142,8 @@ func (r *remoteSubsystem) emitAuditEvent(err error) { LocalAddr: r.serverContext.RemoteClient.LocalAddr().String(), RemoteAddr: r.serverContext.RemoteClient.RemoteAddr().String(), }, - Name: r.subsytemName, + Name: r.subsystemName, + ServerMetadata: r.serverContext.GetServer().TargetMetadata(), } if err != nil { @@ -153,7 +153,7 @@ func (r *remoteSubsystem) emitAuditEvent(err error) { subsystemEvent.Code = events.SubsystemCode } - if err := srv.EmitAuditEvent(srv.Context(), subsystemEvent); err != nil { + if err := r.serverContext.GetServer().EmitAuditEvent(ctx, subsystemEvent); err != nil { r.log.WithError(err).Warn("Failed to emit subsystem audit event.") } } diff --git a/lib/srv/mock.go b/lib/srv/mock.go index cfe94e4dc5e78..97b9a2f878600 100644 --- a/lib/srv/mock.go +++ b/lib/srv/mock.go @@ -245,7 +245,12 @@ func (m *mockServer) GetInfo() types.Server { } func (m *mockServer) TargetMetadata() apievents.ServerMetadata { - return apievents.ServerMetadata{} + return apievents.ServerMetadata{ + ServerID: "123", + ForwardedBy: "abc", + ServerHostname: "testHost", + ServerNamespace: "testNamespace", + } } // UseTunnel used to determine if this node has connected to this cluster diff --git a/lib/srv/regular/sftp.go b/lib/srv/regular/sftp.go index 10ed01d3ea594..f3f194ab16ae0 100644 --- a/lib/srv/regular/sftp.go +++ b/lib/srv/regular/sftp.go @@ -78,7 +78,7 @@ func (s *sftpSubsys) Start(ctx context.Context, Time: time.Now(), }, UserMetadata: serverCtx.Identity.GetUserMetadata(), - ServerMetadata: serverCtx.GetServerMetadata(), + ServerMetadata: serverCtx.GetServer().TargetMetadata(), Error: srv.ErrNodeFileCopyingNotPermitted.Error(), }) return srv.ErrNodeFileCopyingNotPermitted @@ -169,7 +169,7 @@ func (s *sftpSubsys) Start(ctx context.Context, defer auditPipeOut.Close() // Create common fields for events - serverMeta := serverCtx.GetServerMetadata() + serverMeta := serverCtx.GetServer().TargetMetadata() sessionMeta := serverCtx.GetSessionMetadata() userMeta := serverCtx.Identity.GetUserMetadata() connectionMeta := apievents.ConnectionMetadata{ diff --git a/lib/srv/regular/sshserver.go b/lib/srv/regular/sshserver.go index beade253ab3d2..b11427118f89d 100644 --- a/lib/srv/regular/sshserver.go +++ b/lib/srv/regular/sshserver.go @@ -2302,7 +2302,7 @@ func (s *Server) parseSubsystemRequest(req *ssh.Request, ctx *srv.ServerContext) Time: time.Now(), }, UserMetadata: ctx.Identity.GetUserMetadata(), - ServerMetadata: ctx.GetServerMetadata(), + ServerMetadata: ctx.GetServer().TargetMetadata(), Error: err.Error(), }) return nil, trace.Wrap(err) diff --git a/lib/utils/aws/s3.go b/lib/utils/aws/s3.go index f42871fb417d7..f54f7f4c68e4c 100644 --- a/lib/utils/aws/s3.go +++ b/lib/utils/aws/s3.go @@ -23,6 +23,7 @@ import ( "errors" "io" "net/http" + "strings" awsv2 "github.com/aws/aws-sdk-go-v2/aws" managerv2 "github.com/aws/aws-sdk-go-v2/feature/s3/manager" @@ -30,6 +31,7 @@ import ( s3types "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/service/s3" + "github.com/aws/smithy-go" "github.com/gravitational/trace" ) @@ -84,6 +86,11 @@ func ConvertS3Error(err error, args ...interface{}) error { return trace.NotFound(notFound.Error(), args...) } + var opError *smithy.OperationError + if errors.As(err, &opError) && strings.Contains(opError.Err.Error(), "FIPS") { + return trace.BadParameter(opError.Error()) + } + return err } diff --git a/lib/web/apiserver.go b/lib/web/apiserver.go index 3d04ff68892e8..25ec5022321de 100644 --- a/lib/web/apiserver.go +++ b/lib/web/apiserver.go @@ -813,6 +813,9 @@ func (h *Handler) bindDefaultEndpoints() { // Site specific API + // get site info + h.GET("/webapi/sites/:site/info", h.WithClusterAuth(h.getClusterInfo)) + // get namespaces h.GET("/webapi/sites/:site/namespaces", h.WithClusterAuth(h.getSiteNamespaces)) @@ -2885,6 +2888,35 @@ func (h *Handler) getClusters(w http.ResponseWriter, r *http.Request, p httprout return out, nil } +type getClusterInfoResponse struct { + ui.Cluster + IsCloud bool `json:"isCloud"` +} + +// getClusterInfo returns the information about the cluster in the :site param +func (h *Handler) getClusterInfo(w http.ResponseWriter, r *http.Request, p httprouter.Params, sctx *SessionContext, site reversetunnelclient.RemoteSite) (interface{}, error) { + ctx := r.Context() + clusterDetails, err := ui.GetClusterDetails(ctx, site) + if err != nil { + return nil, trace.Wrap(err) + } + + clt, err := sctx.GetUserClient(ctx, site) + if err != nil { + return nil, trace.Wrap(err) + } + + pingResp, err := clt.Ping(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + + return getClusterInfoResponse{ + Cluster: *clusterDetails, + IsCloud: pingResp.GetServerFeatures().Cloud, + }, nil +} + type getSiteNamespacesResponse struct { Namespaces []types.Namespace `json:"namespaces"` } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2fedf18b480f6..27153582c22d3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -356,6 +356,9 @@ importers: '@xterm/addon-fit': specifier: ^0.10.0 version: 0.10.0(@xterm/xterm@5.5.0) + '@xterm/addon-image': + specifier: ^0.8.0 + version: 0.8.0(@xterm/xterm@5.5.0) '@xterm/addon-web-links': specifier: ^0.11.0 version: 0.11.0(@xterm/xterm@5.5.0) @@ -2826,6 +2829,11 @@ packages: peerDependencies: '@xterm/xterm': ^5.0.0 + '@xterm/addon-image@0.8.0': + resolution: {integrity: sha512-b/dqpFn3jUad2pUP5UpF4scPIh0WdxRQL/1qyiahGfUI85XZTCXo0py9G6AcOR2QYUw8eJ8EowGspT7BQcgw6A==} + peerDependencies: + '@xterm/xterm': ^5.2.0 + '@xterm/addon-web-links@0.11.0': resolution: {integrity: sha512-nIHQ38pQI+a5kXnRaTgwqSHnX7KE6+4SVoceompgHL26unAxdfP6IPqUTSYPQgSwM56hsElfoNrrW5V7BUED/Q==} peerDependencies: @@ -9780,6 +9788,10 @@ snapshots: dependencies: '@xterm/xterm': 5.5.0 + '@xterm/addon-image@0.8.0(@xterm/xterm@5.5.0)': + dependencies: + '@xterm/xterm': 5.5.0 + '@xterm/addon-web-links@0.11.0(@xterm/xterm@5.5.0)': dependencies: '@xterm/xterm': 5.5.0 diff --git a/tool/tctl/sso/configure/oidc.go b/tool/tctl/sso/configure/oidc.go index 81c85ce6346e2..c783d29192381 100644 --- a/tool/tctl/sso/configure/oidc.go +++ b/tool/tctl/sso/configure/oidc.go @@ -19,13 +19,12 @@ package configure import ( "context" "fmt" - "net/http" "net/url" "os" "strings" "github.com/alecthomas/kingpin/v2" - "github.com/coreos/go-oidc/oidc" + "github.com/coreos/go-oidc/v3/oidc" "github.com/gravitational/trace" "github.com/sirupsen/logrus" @@ -289,8 +288,7 @@ func oidcRunFunc(ctx context.Context, cmd *SSOConfigureCommand, spec *types.OIDC } // verify .well-known/openid-configuration is reachable - err = checkOpenidConfiguration(spec.IssuerURL) - if err != nil { + if _, err := oidc.NewProvider(ctx, spec.IssuerURL); err != nil { if cmd.Config.Debug { cmd.Logger.WithError(err).Warnf("Failed to load .well-known/openid-configuration for issuer URL %q", spec.IssuerURL) } @@ -346,9 +344,3 @@ func oidcRunFunc(ctx context.Context, cmd *SSOConfigureCommand, spec *types.OIDC return trace.Wrap(utils.WriteYAML(os.Stdout, connector)) } - -func checkOpenidConfiguration(issuerURL string) error { - r := oidc.NewHTTPProviderConfigGetter(http.DefaultClient, issuerURL) - _, err := r.Get() - return trace.Wrap(err) -} diff --git a/tool/tsh/common/tsh.go b/tool/tsh/common/tsh.go index 4875f836b3a4f..0ef322caa460a 100644 --- a/tool/tsh/common/tsh.go +++ b/tool/tsh/common/tsh.go @@ -4867,7 +4867,18 @@ func onStatus(cf *CLIConf) error { return trace.Wrap(err) } - if err := printLoginInformation(cf, profile, profiles, cf.getAccessListsToReview(tc)); err != nil { + // `tsh status` should run without requiring user interaction. + // To achieve this, we avoid remote calls that might prompt for + // hardware key touch or require a PIN. + hardwareKeyInteractionRequired := tc.PrivateKeyPolicy.MFAVerified() + + var accessListsToReview []*accesslist.AccessList + if hardwareKeyInteractionRequired { + log.Debug("Skipping fetching access lists to review due to Hardware Key PIN/Touch requirement.") + } else { + accessListsToReview = cf.getAccessListsToReview(tc) + } + if err := printLoginInformation(cf, profile, profiles, accessListsToReview); err != nil { return trace.Wrap(err) } @@ -4880,7 +4891,7 @@ func onStatus(cf *CLIConf) error { return trace.NotFound("Active profile expired.") } - if tc.PrivateKeyPolicy.MFAVerified() { + if hardwareKeyInteractionRequired { log.Debug("Skipping cluster alerts due to Hardware Key PIN/Touch requirement.") } else { if err := common.ShowClusterAlerts(cf.Context, tc, os.Stderr, nil, diff --git a/web/packages/teleport/package.json b/web/packages/teleport/package.json index 523e6cb14eb86..d76bc3addb6d4 100644 --- a/web/packages/teleport/package.json +++ b/web/packages/teleport/package.json @@ -32,11 +32,12 @@ "@opentelemetry/sdk-trace-base": "1.26.0", "@opentelemetry/sdk-trace-web": "1.26.0", "@opentelemetry/semantic-conventions": "1.27.0", - "@xterm/xterm": "^5.5.0", "@xterm/addon-canvas": "^0.7.0", "@xterm/addon-fit": "^0.10.0", + "@xterm/addon-image": "^0.8.0", "@xterm/addon-web-links": "^0.11.0", "@xterm/addon-webgl": "^0.18.0", + "@xterm/xterm": "^5.5.0", "create-react-class": "^15.6.3", "events": "3.3.0" }, diff --git a/web/packages/teleport/src/Clusters/ClusterList/ClusterList.tsx b/web/packages/teleport/src/Clusters/ClusterList/ClusterList.tsx index b15118c38e98c..293bf38d15c90 100644 --- a/web/packages/teleport/src/Clusters/ClusterList/ClusterList.tsx +++ b/web/packages/teleport/src/Clusters/ClusterList/ClusterList.tsx @@ -26,6 +26,7 @@ import { Primary, Secondary } from 'design/Label'; import { Cluster } from 'teleport/services/clusters'; import cfg from 'teleport/config'; +import { DropdownDivider } from 'teleport/components/Dropdown'; export default function ClustersList(props: Props) { const { clusters = [], pageSize = 50, menuFlags } = props; @@ -84,6 +85,12 @@ function renderActionCell({ clusterId }: Cluster, flags: MenuFlags) { ); } + $items.push(); + + $items.push( + renderMenuItem('Manage Cluster', cfg.getManageClusterRoute(clusterId)) + ); + return ( {$items && } ); diff --git a/web/packages/teleport/src/Clusters/Clusters.story.tsx b/web/packages/teleport/src/Clusters/Clusters.story.tsx index 03fd1184c931f..899ba8de53a90 100644 --- a/web/packages/teleport/src/Clusters/Clusters.story.tsx +++ b/web/packages/teleport/src/Clusters/Clusters.story.tsx @@ -26,7 +26,7 @@ import { FeaturesContextProvider } from 'teleport/FeaturesContext'; import { getOSSFeatures } from 'teleport/features'; -import { Clusters } from './Clusters'; +import { ClusterListPage } from './Clusters'; import * as fixtures from './fixtures'; export default { @@ -40,7 +40,7 @@ export function Story({ value }: { value: teleport.Context }) { - + diff --git a/web/packages/teleport/src/Clusters/Clusters.tsx b/web/packages/teleport/src/Clusters/Clusters.tsx index 61c95d919f05a..68f4acac1fe6f 100644 --- a/web/packages/teleport/src/Clusters/Clusters.tsx +++ b/web/packages/teleport/src/Clusters/Clusters.tsx @@ -30,11 +30,32 @@ import { import useTeleport from 'teleport/useTeleport'; import { useFeatures } from 'teleport/FeaturesContext'; +import { Route, Switch } from 'teleport/components/Router'; +import cfg from 'teleport/config'; import ClusterList from './ClusterList'; import { buildACL } from './utils'; +import { ManageCluster } from './ManageCluster'; export function Clusters() { + return ( + + + + + ); +} + +export function ClusterListPage() { const ctx = useTeleport(); const [clusters, setClusters] = useState([]); diff --git a/web/packages/teleport/src/Clusters/ManageCluster/ManageCluster.story.tsx b/web/packages/teleport/src/Clusters/ManageCluster/ManageCluster.story.tsx new file mode 100644 index 0000000000000..8d6732bd3b743 --- /dev/null +++ b/web/packages/teleport/src/Clusters/ManageCluster/ManageCluster.story.tsx @@ -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 . + */ + +import React from 'react'; +import { MemoryRouter } from 'react-router'; + +import { createTeleportContext } from 'teleport/mocks/contexts'; +import { ContextProvider } from 'teleport/index'; +import { ContentMinWidth } from 'teleport/Main/Main'; +import { Route } from 'teleport/components/Router'; + +import { clusterInfoFixture } from '../fixtures'; + +import { ManageCluster } from './ManageCluster'; + +export default { + title: 'Teleport/Clusters/ManageCluster', +}; + +function render(fetchClusterDetails: (clusterId: string) => Promise) { + const ctx = createTeleportContext(); + + ctx.clusterService.fetchClusterDetails = fetchClusterDetails; + return ( + + + + + + + + + + ); +} + +export function Loading() { + const fetchClusterDetails = () => { + // promise never resolves to simulate loading state + return new Promise(() => {}); + }; + return render(fetchClusterDetails); +} + +export function Failed() { + const fetchClusterDetails = () => + Promise.reject(new Error('Failed to load cluster details')); + return render(fetchClusterDetails); +} + +export function Success() { + const fetchClusterDetails = () => { + return new Promise(resolve => { + resolve(clusterInfoFixture); + }); + }; + return render(fetchClusterDetails); +} diff --git a/web/packages/teleport/src/Clusters/ManageCluster/ManageCluster.test.tsx b/web/packages/teleport/src/Clusters/ManageCluster/ManageCluster.test.tsx new file mode 100644 index 0000000000000..0d137476956a4 --- /dev/null +++ b/web/packages/teleport/src/Clusters/ManageCluster/ManageCluster.test.tsx @@ -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 . + */ + +import React from 'react'; +import { MemoryRouter, Route } from 'react-router-dom'; +import { setupServer } from 'msw/node'; +import { http, HttpResponse } from 'msw'; + +import { render, waitFor, screen } from 'design/utils/testing'; + +import { ContextProvider } from 'teleport/index'; +import { createTeleportContext } from 'teleport/mocks/contexts'; +import { ContentMinWidth } from 'teleport/Main/Main'; +import cfg from 'teleport/config'; + +import { clusterInfoFixture } from '../fixtures'; + +import { ManageCluster } from './ManageCluster'; + +function renderElement(element, ctx) { + return render( + + + + {element} + + + + ); +} + +describe('test ManageCluster component', () => { + const server = setupServer( + http.get(cfg.getClusterInfoPath('cluster-id'), () => { + return HttpResponse.json({ + name: 'cluster-id', + lastConnected: new Date(), + status: 'active', + publicURL: 'cluster-id.teleport.com', + authVersion: 'v17.0.0', + proxyVersion: 'v17.0.0', + isCloud: false, + licenseExpiry: new Date(), + }); + }) + ); + + beforeAll(() => server.listen()); + afterEach(() => server.resetHandlers()); + afterAll(() => server.close()); + + test('fetches cluster information on load', async () => { + const ctx = createTeleportContext(); + + renderElement(, ctx); + await waitFor(() => { + expect(screen.getByText('v17.0.0')).toBeInTheDocument(); + }); + + expect(screen.getByText('cluster-id')).toBeInTheDocument(); + expect(screen.getByText('cluster-id.teleport.com')).toBeInTheDocument(); + }); + + test('shows error when load fails', async () => { + server.use( + http.get(cfg.getClusterInfoPath('cluster-id'), () => { + return HttpResponse.json( + { + message: 'Failed to load cluster information', + }, + { status: 400 } + ); + }) + ); + + const ctx = createTeleportContext(); + + renderElement(, ctx); + await waitFor(() => { + expect( + screen.getByText('Failed to load cluster information') + ).toBeInTheDocument(); + }); + + await waitFor(() => { + expect( + screen.queryByText(clusterInfoFixture.authVersion) + ).not.toBeInTheDocument(); + }); + }); +}); diff --git a/web/packages/teleport/src/Clusters/ManageCluster/ManageCluster.tsx b/web/packages/teleport/src/Clusters/ManageCluster/ManageCluster.tsx new file mode 100644 index 0000000000000..e349e26b5098c --- /dev/null +++ b/web/packages/teleport/src/Clusters/ManageCluster/ManageCluster.tsx @@ -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 . + */ + +import React, { useCallback, useEffect, useState } from 'react'; +import styled from 'styled-components'; +import { Link } from 'react-router-dom'; +import { useParams } from 'react-router'; + +import { useAsync, Attempt } from 'shared/hooks/useAsync'; + +import { MultiRowBox, Row } from 'design/MultiRowBox'; +import Flex from 'design/Flex'; +import * as Icons from 'design/Icon'; +import Text, { H2 } from 'design/Text'; +import { Indicator } from 'design/Indicator'; +import Box, { BoxProps } from 'design/Box'; +import { ShimmerBox } from 'design/ShimmerBox'; +import { Alert } from 'design/Alert'; + +import { LoadingSkeleton } from 'shared/components/UnifiedResources/shared/LoadingSkeleton'; + +import { + FeatureBox, + FeatureHeader, + FeatureHeaderTitle, +} from 'teleport/components/Layout'; +import { useTeleport } from 'teleport/index'; +import cfg from 'teleport/config'; +import { useNoMinWidth } from 'teleport/Main'; +import { ClusterInfo } from 'teleport/services/clusters'; + +/** + * OSS Cluster Management page. + * @returns JSX.Element + */ +export function ManageCluster() { + const [cluster, setCluster] = useState(null); + const ctx = useTeleport(); + + const { clusterId } = useParams<{ + clusterId: string; + }>(); + + const [attempt, run] = useAsync( + useCallback(async () => { + const res = await ctx.clusterService.fetchClusterDetails(clusterId); + setCluster(res); + return res; + }, [clusterId, ctx.clusterService]) + ); + + useEffect(() => { + if (!attempt.status && clusterId) { + run(); + } + }, [attempt.status, run, clusterId]); + + useNoMinWidth(); + + return ( + + + {attempt.status === 'processing' ? ( + + + + ) : ( + + )} + + ); +} + +export function ManageClusterHeader({ clusterId }: { clusterId: string }) { + return ( + + + + + + Manage Clusters + / + {clusterId} + + + + + ); +} + +type ClusterInformationProps = { + cluster?: ClusterInfo; + style?: React.CSSProperties; + attempt: Attempt; +} & BoxProps; + +export function ClusterInformation({ + cluster, + style, + attempt, + ...rest +}: ClusterInformationProps) { + const isLoading = attempt.status === 'processing'; + return ( + + + + + + +

Cluster Information

+
+
+ + {attempt.status === 'error' && {attempt.statusText}} + {attempt.status !== 'error' && ( + <> + + + + {cfg.tunnelPublicAddress && ( + + )} + {cfg.edition === 'ent' && + !cfg.isCloud && + cluster?.licenseExpiryDateText && ( + + )} + + )} + +
+ ); +} + +export const IconBox = styled(Box)` + line-height: 0; + padding: ${props => props.theme.space[2]}px; + border-radius: ${props => props.theme.radii[3]}px; + margin-right: ${props => props.theme.space[3]}px; + background: ${props => props.theme.colors.interactive.tonal.neutral[0]}; +`; + +export const DataItem = ({ title = '', data = null, isLoading = false }) => ( + + + {title}: + + {isLoading ? ( + + } + /> + ) : ( + {data} + )} + +); + +const DataItemFlex = styled(Flex)` + margin-bottom: ${props => props.theme.space[3]}px; + align-items: center; + @media screen and (max-width: ${props => props.theme.breakpoints.mobile}px) { + flex-direction: column; + padding-left: ${props => props.theme.space[2]}px; + align-items: start; + } +`; + +function randomRange(min: number, max: number) { + return Math.floor(Math.random() * (max - min + 1)) + min; +} diff --git a/web/packages/teleport/src/Clusters/ManageCluster/index.ts b/web/packages/teleport/src/Clusters/ManageCluster/index.ts new file mode 100644 index 0000000000000..3708a63541576 --- /dev/null +++ b/web/packages/teleport/src/Clusters/ManageCluster/index.ts @@ -0,0 +1,19 @@ +/** + * 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 . + */ + +export { ManageCluster } from './ManageCluster'; diff --git a/web/packages/teleport/src/Clusters/fixtures/index.ts b/web/packages/teleport/src/Clusters/fixtures/index.ts index 41344401a5a7d..ab99fcac55d9c 100644 --- a/web/packages/teleport/src/Clusters/fixtures/index.ts +++ b/web/packages/teleport/src/Clusters/fixtures/index.ts @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +import { ClusterInfo } from 'teleport/services/clusters'; + export const clusters = [ { clusterId: 'localhost', @@ -428,3 +430,16 @@ export const clusters = [ proxyVersion: '1.14.3', }, ]; + +export const clusterInfoFixture: ClusterInfo = { + authVersion: 'v17.0.0', + clusterId: 'cluster-id', + connectedText: '', + isCloud: false, + lastConnected: new Date(), + proxyVersion: 'v17.0.0', + publicURL: 'example.teleport.com', + status: 'active', + url: 'example.teleport.com', + licenseExpiryDateText: new Date().toISOString(), +}; diff --git a/web/packages/teleport/src/Discover/Database/EnrollRdsDatabase/AutoDiscoverToggle.tsx b/web/packages/teleport/src/Discover/Database/EnrollRdsDatabase/AutoDiscoverToggle.tsx index 6e2224731d9d8..204e30b3e79d1 100644 --- a/web/packages/teleport/src/Discover/Database/EnrollRdsDatabase/AutoDiscoverToggle.tsx +++ b/web/packages/teleport/src/Discover/Database/EnrollRdsDatabase/AutoDiscoverToggle.tsx @@ -38,12 +38,12 @@ export function AutoDiscoverToggle({ disabled={disabled} > - Auto-enroll all databases for the selected region + Auto-enroll all databases for the selected VPC Auto-enroll will automatically identify all RDS databases (e.g. - PostgreSQL, MySQL, Aurora) from the selected region and register them - as database resources in your infrastructure. + PostgreSQL, MySQL, Aurora) from the selected VPC and register them as + database resources in your infrastructure. diff --git a/web/packages/teleport/src/Discover/Database/EnrollRdsDatabase/AutoEnrollment.tsx b/web/packages/teleport/src/Discover/Database/EnrollRdsDatabase/AutoEnrollment.tsx index a065a0bcc702e..2a48bdccbd40c 100644 --- a/web/packages/teleport/src/Discover/Database/EnrollRdsDatabase/AutoEnrollment.tsx +++ b/web/packages/teleport/src/Discover/Database/EnrollRdsDatabase/AutoEnrollment.tsx @@ -124,7 +124,7 @@ export function AutoEnrollment({ } ); - // Abort if there were no rds dbs for the selected region. + // Abort if there were no rds dbs for the selected region/vpc. if (fetchedDbs.length <= 0) { onFetchAttempt({ status: 'success' }); setTableData({ ...data, fetchStatus: 'disabled' }); diff --git a/web/packages/teleport/src/Discover/Database/EnrollRdsDatabase/EnrollRdsDatabase.test.tsx b/web/packages/teleport/src/Discover/Database/EnrollRdsDatabase/EnrollRdsDatabase.test.tsx index e6aba3b4fd2bf..f9a219a2749c7 100644 --- a/web/packages/teleport/src/Discover/Database/EnrollRdsDatabase/EnrollRdsDatabase.test.tsx +++ b/web/packages/teleport/src/Discover/Database/EnrollRdsDatabase/EnrollRdsDatabase.test.tsx @@ -88,7 +88,7 @@ describe('test EnrollRdsDatabase.tsx', () => { fireEvent.keyDown(selectEl, { key: 'ArrowDown' }); fireEvent.keyDown(selectEl, { key: 'Enter' }); - await screen.findByText(/selected region/i); + await screen.findByText(/selected VPC/i); } test('without rds database result, does not attempt to fetch db servers', async () => { diff --git a/web/packages/teleport/src/Discover/Database/EnrollRdsDatabase/SingleEnrollment.tsx b/web/packages/teleport/src/Discover/Database/EnrollRdsDatabase/SingleEnrollment.tsx index f8d3fa315de5c..1d7203366f94a 100644 --- a/web/packages/teleport/src/Discover/Database/EnrollRdsDatabase/SingleEnrollment.tsx +++ b/web/packages/teleport/src/Discover/Database/EnrollRdsDatabase/SingleEnrollment.tsx @@ -121,7 +121,7 @@ export function SingleEnrollment({ } ); - // Abort early if there were no rds dbs for the selected region. + // Abort early if there were no rds dbs for the selected region/vpc. if (fetchedDbs.length <= 0) { onFetchAttempt({ status: 'success' }); setTableData({ ...data, fetchStatus: 'disabled' }); diff --git a/web/packages/teleport/src/TopBar/TopBar.tsx b/web/packages/teleport/src/TopBar/TopBar.tsx index 707af5b4b7cac..20c828f7c5510 100644 --- a/web/packages/teleport/src/TopBar/TopBar.tsx +++ b/web/packages/teleport/src/TopBar/TopBar.tsx @@ -168,7 +168,11 @@ export function TopBar({ CustomLogo }: TopBarProps) { /> )} - {topBarLinks.map(({ topMenuItem, navigationItem }) => { + {topBarLinks.map(({ topMenuItem, navigationItem, hasAccess }) => { + const canAccess = hasAccess(ctx.getFeatureFlags()); + if (!canAccess) { + return; + } const link = navigationItem.getLink(clusterId); const currentPath = history.location.pathname; const selected = diff --git a/web/packages/teleport/src/config.ts b/web/packages/teleport/src/config.ts index e2fb3fce9da7a..e71bac834017a 100644 --- a/web/packages/teleport/src/config.ts +++ b/web/packages/teleport/src/config.ts @@ -156,6 +156,8 @@ const cfg = { sso: '/web/sso', cluster: '/web/cluster/:clusterId/', clusters: '/web/clusters', + manageCluster: '/web/clusters/:clusterId/manage', + trustedClusters: '/web/trust', audit: '/web/cluster/:clusterId/audit', unifiedResources: '/web/cluster/:clusterId/resources', @@ -211,6 +213,7 @@ const cfg = { applicationsPath: '/v1/webapi/sites/:clusterId/apps?searchAsRoles=:searchAsRoles?&limit=:limit?&startKey=:startKey?&query=:query?&search=:search?&sort=:sort?', clustersPath: '/v1/webapi/sites', + clusterInfoPath: '/v1/webapi/sites/:clusterId/info', clusterAlertsPath: '/v1/webapi/sites/:clusterId/alerts', clusterEventsPath: `/v1/webapi/sites/:clusterId/events/search?from=:start?&to=:end?&limit=:limit?&startKey=:startKey?&include=:include?`, clusterEventsRecordingsPath: `/v1/webapi/sites/:clusterId/events/search/sessions?from=:start?&to=:end?&limit=:limit?&startKey=:startKey?`, @@ -410,6 +413,12 @@ const cfg = { return cfg.playable_db_protocols; }, + getClusterInfoPath(clusterId: string) { + return generatePath(cfg.api.clusterInfoPath, { + clusterId, + }); + }, + getUserClusterPreferencesUrl(clusterId: string) { return generatePath(cfg.api.userClusterPreferencesPath, { clusterId, @@ -525,6 +534,10 @@ const cfg = { return generatePath(cfg.routes.nodes, { clusterId }); }, + getManageClusterRoute(clusterId: string) { + return generatePath(cfg.routes.manageCluster, { clusterId }); + }, + getUnifiedResourcesRoute(clusterId: string) { return generatePath(cfg.routes.unifiedResources, { clusterId }); }, diff --git a/web/packages/teleport/src/features.tsx b/web/packages/teleport/src/features.tsx index 722d97fb565e3..b7e563c36b89b 100644 --- a/web/packages/teleport/src/features.tsx +++ b/web/packages/teleport/src/features.tsx @@ -571,6 +571,10 @@ export class FeatureClusters implements TeleportFeature { }, searchableTags: ['clusters', 'manage clusters'], }; + + getRoute() { + return this.route; + } } export class FeatureTrust implements TeleportFeature { diff --git a/web/packages/teleport/src/lib/term/terminal.ts b/web/packages/teleport/src/lib/term/terminal.ts index cc8f68a2ff12b..d4b4e40dfda57 100644 --- a/web/packages/teleport/src/lib/term/terminal.ts +++ b/web/packages/teleport/src/lib/term/terminal.ts @@ -19,6 +19,7 @@ import '@xterm/xterm/css/xterm.css'; import { ITheme, Terminal } from '@xterm/xterm'; import { FitAddon } from '@xterm/addon-fit'; +import { ImageAddon } from '@xterm/addon-image'; import { WebglAddon } from '@xterm/addon-webgl'; import { WebLinksAddon } from '@xterm/addon-web-links'; import { CanvasAddon } from '@xterm/addon-canvas'; @@ -50,6 +51,7 @@ export default class TtyTerminal { _convertEol: boolean; _debouncedResize: DebouncedFunc<() => void>; _fitAddon = new FitAddon(); + _imageAddon = new ImageAddon(); _webLinksAddon = new WebLinksAddon(); _webglAddon: WebglAddon; _canvasAddon = new CanvasAddon(); @@ -88,6 +90,7 @@ export default class TtyTerminal { this.term.loadAddon(this._fitAddon); this.term.loadAddon(this._webLinksAddon); + this.term.loadAddon(this._imageAddon); // handle context loss and load webgl addon try { // try to create a new WebglAddon. If webgl is not supported, this @@ -155,6 +158,7 @@ export default class TtyTerminal { this._disconnect(); this._debouncedResize.cancel(); this._fitAddon.dispose(); + this._imageAddon.dispose(); this._webglAddon?.dispose(); this._canvasAddon?.dispose(); this._el.innerHTML = null; diff --git a/web/packages/teleport/src/mocks/contexts.ts b/web/packages/teleport/src/mocks/contexts.ts index bf2581de1763e..8b477eb6513d0 100644 --- a/web/packages/teleport/src/mocks/contexts.ts +++ b/web/packages/teleport/src/mocks/contexts.ts @@ -59,6 +59,7 @@ export const allAccessAcl: Acl = { clipboardSharingEnabled: true, desktopSessionRecordingEnabled: true, directorySharingEnabled: true, + reviewRequests: true, license: fullAccess, download: fullAccess, plugins: fullAccess, diff --git a/web/packages/teleport/src/services/clusters/clusters.ts b/web/packages/teleport/src/services/clusters/clusters.ts index 9aa15cf7c81fb..a912a315433e0 100644 --- a/web/packages/teleport/src/services/clusters/clusters.ts +++ b/web/packages/teleport/src/services/clusters/clusters.ts @@ -19,7 +19,7 @@ import api from 'teleport/services/api'; import cfg from 'teleport/config'; -import { makeClusterList } from './makeCluster'; +import { makeClusterInfo, makeClusterList } from './makeCluster'; import { Cluster } from '.'; @@ -39,4 +39,8 @@ export default class ClustersService { } return Promise.resolve(this.clusters); } + + fetchClusterDetails(clusterId) { + return api.get(cfg.getClusterInfoPath(clusterId)).then(makeClusterInfo); + } } diff --git a/web/packages/teleport/src/services/clusters/makeCluster.ts b/web/packages/teleport/src/services/clusters/makeCluster.ts index 78967d4f430f9..1a3165054ea9c 100644 --- a/web/packages/teleport/src/services/clusters/makeCluster.ts +++ b/web/packages/teleport/src/services/clusters/makeCluster.ts @@ -20,7 +20,7 @@ import { displayDate, displayDateTime } from 'design/datetime'; import cfg from 'teleport/config'; -import { Cluster } from './types'; +import { Cluster, ClusterInfo } from './types'; export function makeCluster(json): Cluster { const { @@ -54,6 +54,12 @@ export function makeCluster(json): Cluster { }; } +export function makeClusterInfo(json): ClusterInfo { + const isCloud = json.isCloud; + const cluster = makeCluster(json); + return { ...cluster, isCloud }; +} + export function makeClusterList(json: any): Cluster[] { json = json || []; diff --git a/web/packages/teleport/src/services/clusters/types.ts b/web/packages/teleport/src/services/clusters/types.ts index a036f61b7860f..2d555f1d2059c 100644 --- a/web/packages/teleport/src/services/clusters/types.ts +++ b/web/packages/teleport/src/services/clusters/types.ts @@ -27,3 +27,7 @@ export interface Cluster { proxyVersion: string; licenseExpiryDateText?: string; } + +export type ClusterInfo = { + isCloud: boolean; +} & Cluster; diff --git a/web/packages/teleport/src/services/user/makeAcl.ts b/web/packages/teleport/src/services/user/makeAcl.ts index 57c5fd99615c7..785b27af00aa3 100644 --- a/web/packages/teleport/src/services/user/makeAcl.ts +++ b/web/packages/teleport/src/services/user/makeAcl.ts @@ -39,6 +39,7 @@ export function makeAcl(json): Acl { const dbServers = json.dbServers || defaultAccess; const db = json.db || defaultAccess; const desktops = json.desktops || defaultAccess; + const reviewRequests = json.reviewRequests ?? false; const connectionDiagnostic = json.connectionDiagnostic || defaultAccess; // Defaults to true, see RFD 0049 // https://github.com/gravitational/teleport/blob/master/rfd/0049-desktop-clipboard.md#security @@ -87,6 +88,7 @@ export function makeAcl(json): Acl { kubeServers, tokens, accessRequests, + reviewRequests, billing, plugins, integrations, diff --git a/web/packages/teleport/src/services/user/types.ts b/web/packages/teleport/src/services/user/types.ts index e2a5484648eb5..0558e0b1f4079 100644 --- a/web/packages/teleport/src/services/user/types.ts +++ b/web/packages/teleport/src/services/user/types.ts @@ -71,6 +71,7 @@ export interface AccessWithUse extends Access { export interface Acl { directorySharingEnabled: boolean; + reviewRequests: boolean; desktopSessionRecordingEnabled: boolean; clipboardSharingEnabled: boolean; authConnectors: Access; diff --git a/web/packages/teleport/src/services/user/user.test.ts b/web/packages/teleport/src/services/user/user.test.ts index 53c6d26d0a04e..7aca65ef89884 100644 --- a/web/packages/teleport/src/services/user/user.test.ts +++ b/web/packages/teleport/src/services/user/user.test.ts @@ -193,6 +193,7 @@ test('undefined values in context response gives proper default values', async ( create: false, remove: false, }, + reviewRequests: false, accessRequests: { list: false, read: false, diff --git a/web/packages/teleport/src/stores/storeUserContext.ts b/web/packages/teleport/src/stores/storeUserContext.ts index 23c075a681607..0290fda593ceb 100644 --- a/web/packages/teleport/src/stores/storeUserContext.ts +++ b/web/packages/teleport/src/stores/storeUserContext.ts @@ -125,6 +125,10 @@ export default class StoreUserContext extends Store { return this.state.acl.clipboardSharingEnabled; } + getReviewRequests() { + return this.state.acl.reviewRequests; + } + getNodeAccess() { return this.state.acl.nodes; } diff --git a/web/packages/teleport/src/teleportContext.tsx b/web/packages/teleport/src/teleportContext.tsx index 535e559d4d0d8..1ba4c3fde4380 100644 --- a/web/packages/teleport/src/teleportContext.tsx +++ b/web/packages/teleport/src/teleportContext.tsx @@ -164,6 +164,7 @@ class TeleportContext implements types.Context { // having list access, requestable roles, or allowed search_as_roles. if (cfg.hideInaccessibleFeatures) { return !!( + userContext.getReviewRequests() || userContext.getAccessRequestAccess().list || userContext.getRequestableRoles().length || userContext.getAllowedSearchAsRoles().length