From 82a3c42fc1228b4622de2ed2e45a7ead92957de1 Mon Sep 17 00:00:00 2001 From: Edward Dowling Date: Thu, 31 Oct 2024 14:20:22 +0000 Subject: [PATCH] Add access monitoring rule and hosted support to msteams plugin --- api/proto/teleport/legacy/types/types.proto | 8 +- api/types/plugin.go | 4 + api/types/types.pb.go | 909 +++++++++--------- .../access_monitoring_rules.go | 22 +- integrations/access/common/recipient.go | 9 + integrations/access/msteams/app.go | 49 +- integrations/access/msteams/bot.go | 34 +- integrations/access/msteams/config.go | 18 +- integrations/access/msteams/configure.go | 107 ++- integrations/access/msteams/msapi/config.go | 3 +- .../access/msteams/testlib/helpers.go | 2 +- integrations/access/msteams/testlib/suite.go | 1 + integrations/access/msteams/validate.go | 2 +- lib/web/apiserver.go | 3 + lib/web/integrations.go | 34 + web/packages/shared/utils/saveOnDisk.ts | 8 +- .../src/Integrations/IntegrationList.tsx | 25 + web/packages/teleport/src/config.ts | 7 + .../src/services/integrations/types.ts | 11 +- 19 files changed, 719 insertions(+), 537 deletions(-) diff --git a/api/proto/teleport/legacy/types/types.proto b/api/proto/teleport/legacy/types/types.proto index c480521eaad34..aa6d526b1d47d 100644 --- a/api/proto/teleport/legacy/types/types.proto +++ b/api/proto/teleport/legacy/types/types.proto @@ -6239,7 +6239,7 @@ message PluginSpecV1 { // Settings for the Email Access Request plugin PluginEmailSettings email = 17; // Settings for the Microsoft Teams plugin - PluginMSTeamsSettings msTeams = 18; + PluginMSTeamsSettings msteams = 18; } // generation contains a unique ID that should: @@ -6622,14 +6622,16 @@ message SMTPSpec { // PluginMSTeamsSettings defines the settings for a Microsoft Teams integration plugin message PluginMSTeamsSettings { option (gogoproto.equal) = true; - // AppId is the Microsoft application ID (uuid, for bots must be underlying app id, not bot's id). + // AppId is the Microsoft application ID (uuid, for Azure bots must be underlying app id, not bot's id). string app_id = 1; // TenantId is the Microsoft tenant ID. string tenant_id = 2; // TeamsAppId is the Microsoft teams application ID. string teams_app_id = 3; - // Region bot framework api AP region. + // Region to be used by the Microsoft Graph API client. string region = 4; + // DefaultRecipient is the default recipient to use if no access monitoring rules are specified. + string default_recipient = 5; } message PluginBootstrapCredentialsV1 { diff --git a/api/types/plugin.go b/api/types/plugin.go index b0fca5eba8a51..96248fe86a33d 100644 --- a/api/types/plugin.go +++ b/api/types/plugin.go @@ -81,6 +81,8 @@ const ( PluginTypeAWSIdentityCenter = "aws-identity-center" // PluginTypeEmail indicates an Email Access Request plugin PluginTypeEmail = "email" + // PluginTypeMSTeams indicates a Microsoft Teams integration + PluginTypeMSTeams = "msteams" ) // PluginSubkind represents the type of the plugin, e.g., access request, MDM etc. @@ -541,6 +543,8 @@ func (p *PluginV1) GetType() PluginType { return PluginTypeAWSIdentityCenter case *PluginSpecV1_Email: return PluginTypeEmail + case *PluginSpecV1_Msteams: + return PluginTypeMSTeams default: return PluginTypeUnknown } diff --git a/api/types/types.pb.go b/api/types/types.pb.go index 6f4bd6e4bd13f..9e6570d92e6c5 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -15574,7 +15574,7 @@ type PluginSpecV1 struct { // *PluginSpecV1_Datadog // *PluginSpecV1_AwsIc // *PluginSpecV1_Email - // *PluginSpecV1_MsTeams + // *PluginSpecV1_Msteams Settings isPluginSpecV1_Settings `protobuf_oneof:"settings"` // generation contains a unique ID that should: // - Be created by the backend on plugin creation. @@ -15675,8 +15675,8 @@ type PluginSpecV1_AwsIc struct { type PluginSpecV1_Email struct { Email *PluginEmailSettings `protobuf:"bytes,17,opt,name=email,proto3,oneof" json:"email,omitempty"` } -type PluginSpecV1_MsTeams struct { - MsTeams *PluginMSTeamsSettings `protobuf:"bytes,18,opt,name=msTeams,proto3,oneof" json:"msTeams,omitempty"` +type PluginSpecV1_Msteams struct { + Msteams *PluginMSTeamsSettings `protobuf:"bytes,18,opt,name=msteams,proto3,oneof" json:"msteams,omitempty"` } func (*PluginSpecV1_SlackAccessPlugin) isPluginSpecV1_Settings() {} @@ -15695,7 +15695,7 @@ func (*PluginSpecV1_Scim) isPluginSpecV1_Settings() {} func (*PluginSpecV1_Datadog) isPluginSpecV1_Settings() {} func (*PluginSpecV1_AwsIc) isPluginSpecV1_Settings() {} func (*PluginSpecV1_Email) isPluginSpecV1_Settings() {} -func (*PluginSpecV1_MsTeams) isPluginSpecV1_Settings() {} +func (*PluginSpecV1_Msteams) isPluginSpecV1_Settings() {} func (m *PluginSpecV1) GetSettings() isPluginSpecV1_Settings { if m != nil { @@ -15816,9 +15816,9 @@ func (m *PluginSpecV1) GetEmail() *PluginEmailSettings { return nil } -func (m *PluginSpecV1) GetMsTeams() *PluginMSTeamsSettings { - if x, ok := m.GetSettings().(*PluginSpecV1_MsTeams); ok { - return x.MsTeams +func (m *PluginSpecV1) GetMsteams() *PluginMSTeamsSettings { + if x, ok := m.GetSettings().(*PluginSpecV1_Msteams); ok { + return x.Msteams } return nil } @@ -15842,7 +15842,7 @@ func (*PluginSpecV1) XXX_OneofWrappers() []interface{} { (*PluginSpecV1_Datadog)(nil), (*PluginSpecV1_AwsIc)(nil), (*PluginSpecV1_Email)(nil), - (*PluginSpecV1_MsTeams)(nil), + (*PluginSpecV1_Msteams)(nil), } } @@ -17081,14 +17081,16 @@ var xxx_messageInfo_SMTPSpec proto.InternalMessageInfo // PluginMSTeamsSettings defines the settings for a Microsoft Teams integration plugin type PluginMSTeamsSettings struct { - // AppId is the Microsoft application ID (uuid, for bots must be underlying app id, not bot's id). + // AppId is the Microsoft application ID (uuid, for Azure bots must be underlying app id, not bot's id). AppId string `protobuf:"bytes,1,opt,name=app_id,json=appId,proto3" json:"app_id,omitempty"` // TenantId is the Microsoft tenant ID. TenantId string `protobuf:"bytes,2,opt,name=tenant_id,json=tenantId,proto3" json:"tenant_id,omitempty"` // TeamsAppId is the Microsoft teams application ID. TeamsAppId string `protobuf:"bytes,3,opt,name=teams_app_id,json=teamsAppId,proto3" json:"teams_app_id,omitempty"` - // Region bot framework api AP region. - Region string `protobuf:"bytes,4,opt,name=region,proto3" json:"region,omitempty"` + // Region to be used by the Microsoft Graph API client. + Region string `protobuf:"bytes,4,opt,name=region,proto3" json:"region,omitempty"` + // DefaultRecipient is the default recipient to use if no access monitoring rules are specified. + DefaultRecipient string `protobuf:"bytes,5,opt,name=default_recipient,json=defaultRecipient,proto3" json:"default_recipient,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -21015,7 +21017,7 @@ func init() { func init() { proto.RegisterFile("teleport/legacy/types/types.proto", fileDescriptor_9198ee693835762e) } var fileDescriptor_9198ee693835762e = []byte{ - // 29244 bytes of a gzipped FileDescriptorProto + // 29258 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xfd, 0x6b, 0x70, 0x1c, 0x59, 0x76, 0x20, 0x06, 0x77, 0x55, 0xe1, 0x51, 0x38, 0x78, 0x15, 0x2e, 0x40, 0x12, 0x44, 0x37, 0x59, 0xec, 0xec, 0x6e, 0x36, 0xd9, 0xd3, 0x4d, 0x0e, 0xc1, 0x69, 0xce, 0xf4, 0xf4, 0x6b, 0x0a, 0x0f, @@ -22439,411 +22441,412 @@ var fileDescriptor_9198ee693835762e = []byte{ 0x99, 0xfd, 0x23, 0xcb, 0x7a, 0xa6, 0xab, 0x22, 0x12, 0x0b, 0xd9, 0x7d, 0x1c, 0x3a, 0x5e, 0x9d, 0x82, 0x3c, 0x98, 0xcb, 0xb1, 0xf2, 0xa0, 0x56, 0x5d, 0xd6, 0xc8, 0x86, 0xdd, 0xc7, 0x61, 0xb5, 0xce, 0x16, 0x61, 0x18, 0x53, 0x44, 0x50, 0x20, 0x4a, 0x93, 0x06, 0x93, 0x43, 0xe8, 0x34, 0x88, - 0x2a, 0x06, 0xb2, 0x15, 0x4a, 0x07, 0x12, 0x96, 0xd1, 0x27, 0x77, 0x6a, 0x58, 0xa6, 0x37, 0x91, - 0xd0, 0xd9, 0x59, 0x80, 0xe4, 0x15, 0x5f, 0xbe, 0xb9, 0xd8, 0x1a, 0xe4, 0xf3, 0x43, 0xff, 0xdb, - 0x2f, 0x94, 0x73, 0x4b, 0x00, 0x45, 0x15, 0xa1, 0xc6, 0x5a, 0x83, 0xd3, 0x7d, 0xd7, 0x3d, 0xbb, - 0x08, 0xa5, 0x6d, 0x97, 0xb4, 0x7e, 0xf5, 0x5d, 0xb7, 0xdd, 0xe6, 0x4d, 0xda, 0x71, 0xa7, 0x15, - 0x7c, 0x59, 0x82, 0x25, 0x67, 0xeb, 0x7d, 0x98, 0xcb, 0x1a, 0x70, 0xf6, 0x22, 0x4c, 0xe8, 0xc1, - 0x78, 0x88, 0xc9, 0xb8, 0xdb, 0xf1, 0x54, 0x38, 0x1e, 0x62, 0xf0, 0xeb, 0x39, 0x78, 0xe1, 0xb0, - 0xed, 0x83, 0x2d, 0x40, 0xb1, 0x13, 0x78, 0x3e, 0x8a, 0xa9, 0x94, 0xed, 0x40, 0xfd, 0xc6, 0x44, - 0x06, 0x28, 0x4f, 0x45, 0xee, 0x0e, 0x39, 0x78, 0xd8, 0x63, 0x08, 0xd9, 0x74, 0x77, 0x42, 0xf6, - 0x29, 0x98, 0x69, 0xf0, 0x6d, 0xb7, 0xdb, 0x8c, 0x9c, 0xb0, 0xbe, 0xcb, 0x1b, 0xe8, 0x53, 0x85, - 0x86, 0x7b, 0x76, 0x89, 0x0a, 0x6a, 0x0a, 0xde, 0xd3, 0xe2, 0xe1, 0x3e, 0x2d, 0xbe, 0x35, 0x54, - 0xcc, 0x95, 0xf2, 0x36, 0x5a, 0x4a, 0x59, 0xdf, 0x97, 0x87, 0xf9, 0x7e, 0xeb, 0x85, 0xbd, 0x9b, - 0xd5, 0x07, 0xf2, 0xe1, 0x42, 0x87, 0xeb, 0x0f, 0x17, 0x5a, 0x6d, 0x6c, 0x11, 0x62, 0x8f, 0xa8, - 0xa3, 0xa2, 0x1b, 0x28, 0x98, 0xa0, 0xe9, 0xb8, 0x61, 0xf8, 0x58, 0x6c, 0x09, 0x05, 0x2d, 0xa0, - 0x2d, 0xc1, 0x74, 0x1a, 0x05, 0x63, 0x9f, 0x05, 0xa8, 0x37, 0xfd, 0x90, 0xa3, 0x7d, 0x00, 0xc9, - 0x1a, 0xd2, 0x2c, 0x3c, 0x86, 0xea, 0x0f, 0xc2, 0x08, 0x5d, 0xf6, 0x1b, 0x9c, 0x06, 0xd0, 0x85, - 0x53, 0x7d, 0x36, 0x48, 0x31, 0x3c, 0x49, 0x76, 0x78, 0x95, 0x6b, 0xaa, 0x1b, 0xe7, 0x88, 0x4f, - 0xf7, 0x78, 0xbe, 0xdf, 0x1c, 0xd9, 0x03, 0xd6, 0xbb, 0x0b, 0x0a, 0xee, 0x64, 0xdc, 0xdc, 0x0d, - 0x62, 0xee, 0x12, 0x72, 0x2f, 0x68, 0xb2, 0x32, 0x8c, 0xab, 0x5c, 0x92, 0x42, 0x96, 0x97, 0xcc, - 0x81, 0x40, 0xb7, 0x39, 0x4e, 0x1e, 0x8c, 0x58, 0x8a, 0x7e, 0x6f, 0x24, 0x25, 0x8c, 0x21, 0x64, - 0x73, 0xaf, 0xa3, 0xbe, 0xee, 0x05, 0x35, 0xbf, 0xcd, 0xb3, 0x89, 0x4a, 0x7f, 0x26, 0xa7, 0x86, - 0xbf, 0x77, 0x73, 0x3f, 0xaa, 0x7d, 0x0c, 0xd0, 0x4b, 0x89, 0x1a, 0x86, 0x7f, 0x0b, 0xa9, 0x45, - 0xad, 0x3a, 0x92, 0x5a, 0xe8, 0x27, 0x3b, 0x0f, 0xd3, 0x81, 0xb4, 0x63, 0x8d, 0x7c, 0xea, 0x4f, - 0x99, 0xb7, 0x63, 0x52, 0x82, 0x37, 0x7d, 0xec, 0x53, 0x6a, 0xd7, 0xad, 0xb8, 0xc3, 0xb4, 0xb3, - 0x8e, 0x5d, 0x82, 0x31, 0x71, 0xd6, 0x61, 0xa4, 0x9b, 0x94, 0x7b, 0x04, 0xe2, 0xa1, 0xe4, 0x60, - 0x17, 0x3f, 0xa4, 0xbf, 0x89, 0xd7, 0xb7, 0xf2, 0x8a, 0x99, 0x7e, 0xd2, 0xb2, 0x53, 0x30, 0xea, - 0x07, 0x3b, 0xda, 0xa7, 0x8d, 0xf8, 0xc1, 0x8e, 0xf8, 0xae, 0x0b, 0x50, 0x92, 0xde, 0x3a, 0x32, - 0x0c, 0x42, 0xb8, 0xd7, 0x96, 0x57, 0xf1, 0xa2, 0x3d, 0x25, 0xe1, 0x98, 0x30, 0x7f, 0xaf, 0x5d, - 0x17, 0x98, 0x61, 0xe8, 0x3b, 0x7a, 0x80, 0x2b, 0xfa, 0xec, 0xa9, 0x30, 0xf4, 0x93, 0x48, 0x57, - 0x0d, 0xb6, 0x04, 0x93, 0x82, 0x4f, 0x1c, 0x66, 0x8b, 0x04, 0x81, 0x33, 0xbd, 0x82, 0xc0, 0x5e, - 0xbb, 0xae, 0x9a, 0x68, 0x4f, 0x84, 0xda, 0x2f, 0x76, 0x1b, 0x4a, 0x9a, 0xc4, 0x84, 0xfe, 0x98, - 0x29, 0x9b, 0xea, 0x84, 0x8d, 0x26, 0x69, 0x55, 0xdb, 0xdb, 0xbe, 0x3d, 0x5d, 0x37, 0x01, 0xd4, - 0x35, 0xff, 0x76, 0x4e, 0xed, 0xa5, 0x19, 0x44, 0xcc, 0x82, 0xc9, 0x5d, 0x37, 0x74, 0xc2, 0xb0, - 0x25, 0x6d, 0xc4, 0x28, 0xb0, 0xef, 0xf8, 0xae, 0x1b, 0xd6, 0xc2, 0x96, 0x4a, 0x1c, 0x72, 0x42, - 0xe0, 0xf8, 0x6e, 0x37, 0xda, 0x75, 0x74, 0xf9, 0x4f, 0xf6, 0xd8, 0xec, 0xae, 0x1b, 0xde, 0x15, - 0x65, 0x1a, 0x6f, 0xf6, 0x32, 0x4c, 0x21, 0xdf, 0xba, 0xa7, 0x18, 0x63, 0x28, 0x0b, 0x7b, 0x42, - 0x30, 0xae, 0x7b, 0x92, 0x33, 0xb5, 0xf0, 0x7f, 0xcf, 0xc3, 0xc9, 0xec, 0xde, 0xc1, 0xe9, 0x29, - 0xfa, 0x14, 0x7d, 0xf4, 0xa8, 0x6d, 0x63, 0x02, 0x22, 0xc3, 0x90, 0x64, 0x0d, 0x4e, 0x3e, 0x73, - 0x70, 0x5e, 0x83, 0x19, 0x64, 0x44, 0x92, 0x66, 0xd3, 0x0b, 0x23, 0x8a, 0xae, 0x61, 0x4f, 0x8b, - 0x02, 0xb9, 0x9f, 0xaf, 0x09, 0x30, 0x7b, 0x05, 0xa6, 0xd4, 0x8e, 0xec, 0x3f, 0x6e, 0x8b, 0x8a, - 0xe5, 0x76, 0x3c, 0x49, 0xd0, 0xbb, 0x08, 0x64, 0x27, 0x60, 0xc4, 0xed, 0x74, 0x44, 0x95, 0x72, - 0x17, 0x1e, 0x76, 0x3b, 0x1d, 0x99, 0xdc, 0x06, 0x3d, 0x12, 0x9d, 0x6d, 0xb4, 0x12, 0x22, 0x93, - 0x44, 0x7b, 0x02, 0x81, 0xd2, 0x72, 0x28, 0x14, 0xeb, 0x5e, 0xd0, 0x2a, 0x94, 0x51, 0x44, 0x01, - 0xb7, 0x13, 0x23, 0x9c, 0x86, 0xa2, 0x7a, 0xaf, 0x96, 0x8e, 0x15, 0xf6, 0xa8, 0x4b, 0x6f, 0xd5, - 0x6f, 0xc2, 0xa9, 0x86, 0x17, 0xe2, 0xe4, 0x95, 0x9f, 0xd4, 0xe9, 0x90, 0x0f, 0xa4, 0x0c, 0x92, - 0x6b, 0xcf, 0x51, 0xb1, 0xe8, 0xc9, 0x4a, 0xa7, 0x23, 0x3d, 0x21, 0xa9, 0xaf, 0x3f, 0x07, 0xd3, - 0x24, 0x71, 0xd1, 0x11, 0x89, 0x6d, 0xa1, 0x05, 0x2c, 0xae, 0x42, 0x94, 0x4e, 0x08, 0x08, 0x54, - 0x6d, 0x28, 0xca, 0x3f, 0xca, 0xc1, 0x89, 0x4c, 0x91, 0x8d, 0x7d, 0x1d, 0xa4, 0xcb, 0x57, 0xe4, - 0x3b, 0x01, 0xaf, 0x7b, 0x1d, 0x0f, 0x83, 0x62, 0x48, 0x95, 0xe6, 0xe2, 0x61, 0xc2, 0x1e, 0xba, - 0x8f, 0x6d, 0xfa, 0x76, 0x4c, 0x24, 0x75, 0x2d, 0xa5, 0x20, 0x05, 0x5e, 0xf8, 0x32, 0x9c, 0xc8, - 0x44, 0xcd, 0xd0, 0x81, 0xbc, 0x6e, 0x26, 0x73, 0x56, 0x8f, 0x54, 0xa9, 0x8f, 0xd6, 0x74, 0x23, - 0xf4, 0x79, 0xbf, 0x15, 0x7f, 0x5e, 0x4a, 0xb8, 0x63, 0xab, 0xe9, 0x75, 0x9d, 0x75, 0x3f, 0x51, - 0x44, 0xfd, 0x97, 0xf6, 0x97, 0xe1, 0x04, 0x4d, 0xbe, 0x9d, 0xc0, 0xed, 0xec, 0x26, 0xec, 0x64, - 0x43, 0x5f, 0xcd, 0x62, 0x27, 0x67, 0xe5, 0x0d, 0x81, 0x1f, 0x73, 0x9d, 0x75, 0x7b, 0x81, 0xf4, - 0x0d, 0x7f, 0x1c, 0x2f, 0xf5, 0x8c, 0xe6, 0x64, 0x4c, 0xeb, 0x5c, 0xd6, 0xb4, 0x1e, 0x7c, 0x4d, - 0xad, 0x03, 0xd3, 0x37, 0x2b, 0xa9, 0xf5, 0x24, 0x83, 0x2a, 0x25, 0xa7, 0x53, 0x43, 0xb4, 0xad, - 0xa1, 0x26, 0x93, 0x69, 0xce, 0xd4, 0xd3, 0x20, 0xf6, 0x3c, 0x8c, 0xc5, 0xf9, 0xaa, 0xe9, 0xe0, - 0xf8, 0xff, 0xd8, 0xfb, 0xb6, 0x1f, 0x47, 0x8e, 0xeb, 0xee, 0x69, 0x92, 0x33, 0xc3, 0x39, 0x9c, - 0x4b, 0x4f, 0xed, 0x6a, 0x77, 0xb4, 0xb3, 0xd7, 0xde, 0x8b, 0x77, 0xb9, 0x96, 0xec, 0x5d, 0x7d, - 0xb2, 0xb4, 0xf2, 0x27, 0xcb, 0x3d, 0x64, 0x73, 0xa6, 0x77, 0x79, 0x53, 0x77, 0x73, 0xc6, 0x2b, - 0xd9, 0xee, 0x50, 0xc3, 0x9e, 0x19, 0xc6, 0x1c, 0x92, 0x66, 0x93, 0x5a, 0xaf, 0x10, 0x20, 0x71, - 0x02, 0xd8, 0x40, 0x9c, 0xc4, 0x89, 0x13, 0x20, 0x46, 0x10, 0x20, 0x0f, 0x11, 0x82, 0x3c, 0xe4, - 0x2f, 0x48, 0xf2, 0xe2, 0x37, 0x01, 0x86, 0x01, 0x03, 0xc9, 0x53, 0x02, 0x08, 0x89, 0x80, 0xe4, - 0x21, 0xc9, 0x5b, 0x10, 0x3f, 0xf8, 0x29, 0xa8, 0x53, 0x55, 0xdd, 0xd5, 0x17, 0x72, 0x67, 0xb5, - 0x52, 0x12, 0x03, 0x7e, 0x9a, 0x61, 0xd5, 0xa9, 0xea, 0xba, 0xd7, 0x39, 0xa7, 0xce, 0xf9, 0x9d, - 0x3c, 0x4b, 0x30, 0x3b, 0xbc, 0x87, 0xdf, 0x56, 0xe0, 0xf2, 0x93, 0x46, 0x88, 0xec, 0xc1, 0x19, - 0x34, 0xda, 0xf0, 0x07, 0xc1, 0x20, 0xbb, 0xfb, 0xed, 0xfd, 0x23, 0x8f, 0xaf, 0x49, 0x2d, 0x75, - 0xa8, 0x87, 0x43, 0xdb, 0x6e, 0x48, 0xa3, 0x3c, 0x1c, 0xda, 0xfe, 0x40, 0xfc, 0x2e, 0xd1, 0xe2, - 0xbc, 0x0d, 0x1d, 0xd8, 0x9c, 0x51, 0x52, 0x3a, 0x16, 0x14, 0xf9, 0x58, 0xb8, 0x09, 0xea, 0x81, - 0xd7, 0xa1, 0x1c, 0xaf, 0xd7, 0xc1, 0xa6, 0xbd, 0x7b, 0x97, 0xc5, 0x5f, 0xb7, 0x56, 0x83, 0x74, - 0xdb, 0x1f, 0xec, 0xde, 0xe5, 0x5f, 0x39, 0x16, 0x17, 0x9a, 0x2c, 0x34, 0x90, 0x17, 0xe1, 0x54, - 0x0c, 0x4e, 0x24, 0xf4, 0x4f, 0xb7, 0xd6, 0x69, 0x56, 0x14, 0x7c, 0xea, 0x0a, 0x2c, 0x8b, 0x39, - 0x1f, 0x05, 0x5e, 0x6e, 0x56, 0x81, 0xa7, 0xd1, 0x3d, 0xc5, 0x3f, 0x37, 0x11, 0x9d, 0x4a, 0x95, - 0x37, 0x4e, 0xc0, 0x29, 0x93, 0x17, 0x80, 0x04, 0x5c, 0x79, 0x70, 0x0c, 0xf0, 0x0f, 0xae, 0x8b, - 0x9c, 0x60, 0xff, 0xf2, 0xcf, 0xfe, 0x6d, 0x06, 0x4e, 0xa5, 0x08, 0x2a, 0x94, 0xc5, 0xef, 0xf6, - 0xc7, 0xde, 0x21, 0x13, 0x10, 0xe4, 0x4e, 0xae, 0x49, 0xe9, 0x5c, 0xfb, 0xb4, 0xc0, 0xe2, 0x8b, - 0xf3, 0x6f, 0xf1, 0x5f, 0xf4, 0x68, 0x68, 0x8f, 0x84, 0x62, 0x85, 0xfe, 0x4b, 0x4c, 0x58, 0xc7, - 0xa0, 0x09, 0x7e, 0x77, 0x80, 0xb1, 0x17, 0x90, 0xc5, 0xc8, 0x45, 0x44, 0x19, 0x6c, 0x45, 0x53, - 0x22, 0xa2, 0x3c, 0x86, 0xa5, 0x0e, 0x63, 0x29, 0xe4, 0x8b, 0x70, 0x4e, 0xba, 0x49, 0xdc, 0xd8, - 0xbe, 0x42, 0x3b, 0x76, 0xeb, 0x6c, 0x3b, 0xb8, 0x53, 0xca, 0x91, 0x1d, 0xb6, 0x05, 0x17, 0x71, - 0x12, 0xbb, 0x9d, 0xa1, 0x9b, 0x88, 0xb2, 0x81, 0x5d, 0x65, 0xb0, 0xf4, 0xe7, 0x28, 0x95, 0xd9, - 0x19, 0xc6, 0x02, 0x6e, 0xd0, 0x5e, 0xf3, 0xe1, 0x7b, 0x1b, 0x9e, 0x4b, 0x6d, 0x31, 0xbd, 0x3e, - 0xd0, 0x4c, 0x2a, 0xe4, 0x7c, 0x16, 0xe9, 0x6f, 0xca, 0xfa, 0x5c, 0x81, 0xe5, 0x77, 0xbc, 0xf6, - 0xc8, 0x1b, 0xf1, 0x7b, 0x99, 0x2f, 0x09, 0x96, 0x26, 0x5f, 0xcb, 0x7f, 0xa7, 0x88, 0xb9, 0x89, - 0x08, 0x84, 0x74, 0xc0, 0x7d, 0xaf, 0x2f, 0xde, 0x3d, 0x96, 0x2c, 0xfe, 0xeb, 0x29, 0x17, 0x00, - 0x79, 0x05, 0x96, 0x69, 0xb5, 0x87, 0x93, 0x3e, 0x9b, 0x88, 0x6c, 0x04, 0x5c, 0xa6, 0xc6, 0xb2, - 0x68, 0x67, 0x76, 0xe6, 0xac, 0xc2, 0x71, 0xf8, 0x93, 0x72, 0x88, 0xfe, 0xf1, 0x78, 0x28, 0x4f, - 0x9f, 0x50, 0x8e, 0xd9, 0x35, 0xa7, 0xc9, 0x8b, 0xe4, 0x29, 0x4d, 0xc8, 0x21, 0x6e, 0x2d, 0x30, - 0xf5, 0x98, 0x76, 0x1b, 0x0a, 0x52, 0xdd, 0xb4, 0x33, 0xcc, 0x5b, 0x44, 0x74, 0x86, 0xfd, 0xe2, - 0x43, 0xf0, 0x0e, 0xe4, 0x45, 0x95, 0x94, 0x15, 0x3e, 0x1a, 0xf8, 0x62, 0xe9, 0xe3, 0xff, 0x34, - 0x8d, 0xf2, 0xb5, 0xd8, 0xc9, 0x79, 0x0b, 0xff, 0xc7, 0xf3, 0x73, 0xdc, 0xa6, 0x3c, 0x70, 0xcf, - 0x77, 0x87, 0x68, 0x75, 0x14, 0x30, 0x8c, 0x34, 0xdd, 0xe9, 0xf9, 0xcc, 0x16, 0x89, 0x7f, 0xe3, - 0x7b, 0xc1, 0xc5, 0x13, 0x93, 0xa0, 0xa7, 0x9d, 0x24, 0x91, 0x63, 0x32, 0x13, 0x3d, 0x26, 0xc9, - 0x65, 0x58, 0x66, 0xa0, 0x21, 0xbc, 0x24, 0xfb, 0x32, 0x60, 0x9a, 0x8e, 0xc5, 0xc3, 0xfd, 0x92, - 0x93, 0xf7, 0x0b, 0x6f, 0xcd, 0x5f, 0x64, 0x84, 0xa4, 0xbb, 0x35, 0x18, 0x8c, 0xfd, 0xf1, 0xa8, - 0x3d, 0x8c, 0x68, 0xf4, 0xc8, 0x31, 0x3c, 0x8f, 0x8c, 0xe0, 0x5d, 0x8c, 0xc4, 0x30, 0x18, 0x09, - 0xe8, 0x89, 0x7d, 0x61, 0xce, 0x5d, 0xb8, 0xfb, 0xb9, 0x28, 0xab, 0xaa, 0x53, 0x6a, 0x5d, 0x26, - 0xa6, 0x82, 0x99, 0x54, 0xeb, 0xce, 0x9c, 0x75, 0x96, 0xd5, 0x99, 0xa0, 0x22, 0x3b, 0x29, 0xab, - 0x35, 0xae, 0xd2, 0xdb, 0x0a, 0x97, 0x6e, 0xb4, 0x56, 0x79, 0x51, 0x93, 0x2f, 0xc1, 0x52, 0xb7, - 0x23, 0x07, 0x1c, 0x8c, 0x2b, 0x93, 0xcc, 0x0e, 0x03, 0x3d, 0x0e, 0xeb, 0xa0, 0xcb, 0xa8, 0xcb, - 0x53, 0xb7, 0x56, 0x22, 0xba, 0x4f, 0x6d, 0x4b, 0x08, 0x55, 0xc9, 0x62, 0x64, 0x15, 0x32, 0xc1, - 0xa4, 0x65, 0xba, 0x1d, 0xb6, 0x63, 0x42, 0xd8, 0x65, 0x8b, 0xff, 0xd2, 0x7e, 0x0d, 0x6e, 0x9e, - 0x74, 0x8c, 0xe8, 0xee, 0x9a, 0x32, 0xe0, 0x4b, 0xd6, 0x7a, 0x3b, 0x31, 0x6e, 0x57, 0x40, 0x46, - 0x8d, 0xed, 0x8a, 0x5d, 0x2e, 0xd2, 0x5a, 0xa3, 0xae, 0xf6, 0x9b, 0x59, 0x58, 0x8d, 0x6a, 0x7b, - 0xc9, 0x6d, 0xc8, 0x05, 0xd5, 0xae, 0x06, 0xaf, 0x92, 0x32, 0x11, 0xad, 0xdc, 0x42, 0x22, 0xca, - 0xe8, 0xa2, 0x11, 0x83, 0x7b, 0x2c, 0x3f, 0x1c, 0x5a, 0xcb, 0x98, 0x28, 0x1e, 0x0c, 0xef, 0xc3, - 0x2a, 0xda, 0x9f, 0x21, 0x07, 0x35, 0xee, 0xf2, 0x37, 0x84, 0xd9, 0xcf, 0x40, 0xf9, 0x0f, 0x3e, - 0xbc, 0x34, 0x87, 0x2f, 0x3e, 0xcb, 0xb4, 0x2c, 0x65, 0x62, 0x68, 0xa6, 0xa4, 0xcc, 0xcb, 0x4d, - 0x57, 0xe6, 0xf1, 0xae, 0x4c, 0x51, 0xe6, 0xcd, 0xcf, 0x50, 0xe6, 0x85, 0x25, 0x65, 0x65, 0x1e, - 0xaa, 0x74, 0x17, 0xa7, 0xa9, 0x74, 0xc3, 0x32, 0x4c, 0xa5, 0x7b, 0x8d, 0x77, 0x77, 0xd4, 0x7e, - 0xe4, 0xe2, 0x38, 0xf0, 0xa3, 0x1c, 0x3b, 0x62, 0xb5, 0x1f, 0xa1, 0xb9, 0xc7, 0xd6, 0x12, 0x08, - 0x1b, 0x11, 0xed, 0x0f, 0x95, 0x98, 0x6e, 0x4a, 0x4c, 0xc5, 0x75, 0x58, 0xed, 0x1e, 0xd3, 0x03, - 0xc5, 0xeb, 0x48, 0xd2, 0xcf, 0x8a, 0xb5, 0x22, 0x52, 0x99, 0x04, 0xf4, 0x19, 0x58, 0x0b, 0xc8, - 0xb8, 0x10, 0x80, 0xbe, 0x63, 0x56, 0x50, 0x9a, 0x03, 0xa1, 0xdc, 0x86, 0xf5, 0x80, 0x90, 0xeb, - 0x17, 0x98, 0x00, 0xb4, 0x62, 0xa9, 0x22, 0xa3, 0xc9, 0xd3, 0xb5, 0xc3, 0x38, 0x2f, 0xfc, 0x29, - 0xb5, 0x4a, 0xfb, 0x51, 0x36, 0x22, 0xb7, 0x8b, 0xcf, 0x6c, 0x41, 0x81, 0xb2, 0x48, 0x7c, 0x90, - 0xf8, 0xb1, 0x72, 0x65, 0xca, 0xf0, 0x73, 0x2b, 0x1b, 0xdb, 0x6e, 0x58, 0xe0, 0xfb, 0x03, 0x61, - 0x74, 0xe3, 0x32, 0x2e, 0x90, 0xc9, 0x62, 0xb8, 0xfc, 0x44, 0x75, 0xec, 0x0c, 0x29, 0xce, 0xae, - 0x4e, 0x08, 0x4e, 0x74, 0xf5, 0x21, 0x37, 0x18, 0xfc, 0x12, 0x1f, 0x68, 0x01, 0xaa, 0xb9, 0xfc, - 0x68, 0xe5, 0xd9, 0x14, 0x6e, 0x3e, 0x51, 0x39, 0x8e, 0x12, 0xd6, 0xac, 0x4e, 0xc4, 0xbf, 0xa2, - 0x5a, 0x03, 0x96, 0x51, 0x6a, 0x16, 0x15, 0xe6, 0x52, 0x94, 0xc2, 0xc9, 0xce, 0x97, 0xcc, 0x9a, - 0x55, 0xa0, 0xe5, 0x44, 0x35, 0x47, 0xf0, 0xbc, 0x2c, 0xeb, 0x46, 0x1b, 0x39, 0x2f, 0x70, 0x5d, - 0x67, 0x8e, 0x40, 0x28, 0x12, 0x63, 0x53, 0xcf, 0xb4, 0xa3, 0x09, 0x9c, 0x4c, 0x3b, 0x82, 0x73, - 0xd3, 0xa7, 0x64, 0x46, 0xcc, 0xa0, 0xf0, 0x7a, 0xcb, 0xc8, 0xd7, 0x9b, 0x2c, 0xf9, 0x66, 0x23, - 0x92, 0xaf, 0xf6, 0xe7, 0x59, 0xb8, 0x7a, 0x82, 0xe9, 0x9a, 0xf1, 0xcd, 0x2f, 0x43, 0x81, 0x3d, - 0x65, 0xb1, 0xe3, 0x33, 0x13, 0x91, 0x55, 0x68, 0xa5, 0xfc, 0xac, 0xa3, 0x72, 0x53, 0x78, 0xde, - 0x81, 0x1f, 0xfc, 0x4f, 0x7e, 0x05, 0xd6, 0xd8, 0x81, 0xc6, 0x0c, 0xe5, 0x0e, 0x26, 0xbd, 0x13, - 0x9c, 0x68, 0x9b, 0xc2, 0xab, 0x27, 0x56, 0x14, 0x0f, 0x39, 0x3c, 0x31, 0xec, 0x20, 0x8d, 0x38, - 0x50, 0x40, 0xb2, 0x83, 0x76, 0xb7, 0x77, 0x22, 0xf7, 0x12, 0xe1, 0x33, 0x24, 0x17, 0x63, 0xf6, - 0xbd, 0x34, 0xa1, 0x82, 0xbf, 0xc9, 0x0d, 0x58, 0xeb, 0x4f, 0x8e, 0x29, 0x5b, 0xc0, 0xd6, 0x02, - 0xb7, 0x47, 0x98, 0xb7, 0x56, 0xfa, 0x93, 0x63, 0x7d, 0x38, 0xc4, 0x29, 0x45, 0xc3, 0x85, 0x75, - 0x4a, 0xc7, 0x76, 0xad, 0xa0, 0x5c, 0x40, 0x4a, 0x5a, 0x01, 0xdb, 0xb7, 0x9c, 0xf6, 0x34, 0x30, - 0x33, 0x36, 0x1e, 0x33, 0x89, 0xfd, 0xd0, 0x7e, 0x96, 0x11, 0x32, 0xda, 0xf4, 0x75, 0xff, 0xcb, - 0x29, 0x4a, 0x99, 0xa2, 0x9b, 0xa0, 0xd2, 0xa1, 0x0f, 0x0f, 0x95, 0x60, 0x8e, 0x56, 0xfb, 0x93, - 0xe3, 0x60, 0xec, 0xe4, 0x81, 0x5f, 0x90, 0x07, 0xfe, 0x15, 0x21, 0xc3, 0xa5, 0x1e, 0x0f, 0xd3, - 0x87, 0x5c, 0xfb, 0x8f, 0x2c, 0xdc, 0x38, 0xd9, 0x21, 0xf0, 0xcb, 0x79, 0x4b, 0x99, 0xb7, 0x98, - 0x32, 0x6f, 0x3e, 0xa1, 0xcc, 0x4b, 0xd9, 0x7b, 0x0b, 0x69, 0x7b, 0x2f, 0xa1, 0x3a, 0x5c, 0x4c, - 0x51, 0x1d, 0xa6, 0x6e, 0xd0, 0xfc, 0x13, 0x36, 0xe8, 0x92, 0xbc, 0x4e, 0xfe, 0x35, 0x10, 0xba, - 0xa3, 0xac, 0xfd, 0xdb, 0x70, 0x4a, 0xb0, 0xf6, 0xec, 0xe6, 0x08, 0x35, 0xc2, 0x85, 0xbb, 0xb7, - 0xd2, 0x98, 0x7a, 0x24, 0x4b, 0x61, 0xbc, 0xd7, 0x39, 0x3b, 0x1f, 0xe6, 0xff, 0xdf, 0x61, 0xe4, - 0xc9, 0x43, 0x38, 0x83, 0x88, 0xe3, 0xfb, 0xb2, 0x2e, 0xdb, 0x1d, 0x79, 0x07, 0x7c, 0x3d, 0x5c, - 0x49, 0xb0, 0xbd, 0xdd, 0x7d, 0xa9, 0x39, 0x96, 0x77, 0xb0, 0x33, 0x67, 0x9d, 0xf6, 0x53, 0xd2, - 0xe3, 0x32, 0xc2, 0x5f, 0x29, 0xa0, 0x3d, 0x79, 0xbc, 0x50, 0xb9, 0x12, 0x1f, 0xf0, 0x25, 0xab, - 0xd0, 0x96, 0x46, 0xef, 0x2a, 0xac, 0x8c, 0xbc, 0x83, 0x91, 0xe7, 0x1f, 0x45, 0xa4, 0xf6, 0x65, - 0x9e, 0x28, 0x06, 0x46, 0xe0, 0x1e, 0x3e, 0x15, 0x93, 0x2d, 0x0a, 0x69, 0x95, 0x40, 0xf4, 0x4b, - 0x9d, 0x07, 0xba, 0x9a, 0xe4, 0x06, 0xb2, 0x1f, 0xf7, 0x73, 0xf9, 0x8c, 0x9a, 0xb5, 0x38, 0x3a, - 0xe3, 0x41, 0xb7, 0xe7, 0x69, 0x7f, 0xad, 0x08, 0x8e, 0x20, 0x6d, 0xf0, 0xc8, 0xdb, 0x92, 0x79, - 0x69, 0x36, 0xc1, 0x86, 0xa4, 0x15, 0x91, 0x2d, 0xf1, 0x38, 0x60, 0x20, 0x26, 0x44, 0x00, 0x03, - 0x31, 0xe5, 0x19, 0x6c, 0xe4, 0xb8, 0x00, 0x7c, 0x4f, 0xd8, 0xa8, 0xd0, 0x33, 0x6f, 0xf7, 0x0e, - 0xb9, 0x05, 0x8b, 0xcc, 0x2c, 0x45, 0x34, 0x77, 0x2d, 0xd2, 0xdc, 0xdd, 0x3b, 0x96, 0xc8, 0xd7, - 0x7e, 0x18, 0xa8, 0x5f, 0x13, 0x9d, 0xd8, 0xbd, 0x43, 0x5e, 0x39, 0x99, 0xb9, 0x68, 0x5e, 0x98, - 0x8b, 0x06, 0xa6, 0xa2, 0xaf, 0x46, 0x4c, 0x45, 0xaf, 0xcd, 0x1e, 0x2d, 0xfe, 0x3e, 0xc6, 0x00, - 0xf2, 0x42, 0xe0, 0xa4, 0x9f, 0x29, 0x70, 0x61, 0x66, 0x09, 0x72, 0x1e, 0xf2, 0x7a, 0xd3, 0x74, - 0xc2, 0xf9, 0xa5, 0x7b, 0x46, 0xa4, 0x90, 0x6d, 0x58, 0xda, 0x6a, 0xfb, 0xdd, 0x7d, 0xba, 0x8c, - 0x53, 0x15, 0xd6, 0x89, 0x6a, 0x03, 0xf2, 0x9d, 0x39, 0x2b, 0x2c, 0x4b, 0x5c, 0x58, 0xc7, 0xbd, - 0x10, 0x09, 0x46, 0x94, 0x4d, 0x51, 0x1b, 0x24, 0x2a, 0x4c, 0x14, 0xa3, 0xe7, 0x4c, 0x22, 0x31, - 0xbe, 0x05, 0xdf, 0x15, 0xbc, 0xc8, 0xf4, 0x06, 0x3e, 0x05, 0xd2, 0xe7, 0x4d, 0xc8, 0x37, 0xc5, - 0xcb, 0xb5, 0x64, 0x5f, 0x2d, 0x5e, 0xa9, 0xad, 0x20, 0x57, 0xfb, 0x1d, 0x45, 0xc8, 0xf6, 0x4f, - 0xee, 0x88, 0x14, 0xc7, 0xa9, 0x33, 0x3b, 0x8e, 0x53, 0xe7, 0x63, 0xc6, 0x71, 0xd2, 0xfe, 0x92, - 0xe3, 0x70, 0x9b, 0x9d, 0x66, 0x4c, 0x9b, 0xf8, 0xac, 0x76, 0xf2, 0x46, 0x64, 0x75, 0x5e, 0x95, - 0xe2, 0x00, 0x26, 0xbf, 0x35, 0xdd, 0x5c, 0x5e, 0x5a, 0xaa, 0x7f, 0x9c, 0x85, 0xf3, 0xb3, 0x8a, - 0xa7, 0x46, 0x1a, 0x56, 0x9e, 0x2e, 0xd2, 0xf0, 0x2d, 0xc8, 0xb3, 0xb4, 0xc0, 0x08, 0x1c, 0x07, - 0x9c, 0x17, 0xa5, 0x03, 0x2e, 0xb2, 0xc9, 0x55, 0x58, 0xd0, 0x4b, 0x76, 0x18, 0xfc, 0x0a, 0xad, - 0x35, 0xdb, 0xfb, 0x3e, 0xda, 0x01, 0xf2, 0x2c, 0xf2, 0xf5, 0x64, 0xbc, 0x37, 0x1e, 0xf5, 0x6a, - 0x53, 0x1a, 0x90, 0x04, 0x44, 0x3e, 0xb6, 0x37, 0x84, 0x74, 0xe7, 0x28, 0xc9, 0x56, 0x32, 0x76, - 0x9c, 0x06, 0x0b, 0xcd, 0x91, 0xe7, 0x7b, 0x63, 0xd9, 0x92, 0x72, 0x88, 0x29, 0x16, 0xcf, 0xe1, - 0x76, 0x8e, 0xed, 0xc7, 0xcc, 0xad, 0x7d, 0x41, 0x86, 0x1a, 0x41, 0xc3, 0x48, 0x9a, 0x6c, 0x49, - 0x24, 0xb4, 0x40, 0xb5, 0x3d, 0xe9, 0xef, 0x1f, 0xb5, 0xac, 0x2a, 0x67, 0x35, 0x58, 0x81, 0x1e, - 0xa6, 0xd2, 0x0e, 0xfa, 0x96, 0x44, 0xa2, 0x7d, 0x57, 0x81, 0xd3, 0x69, 0xfd, 0x20, 0xe7, 0x21, - 0xd7, 0x4f, 0x0d, 0x6d, 0xd7, 0x67, 0xde, 0xb8, 0x05, 0xfa, 0xd7, 0x3d, 0x18, 0x8c, 0x8e, 0xdb, - 0x63, 0xd9, 0xde, 0x54, 0x4a, 0xb6, 0x80, 0xfe, 0xa8, 0xe0, 0xff, 0xe4, 0x92, 0x38, 0xa3, 0xb3, - 0x89, 0x60, 0x78, 0xf8, 0x47, 0xd3, 0x01, 0xcc, 0x4e, 0xb3, 0x31, 0x64, 0x10, 0xed, 0x2f, 0x41, - 0x8e, 0x36, 0x2b, 0xb6, 0x7a, 0xe9, 0xfa, 0xd1, 0x6b, 0x55, 0x4e, 0xc4, 0x5a, 0xe5, 0xb7, 0x8f, - 0x7b, 0x16, 0x12, 0x6b, 0x7b, 0xb0, 0x1a, 0xa5, 0x20, 0x46, 0x14, 0xd4, 0xb3, 0x70, 0x57, 0xe5, - 0x35, 0x6d, 0x0d, 0x06, 0xcc, 0xe7, 0x61, 0xeb, 0xf9, 0x7f, 0xf8, 0xf0, 0x12, 0xd0, 0x9f, 0xac, - 0x4c, 0x1a, 0xe8, 0xa7, 0xf6, 0xfd, 0x0c, 0x9c, 0x0e, 0xdd, 0xac, 0xc5, 0x1e, 0xfa, 0x85, 0xf5, - 0xf9, 0xd3, 0x23, 0x3e, 0x69, 0x82, 0xd1, 0x4a, 0x76, 0x70, 0x86, 0x2b, 0xcc, 0x36, 0x6c, 0x4c, - 0xa3, 0x27, 0xb7, 0x61, 0x09, 0x91, 0x79, 0x86, 0xed, 0x7d, 0x4f, 0x3e, 0xfb, 0xfa, 0x22, 0xd1, - 0x0a, 0xf3, 0xb5, 0x9f, 0x28, 0x70, 0x8e, 0x5b, 0xea, 0xd7, 0xda, 0xdd, 0x3e, 0x2a, 0xbd, 0xf7, - 0xbd, 0x4f, 0xc6, 0x67, 0x75, 0x3b, 0x72, 0x8e, 0x5d, 0x8f, 0x3a, 0x64, 0x24, 0xbe, 0x36, 0xbd, - 0xb7, 0xe4, 0x16, 0xa2, 0x4d, 0xf1, 0x87, 0xd0, 0x1c, 0xc3, 0x08, 0xe8, 0xd3, 0x04, 0x19, 0x23, - 0x00, 0x29, 0xb4, 0x5f, 0x87, 0x8b, 0xb3, 0x3f, 0x40, 0xbe, 0x06, 0x2b, 0x18, 0xbe, 0xa8, 0x35, - 0x3c, 0x1c, 0xb5, 0x3b, 0x9e, 0x50, 0x85, 0x09, 0x4d, 0xa4, 0x9c, 0xc7, 0xc0, 0xb3, 0xb8, 0xcf, - 0xfa, 0x21, 0x06, 0x46, 0xe2, 0x85, 0x22, 0xee, 0x30, 0x72, 0x6d, 0xda, 0x6f, 0x28, 0x40, 0x92, - 0x75, 0x90, 0x2f, 0xc0, 0x72, 0xcb, 0x29, 0xd9, 0xe3, 0xf6, 0x68, 0xbc, 0x33, 0x98, 0x8c, 0x38, - 0x72, 0x15, 0x73, 0x61, 0x1e, 0xef, 0xbb, 0xec, 0x79, 0xe3, 0x68, 0x30, 0x19, 0x59, 0x11, 0x3a, - 0x8c, 0xbb, 0xe3, 0x79, 0xdf, 0xe8, 0xb4, 0x1f, 0x47, 0xe3, 0xee, 0xf0, 0xb4, 0x48, 0xdc, 0x1d, - 0x9e, 0xa6, 0xbd, 0xaf, 0xc0, 0xa6, 0xb0, 0x6f, 0xeb, 0xa4, 0xb4, 0xa5, 0x84, 0x40, 0x1d, 0x23, - 0x01, 0x95, 0x3a, 0x8b, 0xa5, 0x5d, 0x17, 0x58, 0x36, 0xd8, 0x40, 0xe4, 0x6d, 0x59, 0x59, 0xf2, - 0x65, 0xc8, 0xd9, 0xe3, 0xc1, 0xf0, 0x04, 0x60, 0x36, 0x6a, 0x30, 0xa3, 0xe3, 0xc1, 0x10, 0xab, - 0xc0, 0x92, 0x9a, 0x07, 0xa7, 0xe5, 0xc6, 0x89, 0x16, 0x93, 0x1a, 0x2c, 0x72, 0xd4, 0xb2, 0xd8, - 0xe3, 0xf2, 0x8c, 0x3e, 0x6d, 0xad, 0x09, 0xc4, 0x1c, 0x0e, 0xd5, 0x69, 0x89, 0x3a, 0xb4, 0xdf, - 0x53, 0xa0, 0x40, 0xb9, 0x0d, 0x94, 0xe2, 0x9e, 0x75, 0x49, 0x47, 0x19, 0x47, 0x61, 0x09, 0x11, - 0x54, 0x7f, 0xa2, 0xdb, 0xf8, 0x65, 0x58, 0x8b, 0x15, 0x20, 0x1a, 0x62, 0x25, 0xf4, 0xba, 0xfb, - 0x6d, 0x16, 0xc6, 0x83, 0x59, 0x11, 0x44, 0xd2, 0xb4, 0xdf, 0x56, 0xe0, 0x34, 0x95, 0xf9, 0x4d, - 0x54, 0xf7, 0x5a, 0x93, 0x9e, 0xd8, 0xef, 0x94, 0x83, 0x12, 0x86, 0x92, 0xcc, 0x8f, 0x9b, 0x71, - 0x50, 0x3c, 0xcd, 0x0a, 0x72, 0xc9, 0x0e, 0xe4, 0xf9, 0xfd, 0xe2, 0x73, 0x84, 0xcd, 0x8b, 0x92, - 0x32, 0x21, 0xac, 0x98, 0x13, 0xd1, 0x9e, 0xe0, 0x11, 0xc6, 0xcb, 0x58, 0x41, 0x69, 0xed, 0x3f, - 0x15, 0x38, 0x3b, 0xa5, 0x0c, 0x79, 0x1d, 0xe6, 0xd1, 0xc7, 0x8c, 0xcf, 0xde, 0xf9, 0x29, 0x9f, - 0x18, 0xef, 0x1f, 0xed, 0xde, 0x61, 0x17, 0xd1, 0x31, 0xfd, 0x61, 0xb1, 0x52, 0xe4, 0x6d, 0x58, - 0xd2, 0x3b, 0x1d, 0x2e, 0xce, 0x64, 0x22, 0xe2, 0xcc, 0x94, 0x2f, 0xbe, 0x18, 0xd0, 0x33, 0x71, - 0x86, 0x79, 0x3b, 0x74, 0x3a, 0x2e, 0xf7, 0x9f, 0x0b, 0xeb, 0x3b, 0xf7, 0xff, 0x61, 0x35, 0x4a, - 0xfc, 0x54, 0x2e, 0x3f, 0x3f, 0x54, 0x40, 0x8d, 0xb6, 0xe1, 0xd3, 0xc1, 0xfa, 0x49, 0x9b, 0xe6, - 0x27, 0x2c, 0xaa, 0x3f, 0xc8, 0xc0, 0x73, 0xa9, 0x23, 0x4c, 0x5e, 0x80, 0x05, 0x7d, 0x38, 0x34, - 0xcb, 0x7c, 0x55, 0x71, 0x0e, 0x09, 0xb5, 0xc4, 0x11, 0x69, 0x8f, 0x11, 0x91, 0x97, 0x20, 0x8f, - 0x2b, 0x93, 0x16, 0xc8, 0x84, 0x58, 0x97, 0x4c, 0x89, 0x12, 0xc3, 0xba, 0x14, 0x84, 0xa4, 0x02, - 0xab, 0x1c, 0xf6, 0xc3, 0xf2, 0x0e, 0xbd, 0x6f, 0x05, 0xa0, 0xeb, 0x88, 0x0b, 0x2f, 0x54, 0xcf, - 0xee, 0x88, 0xe5, 0xc9, 0xc0, 0x17, 0xd1, 0x52, 0xa4, 0x0a, 0x2a, 0xd6, 0x29, 0xd7, 0xc4, 0x00, - 0x37, 0x11, 0x88, 0x85, 0x35, 0x62, 0x4a, 0x5d, 0x89, 0x92, 0xc1, 0x74, 0xe9, 0xbe, 0xdf, 0x3d, - 0xec, 0x1f, 0x7b, 0xfd, 0xf1, 0xa7, 0x37, 0x5d, 0xe1, 0x37, 0x4e, 0x34, 0x5d, 0x7f, 0x94, 0x63, - 0x9b, 0x39, 0x5e, 0x8c, 0x72, 0x34, 0x12, 0xc6, 0x32, 0x72, 0x34, 0x18, 0x95, 0x9e, 0x01, 0x5b, - 0x94, 0x61, 0x91, 0x01, 0x8e, 0x88, 0x9d, 0x71, 0x21, 0xb5, 0x09, 0x8c, 0x66, 0xf7, 0x0e, 0x63, - 0x5f, 0x98, 0xb3, 0x9b, 0x6f, 0x89, 0xa2, 0x64, 0x17, 0x0a, 0xa5, 0x9e, 0xd7, 0xee, 0x4f, 0x86, - 0xce, 0xc9, 0x5e, 0x0f, 0x37, 0x78, 0x5f, 0x96, 0xf7, 0x59, 0x31, 0x7c, 0x75, 0xc4, 0x93, 0x5c, - 0xae, 0x88, 0x38, 0x81, 0xff, 0x4b, 0x0e, 0x35, 0x95, 0x9f, 0x9f, 0x31, 0x3e, 0xf1, 0x44, 0x2c, - 0x17, 0x75, 0xee, 0xe2, 0x0e, 0x32, 0x2e, 0xac, 0x56, 0xdb, 0xfe, 0xd8, 0x19, 0xb5, 0xfb, 0x3e, - 0x02, 0x15, 0x9e, 0x00, 0xc8, 0x69, 0x53, 0x04, 0xc1, 0x45, 0x1d, 0xe3, 0x38, 0x28, 0xca, 0x34, - 0x98, 0xd1, 0xea, 0x28, 0xbf, 0x54, 0xe9, 0xf6, 0xdb, 0xbd, 0xee, 0x7b, 0xc2, 0x4d, 0x90, 0xf1, - 0x4b, 0x07, 0x22, 0xd1, 0x0a, 0xf3, 0xb5, 0xaf, 0x26, 0xe6, 0x8d, 0xb5, 0xb2, 0x00, 0x8b, 0xdc, - 0x89, 0x9c, 0x39, 0x55, 0x37, 0x8d, 0x7a, 0xd9, 0xac, 0x6f, 0xab, 0x0a, 0x59, 0x05, 0x68, 0x5a, - 0x8d, 0x92, 0x61, 0xdb, 0xf4, 0x77, 0x86, 0xfe, 0xe6, 0x1e, 0xd7, 0x95, 0x56, 0x55, 0xcd, 0x4a, - 0x4e, 0xd7, 0x39, 0xed, 0xc7, 0x0a, 0x9c, 0x49, 0x9f, 0x4a, 0xe2, 0x00, 0xba, 0xdd, 0xf3, 0x77, - 0xe4, 0x2f, 0xcc, 0x9c, 0xf7, 0xd4, 0xe4, 0xb8, 0xfb, 0xfe, 0x98, 0xb9, 0x85, 0x67, 0xc4, 0x63, - 0x11, 0xf3, 0x33, 0xeb, 0x76, 0xac, 0x4c, 0xb7, 0xa3, 0x95, 0x60, 0x63, 0x5a, 0x1d, 0xd1, 0xae, - 0xae, 0x41, 0x41, 0x6f, 0x36, 0xab, 0x66, 0x49, 0x77, 0xcc, 0x46, 0x5d, 0x55, 0xc8, 0x12, 0xcc, - 0x6f, 0x5b, 0x8d, 0x56, 0x53, 0xcd, 0x68, 0x3f, 0x50, 0x60, 0xc5, 0x0c, 0x4d, 0x8b, 0x9e, 0x75, - 0xf3, 0xbd, 0x16, 0xd9, 0x7c, 0x1b, 0x01, 0x40, 0x45, 0xf0, 0x81, 0x13, 0xed, 0xbc, 0xbf, 0x57, - 0x60, 0x3d, 0x51, 0x86, 0xd8, 0xb0, 0xa8, 0xef, 0xd9, 0x0d, 0xb3, 0x5c, 0xe2, 0x2d, 0xbb, 0x14, - 0x5a, 0x2f, 0x61, 0x0c, 0xa2, 0xc4, 0x57, 0x98, 0x53, 0xe7, 0x23, 0xdf, 0x1d, 0x74, 0x3b, 0x52, - 0xfc, 0xd0, 0x9d, 0x39, 0x4b, 0xd4, 0x84, 0x37, 0xd9, 0x7b, 0x93, 0x91, 0x87, 0xd5, 0x66, 0x22, - 0x8a, 0xd0, 0x20, 0x3d, 0x59, 0x31, 0x9a, 0xe0, 0xb7, 0x69, 0x7e, 0xb2, 0xea, 0xb0, 0xbe, 0xad, - 0x15, 0x28, 0x70, 0xa9, 0x05, 0x05, 0x82, 0x1f, 0x29, 0xb0, 0x31, 0xad, 0xad, 0x54, 0x10, 0x8a, - 0x7a, 0x78, 0x9f, 0x09, 0x62, 0x0a, 0x44, 0x5d, 0xbb, 0x05, 0x19, 0x79, 0x03, 0x0a, 0xa6, 0xef, - 0x4f, 0xbc, 0x91, 0xfd, 0x52, 0xcb, 0x32, 0xf9, 0x02, 0xb9, 0xf0, 0x6f, 0x1f, 0x5e, 0x3a, 0x8b, - 0x86, 0xf2, 0x23, 0xd7, 0x7f, 0xc9, 0x9d, 0x8c, 0xba, 0x11, 0xfc, 0x75, 0xb9, 0x04, 0xe5, 0x5b, - 0xdb, 0x93, 0x4e, 0xd7, 0x13, 0x5c, 0xbb, 0xf0, 0x82, 0xe5, 0x69, 0xf2, 0x2d, 0x22, 0xd2, 0xb4, - 0xef, 0x28, 0x70, 0x6e, 0xfa, 0xc0, 0xd0, 0x9b, 0xc9, 0x61, 0x36, 0x39, 0xc2, 0x0f, 0x15, 0x6f, - 0xa6, 0xc0, 0x70, 0x47, 0xae, 0x53, 0x10, 0xd2, 0x42, 0x41, 0x3c, 0xef, 0x4c, 0x22, 0x88, 0x6f, - 0xb4, 0x90, 0x20, 0xd4, 0xfe, 0x3d, 0x03, 0x67, 0xe8, 0xa2, 0xeb, 0x79, 0xbe, 0xaf, 0x4f, 0xc6, - 0x47, 0x5e, 0x7f, 0xcc, 0xd9, 0x30, 0xf2, 0x0a, 0x2c, 0x1c, 0x3d, 0x9d, 0xca, 0x91, 0x91, 0x13, - 0x02, 0x78, 0x90, 0x0b, 0xb3, 0x7f, 0xfa, 0x3f, 0xb9, 0x02, 0x72, 0xd8, 0xe4, 0x2c, 0x02, 0x37, - 0x66, 0x36, 0x14, 0x6b, 0x69, 0x18, 0x44, 0x38, 0x7d, 0x15, 0xe6, 0x51, 0xcd, 0xc0, 0x8f, 0x54, - 0xc1, 0x0a, 0xa7, 0xb7, 0x0e, 0x95, 0x10, 0x16, 0x2b, 0x40, 0x3e, 0x07, 0x10, 0x62, 0xde, 0xf3, - 0x33, 0x53, 0x88, 0xdf, 0x01, 0xec, 0xbd, 0xb5, 0x74, 0x7c, 0xd0, 0xe6, 0x40, 0xf2, 0x45, 0x58, - 0x17, 0xc3, 0x32, 0x14, 0x78, 0x6f, 0xfc, 0x35, 0x6c, 0x8d, 0x65, 0x98, 0x43, 0x81, 0xf9, 0x76, - 0x2d, 0x11, 0xfa, 0x15, 0x61, 0x5f, 0x63, 0xf1, 0x5d, 0xaf, 0x25, 0xe2, 0xbb, 0xe6, 0x19, 0x95, - 0x1c, 0xc4, 0x55, 0xfb, 0x97, 0x0c, 0x2c, 0xed, 0x51, 0x66, 0x05, 0x45, 0xf0, 0xd9, 0x22, 0xfd, - 0x5d, 0x28, 0x54, 0x07, 0x6d, 0xfe, 0xec, 0xc0, 0xad, 0xe5, 0x99, 0xb7, 0x6a, 0x6f, 0xd0, 0x16, - 0x2f, 0x18, 0xbe, 0x25, 0x13, 0x3d, 0xc1, 0xd3, 0xf6, 0x3e, 0x2c, 0xb0, 0x67, 0x20, 0xae, 0x5d, - 0x12, 0xec, 0x6a, 0xd0, 0xa2, 0x17, 0x59, 0xb6, 0xa4, 0x29, 0x67, 0x4f, 0x49, 0x32, 0xef, 0xc4, - 0xd1, 0x2b, 0x25, 0x85, 0xc3, 0xfc, 0xc9, 0x14, 0x0e, 0x12, 0x4a, 0xd7, 0xc2, 0x49, 0x50, 0xba, - 0xce, 0xdd, 0x83, 0x82, 0xd4, 0x9e, 0xa7, 0xe2, 0x5e, 0xbf, 0x9d, 0x81, 0x15, 0xec, 0x55, 0x60, - 0x13, 0xf2, 0x8b, 0xa9, 0x3e, 0x79, 0x2d, 0xa2, 0x3e, 0xd9, 0x90, 0xe7, 0x8b, 0xf5, 0x6c, 0x86, - 0xde, 0xe4, 0x3e, 0xac, 0x27, 0x08, 0xc9, 0xcb, 0x30, 0x4f, 0x9b, 0x2f, 0xc4, 0x4d, 0x35, 0xbe, - 0x02, 0x42, 0x44, 0x57, 0xda, 0x71, 0xdf, 0x62, 0xd4, 0xda, 0x7f, 0x29, 0xb0, 0xcc, 0x03, 0x2a, - 0xf4, 0x0f, 0x06, 0x4f, 0x1c, 0xce, 0x1b, 0xf1, 0xe1, 0x64, 0xb8, 0x11, 0x7c, 0x38, 0xff, 0xa7, - 0x07, 0xf1, 0x5e, 0x64, 0x10, 0xcf, 0x06, 0xf8, 0x6e, 0xa2, 0x3b, 0x33, 0xc6, 0xf0, 0x6f, 0x10, - 0xf1, 0x34, 0x4a, 0x48, 0xbe, 0x0e, 0x4b, 0x75, 0xef, 0x51, 0x44, 0x6a, 0xbb, 0x31, 0xa5, 0xd2, - 0x17, 0x03, 0x42, 0xb6, 0xa7, 0xf0, 0xc2, 0xeb, 0x7b, 0x8f, 0xdc, 0xc4, 0x0b, 0x54, 0x58, 0x25, - 0x15, 0xdc, 0xa2, 0xc5, 0x9e, 0x66, 0xe9, 0x73, 0xd7, 0x3d, 0x84, 0x42, 0xf9, 0x6e, 0x16, 0x20, - 0xf4, 0x7a, 0xa2, 0x1b, 0x30, 0xf2, 0xf8, 0x2e, 0x14, 0xde, 0x98, 0x24, 0xaf, 0x71, 0xf1, 0x26, - 0x7f, 0x83, 0x2b, 0x66, 0x33, 0xd3, 0xf1, 0xf7, 0x50, 0x45, 0x5b, 0xe2, 0x6e, 0x36, 0x1d, 0xaf, - 0xd7, 0x66, 0x67, 0x7b, 0x76, 0xeb, 0x1a, 0xc2, 0xad, 0x06, 0xa9, 0x53, 0x22, 0xe3, 0xa2, 0x33, - 0x4e, 0x99, 0x12, 0x24, 0x3c, 0x09, 0x73, 0x4f, 0xe7, 0x49, 0xd8, 0x84, 0xa5, 0x6e, 0xff, 0x5d, - 0xaf, 0x3f, 0x1e, 0x8c, 0x1e, 0xa3, 0x36, 0x3a, 0x54, 0x73, 0xd1, 0x21, 0x30, 0x45, 0x1e, 0x9b, - 0x07, 0xbc, 0x18, 0x03, 0x7a, 0x79, 0x1a, 0x82, 0xc4, 0xc0, 0x13, 0x72, 0x5e, 0x5d, 0xb8, 0x9f, - 0xcb, 0x2f, 0xa8, 0x8b, 0xf7, 0x73, 0xf9, 0xbc, 0xba, 0x74, 0x3f, 0x97, 0x5f, 0x52, 0xc1, 0x92, - 0xde, 0x77, 0x82, 0xf7, 0x1b, 0xe9, 0xc9, 0x25, 0xfa, 0x9c, 0xa2, 0xfd, 0x3c, 0x03, 0x24, 0xd9, - 0x0c, 0xf2, 0x1a, 0x14, 0xd8, 0x01, 0xeb, 0x8e, 0xfc, 0x6f, 0x72, 0x53, 0x6b, 0x06, 0x28, 0x23, - 0x25, 0xcb, 0x80, 0x32, 0x2c, 0xd9, 0xf2, 0xbf, 0xd9, 0x23, 0x5f, 0x83, 0x53, 0x38, 0xbc, 0x43, - 0x6f, 0xd4, 0x1d, 0x74, 0x5c, 0x44, 0xff, 0x6c, 0xf7, 0x78, 0x14, 0xbb, 0x17, 0x30, 0xdc, 0x6a, - 0x32, 0x7b, 0xca, 0x34, 0xa0, 0x73, 0x53, 0x13, 0x29, 0x9b, 0x8c, 0x90, 0x38, 0xa0, 0xca, 0xe5, - 0x0f, 0x26, 0xbd, 0x1e, 0x9f, 0xd9, 0x22, 0x15, 0x74, 0xe3, 0x79, 0x53, 0x2a, 0x5e, 0x0d, 0x2b, - 0xae, 0x4c, 0x7a, 0x3d, 0xf2, 0x0a, 0xc0, 0xa0, 0xef, 0x1e, 0x77, 0x7d, 0x9f, 0xbd, 0x71, 0x04, - 0x7e, 0x98, 0x61, 0xaa, 0x3c, 0x19, 0x83, 0x7e, 0x8d, 0x25, 0x92, 0xff, 0x07, 0xe8, 0x87, 0x8e, - 0x00, 0x0d, 0xcc, 0xaa, 0x85, 0xc7, 0xa5, 0x10, 0x89, 0x51, 0xb7, 0xcf, 0x43, 0xcf, 0xee, 0xbe, - 0x27, 0xcc, 0xdc, 0xdf, 0x82, 0x75, 0x6e, 0x4f, 0xba, 0xd7, 0x1d, 0x1f, 0x71, 0x0e, 0xfb, 0x59, - 0xd8, 0x73, 0x89, 0xc5, 0xfe, 0xc7, 0x1c, 0x80, 0xbe, 0x67, 0x0b, 0xec, 0xa3, 0x5b, 0x30, 0x4f, - 0xe5, 0x06, 0xa1, 0x7f, 0x40, 0xed, 0x2d, 0xd6, 0x2b, 0x6b, 0x6f, 0x91, 0x82, 0xee, 0x46, 0x0b, - 0x4d, 0xa7, 0x85, 0xee, 0x01, 0x77, 0x23, 0xb3, 0xa6, 0x8e, 0x60, 0xcf, 0x72, 0x2a, 0x52, 0x05, - 0x08, 0xd1, 0x88, 0xb8, 0x24, 0xbb, 0x1e, 0xc2, 0x7a, 0xf0, 0x0c, 0x8e, 0x7f, 0x1f, 0x22, 0x1a, - 0xc9, 0xcb, 0x27, 0x24, 0x23, 0x0f, 0x20, 0xe7, 0xb4, 0x03, 0x2f, 0xc3, 0x29, 0x18, 0x4d, 0x97, - 0x79, 0x94, 0xc1, 0x10, 0xa7, 0x69, 0x75, 0xdc, 0x8e, 0x04, 0x63, 0xc5, 0x4a, 0x88, 0x01, 0x0b, - 0x3c, 0x82, 0xf4, 0x14, 0x6c, 0x3f, 0x1e, 0x40, 0x9a, 0x23, 0xfa, 0x62, 0xa2, 0xcc, 0x53, 0xf0, - 0x58, 0xd1, 0x77, 0x21, 0x6b, 0xdb, 0x35, 0x8e, 0x4c, 0xb0, 0x12, 0x4a, 0x25, 0xb6, 0x5d, 0x63, - 0x6f, 0x94, 0xbe, 0x7f, 0x2c, 0x15, 0xa3, 0xc4, 0xe4, 0x8b, 0x50, 0x90, 0xd8, 0x67, 0x8e, 0xe9, - 0x81, 0x63, 0x20, 0x79, 0x7a, 0xc8, 0x87, 0x86, 0x44, 0x4d, 0xaa, 0xa0, 0x3e, 0x98, 0xbc, 0xe3, - 0xe9, 0xc3, 0x21, 0x3a, 0x78, 0xbd, 0xeb, 0x8d, 0x18, 0xdb, 0x96, 0x0f, 0xc1, 0x70, 0xd1, 0x12, - 0xbe, 0x23, 0x72, 0x65, 0x1d, 0x4c, 0xbc, 0x24, 0x69, 0xc2, 0xba, 0xed, 0x8d, 0x27, 0x43, 0x66, - 0xa7, 0x51, 0x19, 0x8c, 0xa8, 0x10, 0xc2, 0x10, 0x40, 0x10, 0x37, 0xd4, 0xa7, 0x99, 0xc2, 0x38, - 0xe6, 0x60, 0x30, 0x8a, 0x09, 0x24, 0xc9, 0xc2, 0x9a, 0x27, 0x4f, 0x39, 0xbd, 0x55, 0xa3, 0xa2, - 0x0d, 0xde, 0xaa, 0x42, 0xb4, 0x09, 0x05, 0x9a, 0xcf, 0xa5, 0xa0, 0x54, 0xe1, 0x83, 0x99, 0x84, - 0x52, 0x15, 0xc1, 0xa6, 0x7a, 0x3f, 0x27, 0x01, 0x25, 0xf2, 0xb9, 0x78, 0x1d, 0xe0, 0xfe, 0xa0, - 0xdb, 0xaf, 0x79, 0xe3, 0xa3, 0x41, 0x47, 0x02, 0xcb, 0x2a, 0xfc, 0xea, 0xa0, 0xdb, 0x77, 0x8f, - 0x31, 0xf9, 0xe7, 0x1f, 0x5e, 0x92, 0x88, 0x2c, 0xe9, 0x7f, 0xf2, 0x59, 0x58, 0xa2, 0xbf, 0x9c, - 0xd0, 0xda, 0x84, 0xa9, 0x2a, 0xb1, 0x34, 0x0b, 0x27, 0x10, 0x12, 0x90, 0x7b, 0x18, 0x40, 0xa3, - 0x3b, 0x1c, 0x4b, 0xcc, 0xab, 0x88, 0x96, 0xd1, 0x1d, 0x8e, 0xe3, 0xd8, 0xb7, 0x12, 0x31, 0xd9, - 0x09, 0x9a, 0x2e, 0x62, 0xde, 0xf0, 0x38, 0x1d, 0xa8, 0x8f, 0xe3, 0x6b, 0xcd, 0x15, 0xa0, 0x9b, - 0x72, 0x74, 0xd2, 0x58, 0x31, 0x6c, 0x84, 0xbd, 0x53, 0x66, 0x0f, 0x28, 0x9c, 0xa9, 0x65, 0x8d, - 0xf0, 0x8f, 0x3a, 0xee, 0x3e, 0x26, 0x47, 0x1a, 0x11, 0x10, 0x93, 0x2d, 0x58, 0x63, 0x3c, 0x7e, - 0x10, 0x3b, 0x8f, 0xb3, 0xb8, 0x78, 0xb6, 0x85, 0xc1, 0xf5, 0xe4, 0xcf, 0xc7, 0x0a, 0x90, 0x0a, - 0xcc, 0xa3, 0x40, 0xc8, 0xad, 0xc5, 0x37, 0x65, 0xe9, 0x39, 0xbe, 0x8f, 0xf0, 0x5c, 0x41, 0xb9, - 0x59, 0x3e, 0x57, 0x90, 0x94, 0x7c, 0x05, 0xc0, 0xe8, 0x8f, 0x06, 0xbd, 0x1e, 0xc2, 0xc2, 0xe6, - 0x51, 0x94, 0xba, 0x10, 0xdd, 0x8f, 0x58, 0x4b, 0x48, 0xc4, 0x21, 0xcc, 0xf0, 0xb7, 0x1b, 0x03, - 0x8f, 0x95, 0xea, 0xd2, 0x4c, 0x58, 0x60, 0x9b, 0x11, 0x21, 0x96, 0x79, 0xd0, 0x08, 0x09, 0xa0, - 0x97, 0x41, 0x2c, 0xf3, 0xf4, 0x24, 0xc4, 0xb2, 0x54, 0x40, 0x7b, 0x00, 0xa7, 0xd3, 0x3a, 0x16, - 0x11, 0x61, 0x95, 0x93, 0x8a, 0xb0, 0x7f, 0x96, 0x85, 0x65, 0xac, 0x4d, 0x9c, 0xc2, 0x3a, 0xac, - 0xd8, 0x93, 0x77, 0x02, 0xfc, 0x21, 0x71, 0x1a, 0x63, 0xfb, 0x7c, 0x39, 0x43, 0x7e, 0xda, 0x8a, - 0x94, 0x20, 0x06, 0xac, 0x8a, 0x9b, 0x60, 0x5b, 0x58, 0xa0, 0x07, 0xe8, 0xc6, 0x02, 0x43, 0x2f, - 0x19, 0x3b, 0x34, 0x56, 0x28, 0xbc, 0x0f, 0xb2, 0x4f, 0x73, 0x1f, 0xe4, 0x4e, 0x74, 0x1f, 0xbc, - 0x0d, 0xcb, 0xe2, 0x6b, 0x78, 0x92, 0xcf, 0x3f, 0xdb, 0x49, 0x1e, 0xa9, 0x8c, 0x54, 0x83, 0x13, - 0x7d, 0x61, 0xe6, 0x89, 0x8e, 0xef, 0x85, 0x62, 0x97, 0x0d, 0x31, 0x2d, 0x79, 0xb0, 0x63, 0x70, - 0xbd, 0xed, 0x52, 0xf3, 0x63, 0xdc, 0x92, 0x2f, 0xc3, 0x52, 0x75, 0x20, 0x9e, 0x8a, 0x24, 0x1d, - 0x7d, 0x4f, 0x24, 0xca, 0xec, 0x42, 0x40, 0x19, 0xdc, 0x6e, 0xd9, 0x4f, 0xe2, 0x76, 0xbb, 0x07, - 0xc0, 0x5d, 0x1b, 0xc2, 0xa0, 0x58, 0xb8, 0x65, 0x04, 0xf6, 0x42, 0xf4, 0xa9, 0x40, 0x22, 0xa6, - 0xa7, 0x13, 0xb7, 0x42, 0xd1, 0xf7, 0xf7, 0x07, 0x93, 0xfe, 0x38, 0x12, 0x45, 0x56, 0x78, 0xef, - 0xb5, 0x79, 0x9e, 0x7c, 0x3c, 0xc4, 0x8a, 0x7d, 0xb2, 0x13, 0x42, 0xde, 0x0c, 0x8c, 0xe8, 0x16, - 0x67, 0x8d, 0x90, 0x96, 0x18, 0xa1, 0xa9, 0xa6, 0x73, 0xda, 0x8f, 0x15, 0x19, 0x5a, 0xfe, 0x63, - 0x4c, 0xf5, 0xab, 0x00, 0xc1, 0x5b, 0xbd, 0x98, 0x6b, 0x26, 0x2f, 0x05, 0xa9, 0xf2, 0x28, 0x87, - 0xb4, 0x52, 0x6f, 0xb2, 0x9f, 0x54, 0x6f, 0x1c, 0x28, 0x34, 0xbe, 0x31, 0x6e, 0x87, 0xc6, 0x1d, - 0x60, 0x07, 0x9c, 0x2c, 0x9e, 0x4c, 0xd9, 0xad, 0xeb, 0x78, 0x37, 0x84, 0x7c, 0xf0, 0x14, 0x16, - 0x58, 0x2a, 0xa8, 0xbd, 0x09, 0x6b, 0xb2, 0xc7, 0xf1, 0xe3, 0xfe, 0x3e, 0xf9, 0x12, 0x03, 0xba, - 0x54, 0x22, 0x12, 0x8b, 0x44, 0x44, 0x4f, 0xdc, 0xc7, 0xfd, 0x7d, 0xc6, 0xff, 0xb4, 0x1f, 0xc9, - 0x6d, 0x45, 0x19, 0xef, 0xa7, 0x0a, 0x90, 0x24, 0xb9, 0x7c, 0x9a, 0x28, 0xff, 0x0b, 0xdc, 0x65, - 0x8c, 0x2b, 0xcb, 0x3d, 0x0d, 0x57, 0x56, 0xfc, 0x7d, 0x05, 0xd6, 0x4c, 0xbd, 0xc6, 0x71, 0xe0, - 0xd9, 0x9b, 0xc3, 0x15, 0xb8, 0x60, 0xea, 0x35, 0xb7, 0xd9, 0xa8, 0x9a, 0xa5, 0x87, 0x6e, 0x2a, - 0xbc, 0xeb, 0x05, 0x78, 0x3e, 0x49, 0x12, 0xbe, 0x4d, 0x9c, 0x87, 0x8d, 0x64, 0xb6, 0x80, 0x80, - 0x4d, 0x2f, 0x2c, 0xd0, 0x62, 0xb3, 0xc5, 0x37, 0x60, 0x4d, 0xc0, 0x9d, 0x3a, 0x55, 0x1b, 0x01, - 0xd5, 0xd7, 0xa0, 0xb0, 0x6b, 0x58, 0x66, 0xe5, 0xa1, 0x5b, 0x69, 0x55, 0xab, 0xea, 0x1c, 0x59, - 0x81, 0x25, 0x9e, 0x50, 0xd2, 0x55, 0x85, 0x2c, 0x43, 0xde, 0xac, 0xdb, 0x46, 0xa9, 0x65, 0x19, - 0x6a, 0xa6, 0xf8, 0x06, 0xac, 0x36, 0x47, 0xdd, 0x77, 0xdb, 0x63, 0xef, 0x81, 0xf7, 0x18, 0x9f, - 0x16, 0x16, 0x21, 0x6b, 0xe9, 0x7b, 0xea, 0x1c, 0x01, 0x58, 0x68, 0x3e, 0x28, 0xd9, 0x77, 0xee, - 0xa8, 0x0a, 0x29, 0xc0, 0xe2, 0x76, 0xa9, 0xe9, 0x3e, 0xa8, 0xd9, 0x6a, 0x86, 0xfe, 0xd0, 0xf7, - 0x6c, 0xfc, 0x91, 0x2d, 0x7e, 0x1e, 0xd6, 0x91, 0x57, 0xa8, 0x76, 0xfd, 0xb1, 0xd7, 0xf7, 0x46, - 0xd8, 0x86, 0x65, 0xc8, 0xdb, 0x1e, 0xdd, 0xe4, 0x63, 0x8f, 0x35, 0xa0, 0x36, 0xe9, 0x8d, 0xbb, - 0xc3, 0x9e, 0xf7, 0x2d, 0x55, 0x29, 0xde, 0x83, 0x35, 0x6b, 0x30, 0x19, 0x77, 0xfb, 0x87, 0xf6, - 0x98, 0x52, 0x1c, 0x3e, 0x26, 0xcf, 0xc1, 0x7a, 0xab, 0xae, 0xd7, 0xb6, 0xcc, 0xed, 0x56, 0xa3, - 0x65, 0xbb, 0x35, 0xdd, 0x29, 0xed, 0xb0, 0x87, 0x8d, 0x5a, 0xc3, 0x76, 0x5c, 0xcb, 0x28, 0x19, - 0x75, 0x47, 0x55, 0x8a, 0xdf, 0x47, 0xb5, 0xc7, 0xfe, 0xa0, 0xdf, 0xa9, 0xb4, 0x31, 0xc0, 0x3e, - 0x6d, 0xb0, 0x06, 0x17, 0x6d, 0xa3, 0xd4, 0xa8, 0x97, 0xdd, 0x8a, 0x5e, 0x72, 0x1a, 0x56, 0x1a, - 0xbe, 0xf0, 0x39, 0x38, 0x93, 0x42, 0xd3, 0x70, 0x9a, 0xaa, 0x42, 0x2e, 0xc1, 0x66, 0x4a, 0xde, - 0x9e, 0xb1, 0xa5, 0xb7, 0x9c, 0x9d, 0xba, 0x9a, 0x99, 0x52, 0xd8, 0xb6, 0x1b, 0x6a, 0xb6, 0xf8, - 0x3d, 0x05, 0x56, 0x5b, 0x3e, 0xb7, 0x2a, 0x6e, 0xa1, 0x6f, 0xe0, 0x65, 0x38, 0xdf, 0xb2, 0x0d, - 0xcb, 0x75, 0x1a, 0x0f, 0x8c, 0xba, 0xdb, 0xb2, 0xf5, 0xed, 0x78, 0x6b, 0x2e, 0xc1, 0xa6, 0x44, - 0x61, 0x19, 0xa5, 0xc6, 0xae, 0x61, 0xb9, 0x4d, 0xdd, 0xb6, 0xf7, 0x1a, 0x56, 0x59, 0x55, 0xe8, - 0x17, 0x53, 0x08, 0x6a, 0x15, 0x9d, 0xb5, 0x26, 0x92, 0x57, 0x37, 0xf6, 0xf4, 0xaa, 0xbb, 0xd5, - 0x70, 0xd4, 0x6c, 0xb1, 0x46, 0xaf, 0x5e, 0x44, 0xf9, 0x64, 0xb6, 0x70, 0x79, 0xc8, 0xd5, 0x1b, - 0x75, 0x23, 0xfe, 0x1c, 0xb6, 0x0c, 0x79, 0xbd, 0xd9, 0xb4, 0x1a, 0xbb, 0xb8, 0xc4, 0x00, 0x16, - 0xca, 0x46, 0x9d, 0xb6, 0x2c, 0x4b, 0x73, 0x9a, 0x56, 0xa3, 0xd6, 0x70, 0x8c, 0xb2, 0x9a, 0x2b, - 0x5a, 0x62, 0x0b, 0x8b, 0x4a, 0xf7, 0x07, 0xec, 0xed, 0xa9, 0x6c, 0x54, 0xf4, 0x56, 0xd5, 0xe1, - 0x53, 0xf4, 0xd0, 0xb5, 0x8c, 0x37, 0x5b, 0x86, 0xed, 0xd8, 0xaa, 0x42, 0x54, 0x58, 0xae, 0x1b, - 0x46, 0xd9, 0x76, 0x2d, 0x63, 0xd7, 0x34, 0xf6, 0xd4, 0x0c, 0xad, 0x93, 0xfd, 0x4f, 0xbf, 0x50, - 0x7c, 0x5f, 0x01, 0xc2, 0x10, 0x52, 0x45, 0xd8, 0x0d, 0x5c, 0x31, 0x17, 0xe1, 0xdc, 0x0e, 0x9d, - 0x6a, 0xec, 0x5a, 0xad, 0x51, 0x8e, 0x0f, 0xd9, 0x19, 0x20, 0xb1, 0xfc, 0x46, 0xa5, 0xa2, 0x2a, - 0x64, 0x13, 0x4e, 0xc5, 0xd2, 0xcb, 0x56, 0xa3, 0xa9, 0x66, 0xce, 0x65, 0xf2, 0x0a, 0x39, 0x9b, - 0xc8, 0x7c, 0x60, 0x18, 0x4d, 0x35, 0x4b, 0xa7, 0x28, 0x96, 0x21, 0xb6, 0x04, 0x2b, 0x9e, 0x2b, - 0x7e, 0x47, 0x81, 0x33, 0xac, 0x99, 0x62, 0x7f, 0x05, 0x4d, 0x3d, 0x0f, 0x1b, 0x1c, 0xf7, 0x39, - 0xad, 0xa1, 0xa7, 0x41, 0x8d, 0xe4, 0xb2, 0x66, 0x3e, 0x07, 0xeb, 0x91, 0x54, 0x6c, 0x47, 0x86, - 0x9e, 0x1e, 0x91, 0xe4, 0x2d, 0xc3, 0x76, 0x5c, 0xa3, 0x52, 0x69, 0x58, 0x0e, 0x6b, 0x48, 0xb6, - 0xa8, 0xc1, 0x7a, 0xc9, 0x1b, 0x8d, 0xa9, 0x54, 0xd4, 0xf7, 0xbb, 0x83, 0x3e, 0x36, 0x61, 0x05, - 0x96, 0x8c, 0xaf, 0x38, 0x46, 0xdd, 0x36, 0x1b, 0x75, 0x75, 0xae, 0x78, 0x3e, 0x46, 0x23, 0xf6, - 0xb1, 0x6d, 0xef, 0xa8, 0x73, 0xc5, 0x36, 0xac, 0x08, 0xfb, 0x5d, 0xb6, 0x2a, 0x2e, 0xc2, 0x39, - 0xb1, 0xd6, 0xf0, 0x44, 0x89, 0x77, 0x61, 0x03, 0x4e, 0x27, 0xf3, 0x0d, 0x47, 0x55, 0xe8, 0x2c, - 0xc4, 0x72, 0x68, 0x7a, 0xa6, 0xf8, 0x5b, 0x0a, 0xac, 0x04, 0xef, 0x19, 0xa8, 0x41, 0xbd, 0x04, - 0x9b, 0xb5, 0x8a, 0xee, 0x96, 0x8d, 0x5d, 0xb3, 0x64, 0xb8, 0x0f, 0xcc, 0x7a, 0x39, 0xf6, 0x91, - 0xe7, 0xe1, 0xb9, 0x14, 0x02, 0xfc, 0xca, 0x06, 0x9c, 0x8e, 0x67, 0x39, 0x74, 0xab, 0x66, 0xe8, - 0xd0, 0xc7, 0x73, 0x82, 0x7d, 0x9a, 0x2d, 0xfe, 0xa9, 0x02, 0x1b, 0x3c, 0xae, 0x39, 0x7f, 0x59, - 0x61, 0x01, 0x2f, 0x10, 0x11, 0xb6, 0x08, 0x37, 0x1c, 0xab, 0x65, 0x3b, 0x46, 0x59, 0x14, 0xa7, - 0x8b, 0xd6, 0xb4, 0x8c, 0x9a, 0x51, 0x77, 0x62, 0x6d, 0xbb, 0x0d, 0x9f, 0x99, 0x41, 0x5b, 0x6f, - 0x38, 0xe2, 0x37, 0xdd, 0xab, 0x9f, 0x81, 0xab, 0x33, 0x88, 0x03, 0xc2, 0x4c, 0x71, 0x17, 0x56, - 0x6d, 0xbd, 0x56, 0xad, 0x0c, 0x46, 0xfb, 0x9e, 0x3e, 0x19, 0x1f, 0xf5, 0xc9, 0x26, 0x9c, 0xad, - 0x34, 0xac, 0x92, 0xe1, 0x62, 0x0f, 0x62, 0x8d, 0x38, 0x05, 0x6b, 0x72, 0xe6, 0x43, 0x83, 0xee, - 0x2e, 0x02, 0xab, 0x72, 0x62, 0xbd, 0xa1, 0x66, 0x8a, 0x5f, 0x85, 0xe5, 0x48, 0x70, 0xb0, 0xb3, - 0x70, 0x4a, 0xfe, 0xdd, 0xf4, 0xfa, 0x9d, 0x6e, 0xff, 0x50, 0x9d, 0x8b, 0x67, 0x58, 0x93, 0x7e, - 0x9f, 0x66, 0xe0, 0x71, 0x23, 0x67, 0x38, 0xde, 0xe8, 0xb8, 0xdb, 0x6f, 0x8f, 0xbd, 0x8e, 0x9a, - 0x29, 0xbe, 0x08, 0x2b, 0x11, 0x48, 0x62, 0xba, 0xae, 0xaa, 0x0d, 0x7e, 0x3f, 0xd4, 0x8c, 0xb2, - 0xd9, 0xaa, 0xa9, 0xf3, 0xf4, 0xa0, 0xd9, 0x31, 0xb7, 0x77, 0x54, 0x28, 0xfe, 0x40, 0xa1, 0x12, - 0x0a, 0x8e, 0x7b, 0xad, 0xa2, 0x8b, 0x95, 0x48, 0x77, 0x01, 0x03, 0x3a, 0x37, 0x6c, 0x9b, 0x3d, - 0x52, 0x9f, 0x87, 0x0d, 0xfe, 0xc3, 0xd5, 0xeb, 0x65, 0x77, 0x47, 0xb7, 0xca, 0x7b, 0xba, 0x45, - 0xb7, 0xc6, 0x43, 0x35, 0x83, 0xfb, 0x5d, 0x4a, 0x71, 0x9d, 0x46, 0xab, 0xb4, 0xa3, 0x66, 0xe9, - 0xf6, 0x8a, 0xa4, 0x37, 0xcd, 0xba, 0x9a, 0xc3, 0xd3, 0x23, 0x41, 0x8d, 0xd5, 0xd2, 0xfc, 0xf9, - 0xe2, 0x47, 0x0a, 0x9c, 0xb5, 0xbb, 0x87, 0xfd, 0xf6, 0x78, 0x32, 0xf2, 0xf4, 0xde, 0xe1, 0x60, - 0xd4, 0x1d, 0x1f, 0x1d, 0xdb, 0x93, 0xee, 0xd8, 0x23, 0xb7, 0xe0, 0xba, 0x6d, 0x6e, 0xd7, 0x75, - 0x87, 0xee, 0x7e, 0xbd, 0xba, 0xdd, 0xb0, 0x4c, 0x67, 0xa7, 0xe6, 0xda, 0x2d, 0x33, 0xb1, 0x31, - 0xae, 0xc1, 0xe5, 0xe9, 0xa4, 0x55, 0x63, 0x5b, 0x2f, 0x3d, 0x54, 0x95, 0xd9, 0x15, 0x6e, 0xe9, - 0x55, 0xbd, 0x5e, 0x32, 0xca, 0xee, 0xee, 0x1d, 0x35, 0x43, 0xae, 0xc3, 0x95, 0xe9, 0xa4, 0x15, - 0xb3, 0x69, 0x53, 0xb2, 0xec, 0xec, 0xef, 0xee, 0xd8, 0x35, 0x4a, 0x95, 0x2b, 0xfe, 0x89, 0x02, - 0x1b, 0xd3, 0x70, 0x69, 0xc8, 0x0d, 0xd0, 0x8c, 0xba, 0x63, 0xe9, 0x66, 0xd9, 0x2d, 0x59, 0x46, - 0xd9, 0xa8, 0x3b, 0xa6, 0x5e, 0xb5, 0x5d, 0xbb, 0xd1, 0xa2, 0xab, 0x29, 0xb4, 0x25, 0xb8, 0x0a, - 0x97, 0x66, 0xd0, 0x35, 0xcc, 0x72, 0x49, 0x55, 0xc8, 0x1d, 0x78, 0x61, 0x06, 0x91, 0xfd, 0xd0, - 0x76, 0x8c, 0x9a, 0x9c, 0xa3, 0x66, 0x8a, 0x5d, 0x50, 0xe3, 0xfe, 0xf6, 0x09, 0x7b, 0x0d, 0xab, - 0x55, 0xaf, 0xb3, 0x0b, 0x6a, 0x0d, 0x0a, 0x0d, 0x67, 0xc7, 0xb0, 0x78, 0x30, 0x00, 0x44, 0xff, - 0x6f, 0xd5, 0xe9, 0x9a, 0x6f, 0x58, 0xe6, 0x5b, 0x78, 0x53, 0x6d, 0xc0, 0x69, 0xbb, 0xaa, 0x97, - 0x1e, 0xe0, 0x76, 0x34, 0xeb, 0x6e, 0x69, 0x47, 0xaf, 0xd7, 0x8d, 0xaa, 0x0a, 0x38, 0x0e, 0xd3, - 0x1c, 0xf3, 0xc8, 0x67, 0xe1, 0x66, 0xe3, 0x81, 0xa3, 0xbb, 0xcd, 0x6a, 0x6b, 0xdb, 0xac, 0xbb, - 0xf6, 0xc3, 0x7a, 0x49, 0x70, 0x55, 0xa5, 0xe4, 0x61, 0x7e, 0x13, 0xae, 0xcd, 0xa4, 0x0e, 0x61, - 0xfb, 0x6f, 0x80, 0x36, 0x93, 0x92, 0x77, 0xa4, 0xf8, 0x13, 0x05, 0x36, 0x67, 0x3c, 0x1c, 0x93, - 0x17, 0xe0, 0xd6, 0x8e, 0xa1, 0x97, 0xab, 0x86, 0x6d, 0xe3, 0x1e, 0xa7, 0x23, 0xc8, 0xec, 0x3a, - 0x52, 0x8f, 0xea, 0x5b, 0x70, 0x7d, 0x36, 0x79, 0x78, 0xe9, 0xdf, 0x84, 0x6b, 0xb3, 0x49, 0x39, - 0x13, 0x90, 0xa1, 0x47, 0xe5, 0x6c, 0xca, 0x80, 0x79, 0xc8, 0x16, 0x7f, 0x57, 0x81, 0x33, 0xe9, - 0xda, 0x1b, 0xda, 0x36, 0xb3, 0x6e, 0x3b, 0x7a, 0xb5, 0xea, 0x36, 0x75, 0x4b, 0xaf, 0xb9, 0x46, - 0xdd, 0x6a, 0x54, 0xab, 0x69, 0x97, 0xe6, 0x35, 0xb8, 0x3c, 0x9d, 0xd4, 0x2e, 0x59, 0x66, 0x93, - 0xde, 0x0b, 0x1a, 0x5c, 0x9c, 0x4e, 0x65, 0x98, 0x25, 0x43, 0xcd, 0x6c, 0xbd, 0xfe, 0xc1, 0x3f, - 0x5f, 0x9c, 0xfb, 0xe0, 0xa3, 0x8b, 0xca, 0x4f, 0x3f, 0xba, 0xa8, 0xfc, 0xd3, 0x47, 0x17, 0x95, - 0xb7, 0x6e, 0x9f, 0x2c, 0xe2, 0x0d, 0x4a, 0x14, 0xef, 0x2c, 0xa0, 0x21, 0xd3, 0x4b, 0xff, 0x1d, - 0x00, 0x00, 0xff, 0xff, 0x6d, 0xa1, 0x67, 0x53, 0xe0, 0xad, 0x01, 0x00, + 0x2a, 0x06, 0xb2, 0x15, 0xa2, 0xbf, 0x08, 0x25, 0x6a, 0x30, 0xfb, 0xe4, 0x4e, 0x0d, 0x9d, 0x48, + 0xf4, 0x26, 0x12, 0x3a, 0x3b, 0x0b, 0x90, 0xbc, 0xe2, 0xcb, 0x37, 0x17, 0x5b, 0x83, 0x7c, 0x7e, + 0xe8, 0x7f, 0xfb, 0x85, 0x72, 0x6e, 0x09, 0xa0, 0xa8, 0x22, 0xd4, 0x58, 0x6b, 0x70, 0xba, 0xef, + 0xba, 0x67, 0x17, 0xa1, 0xb4, 0xed, 0x92, 0xd6, 0xaf, 0xbe, 0xeb, 0xb6, 0xdb, 0xbc, 0x49, 0x3b, + 0xee, 0xb4, 0x82, 0x2f, 0x4b, 0xb0, 0xe4, 0x6c, 0xbd, 0x0f, 0x73, 0x59, 0x03, 0xce, 0x5e, 0x84, + 0x09, 0x3d, 0x18, 0x0f, 0x31, 0x19, 0x77, 0x3b, 0x9e, 0x0a, 0xc7, 0x43, 0x0c, 0x7e, 0x3d, 0x07, + 0x2f, 0x1c, 0xb6, 0x7d, 0xb0, 0x05, 0x28, 0x76, 0x02, 0xcf, 0x47, 0x31, 0x95, 0xb2, 0x1d, 0xa8, + 0xdf, 0x98, 0xc8, 0x00, 0xe5, 0xa9, 0xc8, 0xdd, 0x21, 0x07, 0x0f, 0x7b, 0x0c, 0x21, 0x9b, 0xee, + 0x4e, 0xc8, 0x3e, 0x05, 0x33, 0x0d, 0xbe, 0xed, 0x76, 0x9b, 0x91, 0x13, 0xd6, 0x77, 0x79, 0x03, + 0x7d, 0xaa, 0xd0, 0x70, 0xcf, 0x2e, 0x51, 0x41, 0x4d, 0xc1, 0x7b, 0x5a, 0x3c, 0xdc, 0xa7, 0xc5, + 0xb7, 0x86, 0x8a, 0xb9, 0x52, 0xde, 0x46, 0x4b, 0x29, 0xeb, 0xfb, 0xf2, 0x30, 0xdf, 0x6f, 0xbd, + 0xb0, 0x77, 0xb3, 0xfa, 0x40, 0x3e, 0x5c, 0xe8, 0x70, 0xfd, 0xe1, 0x42, 0xab, 0x8d, 0x2d, 0x42, + 0xec, 0x11, 0x75, 0x54, 0x74, 0x03, 0x05, 0x13, 0x34, 0x1d, 0x37, 0x0c, 0x1f, 0x8b, 0x2d, 0xa1, + 0xa0, 0x05, 0xb4, 0x25, 0x98, 0x4e, 0xa3, 0x60, 0xec, 0xb3, 0x00, 0xf5, 0xa6, 0x1f, 0x72, 0xb4, + 0x0f, 0x20, 0x59, 0x43, 0x9a, 0x85, 0xc7, 0x50, 0xfd, 0x41, 0x18, 0xa1, 0xcb, 0x7e, 0x83, 0xd3, + 0x00, 0xba, 0x70, 0xaa, 0xcf, 0x06, 0x29, 0x86, 0x27, 0xc9, 0x0e, 0xaf, 0x72, 0x4d, 0x75, 0xe3, + 0x1c, 0xf1, 0xe9, 0x1e, 0xcf, 0xf7, 0x9b, 0x23, 0x7b, 0xc0, 0x7a, 0x77, 0x41, 0xc1, 0x9d, 0x8c, + 0x9b, 0xbb, 0x41, 0xcc, 0x5d, 0x42, 0xee, 0x05, 0x4d, 0x56, 0x86, 0x71, 0x95, 0x4b, 0x52, 0xc8, + 0xf2, 0x92, 0x39, 0x10, 0xe8, 0x36, 0xc7, 0xc9, 0x83, 0x11, 0x4b, 0xd1, 0xef, 0x8d, 0xa4, 0x84, + 0x31, 0x84, 0x6c, 0xee, 0x75, 0xd4, 0xd7, 0xbd, 0xa0, 0xe6, 0xb7, 0x79, 0x36, 0x51, 0xe9, 0xcf, + 0xe4, 0xd4, 0xf0, 0xf7, 0x6e, 0xee, 0x47, 0xb5, 0x8f, 0x01, 0x7a, 0x29, 0x51, 0xc3, 0xf0, 0x6f, + 0x21, 0xb5, 0xa8, 0x55, 0x47, 0x52, 0x0b, 0xfd, 0x64, 0xe7, 0x61, 0x3a, 0x90, 0x76, 0xac, 0x91, + 0x4f, 0xfd, 0x29, 0xf3, 0x76, 0x4c, 0x4a, 0xf0, 0xa6, 0x8f, 0x7d, 0x4a, 0xed, 0xba, 0x15, 0x77, + 0x98, 0x76, 0xd6, 0xb1, 0x4b, 0x30, 0x26, 0xce, 0x3a, 0x8c, 0x74, 0x93, 0x72, 0x8f, 0x40, 0x3c, + 0x94, 0x1c, 0xec, 0xe2, 0x87, 0xf4, 0x37, 0xf1, 0xfa, 0x56, 0x5e, 0x31, 0xd3, 0x4f, 0x5a, 0x76, + 0x0a, 0x46, 0xfd, 0x60, 0x47, 0xfb, 0xb4, 0x11, 0x3f, 0xd8, 0x11, 0xdf, 0x75, 0x01, 0x4a, 0xd2, + 0x5b, 0x47, 0x86, 0x41, 0x08, 0xf7, 0xda, 0xf2, 0x2a, 0x5e, 0xb4, 0xa7, 0x24, 0x1c, 0x13, 0xe6, + 0xef, 0xb5, 0xeb, 0x02, 0x33, 0x0c, 0x7d, 0x47, 0x0f, 0x70, 0x45, 0x9f, 0x3d, 0x15, 0x86, 0x7e, + 0x12, 0xe9, 0xaa, 0xc1, 0x96, 0x60, 0x52, 0xf0, 0x89, 0xc3, 0x6c, 0x91, 0x20, 0x70, 0xa6, 0x57, + 0x10, 0xd8, 0x6b, 0xd7, 0x55, 0x13, 0xed, 0x89, 0x50, 0xfb, 0xc5, 0x6e, 0x43, 0x49, 0x93, 0x98, + 0xd0, 0x1f, 0x33, 0x65, 0x53, 0x9d, 0xb0, 0xd1, 0x24, 0xad, 0x6a, 0x7b, 0xdb, 0xb7, 0xa7, 0xeb, + 0x26, 0x80, 0xba, 0xe6, 0xdf, 0xce, 0xa9, 0xbd, 0x34, 0x83, 0x88, 0x59, 0x30, 0xb9, 0xeb, 0x86, + 0x4e, 0x18, 0xb6, 0xa4, 0x8d, 0x18, 0x05, 0xf6, 0x1d, 0xdf, 0x75, 0xc3, 0x5a, 0xd8, 0x52, 0x89, + 0x43, 0x4e, 0x08, 0x1c, 0xdf, 0xed, 0x46, 0xbb, 0x8e, 0x2e, 0xff, 0xc9, 0x1e, 0x9b, 0xdd, 0x75, + 0xc3, 0xbb, 0xa2, 0x4c, 0xe3, 0xcd, 0x5e, 0x86, 0x29, 0xe4, 0x5b, 0xf7, 0x14, 0x63, 0x0c, 0x65, + 0x61, 0x4f, 0x08, 0xc6, 0x75, 0x4f, 0x72, 0xa6, 0x16, 0xfe, 0xef, 0x79, 0x38, 0x99, 0xdd, 0x3b, + 0x38, 0x3d, 0x45, 0x9f, 0xa2, 0x8f, 0x1e, 0xb5, 0x6d, 0x4c, 0x40, 0x64, 0x18, 0x92, 0xac, 0xc1, + 0xc9, 0x67, 0x0e, 0xce, 0x6b, 0x30, 0x83, 0x8c, 0x48, 0xd2, 0x6c, 0x7a, 0x61, 0x44, 0xd1, 0x35, + 0xec, 0x69, 0x51, 0x20, 0xf7, 0xf3, 0x35, 0x01, 0x66, 0xaf, 0xc0, 0x94, 0xda, 0x91, 0xfd, 0xc7, + 0x6d, 0x51, 0xb1, 0xdc, 0x8e, 0x27, 0x09, 0x7a, 0x17, 0x81, 0xec, 0x04, 0x8c, 0xb8, 0x9d, 0x8e, + 0xa8, 0x52, 0xee, 0xc2, 0xc3, 0x6e, 0xa7, 0x23, 0x93, 0xdb, 0xa0, 0x47, 0xa2, 0xb3, 0x8d, 0x56, + 0x42, 0x64, 0x92, 0x68, 0x4f, 0x20, 0x50, 0x5a, 0x0e, 0x85, 0x62, 0xdd, 0x0b, 0x5a, 0x85, 0x32, + 0x8a, 0x28, 0xe0, 0x76, 0x62, 0x84, 0xd3, 0x50, 0x54, 0xef, 0xd5, 0xd2, 0xb1, 0xc2, 0x1e, 0x75, + 0xe9, 0xad, 0xfa, 0x4d, 0x38, 0xd5, 0xf0, 0x42, 0x9c, 0xbc, 0xf2, 0x93, 0x3a, 0x1d, 0xf2, 0x81, + 0x94, 0x41, 0x72, 0xed, 0x39, 0x2a, 0x16, 0x3d, 0x59, 0xe9, 0x74, 0xa4, 0x27, 0x24, 0xf5, 0xf5, + 0xe7, 0x60, 0x9a, 0x24, 0x2e, 0x3a, 0x22, 0xb1, 0x2d, 0xb4, 0x80, 0xc5, 0x55, 0x88, 0xd2, 0x09, + 0x01, 0x81, 0xaa, 0x0d, 0x45, 0xf9, 0x47, 0x39, 0x38, 0x91, 0x29, 0xb2, 0xb1, 0xaf, 0x83, 0x74, + 0xf9, 0x8a, 0x7c, 0x27, 0xe0, 0x75, 0xaf, 0xe3, 0x61, 0x50, 0x0c, 0xa9, 0xd2, 0x5c, 0x3c, 0x4c, + 0xd8, 0x43, 0xf7, 0xb1, 0x4d, 0xdf, 0x8e, 0x89, 0xa4, 0xae, 0xa5, 0x14, 0xa4, 0xc0, 0x0b, 0x5f, + 0x86, 0x13, 0x99, 0xa8, 0x19, 0x3a, 0x90, 0xd7, 0xcd, 0x64, 0xce, 0xea, 0x91, 0x2a, 0xf5, 0xd1, + 0x9a, 0x6e, 0x84, 0x3e, 0xef, 0xb7, 0xe2, 0xcf, 0x4b, 0x09, 0x77, 0x6c, 0x35, 0xbd, 0xae, 0xb3, + 0xee, 0x27, 0x8a, 0xa8, 0xff, 0xd2, 0xfe, 0x32, 0x9c, 0xa0, 0xc9, 0xb7, 0x13, 0xb8, 0x9d, 0xdd, + 0x84, 0x9d, 0x6c, 0xe8, 0xab, 0x59, 0xec, 0xe4, 0xac, 0xbc, 0x21, 0xf0, 0x63, 0xae, 0xb3, 0x6e, + 0x2f, 0x90, 0xbe, 0xe1, 0x8f, 0xe3, 0xa5, 0x9e, 0xd1, 0x9c, 0x8c, 0x69, 0x9d, 0xcb, 0x9a, 0xd6, + 0x83, 0xaf, 0xa9, 0x75, 0x60, 0xfa, 0x66, 0x25, 0xb5, 0x9e, 0x64, 0x50, 0xa5, 0xe4, 0x74, 0x6a, + 0x88, 0xb6, 0x35, 0xd4, 0x64, 0x32, 0xcd, 0x99, 0x7a, 0x1a, 0xc4, 0x9e, 0x87, 0xb1, 0x38, 0x5f, + 0x35, 0x1d, 0x1c, 0xff, 0x1f, 0x7b, 0xdf, 0xf6, 0xe3, 0xc8, 0x71, 0xdd, 0x3d, 0x4d, 0x72, 0x66, + 0x38, 0x87, 0x73, 0xe9, 0xa9, 0x5d, 0xed, 0x8e, 0x76, 0xf6, 0xda, 0x7b, 0xf1, 0x2e, 0xd7, 0x92, + 0xbd, 0xab, 0x4f, 0x96, 0x56, 0xfe, 0x64, 0xb9, 0x87, 0x6c, 0xce, 0xf4, 0x2e, 0x6f, 0xea, 0x6e, + 0xce, 0x78, 0x25, 0xdb, 0x1d, 0x6a, 0xd8, 0x33, 0xc3, 0x98, 0x43, 0xd2, 0x6c, 0x52, 0xeb, 0x15, + 0x02, 0x24, 0x4e, 0x00, 0x1b, 0xc8, 0xcd, 0x89, 0x13, 0x20, 0x46, 0x10, 0x20, 0x0f, 0x11, 0x82, + 0x3c, 0xe4, 0x0f, 0x08, 0x92, 0xbc, 0xf8, 0x4d, 0x80, 0x61, 0xc0, 0x40, 0xf2, 0x94, 0x00, 0x42, + 0x22, 0x20, 0x79, 0x48, 0xf2, 0x16, 0xc4, 0x0f, 0x7e, 0x0a, 0xea, 0x54, 0x55, 0x77, 0xf5, 0x85, + 0xdc, 0x59, 0xad, 0x94, 0xc4, 0x80, 0x9f, 0x66, 0x58, 0x75, 0xaa, 0xba, 0xee, 0x75, 0xce, 0xa9, + 0x73, 0x7e, 0x27, 0xcf, 0x12, 0xcc, 0x0e, 0xef, 0xe1, 0xb7, 0x15, 0xb8, 0xfc, 0xa4, 0x11, 0x22, + 0x7b, 0x70, 0x06, 0x8d, 0x36, 0xfc, 0x41, 0x30, 0xc8, 0xee, 0x7e, 0x7b, 0xff, 0xc8, 0xe3, 0x6b, + 0x52, 0x4b, 0x1d, 0xea, 0xe1, 0xd0, 0xb6, 0x1b, 0xd2, 0x28, 0x0f, 0x87, 0xb6, 0x3f, 0x10, 0xbf, + 0x4b, 0xb4, 0x38, 0x6f, 0x43, 0x07, 0x36, 0x67, 0x94, 0x94, 0x8e, 0x05, 0x45, 0x3e, 0x16, 0x6e, + 0x82, 0x7a, 0xe0, 0x75, 0x28, 0xc7, 0xeb, 0x75, 0xb0, 0x69, 0xef, 0xde, 0x65, 0xf1, 0xd7, 0xad, + 0xd5, 0x20, 0xdd, 0xf6, 0x07, 0xbb, 0x77, 0xf9, 0x57, 0x8e, 0xc5, 0x85, 0x26, 0x0b, 0x0d, 0xe4, + 0x45, 0x38, 0x15, 0x83, 0x13, 0x09, 0xfd, 0xd3, 0xad, 0x75, 0x9a, 0x15, 0x05, 0x9f, 0xba, 0x02, + 0xcb, 0x62, 0xce, 0x47, 0x81, 0x97, 0x9b, 0x55, 0xe0, 0x69, 0x74, 0x4f, 0xf1, 0xcf, 0x4d, 0x44, + 0xa7, 0x52, 0xe5, 0x8d, 0x13, 0x70, 0xca, 0xe4, 0x05, 0x20, 0x01, 0x57, 0x1e, 0x1c, 0x03, 0xfc, + 0x83, 0xeb, 0x22, 0x27, 0xd8, 0xbf, 0xfc, 0xb3, 0x7f, 0x9b, 0x81, 0x53, 0x29, 0x82, 0x0a, 0x65, + 0xf1, 0xbb, 0xfd, 0xb1, 0x77, 0xc8, 0x04, 0x04, 0xb9, 0x93, 0x6b, 0x52, 0x3a, 0xd7, 0x3e, 0x2d, + 0xb0, 0xf8, 0xe2, 0xfc, 0x5b, 0xfc, 0x17, 0x3d, 0x1a, 0xda, 0x23, 0xa1, 0x58, 0xa1, 0xff, 0x12, + 0x13, 0xd6, 0x31, 0x68, 0x82, 0xdf, 0x1d, 0x60, 0xec, 0x05, 0x64, 0x31, 0x72, 0x11, 0x51, 0x06, + 0x5b, 0xd1, 0x94, 0x88, 0x28, 0x8f, 0x61, 0xa9, 0xc3, 0x58, 0x0a, 0xf9, 0x22, 0x9c, 0x93, 0x6e, + 0x12, 0x37, 0xb6, 0xaf, 0xd0, 0x8e, 0xdd, 0x3a, 0xdb, 0x0e, 0xee, 0x94, 0x72, 0x64, 0x87, 0x6d, + 0xc1, 0x45, 0x9c, 0xc4, 0x6e, 0x67, 0xe8, 0x26, 0xa2, 0x6c, 0x60, 0x57, 0x19, 0x2c, 0xfd, 0x39, + 0x4a, 0x65, 0x76, 0x86, 0xb1, 0x80, 0x1b, 0xb4, 0xd7, 0x7c, 0xf8, 0xde, 0x86, 0xe7, 0x52, 0x5b, + 0x4c, 0xaf, 0x0f, 0x34, 0x93, 0x0a, 0x39, 0x9f, 0x45, 0xfa, 0x9b, 0xb2, 0x3e, 0x57, 0x60, 0xf9, + 0x1d, 0xaf, 0x3d, 0xf2, 0x46, 0xfc, 0x5e, 0xe6, 0x4b, 0x82, 0xa5, 0xc9, 0xd7, 0xf2, 0xdf, 0x29, + 0x62, 0x6e, 0x22, 0x02, 0x21, 0x1d, 0x70, 0xdf, 0xeb, 0x8b, 0x77, 0x8f, 0x25, 0x8b, 0xff, 0x7a, + 0xca, 0x05, 0x40, 0x5e, 0x81, 0x65, 0x5a, 0xed, 0xe1, 0xa4, 0xcf, 0x26, 0x22, 0x1b, 0x01, 0x97, + 0xa9, 0xb1, 0x2c, 0xda, 0x99, 0x9d, 0x39, 0xab, 0x70, 0x1c, 0xfe, 0xa4, 0x1c, 0xa2, 0x7f, 0x3c, + 0x1e, 0xca, 0xd3, 0x27, 0x94, 0x63, 0x76, 0xcd, 0x69, 0xf2, 0x22, 0x79, 0x4a, 0x13, 0x72, 0x88, + 0x5b, 0x0b, 0x4c, 0x3d, 0xa6, 0xdd, 0x86, 0x82, 0x54, 0x37, 0xed, 0x0c, 0xf3, 0x16, 0x11, 0x9d, + 0x61, 0xbf, 0xf8, 0x10, 0xbc, 0x03, 0x79, 0x51, 0x25, 0x65, 0x85, 0x8f, 0x06, 0xbe, 0x58, 0xfa, + 0xf8, 0x3f, 0x4d, 0xa3, 0x7c, 0x2d, 0x76, 0x72, 0xde, 0xc2, 0xff, 0xf1, 0xfc, 0x1c, 0xb7, 0x29, + 0x0f, 0xdc, 0xf3, 0xdd, 0x21, 0x5a, 0x1d, 0x05, 0x0c, 0x23, 0x4d, 0x77, 0x7a, 0x3e, 0xb3, 0x45, + 0xe2, 0xdf, 0xf8, 0xab, 0xe0, 0xe2, 0x89, 0x49, 0xd0, 0xd3, 0x4e, 0x92, 0xc8, 0x31, 0x99, 0x89, + 0x1e, 0x93, 0xe4, 0x32, 0x2c, 0x33, 0xd0, 0x10, 0x5e, 0x92, 0x7d, 0x19, 0x30, 0x4d, 0xc7, 0xe2, + 0xe1, 0x7e, 0xc9, 0x45, 0xf6, 0x8b, 0x24, 0x87, 0x86, 0xb3, 0xc7, 0x38, 0x1b, 0x21, 0x87, 0xc6, + 0x77, 0xef, 0x9f, 0x67, 0x84, 0x58, 0xbc, 0x35, 0x18, 0x8c, 0xfd, 0xf1, 0xa8, 0x3d, 0x8c, 0xa8, + 0xff, 0xc8, 0x31, 0x3c, 0x8f, 0x5c, 0xe3, 0x5d, 0x0c, 0xdb, 0x30, 0x18, 0x09, 0x9c, 0x8a, 0x7d, + 0x61, 0xfb, 0x5d, 0xb8, 0xfb, 0xb9, 0x28, 0x5f, 0xab, 0x53, 0x6a, 0x5d, 0x26, 0xa6, 0x52, 0x9c, + 0x54, 0xeb, 0xce, 0x9c, 0x75, 0x96, 0xd5, 0x99, 0xa0, 0x22, 0x3b, 0x29, 0x4b, 0x3b, 0xae, 0xff, + 0xdb, 0x0a, 0xd7, 0x79, 0xb4, 0x56, 0x79, 0x07, 0x90, 0x2f, 0xc1, 0x52, 0xb7, 0x23, 0x47, 0x27, + 0x8c, 0x6b, 0x9e, 0xcc, 0x0e, 0x43, 0x48, 0x0e, 0xeb, 0xa0, 0x6b, 0xae, 0xcb, 0x53, 0xb7, 0x56, + 0x22, 0x8a, 0x52, 0x6d, 0x4b, 0x48, 0x60, 0xc9, 0x62, 0x64, 0x15, 0x32, 0xc1, 0x0c, 0x67, 0xba, + 0x1d, 0xb6, 0xbd, 0x42, 0x8c, 0x66, 0x8b, 0xff, 0xd2, 0x7e, 0x05, 0x6e, 0x9e, 0x74, 0x8c, 0xe8, + 0x56, 0x9c, 0x32, 0xe0, 0x4b, 0xd6, 0x7a, 0x3b, 0x31, 0x6e, 0x57, 0x40, 0x86, 0x98, 0xed, 0x8a, + 0x23, 0x41, 0xa4, 0xb5, 0x46, 0x5d, 0xed, 0xd7, 0xb3, 0xb0, 0x1a, 0x55, 0x0d, 0x93, 0xdb, 0x90, + 0x0b, 0xaa, 0x5d, 0x0d, 0x9e, 0x30, 0x65, 0x22, 0x5a, 0xb9, 0x85, 0x44, 0x94, 0x2b, 0x46, 0x8b, + 0x07, 0xf7, 0x58, 0x7e, 0x65, 0xb4, 0x96, 0x31, 0x51, 0xbc, 0x2e, 0xde, 0x87, 0x55, 0x34, 0x56, + 0x43, 0x76, 0x6b, 0xdc, 0xe5, 0x0f, 0x0e, 0xb3, 0xdf, 0x8c, 0xf2, 0x1f, 0x7c, 0x78, 0x69, 0x0e, + 0x9f, 0x87, 0x96, 0x69, 0x59, 0xca, 0xf1, 0xd0, 0x4c, 0x49, 0xf3, 0x97, 0x9b, 0xae, 0xf9, 0xe3, + 0x5d, 0x99, 0xa2, 0xf9, 0x9b, 0x9f, 0xa1, 0xf9, 0x0b, 0x4b, 0xca, 0x9a, 0x3f, 0xd4, 0xff, 0x2e, + 0x4e, 0xd3, 0xff, 0x86, 0x65, 0x98, 0xfe, 0xf7, 0x1a, 0xef, 0xee, 0xa8, 0xfd, 0xc8, 0xc5, 0x71, + 0xe0, 0xe7, 0x3e, 0x76, 0xc4, 0x6a, 0x3f, 0x42, 0xdb, 0x90, 0xad, 0x25, 0x10, 0x06, 0x25, 0xda, + 0x1f, 0x28, 0x31, 0x45, 0x96, 0x98, 0x8a, 0xeb, 0xb0, 0xda, 0x3d, 0xa6, 0xa7, 0x8f, 0xd7, 0x91, + 0x44, 0xa5, 0x15, 0x6b, 0x45, 0xa4, 0x32, 0x71, 0xe9, 0x33, 0xb0, 0x16, 0x90, 0x71, 0x89, 0x01, + 0x1d, 0xcd, 0xac, 0xa0, 0x34, 0x47, 0x4d, 0xb9, 0x0d, 0xeb, 0x01, 0x21, 0x57, 0x46, 0x30, 0x69, + 0x69, 0xc5, 0x52, 0x45, 0x46, 0x93, 0xa7, 0x6b, 0x87, 0x71, 0xc6, 0xf9, 0x53, 0x6a, 0x95, 0xf6, + 0xc3, 0x6c, 0x44, 0xc8, 0x17, 0x9f, 0xd9, 0x82, 0x02, 0xe5, 0xa7, 0xf8, 0x20, 0xf1, 0x63, 0xe5, + 0xca, 0x94, 0xe1, 0xe7, 0x26, 0x39, 0xb6, 0xdd, 0xb0, 0xc0, 0xf7, 0x07, 0xc2, 0x42, 0xc7, 0x65, + 0x2c, 0x23, 0x13, 0xdc, 0x70, 0xf9, 0x89, 0xea, 0xd8, 0x19, 0x52, 0x9c, 0x5d, 0x9d, 0x90, 0xb2, + 0xe8, 0xea, 0x43, 0xd6, 0x31, 0xf8, 0x25, 0x3e, 0xd0, 0x02, 0xd4, 0x89, 0xf9, 0xd1, 0xca, 0xb3, + 0x29, 0xac, 0x7f, 0xa2, 0x72, 0x1c, 0x25, 0xac, 0x59, 0x9d, 0x88, 0x7f, 0x45, 0xb5, 0x06, 0x2c, + 0xa3, 0x88, 0x2d, 0x2a, 0xcc, 0xa5, 0x68, 0x90, 0x93, 0x9d, 0x2f, 0x99, 0x35, 0xab, 0x40, 0xcb, + 0x89, 0x6a, 0x8e, 0xe0, 0x79, 0x59, 0x30, 0x8e, 0x36, 0x72, 0x5e, 0x80, 0xc0, 0xce, 0x1c, 0x81, + 0x50, 0x7e, 0xc6, 0xa6, 0x9e, 0x69, 0x47, 0x13, 0x38, 0x99, 0x76, 0x04, 0xe7, 0xa6, 0x4f, 0xc9, + 0x8c, 0x00, 0x43, 0xe1, 0x5d, 0x98, 0x91, 0xef, 0x42, 0x59, 0x4c, 0xce, 0x46, 0xc4, 0x64, 0xed, + 0xcf, 0xb2, 0x70, 0xf5, 0x04, 0xd3, 0x35, 0xe3, 0x9b, 0x5f, 0x86, 0x02, 0x7b, 0xf7, 0x62, 0xc7, + 0x67, 0x26, 0x22, 0xd8, 0xd0, 0x4a, 0xf9, 0x59, 0x47, 0x85, 0xac, 0xf0, 0xbc, 0x03, 0x3f, 0xf8, + 0x9f, 0xfc, 0x12, 0xac, 0xb1, 0x03, 0x8d, 0x59, 0xd5, 0x1d, 0x4c, 0x7a, 0x27, 0x38, 0xd1, 0x36, + 0x85, 0x0b, 0x50, 0xac, 0x28, 0x1e, 0x72, 0x78, 0x62, 0xd8, 0x41, 0x1a, 0x71, 0xa0, 0x80, 0x64, + 0x07, 0xed, 0x6e, 0xef, 0x44, 0xbe, 0x28, 0xc2, 0xc1, 0x48, 0x2e, 0xc6, 0x8c, 0x81, 0x69, 0x42, + 0x05, 0x7f, 0x93, 0x1b, 0xb0, 0xd6, 0x9f, 0x1c, 0x53, 0x1e, 0x82, 0xad, 0x05, 0x6e, 0xbc, 0x30, + 0x6f, 0xad, 0xf4, 0x27, 0xc7, 0xfa, 0x70, 0x88, 0x53, 0x8a, 0x56, 0x0e, 0xeb, 0x94, 0x8e, 0xed, + 0x5a, 0x41, 0xb9, 0x80, 0x94, 0xb4, 0x02, 0xb6, 0x6f, 0x39, 0xed, 0x69, 0x60, 0x36, 0x6f, 0x3c, + 0xc0, 0x12, 0xfb, 0xa1, 0xfd, 0x34, 0x23, 0x04, 0xba, 0xe9, 0xeb, 0xfe, 0x17, 0x53, 0x94, 0x32, + 0x45, 0x37, 0x41, 0xa5, 0x43, 0x1f, 0x1e, 0x2a, 0xc1, 0x1c, 0xad, 0xf6, 0x27, 0xc7, 0xc1, 0xd8, + 0xc9, 0x03, 0xbf, 0x20, 0x0f, 0xfc, 0x2b, 0x42, 0xe0, 0x4b, 0x3d, 0x1e, 0xa6, 0x0f, 0xb9, 0xf6, + 0x1f, 0x59, 0xb8, 0x71, 0xb2, 0x43, 0xe0, 0x17, 0xf3, 0x96, 0x32, 0x6f, 0x31, 0xcd, 0xdf, 0x7c, + 0x42, 0xf3, 0x97, 0xb2, 0xf7, 0x16, 0xd2, 0xf6, 0x5e, 0x42, 0xcf, 0xb8, 0x98, 0xa2, 0x67, 0x4c, + 0xdd, 0xa0, 0xf9, 0x27, 0x6c, 0xd0, 0x25, 0x79, 0x9d, 0xfc, 0x6b, 0x20, 0xa1, 0x47, 0x59, 0xfb, + 0xb7, 0xe1, 0x94, 0x60, 0xed, 0xd9, 0xcd, 0x11, 0xaa, 0x8f, 0x0b, 0x77, 0x6f, 0xa5, 0x31, 0xf5, + 0x48, 0x96, 0xc2, 0x78, 0xaf, 0x73, 0x76, 0x3e, 0xcc, 0xff, 0xbf, 0xc3, 0xc8, 0x93, 0x87, 0x70, + 0x06, 0xe1, 0xc9, 0xf7, 0x65, 0xc5, 0xb7, 0x3b, 0xf2, 0x0e, 0xf8, 0x7a, 0xb8, 0x92, 0x60, 0x7b, + 0xbb, 0xfb, 0x52, 0x73, 0x2c, 0xef, 0x60, 0x67, 0xce, 0x3a, 0xed, 0xa7, 0xa4, 0xc7, 0x65, 0x84, + 0xbf, 0x54, 0x40, 0x7b, 0xf2, 0x78, 0xa1, 0x26, 0x26, 0x3e, 0xe0, 0x4b, 0x56, 0xa1, 0x2d, 0x8d, + 0xde, 0x55, 0x58, 0x19, 0x79, 0x07, 0x23, 0xcf, 0x3f, 0x8a, 0x88, 0xf8, 0xcb, 0x3c, 0x51, 0x0c, + 0x8c, 0x00, 0x49, 0x7c, 0x2a, 0x26, 0x5b, 0x14, 0xd2, 0x2a, 0x81, 0xe8, 0x97, 0x3a, 0x0f, 0x74, + 0x35, 0xc9, 0x0d, 0x64, 0x3f, 0xee, 0xe7, 0xf2, 0x19, 0x35, 0x6b, 0x71, 0x28, 0xc7, 0x83, 0x6e, + 0xcf, 0xd3, 0xfe, 0x5a, 0x11, 0x1c, 0x41, 0xda, 0xe0, 0x91, 0xb7, 0x25, 0x5b, 0xd4, 0x6c, 0x82, + 0x0d, 0x49, 0x2b, 0x22, 0x9b, 0xed, 0x71, 0x74, 0x41, 0x4c, 0x88, 0xa0, 0x0b, 0x62, 0xca, 0x33, + 0x18, 0xd4, 0x71, 0x01, 0xf8, 0x9e, 0x30, 0x68, 0xa1, 0x67, 0xde, 0xee, 0x1d, 0x72, 0x0b, 0x16, + 0x99, 0x0d, 0x8b, 0x68, 0xee, 0x5a, 0xa4, 0xb9, 0xbb, 0x77, 0x2c, 0x91, 0xaf, 0xfd, 0x20, 0xd0, + 0xd5, 0x26, 0x3a, 0xb1, 0x7b, 0x87, 0xbc, 0x72, 0x32, 0xdb, 0xd2, 0xbc, 0xb0, 0x2d, 0x0d, 0xec, + 0x4a, 0x5f, 0x8d, 0xd8, 0x95, 0x5e, 0x9b, 0x3d, 0x5a, 0xfc, 0x31, 0x8d, 0xa1, 0xe9, 0x85, 0x28, + 0x4b, 0x3f, 0x55, 0xe0, 0xc2, 0xcc, 0x12, 0xe4, 0x3c, 0xe4, 0xf5, 0xa6, 0xe9, 0x84, 0xf3, 0x4b, + 0xf7, 0x8c, 0x48, 0x21, 0xdb, 0xb0, 0xb4, 0xd5, 0xf6, 0xbb, 0xfb, 0x74, 0x19, 0xa7, 0x6a, 0xb7, + 0x13, 0xd5, 0x06, 0xe4, 0x3b, 0x73, 0x56, 0x58, 0x96, 0xb8, 0xb0, 0x8e, 0x7b, 0x21, 0x12, 0xb9, + 0x28, 0x9b, 0xa2, 0x36, 0x48, 0x54, 0x98, 0x28, 0x46, 0xcf, 0x99, 0x44, 0x62, 0x7c, 0x0b, 0xbe, + 0x2b, 0x78, 0x91, 0xe9, 0x0d, 0x7c, 0x0a, 0x58, 0xd0, 0x9b, 0x90, 0x6f, 0x8a, 0x67, 0x6e, 0xc9, + 0x18, 0x5b, 0x3c, 0x69, 0x5b, 0x41, 0xae, 0xf6, 0xdb, 0x8a, 0x90, 0xed, 0x9f, 0xdc, 0x11, 0x29, + 0xe8, 0x53, 0x67, 0x76, 0xd0, 0xa7, 0xce, 0xc7, 0x0c, 0xfa, 0xa4, 0xfd, 0x05, 0x07, 0xed, 0x36, + 0x3b, 0xcd, 0x98, 0xea, 0xf1, 0x59, 0x8d, 0xea, 0x8d, 0xc8, 0xea, 0xbc, 0x2a, 0x05, 0x0d, 0x4c, + 0x7e, 0x6b, 0xba, 0x6d, 0xbd, 0xb4, 0x54, 0xff, 0x28, 0x0b, 0xe7, 0x67, 0x15, 0x4f, 0x0d, 0x4b, + 0xac, 0x3c, 0x5d, 0x58, 0xe2, 0x5b, 0x90, 0x67, 0x69, 0x81, 0xc5, 0x38, 0x0e, 0x38, 0x2f, 0x4a, + 0x07, 0x5c, 0x64, 0x93, 0xab, 0xb0, 0xa0, 0x97, 0xec, 0x30, 0x52, 0x16, 0x9a, 0x76, 0xb6, 0xf7, + 0x7d, 0x34, 0x1a, 0xe4, 0x59, 0xe4, 0xeb, 0xc9, 0xe0, 0x70, 0x3c, 0x44, 0xd6, 0xa6, 0x34, 0x20, + 0x09, 0x3c, 0x7d, 0x6c, 0x6f, 0x88, 0xff, 0xce, 0x21, 0x95, 0xad, 0x64, 0xa0, 0x39, 0x0d, 0x16, + 0x9a, 0x23, 0xcf, 0xf7, 0xc6, 0xb2, 0xd9, 0xe5, 0x10, 0x53, 0x2c, 0x9e, 0xc3, 0x8d, 0x22, 0xdb, + 0x8f, 0x99, 0x0f, 0xfc, 0x82, 0x8c, 0x4b, 0x82, 0x56, 0x94, 0x34, 0xd9, 0x92, 0x48, 0x68, 0x81, + 0x6a, 0x7b, 0xd2, 0xdf, 0x3f, 0x6a, 0x59, 0x55, 0xce, 0x6a, 0xb0, 0x02, 0x3d, 0x4c, 0xa5, 0x1d, + 0xf4, 0x2d, 0x89, 0x44, 0xfb, 0xae, 0x02, 0xa7, 0xd3, 0xfa, 0x41, 0xce, 0x43, 0xae, 0x9f, 0x1a, + 0x07, 0xaf, 0xcf, 0x5c, 0x77, 0x0b, 0xf4, 0xaf, 0x7b, 0x30, 0x18, 0x1d, 0xb7, 0xc7, 0xb2, 0x71, + 0xaa, 0x94, 0x6c, 0x01, 0xfd, 0x51, 0xc1, 0xff, 0xc9, 0x25, 0x71, 0x46, 0x67, 0x13, 0x91, 0xf3, + 0xf0, 0x8f, 0xa6, 0x03, 0x98, 0x9d, 0x66, 0x63, 0xc8, 0xf0, 0xdc, 0x5f, 0x82, 0x1c, 0x6d, 0x56, + 0x6c, 0xf5, 0xd2, 0xf5, 0xa3, 0xd7, 0xaa, 0x9c, 0x88, 0xb5, 0xca, 0x6f, 0x1f, 0xf7, 0x2c, 0x24, + 0xd6, 0xf6, 0x60, 0x35, 0x4a, 0x41, 0x8c, 0x28, 0x02, 0x68, 0xe1, 0xae, 0xca, 0x6b, 0xda, 0x1a, + 0x0c, 0x98, 0x83, 0xc4, 0xd6, 0xf3, 0xff, 0xf0, 0xe1, 0x25, 0xa0, 0x3f, 0x59, 0x99, 0x34, 0x84, + 0x50, 0xed, 0x7b, 0x19, 0x38, 0x1d, 0xfa, 0x64, 0x8b, 0x3d, 0xf4, 0x73, 0xeb, 0x20, 0xa8, 0x47, + 0x1c, 0xd8, 0x04, 0xa3, 0x95, 0xec, 0xe0, 0x0c, 0xbf, 0x99, 0x6d, 0xd8, 0x98, 0x46, 0x4f, 0x6e, + 0xc3, 0x12, 0xc2, 0xf8, 0x0c, 0xdb, 0xfb, 0x9e, 0x7c, 0xf6, 0xf5, 0x45, 0xa2, 0x15, 0xe6, 0x6b, + 0x3f, 0x56, 0xe0, 0x1c, 0x37, 0xeb, 0xaf, 0xb5, 0xbb, 0x7d, 0xd4, 0x90, 0xef, 0x7b, 0x9f, 0x8c, + 0x83, 0xeb, 0x76, 0xe4, 0x1c, 0xbb, 0x1e, 0xf5, 0xde, 0x48, 0x7c, 0x6d, 0x7a, 0x6f, 0xc9, 0x2d, + 0x84, 0xa6, 0xe2, 0xaf, 0xa6, 0x39, 0x06, 0x28, 0xd0, 0xa7, 0x09, 0x32, 0xa0, 0x00, 0x52, 0x68, + 0xbf, 0x0a, 0x17, 0x67, 0x7f, 0x80, 0x7c, 0x0d, 0x56, 0x30, 0xd6, 0x51, 0x6b, 0x78, 0x38, 0x6a, + 0x77, 0x3c, 0xa1, 0x0a, 0x13, 0x9a, 0x48, 0x39, 0x8f, 0x21, 0x6d, 0x71, 0x07, 0xf7, 0x43, 0x8c, + 0xa2, 0xc4, 0x0b, 0x45, 0x7c, 0x67, 0xe4, 0xda, 0xb4, 0x5f, 0x53, 0x80, 0x24, 0xeb, 0x20, 0x5f, + 0x80, 0xe5, 0x96, 0x53, 0xb2, 0xc7, 0xed, 0xd1, 0x78, 0x67, 0x30, 0x19, 0x71, 0x98, 0x2b, 0xe6, + 0xef, 0x3c, 0xde, 0x77, 0xd9, 0x5b, 0xc8, 0xd1, 0x60, 0x32, 0xb2, 0x22, 0x74, 0x18, 0xa4, 0xc7, + 0xf3, 0xbe, 0xd1, 0x69, 0x3f, 0x8e, 0x06, 0xe9, 0xe1, 0x69, 0x91, 0x20, 0x3d, 0x3c, 0x4d, 0x7b, + 0x5f, 0x81, 0x4d, 0x61, 0x0c, 0xd7, 0x49, 0x69, 0x4b, 0x09, 0x51, 0x3d, 0x46, 0x02, 0x57, 0x75, + 0x16, 0x4b, 0xbb, 0x2e, 0x80, 0x6f, 0xb0, 0x81, 0xc8, 0xdb, 0xb2, 0xb2, 0xe4, 0xcb, 0x90, 0xb3, + 0xc7, 0x83, 0xe1, 0x09, 0x90, 0x6f, 0xd4, 0x60, 0x46, 0xc7, 0x83, 0x21, 0x56, 0x81, 0x25, 0x35, + 0x0f, 0x4e, 0xcb, 0x8d, 0x13, 0x2d, 0x26, 0x35, 0x58, 0xe4, 0x10, 0x67, 0xb1, 0x97, 0xe8, 0x19, + 0x7d, 0xda, 0x5a, 0x13, 0xf0, 0x3a, 0x1c, 0xd7, 0xd3, 0x12, 0x75, 0x68, 0xbf, 0xab, 0x40, 0x81, + 0x72, 0x1b, 0x28, 0xc5, 0x3d, 0xeb, 0x92, 0x8e, 0x32, 0x8e, 0xc2, 0x6c, 0x22, 0xa8, 0xfe, 0x44, + 0xb7, 0xf1, 0xcb, 0xb0, 0x16, 0x2b, 0x40, 0x34, 0x04, 0x56, 0xe8, 0x75, 0xf7, 0xdb, 0x2c, 0xe6, + 0x07, 0x33, 0x39, 0x88, 0xa4, 0x69, 0xbf, 0xa9, 0xc0, 0x69, 0x2a, 0xf3, 0x9b, 0xa8, 0xee, 0xb5, + 0x26, 0x3d, 0xb1, 0xdf, 0x29, 0x07, 0x25, 0xac, 0x2a, 0x99, 0xd3, 0x37, 0xe3, 0xa0, 0x78, 0x9a, + 0x15, 0xe4, 0x92, 0x1d, 0xc8, 0xf3, 0xfb, 0xc5, 0xe7, 0x70, 0x9c, 0x17, 0x25, 0x65, 0x42, 0x58, + 0x31, 0x27, 0xa2, 0x3d, 0xc1, 0x23, 0x8c, 0x97, 0xb1, 0x82, 0xd2, 0xda, 0x7f, 0x2a, 0x70, 0x76, + 0x4a, 0x19, 0xf2, 0x3a, 0xcc, 0xa3, 0x43, 0x1a, 0x9f, 0xbd, 0xf3, 0x53, 0x3e, 0x31, 0xde, 0x3f, + 0xda, 0xbd, 0xc3, 0x2e, 0xa2, 0x63, 0xfa, 0xc3, 0x62, 0xa5, 0xc8, 0xdb, 0xb0, 0xa4, 0x77, 0x3a, + 0x5c, 0x9c, 0xc9, 0x44, 0xc4, 0x99, 0x29, 0x5f, 0x7c, 0x31, 0xa0, 0x67, 0xe2, 0x0c, 0x73, 0x8d, + 0xe8, 0x74, 0x5c, 0xee, 0x6c, 0x17, 0xd6, 0x77, 0xee, 0xff, 0xc3, 0x6a, 0x94, 0xf8, 0xa9, 0xfc, + 0x83, 0x7e, 0xa0, 0x80, 0x1a, 0x6d, 0xc3, 0xa7, 0x03, 0x0c, 0x94, 0x36, 0xcd, 0x4f, 0x58, 0x54, + 0xbf, 0x9f, 0x81, 0xe7, 0x52, 0x47, 0x98, 0xbc, 0x00, 0x0b, 0xfa, 0x70, 0x68, 0x96, 0xf9, 0xaa, + 0xe2, 0x1c, 0x12, 0x6a, 0x89, 0x23, 0xd2, 0x1e, 0x23, 0x22, 0x2f, 0x41, 0x1e, 0x57, 0x26, 0x2d, + 0x90, 0x09, 0x81, 0x31, 0x99, 0x12, 0x25, 0x06, 0x8c, 0x29, 0x08, 0x49, 0x05, 0x56, 0x39, 0x46, + 0x88, 0xe5, 0x1d, 0x7a, 0xdf, 0x0a, 0x10, 0xda, 0x11, 0x44, 0x5e, 0xa8, 0x9e, 0xdd, 0x11, 0xcb, + 0x93, 0x51, 0x32, 0xa2, 0xa5, 0x48, 0x15, 0x54, 0xac, 0x53, 0xae, 0x89, 0xa1, 0x73, 0x22, 0x6a, + 0x0b, 0x6b, 0xc4, 0x94, 0xba, 0x12, 0x25, 0x83, 0xe9, 0xd2, 0x7d, 0xbf, 0x7b, 0xd8, 0x3f, 0xf6, + 0xfa, 0xe3, 0x4f, 0x6f, 0xba, 0xc2, 0x6f, 0x9c, 0x68, 0xba, 0xfe, 0x30, 0xc7, 0x36, 0x73, 0xbc, + 0x18, 0xe5, 0x68, 0x24, 0x40, 0x66, 0xe4, 0x68, 0x30, 0x84, 0x3d, 0x43, 0xc1, 0x28, 0xc3, 0x22, + 0x43, 0x27, 0x11, 0x3b, 0xe3, 0x42, 0x6a, 0x13, 0x18, 0xcd, 0xee, 0x1d, 0xc6, 0xbe, 0x30, 0xcf, + 0x38, 0xdf, 0x12, 0x45, 0xc9, 0x2e, 0x14, 0x4a, 0x3d, 0xaf, 0xdd, 0x9f, 0x0c, 0x9d, 0x93, 0xbd, + 0x1e, 0x6e, 0xf0, 0xbe, 0x2c, 0xef, 0xb3, 0x62, 0xf8, 0xea, 0x88, 0x27, 0xb9, 0x5c, 0x11, 0x71, + 0x02, 0x67, 0x99, 0x1c, 0x6a, 0x2a, 0x3f, 0x3f, 0x63, 0x7c, 0xe2, 0x89, 0x58, 0x2e, 0xea, 0x09, + 0xc6, 0xbd, 0x69, 0x5c, 0x58, 0xad, 0xb6, 0xfd, 0xb1, 0x33, 0x6a, 0xf7, 0x7d, 0x44, 0x35, 0x3c, + 0x01, 0xea, 0xd3, 0xa6, 0x88, 0x98, 0x8b, 0x3a, 0xc6, 0x71, 0x50, 0x94, 0x69, 0x30, 0xa3, 0xd5, + 0x51, 0x7e, 0xa9, 0xd2, 0xed, 0xb7, 0x7b, 0xdd, 0xf7, 0x84, 0x4f, 0x21, 0xe3, 0x97, 0x0e, 0x44, + 0xa2, 0x15, 0xe6, 0x6b, 0x5f, 0x4d, 0xcc, 0x1b, 0x6b, 0x65, 0x01, 0x16, 0xb9, 0xc7, 0x39, 0xf3, + 0xc0, 0x6e, 0x1a, 0xf5, 0xb2, 0x59, 0xdf, 0x56, 0x15, 0xb2, 0x0a, 0xd0, 0xb4, 0x1a, 0x25, 0xc3, + 0xb6, 0xe9, 0xef, 0x0c, 0xfd, 0xcd, 0xdd, 0xb3, 0x2b, 0xad, 0xaa, 0x9a, 0x95, 0x3c, 0xb4, 0x73, + 0xda, 0x8f, 0x14, 0x38, 0x93, 0x3e, 0x95, 0xc4, 0x01, 0xf4, 0xd1, 0xe7, 0xef, 0xc8, 0x5f, 0x98, + 0x39, 0xef, 0xa9, 0xc9, 0x71, 0x5f, 0xff, 0x31, 0xf3, 0x21, 0xcf, 0x88, 0xc7, 0x22, 0xe6, 0x94, + 0xd6, 0xed, 0x58, 0x99, 0x6e, 0x47, 0x2b, 0xc1, 0xc6, 0xb4, 0x3a, 0xa2, 0x5d, 0x5d, 0x83, 0x82, + 0xde, 0x6c, 0x56, 0xcd, 0x92, 0xee, 0x98, 0x8d, 0xba, 0xaa, 0x90, 0x25, 0x98, 0xdf, 0xb6, 0x1a, + 0xad, 0xa6, 0x9a, 0xd1, 0xbe, 0xaf, 0xc0, 0x8a, 0x19, 0xda, 0x21, 0x3d, 0xeb, 0xe6, 0x7b, 0x2d, + 0xb2, 0xf9, 0x36, 0x02, 0x34, 0x8b, 0xe0, 0x03, 0x27, 0xda, 0x79, 0x7f, 0xaf, 0xc0, 0x7a, 0xa2, + 0x0c, 0xb1, 0x61, 0x51, 0xdf, 0xb3, 0x1b, 0x66, 0xb9, 0xc4, 0x5b, 0x76, 0x29, 0x34, 0x75, 0xc2, + 0x80, 0x45, 0x89, 0xaf, 0x30, 0x0f, 0xd0, 0x47, 0xbe, 0x3b, 0xe8, 0x76, 0xa4, 0x60, 0xa3, 0x3b, + 0x73, 0x96, 0xa8, 0x09, 0x6f, 0xb2, 0xf7, 0x26, 0x23, 0x0f, 0xab, 0xcd, 0x44, 0x14, 0xa1, 0x41, + 0x7a, 0xb2, 0x62, 0xb4, 0xd7, 0x6f, 0xd3, 0xfc, 0x64, 0xd5, 0x61, 0x7d, 0x5b, 0x2b, 0x50, 0xe0, + 0x52, 0x0b, 0x0a, 0x04, 0x3f, 0x54, 0x60, 0x63, 0x5a, 0x5b, 0xa9, 0x20, 0x14, 0x75, 0x07, 0x3f, + 0x13, 0x04, 0x20, 0x88, 0xfa, 0x81, 0x0b, 0x32, 0xf2, 0x06, 0x14, 0x4c, 0xdf, 0x9f, 0x78, 0x23, + 0xfb, 0xa5, 0x96, 0x65, 0xf2, 0x05, 0x72, 0xe1, 0xdf, 0x3e, 0xbc, 0x74, 0x16, 0xad, 0xea, 0x47, + 0xae, 0xff, 0x92, 0x3b, 0x19, 0x75, 0x23, 0x60, 0xed, 0x72, 0x09, 0xca, 0xb7, 0xb6, 0x27, 0x9d, + 0xae, 0x27, 0xb8, 0x76, 0xe1, 0x32, 0xcb, 0xd3, 0xe4, 0x5b, 0x44, 0xa4, 0x69, 0xdf, 0x51, 0xe0, + 0xdc, 0xf4, 0x81, 0xa1, 0x37, 0x93, 0xc3, 0x0c, 0x78, 0x84, 0xd3, 0x2a, 0xde, 0x4c, 0x81, 0x95, + 0x8f, 0x5c, 0xa7, 0x20, 0xa4, 0x85, 0x82, 0xe0, 0xdf, 0x99, 0x44, 0xc4, 0xdf, 0x68, 0x21, 0x41, + 0xa8, 0xfd, 0x7b, 0x06, 0xce, 0xd0, 0x45, 0xd7, 0xf3, 0x7c, 0x5f, 0x9f, 0x8c, 0x8f, 0xbc, 0xfe, + 0x98, 0xb3, 0x61, 0xe4, 0x15, 0x58, 0x38, 0x7a, 0x3a, 0x95, 0x23, 0x23, 0x27, 0x04, 0xf0, 0x20, + 0x17, 0x3e, 0x02, 0xf4, 0x7f, 0x72, 0x05, 0xe4, 0x18, 0xcb, 0x59, 0x44, 0x79, 0xcc, 0x6c, 0x28, + 0xd6, 0xd2, 0x30, 0x08, 0x87, 0xfa, 0x2a, 0xcc, 0xa3, 0x9a, 0x81, 0x1f, 0xa9, 0x82, 0x15, 0x4e, + 0x6f, 0x1d, 0x2a, 0x21, 0x2c, 0x56, 0x80, 0x7c, 0x0e, 0x20, 0x04, 0xc8, 0xe7, 0x67, 0xa6, 0x10, + 0xbf, 0x03, 0x8c, 0x7c, 0x6b, 0xe9, 0xf8, 0xa0, 0xcd, 0x51, 0xe7, 0x8b, 0xb0, 0x2e, 0x86, 0x65, + 0x28, 0xc0, 0xe1, 0xf8, 0x6b, 0xd8, 0x1a, 0xcb, 0x30, 0x87, 0x02, 0x20, 0xee, 0x5a, 0x22, 0x4e, + 0x2c, 0x62, 0xc4, 0xc6, 0x82, 0xc1, 0x5e, 0x4b, 0x04, 0x83, 0xcd, 0x33, 0x2a, 0x39, 0xe2, 0xab, + 0xf6, 0x2f, 0x19, 0x58, 0xda, 0xa3, 0xcc, 0x0a, 0x8a, 0xe0, 0xb3, 0x45, 0xfa, 0xbb, 0x50, 0xa8, + 0x0e, 0xda, 0xfc, 0xd9, 0x81, 0x9b, 0xd6, 0x33, 0xd7, 0xd6, 0xde, 0xa0, 0x2d, 0x5e, 0x30, 0x7c, + 0x4b, 0x26, 0x7a, 0x82, 0x5b, 0xee, 0x7d, 0x58, 0x60, 0xcf, 0x40, 0x5c, 0xbb, 0x24, 0xd8, 0xd5, + 0xa0, 0x45, 0x2f, 0xb2, 0x6c, 0x49, 0x53, 0xce, 0x9e, 0x92, 0x64, 0xde, 0x89, 0x43, 0x5d, 0x4a, + 0x0a, 0x87, 0xf9, 0x93, 0x29, 0x1c, 0x24, 0x48, 0xaf, 0x85, 0x93, 0x40, 0x7a, 0x9d, 0xbb, 0x07, + 0x05, 0xa9, 0x3d, 0x4f, 0xc5, 0xbd, 0x7e, 0x3b, 0x03, 0x2b, 0xd8, 0xab, 0xc0, 0x26, 0xe4, 0xe7, + 0x53, 0x7d, 0xf2, 0x5a, 0x44, 0x7d, 0xb2, 0x21, 0xcf, 0x17, 0xeb, 0xd9, 0x0c, 0xbd, 0xc9, 0x7d, + 0x58, 0x4f, 0x10, 0x92, 0x97, 0x61, 0x9e, 0x36, 0x5f, 0x88, 0x9b, 0x6a, 0x7c, 0x05, 0x84, 0xf0, + 0xaf, 0xb4, 0xe3, 0xbe, 0xc5, 0xa8, 0xb5, 0xff, 0x52, 0x60, 0x99, 0x47, 0x5f, 0xe8, 0x1f, 0x0c, + 0x9e, 0x38, 0x9c, 0x37, 0xe2, 0xc3, 0xc9, 0x40, 0x26, 0xf8, 0x70, 0xfe, 0x4f, 0x0f, 0xe2, 0xbd, + 0xc8, 0x20, 0x9e, 0x0d, 0xc0, 0xe0, 0x44, 0x77, 0x66, 0x8c, 0xe1, 0xdf, 0x20, 0x3c, 0x6a, 0x94, + 0x90, 0x7c, 0x1d, 0x96, 0xea, 0xde, 0xa3, 0x88, 0xd4, 0x76, 0x63, 0x4a, 0xa5, 0x2f, 0x06, 0x84, + 0x6c, 0x4f, 0xe1, 0x85, 0xd7, 0xf7, 0x1e, 0xb9, 0x89, 0x17, 0xa8, 0xb0, 0x4a, 0x2a, 0xb8, 0x45, + 0x8b, 0x3d, 0xcd, 0xd2, 0xe7, 0x7e, 0x7e, 0x88, 0x9b, 0xf2, 0xdd, 0x2c, 0x40, 0xe8, 0x22, 0x45, + 0x37, 0x60, 0xe4, 0xf1, 0x5d, 0x28, 0xbc, 0x31, 0x49, 0x5e, 0xe3, 0xe2, 0x4d, 0xfe, 0x06, 0x57, + 0xcc, 0x66, 0xa6, 0x83, 0xf5, 0xa1, 0x8a, 0xb6, 0xc4, 0x7d, 0x72, 0x3a, 0x5e, 0xaf, 0xcd, 0xce, + 0xf6, 0xec, 0xd6, 0x35, 0xc4, 0x66, 0x0d, 0x52, 0xa7, 0x84, 0xd1, 0x45, 0xcf, 0x9d, 0x32, 0x25, + 0x48, 0xb8, 0x1d, 0xe6, 0x9e, 0xce, 0xed, 0xb0, 0x09, 0x4b, 0xdd, 0xfe, 0xbb, 0x5e, 0x7f, 0x3c, + 0x18, 0x3d, 0x46, 0x6d, 0x74, 0xa8, 0xe6, 0xa2, 0x43, 0x60, 0x8a, 0x3c, 0x36, 0x0f, 0x78, 0x31, + 0x06, 0xf4, 0xf2, 0x34, 0x04, 0x89, 0x81, 0xdb, 0xe4, 0xbc, 0xba, 0x70, 0x3f, 0x97, 0x5f, 0x50, + 0x17, 0xef, 0xe7, 0xf2, 0x79, 0x75, 0xe9, 0x7e, 0x2e, 0xbf, 0xa4, 0x82, 0x25, 0xbd, 0xef, 0x04, + 0xef, 0x37, 0xd2, 0x93, 0x4b, 0xf4, 0x39, 0x45, 0xfb, 0x59, 0x06, 0x48, 0xb2, 0x19, 0xe4, 0x35, + 0x28, 0xb0, 0x03, 0xd6, 0x1d, 0xf9, 0xdf, 0xe4, 0x76, 0xd9, 0x0c, 0x7d, 0x46, 0x4a, 0x96, 0xd1, + 0x67, 0x58, 0xb2, 0xe5, 0x7f, 0xb3, 0x47, 0xbe, 0x06, 0xa7, 0x70, 0x78, 0x87, 0xde, 0xa8, 0x3b, + 0xe8, 0xb8, 0x08, 0x15, 0xda, 0xee, 0xf1, 0x90, 0x77, 0x2f, 0x60, 0x6c, 0xd6, 0x64, 0xf6, 0x94, + 0x69, 0x40, 0x4f, 0xa8, 0x26, 0x52, 0x36, 0x19, 0x21, 0x71, 0x40, 0x95, 0xcb, 0x1f, 0x4c, 0x7a, + 0x3d, 0x3e, 0xb3, 0x45, 0x2a, 0xe8, 0xc6, 0xf3, 0xa6, 0x54, 0xbc, 0x1a, 0x56, 0x5c, 0x99, 0xf4, + 0x7a, 0xe4, 0x15, 0x80, 0x41, 0xdf, 0x3d, 0xee, 0xfa, 0x3e, 0x7b, 0xe3, 0x08, 0x9c, 0x36, 0xc3, + 0x54, 0x79, 0x32, 0x06, 0xfd, 0x1a, 0x4b, 0x24, 0xff, 0x0f, 0xd0, 0x69, 0x1d, 0xd1, 0x1c, 0x98, + 0x55, 0x0b, 0x0f, 0x62, 0x21, 0x12, 0xa3, 0x3e, 0xa2, 0x87, 0x9e, 0xdd, 0x7d, 0x4f, 0xd8, 0xc4, + 0xbf, 0x05, 0xeb, 0xdc, 0x9e, 0x74, 0xaf, 0x3b, 0x3e, 0xe2, 0x1c, 0xf6, 0xb3, 0xb0, 0xe7, 0x12, + 0x8b, 0xfd, 0x8f, 0x39, 0x00, 0x7d, 0xcf, 0x16, 0x40, 0x49, 0xb7, 0x60, 0x9e, 0xca, 0x0d, 0x42, + 0xff, 0x80, 0xda, 0x5b, 0xac, 0x57, 0xd6, 0xde, 0x22, 0x05, 0xdd, 0x8d, 0x16, 0xda, 0x59, 0x0b, + 0xdd, 0x03, 0xee, 0x46, 0x66, 0x7a, 0x1d, 0x01, 0xaa, 0xe5, 0x54, 0xa4, 0x0a, 0x10, 0x42, 0x17, + 0x71, 0x49, 0x76, 0x3d, 0xc4, 0x00, 0xe1, 0x19, 0x1c, 0x2c, 0x3f, 0x84, 0x3f, 0x92, 0x97, 0x4f, + 0x48, 0x46, 0x1e, 0x40, 0xce, 0x69, 0x07, 0x2e, 0x89, 0x53, 0x00, 0x9d, 0x2e, 0xf3, 0x90, 0x84, + 0x21, 0xa8, 0xd3, 0xea, 0xb8, 0x1d, 0x89, 0xdc, 0x8a, 0x95, 0x10, 0x03, 0x16, 0x78, 0xb8, 0xe9, + 0x29, 0x40, 0x80, 0x3c, 0xda, 0x34, 0x87, 0xff, 0xc5, 0x44, 0x99, 0xa7, 0xe0, 0x81, 0xa5, 0xef, + 0x42, 0xd6, 0xb6, 0x6b, 0x1c, 0xc6, 0x60, 0x25, 0x94, 0x4a, 0x6c, 0xbb, 0xc6, 0xde, 0x28, 0x7d, + 0xff, 0x58, 0x2a, 0x46, 0x89, 0xc9, 0x17, 0xa1, 0x20, 0xb1, 0xcf, 0x1c, 0x00, 0x04, 0xc7, 0x40, + 0x72, 0x0b, 0x91, 0x0f, 0x0d, 0x89, 0x9a, 0x54, 0x41, 0x7d, 0x30, 0x79, 0xc7, 0xd3, 0x87, 0x43, + 0xf4, 0x06, 0x7b, 0xd7, 0x1b, 0x31, 0xb6, 0x2d, 0x1f, 0x22, 0xe7, 0xa2, 0xd9, 0x7c, 0x47, 0xe4, + 0xca, 0x3a, 0x98, 0x78, 0x49, 0xd2, 0x84, 0x75, 0xdb, 0x1b, 0x4f, 0x86, 0xcc, 0x4e, 0xa3, 0x32, + 0x18, 0x51, 0x21, 0x84, 0xc1, 0x85, 0x20, 0xc8, 0xa8, 0x4f, 0x33, 0x85, 0x71, 0xcc, 0xc1, 0x60, + 0x14, 0x13, 0x48, 0x92, 0x85, 0x35, 0x4f, 0x9e, 0x72, 0x7a, 0xab, 0x46, 0x45, 0x1b, 0xbc, 0x55, + 0x85, 0x68, 0x13, 0x0a, 0x34, 0x9f, 0x4b, 0x81, 0xb4, 0xc2, 0x07, 0x33, 0x09, 0xd2, 0x2a, 0x02, + 0x64, 0xf5, 0x7e, 0x4e, 0x42, 0x55, 0xe4, 0x73, 0xf1, 0x3a, 0xc0, 0xfd, 0x41, 0xb7, 0x5f, 0xf3, + 0xc6, 0x47, 0x83, 0x8e, 0x84, 0xac, 0x55, 0xf8, 0xe5, 0x41, 0xb7, 0xef, 0x1e, 0x63, 0xf2, 0xcf, + 0x3e, 0xbc, 0x24, 0x11, 0x59, 0xd2, 0xff, 0xe4, 0xb3, 0xb0, 0x44, 0x7f, 0x39, 0xa1, 0xb5, 0x09, + 0x53, 0x55, 0x62, 0x69, 0x16, 0x7b, 0x20, 0x24, 0x20, 0xf7, 0x30, 0xda, 0x46, 0x77, 0x38, 0x96, + 0x98, 0x57, 0x11, 0x5a, 0xa3, 0x3b, 0x1c, 0xc7, 0x81, 0x72, 0x25, 0x62, 0xb2, 0x13, 0x34, 0x5d, + 0x04, 0xc8, 0xe1, 0x41, 0x3d, 0x50, 0x1f, 0xc7, 0xd7, 0x9a, 0x2b, 0x10, 0x3a, 0xe5, 0x50, 0xa6, + 0xb1, 0x62, 0xd8, 0x08, 0x7b, 0xa7, 0xcc, 0x1e, 0x50, 0x38, 0x53, 0xcb, 0x1a, 0xe1, 0x1f, 0x75, + 0xdc, 0x7d, 0x4c, 0x8e, 0x34, 0x22, 0x20, 0x26, 0x5b, 0xb0, 0xc6, 0x78, 0xfc, 0x20, 0xd0, 0x1e, + 0x67, 0x71, 0xf1, 0x6c, 0x0b, 0x23, 0xf1, 0xc9, 0x9f, 0x8f, 0x15, 0x20, 0x15, 0x98, 0x47, 0x81, + 0x90, 0x5b, 0x8b, 0x6f, 0xca, 0xd2, 0x73, 0x7c, 0x1f, 0xe1, 0xb9, 0x82, 0x72, 0xb3, 0x7c, 0xae, + 0x20, 0x29, 0xf9, 0x0a, 0x80, 0xd1, 0x1f, 0x0d, 0x7a, 0x3d, 0xc4, 0x90, 0xcd, 0xa3, 0x28, 0x75, + 0x21, 0xba, 0x1f, 0xb1, 0x96, 0x90, 0x88, 0xe3, 0x9d, 0xe1, 0x6f, 0x37, 0x86, 0x34, 0x2b, 0xd5, + 0xa5, 0x99, 0xb0, 0xc0, 0x36, 0x23, 0xe2, 0x31, 0xf3, 0x08, 0x13, 0x12, 0x9a, 0x2f, 0xc3, 0x63, + 0xe6, 0xe9, 0x49, 0x3c, 0x66, 0xa9, 0x80, 0xf6, 0x00, 0x4e, 0xa7, 0x75, 0x2c, 0x22, 0xc2, 0x2a, + 0x27, 0x15, 0x61, 0xff, 0x34, 0x0b, 0xcb, 0x58, 0x9b, 0x38, 0x85, 0x75, 0x58, 0xb1, 0x27, 0xef, + 0x04, 0x60, 0x45, 0xe2, 0x34, 0xc6, 0xf6, 0xf9, 0x72, 0x86, 0xfc, 0xb4, 0x15, 0x29, 0x41, 0x0c, + 0x58, 0x15, 0x37, 0xc1, 0xb6, 0xb0, 0x40, 0x0f, 0xa0, 0x90, 0x05, 0xe0, 0x5e, 0x32, 0xd0, 0x68, + 0xac, 0x50, 0x78, 0x1f, 0x64, 0x9f, 0xe6, 0x3e, 0xc8, 0x9d, 0xe8, 0x3e, 0x78, 0x1b, 0x96, 0xc5, + 0xd7, 0xf0, 0x24, 0x9f, 0x7f, 0xb6, 0x93, 0x3c, 0x52, 0x19, 0xa9, 0x06, 0x27, 0xfa, 0xc2, 0xcc, + 0x13, 0x1d, 0xdf, 0x0b, 0xc5, 0x2e, 0x1b, 0x62, 0x5a, 0xf2, 0x60, 0xc7, 0x48, 0x7c, 0xdb, 0xa5, + 0xe6, 0xc7, 0xb8, 0x25, 0x5f, 0x86, 0xa5, 0xea, 0x40, 0x3c, 0x15, 0x49, 0x3a, 0xfa, 0x9e, 0x48, + 0x94, 0xd9, 0x85, 0x80, 0x32, 0xb8, 0xdd, 0xb2, 0x9f, 0xc4, 0xed, 0x76, 0x0f, 0x80, 0xbb, 0x36, + 0x84, 0x11, 0xb4, 0x70, 0xcb, 0x08, 0xa0, 0x86, 0xe8, 0x53, 0x81, 0x44, 0x4c, 0x4f, 0x27, 0x6e, + 0x85, 0xa2, 0xef, 0xef, 0x0f, 0x26, 0xfd, 0x71, 0x24, 0xe4, 0xac, 0x70, 0xf5, 0x6b, 0xf3, 0x3c, + 0xf9, 0x78, 0x88, 0x15, 0xfb, 0x64, 0x27, 0x84, 0xbc, 0x19, 0x18, 0xd1, 0x2d, 0xce, 0x1a, 0x21, + 0x2d, 0x31, 0x42, 0x53, 0x4d, 0xe7, 0xb4, 0x1f, 0x29, 0x32, 0x0e, 0xfd, 0xc7, 0x98, 0xea, 0x57, + 0x01, 0x82, 0xb7, 0x7a, 0x31, 0xd7, 0x4c, 0x5e, 0x0a, 0x52, 0xe5, 0x51, 0x0e, 0x69, 0xa5, 0xde, + 0x64, 0x3f, 0xa9, 0xde, 0x38, 0x50, 0x68, 0x7c, 0x63, 0xdc, 0x0e, 0x8d, 0x3b, 0xc0, 0x0e, 0x38, + 0x59, 0x3c, 0x99, 0xb2, 0x5b, 0xd7, 0xf1, 0x6e, 0x08, 0xf9, 0xe0, 0x29, 0x2c, 0xb0, 0x54, 0x50, + 0x7b, 0x13, 0xd6, 0x64, 0xf7, 0xe4, 0xc7, 0xfd, 0x7d, 0xf2, 0x25, 0x86, 0x8a, 0xa9, 0x44, 0x24, + 0x16, 0x89, 0x88, 0x9e, 0xb8, 0x8f, 0xfb, 0xfb, 0x8c, 0xff, 0x69, 0x3f, 0x92, 0xdb, 0x8a, 0x32, + 0xde, 0x4f, 0x14, 0x20, 0x49, 0x72, 0xf9, 0x34, 0x51, 0xfe, 0x17, 0xb8, 0xcb, 0x18, 0x57, 0x96, + 0x7b, 0x1a, 0xae, 0xac, 0xf8, 0x7b, 0x0a, 0xac, 0x99, 0x7a, 0x8d, 0x83, 0xc6, 0xb3, 0x37, 0x87, + 0x2b, 0x70, 0xc1, 0xd4, 0x6b, 0x6e, 0xb3, 0x51, 0x35, 0x4b, 0x0f, 0xdd, 0x54, 0x2c, 0xd8, 0x0b, + 0xf0, 0x7c, 0x92, 0x24, 0x7c, 0x9b, 0x38, 0x0f, 0x1b, 0xc9, 0x6c, 0x81, 0x17, 0x9b, 0x5e, 0x58, + 0x40, 0xcb, 0x66, 0x8b, 0x6f, 0xc0, 0x9a, 0xc0, 0x46, 0x75, 0xaa, 0x36, 0xa2, 0xaf, 0xaf, 0x41, + 0x61, 0xd7, 0xb0, 0xcc, 0xca, 0x43, 0xb7, 0xd2, 0xaa, 0x56, 0xd5, 0x39, 0xb2, 0x02, 0x4b, 0x3c, + 0xa1, 0xa4, 0xab, 0x0a, 0x59, 0x86, 0xbc, 0x59, 0xb7, 0x8d, 0x52, 0xcb, 0x32, 0xd4, 0x4c, 0xf1, + 0x0d, 0x58, 0x6d, 0x8e, 0xba, 0xef, 0xb6, 0xc7, 0xde, 0x03, 0xef, 0x31, 0x3e, 0x2d, 0x2c, 0x42, + 0xd6, 0xd2, 0xf7, 0xd4, 0x39, 0x02, 0xb0, 0xd0, 0x7c, 0x50, 0xb2, 0xef, 0xdc, 0x51, 0x15, 0x52, + 0x80, 0xc5, 0xed, 0x52, 0xd3, 0x7d, 0x50, 0xb3, 0xd5, 0x0c, 0xfd, 0xa1, 0xef, 0xd9, 0xf8, 0x23, + 0x5b, 0xfc, 0x3c, 0xac, 0x23, 0xaf, 0x50, 0xed, 0xfa, 0x63, 0xaf, 0xef, 0x8d, 0xb0, 0x0d, 0xcb, + 0x90, 0xb7, 0x3d, 0xba, 0xc9, 0xc7, 0x1e, 0x6b, 0x40, 0x6d, 0xd2, 0x1b, 0x77, 0x87, 0x3d, 0xef, + 0x5b, 0xaa, 0x52, 0xbc, 0x07, 0x6b, 0xd6, 0x60, 0x32, 0xee, 0xf6, 0x0f, 0xed, 0x31, 0xa5, 0x38, + 0x7c, 0x4c, 0x9e, 0x83, 0xf5, 0x56, 0x5d, 0xaf, 0x6d, 0x99, 0xdb, 0xad, 0x46, 0xcb, 0x76, 0x6b, + 0xba, 0x53, 0xda, 0x61, 0x0f, 0x1b, 0xb5, 0x86, 0xed, 0xb8, 0x96, 0x51, 0x32, 0xea, 0x8e, 0xaa, + 0x14, 0xbf, 0x87, 0x6a, 0x8f, 0xfd, 0x41, 0xbf, 0x53, 0x69, 0x63, 0x34, 0x7e, 0xda, 0x60, 0x0d, + 0x2e, 0xda, 0x46, 0xa9, 0x51, 0x2f, 0xbb, 0x15, 0xbd, 0xe4, 0x34, 0xac, 0x34, 0x30, 0xe2, 0x73, + 0x70, 0x26, 0x85, 0xa6, 0xe1, 0x34, 0x55, 0x85, 0x5c, 0x82, 0xcd, 0x94, 0xbc, 0x3d, 0x63, 0x4b, + 0x6f, 0x39, 0x3b, 0x75, 0x35, 0x33, 0xa5, 0xb0, 0x6d, 0x37, 0xd4, 0x6c, 0xf1, 0xb7, 0x14, 0x58, + 0x6d, 0xf9, 0xdc, 0xaa, 0xb8, 0x85, 0xbe, 0x81, 0x97, 0xe1, 0x7c, 0xcb, 0x36, 0x2c, 0xd7, 0x69, + 0x3c, 0x30, 0xea, 0x6e, 0xcb, 0xd6, 0xb7, 0xe3, 0xad, 0xb9, 0x04, 0x9b, 0x12, 0x85, 0x65, 0x94, + 0x1a, 0xbb, 0x86, 0xe5, 0x36, 0x75, 0xdb, 0xde, 0x6b, 0x58, 0x65, 0x55, 0xa1, 0x5f, 0x4c, 0x21, + 0xa8, 0x55, 0x74, 0xd6, 0x9a, 0x48, 0x5e, 0xdd, 0xd8, 0xd3, 0xab, 0xee, 0x56, 0xc3, 0x51, 0xb3, + 0xc5, 0x1a, 0xbd, 0x7a, 0x11, 0x12, 0x94, 0xd9, 0xc2, 0xe5, 0x21, 0x57, 0x6f, 0xd4, 0x8d, 0xf8, + 0x73, 0xd8, 0x32, 0xe4, 0xf5, 0x66, 0xd3, 0x6a, 0xec, 0xe2, 0x12, 0x03, 0x58, 0x28, 0x1b, 0x75, + 0xda, 0xb2, 0x2c, 0xcd, 0x69, 0x5a, 0x8d, 0x5a, 0xc3, 0x31, 0xca, 0x6a, 0xae, 0x68, 0x89, 0x2d, + 0x2c, 0x2a, 0xdd, 0x1f, 0xb0, 0xb7, 0xa7, 0xb2, 0x51, 0xd1, 0x5b, 0x55, 0x87, 0x4f, 0xd1, 0x43, + 0xd7, 0x32, 0xde, 0x6c, 0x19, 0xb6, 0x63, 0xab, 0x0a, 0x51, 0x61, 0xb9, 0x6e, 0x18, 0x65, 0xdb, + 0xb5, 0x8c, 0x5d, 0xd3, 0xd8, 0x53, 0x33, 0xb4, 0x4e, 0xf6, 0x3f, 0xfd, 0x42, 0xf1, 0x7d, 0x05, + 0x08, 0x83, 0x53, 0x15, 0x31, 0x3a, 0x70, 0xc5, 0x5c, 0x84, 0x73, 0x3b, 0x74, 0xaa, 0xb1, 0x6b, + 0xb5, 0x46, 0x39, 0x3e, 0x64, 0x67, 0x80, 0xc4, 0xf2, 0x1b, 0x95, 0x8a, 0xaa, 0x90, 0x4d, 0x38, + 0x15, 0x4b, 0x2f, 0x5b, 0x8d, 0xa6, 0x9a, 0x39, 0x97, 0xc9, 0x2b, 0xe4, 0x6c, 0x22, 0xf3, 0x81, + 0x61, 0x34, 0xd5, 0x2c, 0x9d, 0xa2, 0x58, 0x86, 0xd8, 0x12, 0xac, 0x78, 0xae, 0xf8, 0x1d, 0x05, + 0xce, 0xb0, 0x66, 0x8a, 0xfd, 0x15, 0x34, 0xf5, 0x3c, 0x6c, 0x70, 0x90, 0xe8, 0xb4, 0x86, 0x9e, + 0x06, 0x35, 0x92, 0xcb, 0x9a, 0xf9, 0x1c, 0xac, 0x47, 0x52, 0xb1, 0x1d, 0x19, 0x7a, 0x7a, 0x44, + 0x92, 0xb7, 0x0c, 0xdb, 0x71, 0x8d, 0x4a, 0xa5, 0x61, 0x39, 0xac, 0x21, 0xd9, 0xa2, 0x06, 0xeb, + 0x25, 0x6f, 0x34, 0xa6, 0x52, 0x51, 0xdf, 0xef, 0x0e, 0xfa, 0xd8, 0x84, 0x15, 0x58, 0x32, 0xbe, + 0xe2, 0x18, 0x75, 0xdb, 0x6c, 0xd4, 0xd5, 0xb9, 0xe2, 0xf9, 0x18, 0x8d, 0xd8, 0xc7, 0xb6, 0xbd, + 0xa3, 0xce, 0x15, 0xdb, 0xb0, 0x22, 0xec, 0x77, 0xd9, 0xaa, 0xb8, 0x08, 0xe7, 0xc4, 0x5a, 0xc3, + 0x13, 0x25, 0xde, 0x85, 0x0d, 0x38, 0x9d, 0xcc, 0x37, 0x1c, 0x55, 0xa1, 0xb3, 0x10, 0xcb, 0xa1, + 0xe9, 0x99, 0xe2, 0x6f, 0x28, 0xb0, 0x12, 0xbc, 0x67, 0xa0, 0x06, 0xf5, 0x12, 0x6c, 0xd6, 0x2a, + 0xba, 0x5b, 0x36, 0x76, 0xcd, 0x92, 0xe1, 0x3e, 0x30, 0xeb, 0xe5, 0xd8, 0x47, 0x9e, 0x87, 0xe7, + 0x52, 0x08, 0xf0, 0x2b, 0x1b, 0x70, 0x3a, 0x9e, 0xe5, 0xd0, 0xad, 0x9a, 0xa1, 0x43, 0x1f, 0xcf, + 0x09, 0xf6, 0x69, 0xb6, 0xf8, 0x27, 0x0a, 0x6c, 0xf0, 0x20, 0xe8, 0xfc, 0x65, 0x85, 0x45, 0xc7, + 0x40, 0xf8, 0xd8, 0x22, 0xdc, 0x70, 0xac, 0x96, 0xed, 0x18, 0x65, 0x51, 0x9c, 0x2e, 0x5a, 0xd3, + 0x32, 0x6a, 0x46, 0xdd, 0x89, 0xb5, 0xed, 0x36, 0x7c, 0x66, 0x06, 0x6d, 0xbd, 0xe1, 0x88, 0xdf, + 0x74, 0xaf, 0x7e, 0x06, 0xae, 0xce, 0x20, 0x0e, 0x08, 0x33, 0xc5, 0x5d, 0x58, 0xb5, 0xf5, 0x5a, + 0xb5, 0x32, 0x18, 0xed, 0x7b, 0xfa, 0x64, 0x7c, 0xd4, 0x27, 0x9b, 0x70, 0xb6, 0xd2, 0xb0, 0x4a, + 0x86, 0x8b, 0x3d, 0x88, 0x35, 0xe2, 0x14, 0xac, 0xc9, 0x99, 0x0f, 0x0d, 0xba, 0xbb, 0x08, 0xac, + 0xca, 0x89, 0xf5, 0x86, 0x9a, 0x29, 0x7e, 0x15, 0x96, 0x23, 0x91, 0xc4, 0xce, 0xc2, 0x29, 0xf9, + 0x77, 0xd3, 0xeb, 0x77, 0xba, 0xfd, 0x43, 0x75, 0x2e, 0x9e, 0x61, 0x4d, 0xfa, 0x7d, 0x9a, 0x81, + 0xc7, 0x8d, 0x9c, 0xe1, 0x78, 0xa3, 0xe3, 0x6e, 0xbf, 0x3d, 0xf6, 0x3a, 0x6a, 0xa6, 0xf8, 0x22, + 0xac, 0x44, 0xf0, 0x8b, 0xe9, 0xba, 0xaa, 0x36, 0xf8, 0xfd, 0x50, 0x33, 0xca, 0x66, 0xab, 0xa6, + 0xce, 0xd3, 0x83, 0x66, 0xc7, 0xdc, 0xde, 0x51, 0xa1, 0xf8, 0x7d, 0x85, 0x4a, 0x28, 0x38, 0xee, + 0xb5, 0x8a, 0x2e, 0x56, 0x22, 0xdd, 0x05, 0x0c, 0x15, 0xdd, 0xb0, 0x6d, 0xf6, 0x48, 0x7d, 0x1e, + 0x36, 0xf8, 0x0f, 0x57, 0xaf, 0x97, 0xdd, 0x1d, 0xdd, 0x2a, 0xef, 0xe9, 0x16, 0xdd, 0x1a, 0x0f, + 0xd5, 0x0c, 0xee, 0x77, 0x29, 0xc5, 0x75, 0x1a, 0xad, 0xd2, 0x8e, 0x9a, 0xa5, 0xdb, 0x2b, 0x92, + 0xde, 0x34, 0xeb, 0x6a, 0x0e, 0x4f, 0x8f, 0x04, 0x35, 0x56, 0x4b, 0xf3, 0xe7, 0x8b, 0x1f, 0x29, + 0x70, 0xd6, 0xee, 0x1e, 0xf6, 0xdb, 0xe3, 0xc9, 0xc8, 0xd3, 0x7b, 0x87, 0x83, 0x51, 0x77, 0x7c, + 0x74, 0x6c, 0x4f, 0xba, 0x63, 0x8f, 0xdc, 0x82, 0xeb, 0xb6, 0xb9, 0x5d, 0xd7, 0x1d, 0xba, 0xfb, + 0xf5, 0xea, 0x76, 0xc3, 0x32, 0x9d, 0x9d, 0x9a, 0x6b, 0xb7, 0xcc, 0xc4, 0xc6, 0xb8, 0x06, 0x97, + 0xa7, 0x93, 0x56, 0x8d, 0x6d, 0xbd, 0xf4, 0x50, 0x55, 0x66, 0x57, 0xb8, 0xa5, 0x57, 0xf5, 0x7a, + 0xc9, 0x28, 0xbb, 0xbb, 0x77, 0xd4, 0x0c, 0xb9, 0x0e, 0x57, 0xa6, 0x93, 0x56, 0xcc, 0xa6, 0x4d, + 0xc9, 0xb2, 0xb3, 0xbf, 0xbb, 0x63, 0xd7, 0x28, 0x55, 0xae, 0xf8, 0xc7, 0x0a, 0x6c, 0x4c, 0x03, + 0xb1, 0x21, 0x37, 0x40, 0x33, 0xea, 0x8e, 0xa5, 0x9b, 0x65, 0xb7, 0x64, 0x19, 0x65, 0xa3, 0xee, + 0x98, 0x7a, 0xd5, 0x76, 0xed, 0x46, 0x8b, 0xae, 0xa6, 0xd0, 0x96, 0xe0, 0x2a, 0x5c, 0x9a, 0x41, + 0xd7, 0x30, 0xcb, 0x25, 0x55, 0x21, 0x77, 0xe0, 0x85, 0x19, 0x44, 0xf6, 0x43, 0xdb, 0x31, 0x6a, + 0x72, 0x8e, 0x9a, 0x29, 0x76, 0x41, 0x8d, 0xfb, 0xdb, 0x27, 0xec, 0x35, 0xac, 0x56, 0xbd, 0xce, + 0x2e, 0xa8, 0x35, 0x28, 0x34, 0x9c, 0x1d, 0xc3, 0xe2, 0x91, 0x03, 0x30, 0x54, 0x40, 0xab, 0x4e, + 0xd7, 0x7c, 0xc3, 0x32, 0xdf, 0xc2, 0x9b, 0x6a, 0x03, 0x4e, 0xdb, 0x55, 0xbd, 0xf4, 0x00, 0xb7, + 0xa3, 0x59, 0x77, 0x4b, 0x3b, 0x7a, 0xbd, 0x6e, 0x54, 0x55, 0xc0, 0x71, 0x98, 0xe6, 0x98, 0x47, + 0x3e, 0x0b, 0x37, 0x1b, 0x0f, 0x1c, 0xdd, 0x6d, 0x56, 0x5b, 0xdb, 0x66, 0xdd, 0xb5, 0x1f, 0xd6, + 0x4b, 0x82, 0xab, 0x2a, 0x25, 0x0f, 0xf3, 0x9b, 0x70, 0x6d, 0x26, 0x75, 0x88, 0xf1, 0x7f, 0x03, + 0xb4, 0x99, 0x94, 0xbc, 0x23, 0xc5, 0x1f, 0x2b, 0xb0, 0x39, 0xe3, 0xe1, 0x98, 0xbc, 0x00, 0xb7, + 0x76, 0x0c, 0xbd, 0x5c, 0x35, 0x6c, 0x1b, 0xf7, 0x38, 0x1d, 0x41, 0x66, 0xd7, 0x91, 0x7a, 0x54, + 0xdf, 0x82, 0xeb, 0xb3, 0xc9, 0xc3, 0x4b, 0xff, 0x26, 0x5c, 0x9b, 0x4d, 0xca, 0x99, 0x80, 0x0c, + 0x3d, 0x2a, 0x67, 0x53, 0x06, 0xcc, 0x43, 0xb6, 0xf8, 0x3b, 0x0a, 0x9c, 0x49, 0xd7, 0xde, 0xd0, + 0xb6, 0x99, 0x75, 0xdb, 0xd1, 0xab, 0x55, 0xb7, 0xa9, 0x5b, 0x7a, 0xcd, 0x35, 0xea, 0x56, 0xa3, + 0x5a, 0x4d, 0xbb, 0x34, 0xaf, 0xc1, 0xe5, 0xe9, 0xa4, 0x76, 0xc9, 0x32, 0x9b, 0xf4, 0x5e, 0xd0, + 0xe0, 0xe2, 0x74, 0x2a, 0xc3, 0x2c, 0x19, 0x6a, 0x66, 0xeb, 0xf5, 0x0f, 0xfe, 0xf9, 0xe2, 0xdc, + 0x07, 0x1f, 0x5d, 0x54, 0x7e, 0xf2, 0xd1, 0x45, 0xe5, 0x9f, 0x3e, 0xba, 0xa8, 0xbc, 0x75, 0xfb, + 0x64, 0xe1, 0x71, 0x50, 0xa2, 0x78, 0x67, 0x01, 0x0d, 0x99, 0x5e, 0xfa, 0xef, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xe3, 0x69, 0xcb, 0x7c, 0x0d, 0xae, 0x01, 0x00, } func (this *PluginSpecV1) Equal(that interface{}) bool { @@ -23266,14 +23269,14 @@ func (this *PluginSpecV1_Email) Equal(that interface{}) bool { } return true } -func (this *PluginSpecV1_MsTeams) Equal(that interface{}) bool { +func (this *PluginSpecV1_Msteams) Equal(that interface{}) bool { if that == nil { return this == nil } - that1, ok := that.(*PluginSpecV1_MsTeams) + that1, ok := that.(*PluginSpecV1_Msteams) if !ok { - that2, ok := that.(PluginSpecV1_MsTeams) + that2, ok := that.(PluginSpecV1_Msteams) if ok { that1 = &that2 } else { @@ -23285,7 +23288,7 @@ func (this *PluginSpecV1_MsTeams) Equal(that interface{}) bool { } else if this == nil { return false } - if !this.MsTeams.Equal(that1.MsTeams) { + if !this.Msteams.Equal(that1.Msteams) { return false } return true @@ -24226,6 +24229,9 @@ func (this *PluginMSTeamsSettings) Equal(that interface{}) bool { if this.Region != that1.Region { return false } + if this.DefaultRecipient != that1.DefaultRecipient { + return false + } if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { return false } @@ -43311,16 +43317,16 @@ func (m *PluginSpecV1_Email) MarshalToSizedBuffer(dAtA []byte) (int, error) { } return len(dAtA) - i, nil } -func (m *PluginSpecV1_MsTeams) MarshalTo(dAtA []byte) (int, error) { +func (m *PluginSpecV1_Msteams) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *PluginSpecV1_MsTeams) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *PluginSpecV1_Msteams) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - if m.MsTeams != nil { + if m.Msteams != nil { { - size, err := m.MsTeams.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Msteams.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -44635,6 +44641,13 @@ func (m *PluginMSTeamsSettings) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.DefaultRecipient) > 0 { + i -= len(m.DefaultRecipient) + copy(dAtA[i:], m.DefaultRecipient) + i = encodeVarintTypes(dAtA, i, uint64(len(m.DefaultRecipient))) + i-- + dAtA[i] = 0x2a + } if len(m.Region) > 0 { i -= len(m.Region) copy(dAtA[i:], m.Region) @@ -57043,14 +57056,14 @@ func (m *PluginSpecV1_Email) Size() (n int) { } return n } -func (m *PluginSpecV1_MsTeams) Size() (n int) { +func (m *PluginSpecV1_Msteams) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.MsTeams != nil { - l = m.MsTeams.Size() + if m.Msteams != nil { + l = m.Msteams.Size() n += 2 + l + sovTypes(uint64(l)) } return n @@ -57686,6 +57699,10 @@ func (m *PluginMSTeamsSettings) Size() (n int) { if l > 0 { n += 1 + l + sovTypes(uint64(l)) } + l = len(m.DefaultRecipient) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -115443,7 +115460,7 @@ func (m *PluginSpecV1) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 18: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MsTeams", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Msteams", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -115474,7 +115491,7 @@ func (m *PluginSpecV1) Unmarshal(dAtA []byte) error { if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Settings = &PluginSpecV1_MsTeams{v} + m.Settings = &PluginSpecV1_Msteams{v} iNdEx = postIndex default: iNdEx = preIndex @@ -119127,6 +119144,38 @@ func (m *PluginMSTeamsSettings) Unmarshal(dAtA []byte) error { } m.Region = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DefaultRecipient", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DefaultRecipient = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) diff --git a/integrations/access/accessmonitoring/access_monitoring_rules.go b/integrations/access/accessmonitoring/access_monitoring_rules.go index 7fb2c045d57ea..aa3ba2ed59ca9 100644 --- a/integrations/access/accessmonitoring/access_monitoring_rules.go +++ b/integrations/access/accessmonitoring/access_monitoring_rules.go @@ -31,6 +31,7 @@ import ( "github.com/gravitational/teleport/integrations/access/common" "github.com/gravitational/teleport/integrations/access/common/teleport" "github.com/gravitational/teleport/integrations/lib/logger" + "github.com/gravitational/teleport/integrations/lib/stringset" ) const ( @@ -159,7 +160,7 @@ func (amrh *RuleHandler) RecipientsFromAccessMonitoringRules(ctx context.Context for _, recipient := range rule.Spec.Notification.Recipients { rec, err := amrh.fetchRecipientCallback(ctx, recipient) if err != nil { - log.WithError(err).Warn("Failed to fetch plugin recipients based on Access moniotring rule recipients") + log.WithError(err).Warn("Failed to fetch plugin recipients based on Access monitoring rule recipients") continue } recipientSet.Add(*rec) @@ -167,6 +168,25 @@ func (amrh *RuleHandler) RecipientsFromAccessMonitoringRules(ctx context.Context } return &recipientSet } +// RawRecipientsFromAccessMonitoringRules returns the recipients that result from the Access Monitoring Rules being applied to the given Access Request without converting to the rich recipient type. +func (amrh *RuleHandler) RawRecipientsFromAccessMonitoringRules(ctx context.Context, req types.AccessRequest) []string { + log := logger.Get(ctx) + recipientSet := stringset.New() + for _, rule := range amrh.getAccessMonitoringRules() { + match, err := MatchAccessRequest(rule.Spec.Condition, req) + if err != nil { + log.WithError(err).WithField("rule", rule.Metadata.Name). + Warn("Failed to parse access monitoring notification rule") + } + if !match { + continue + } + for _, recipient := range rule.Spec.Notification.Recipients { + recipientSet.Add(recipient) + } + } + return recipientSet.ToSlice() +} func (amrh *RuleHandler) getAllAccessMonitoringRules(ctx context.Context) ([]*accessmonitoringrulesv1.AccessMonitoringRule, error) { var resources []*accessmonitoringrulesv1.AccessMonitoringRule diff --git a/integrations/access/common/recipient.go b/integrations/access/common/recipient.go index 333a197206b48..0fbe218bcd1fe 100644 --- a/integrations/access/common/recipient.go +++ b/integrations/access/common/recipient.go @@ -150,6 +150,15 @@ func (s *RecipientSet) ToSlice() []Recipient { return recipientSlice } +// GetNames returns a slice of the recipient names in the set. +func (s *RecipientSet) GetNames() []string { + names := make([]string, 0, len(s.recipients)) + for _, recipient := range s.recipients { + names = append(names, recipient.Name) + } + return names +} + // ForEach applies run the given func with each recipient in the set as the argument. func (s *RecipientSet) ForEach(f func(r Recipient)) { for _, v := range s.recipients { diff --git a/integrations/access/msteams/app.go b/integrations/access/msteams/app.go index 0f964705c6b94..306be091ca8b0 100644 --- a/integrations/access/msteams/app.go +++ b/integrations/access/msteams/app.go @@ -49,12 +49,11 @@ const ( type App struct { conf Config - apiClient teleport.Client - bot *Bot - mainJob lib.ServiceJob - watcherJob lib.ServiceJob - pd *pd.CompareAndSwap[PluginData] - + apiClient teleport.Client + bot *Bot + mainJob lib.ServiceJob + watcherJob lib.ServiceJob + pd *pd.CompareAndSwap[PluginData] log *slog.Logger accessMonitoringRules *accessmonitoring.RuleHandler @@ -145,7 +144,7 @@ func (a *App) init(ctx context.Context) error { webProxyAddr = pong.ProxyPublicAddr } - a.bot, err = NewBot(a.conf.MSAPI, pong.ClusterName, webProxyAddr, a.log) + a.bot, err = NewBot(&a.conf, pong.ClusterName, webProxyAddr, a.log) if err != nil { return trace.Wrap(err) } @@ -153,19 +152,6 @@ func (a *App) init(ctx context.Context) error { a.accessMonitoringRules = accessmonitoring.NewRuleHandler(accessmonitoring.RuleHandlerConfig{ Client: a.apiClient, PluginName: pluginName, - // Map msteams.RecipientData onto the common recipient type used - // by the access monitoring rules watcher. - FetchRecipientCallback: func(ctx context.Context, name string) (*common.Recipient, error) { - msTeamsRecipient, err := a.bot.FetchRecipient(ctx, name) - if err != nil { - return nil, trace.Wrap(err) - } - return &common.Recipient{ - Name: name, - ID: msTeamsRecipient.ID, - Kind: string(msTeamsRecipient.Kind), - }, nil - }, }) return a.initBot(ctx) @@ -185,6 +171,13 @@ func (a *App) initBot(ctx context.Context) error { "name", teamsApp.DisplayName, "id", teamsApp.ID) + if err := a.bot.CheckHealth(ctx); err != nil { + + a.log.WarnContext(ctx, "MS Teams healthcheck failed", + "name", teamsApp.DisplayName, + "id", teamsApp.ID) + } + if !a.conf.Preload { return nil } @@ -212,9 +205,6 @@ func (a *App) initBot(ctx context.Context) error { // run starts the main process func (a *App) run(ctx context.Context) error { - - process := lib.MustGetProcess(ctx) - watchKinds := []types.WatchKind{ {Kind: types.KindAccessRequest}, {Kind: types.KindAccessMonitoringRule}, @@ -237,6 +227,7 @@ func (a *App) run(ctx context.Context) error { return trace.Wrap(err) } + process := lib.MustGetProcess(ctx) process.SpawnCriticalJob(watcherJob) ok, err := watcherJob.WaitReady(ctx) @@ -254,6 +245,7 @@ func (a *App) run(ctx context.Context) error { return trace.Wrap(err, "initializing Access Monitoring Rule cache") } } + a.watcherJob = watcherJob a.watcherJob.SetReady(ok) if ok { @@ -530,14 +522,10 @@ func (a *App) getMessageRecipients(ctx context.Context, req types.AccessRequest) // We receive a set from GetRawRecipientsFor but we still might end up with duplicate channel names. // This can happen if this set contains the channel `C` and the email for channel `C`. recipientSet := stringset.New() - a.log.DebugContext(ctx, "Getting suggested reviewer recipients") - accessRuleRecipients := a.accessMonitoringRules.RecipientsFromAccessMonitoringRules(ctx, req) - accessRuleRecipients.ForEach(func(r common.Recipient) { - recipientSet.Add(r.Name) - }) - if recipientSet.Len() != 0 { - return recipientSet.ToSlice() + accessRuleRecipients := a.accessMonitoringRules.RawRecipientsFromAccessMonitoringRules(ctx, req) + if len(accessRuleRecipients) != 0 { + return accessRuleRecipients } var validEmailsSuggReviewers []string @@ -557,6 +545,5 @@ func (a *App) getMessageRecipients(ctx context.Context, req types.AccessRequest) recipientSet.Add(recipient) } } - return recipientSet.ToSlice() } diff --git a/integrations/access/msteams/bot.go b/integrations/access/msteams/bot.go index 20fe5c9f0eb6e..c0598c1f4d24f 100644 --- a/integrations/access/msteams/bot.go +++ b/integrations/access/msteams/bot.go @@ -27,8 +27,10 @@ import ( "github.com/gravitational/trace" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/integrations/access/common" "github.com/gravitational/teleport/integrations/access/msteams/msapi" "github.com/gravitational/teleport/integrations/lib" + "github.com/gravitational/teleport/integrations/lib/logger" "github.com/gravitational/teleport/integrations/lib/plugindata" ) @@ -80,10 +82,13 @@ type Bot struct { clusterName string // log is the logger log *slog.Logger + // StatusSink receives any status updates from the plugin for + // further processing. Status updates will be ignored if not set. + StatusSink common.StatusSink } // NewBot creates new bot struct -func NewBot(c msapi.Config, clusterName, webProxyAddr string, log *slog.Logger) (*Bot, error) { +func NewBot(c *Config, clusterName, webProxyAddr string, log *slog.Logger) (*Bot, error) { var ( webProxyURL *url.URL err error @@ -97,14 +102,15 @@ func NewBot(c msapi.Config, clusterName, webProxyAddr string, log *slog.Logger) } bot := &Bot{ - Config: c, - graphClient: msapi.NewGraphClient(c), - botClient: msapi.NewBotFrameworkClient(c), + Config: c.MSAPI, + graphClient: msapi.NewGraphClient(c.MSAPI), + botClient: msapi.NewBotFrameworkClient(c.MSAPI), recipients: make(map[string]RecipientData), webProxyURL: webProxyURL, clusterName: clusterName, mu: &sync.RWMutex{}, log: log, + StatusSink: c.StatusSink, } return bot, nil @@ -448,3 +454,23 @@ func (b *Bot) checkChannelURL(recipient string) (*Channel, bool) { return &channel, true } + +// CheckHealth checks if the bot can connect to its messaging service +func (b *Bot) CheckHealth(ctx context.Context) error { + _, err := b.graphClient.GetTeamsApp(ctx, b.Config.TeamsAppID) + if b.StatusSink != nil { + status := types.PluginStatusCode_RUNNING + message := "" + if err != nil { + status = types.PluginStatusCode_OTHER_ERROR + message = err.Error() + } + if err := b.StatusSink.Emit(ctx, &types.PluginStatusV1{ + Code: status, + ErrorMessage: message, + }); err != nil { + logger.Get(ctx).Errorf("Error while emitting ms teams plugin status: %v", err) + } + } + return trace.Wrap(err) +} diff --git a/integrations/access/msteams/config.go b/integrations/access/msteams/config.go index 8aca1fa074ab1..bbe29de4f265d 100644 --- a/integrations/access/msteams/config.go +++ b/integrations/access/msteams/config.go @@ -25,18 +25,20 @@ import ( "github.com/gravitational/teleport/integrations/access/common/teleport" "github.com/gravitational/teleport/integrations/access/msteams/msapi" "github.com/gravitational/teleport/integrations/lib" - "github.com/gravitational/teleport/integrations/lib/logger" ) // Config represents plugin configuration type Config struct { - // Client is the Teleport API client. - Client teleport.Client - Teleport lib.TeleportConfig - Recipients common.RawRecipientsMap `toml:"role_to_recipients"` - Log logger.Config - MSAPI msapi.Config `toml:"msapi"` - Preload bool `toml:"preload"` + common.BaseConfig + Client teleport.Client + // MSAPI represents MS Graph API and Bot API config. + MSAPI msapi.Config `toml:"msapi"` + // Preload if set to true will preload the potential msteams recipients. + Preload bool `toml:"preload"` + + // StatusSink receives any status updates from the plugin for + // further processing. Status updates will be ignored if not set. + StatusSink common.StatusSink } // LoadConfig reads the config file, initializes a new Config struct object, and returns it. diff --git a/integrations/access/msteams/configure.go b/integrations/access/msteams/configure.go index c579c9e1f80b0..003ad12eaae64 100644 --- a/integrations/access/msteams/configure.go +++ b/integrations/access/msteams/configure.go @@ -21,7 +21,8 @@ import ( "html/template" "io" "os" - "path" + "path/filepath" + "slices" "github.com/google/uuid" "github.com/gravitational/trace" @@ -45,11 +46,16 @@ var ( zipFiles = []string{"manifest.json", "outline.png", "color.png"} ) -// payload represents template payload -type payload struct { - AppID string - AppSecret string - TenantID string +// ConfigTemplatePayload represents template payloads used to generate config files +// used by the Microsoft Teams plugin. +type ConfigTemplatePayload struct { + // AppID is the Microsoft application ID. + AppID string + // AppSecret is the Microsoft application secret. + AppSecret string + // TenantID is the Microsoft Azure tenant ID. + TenantID string + // TeamsAppID is the Microsoft Teams application ID. TeamsAppID string } @@ -57,7 +63,7 @@ type payload struct { func Configure(targetDir, appID, appSecret, tenantID string) error { var step byte = 1 - p := payload{ + p := ConfigTemplatePayload{ AppID: appID, AppSecret: appSecret, TenantID: tenantID, @@ -79,76 +85,77 @@ func Configure(targetDir, appID, appSecret, tenantID string) error { printStep(&step, "Created target directory: %s", targetDir) - if err := renderTemplateTo(confTpl, p, path.Join(targetDir, "teleport-msteams.toml")); err != nil { + configWriter, err := os.Create(filepath.Join(targetDir, "teleport-msteams.toml")) + if err != nil { return trace.Wrap(err) } - if err := renderTemplateTo(manifestTpl, p, path.Join(targetDir, "manifest.json")); err != nil { + defer configWriter.Close() + if err := renderTemplateTo(configWriter, confTpl, p); err != nil { return trace.Wrap(err) } - printStep(&step, "Generated configuration files") - - a, err := assets.ReadDir("_tpl") + appZipFile, err := os.Create(filepath.Join(targetDir, "app.zip")) if err != nil { return trace.Wrap(err) } + defer appZipFile.Close() - for _, d := range a { - in, err := assets.Open(path.Join("_tpl", d.Name())) - if err != nil { - return trace.Wrap(err) - } - defer in.Close() + WriteAppZipTo(appZipFile, p) - out, err := os.Create(path.Join(targetDir, d.Name())) - if err != nil { - return trace.Wrap(err) - } - defer out.Close() + printStep(&step, "Created %v", appZipFile.Name()) + fmt.Println() + fmt.Printf("TeamsAppID: %v\n", p.TeamsAppID) + fmt.Println() + fmt.Println("Follow-along with our getting started guide:") + fmt.Println() + fmt.Println(guideURL) - _, err = io.Copy(out, in) - if err != nil { - return trace.Wrap(err) - } - } + return nil +} - printStep(&step, "Copied assets") +// WriteAppZipTo creates the manifest.json from the template using the provided payload, then writes the app.zip to the provided writer including the needed assets. +func WriteAppZipTo(zipWriter io.Writer, p ConfigTemplatePayload) error { + w := zip.NewWriter(zipWriter) + defer w.Close() - z, err := os.Create(path.Join(targetDir, "app.zip")) + manifestWriter, err := w.Create("manifest.json") if err != nil { return trace.Wrap(err) } - defer z.Close() + if err := renderTemplateTo(manifestWriter, manifestTpl, p); err != nil { + return trace.Wrap(err) + } - w := zip.NewWriter(z) - defer w.Close() + copyAssets(w) + return nil +} - for _, n := range zipFiles { - in, err := os.Open(path.Join(targetDir, n)) +func copyAssets(zipWriter *zip.Writer) error { + a, err := assets.ReadDir("_tpl") + if err != nil { + return trace.Wrap(err) + } + + for _, d := range a { + if !slices.Contains(zipFiles, d.Name()) { + continue + } + in, err := assets.Open(filepath.Join("_tpl", d.Name())) if err != nil { return trace.Wrap(err) } defer in.Close() - out, err := w.Create(n) + out, err := zipWriter.Create(d.Name()) if err != nil { return trace.Wrap(err) } + _, err = io.Copy(out, in) if err != nil { return trace.Wrap(err) } } - - printStep(&step, "Created app.zip") - - fmt.Println() - fmt.Printf("TeamsAppID: %v\n", p.TeamsAppID) - fmt.Println() - fmt.Println("Follow-along with our getting started guide:") - fmt.Println() - fmt.Println(guideURL) - return nil } @@ -160,18 +167,12 @@ func printStep(step *byte, message string, args ...interface{}) { } // renderTemplateTo renders template from a string and writes file to targetPath -func renderTemplateTo(content string, payload interface{}, targetPath string) error { +func renderTemplateTo(w io.Writer, content string, payload interface{}) error { tpl, err := template.New("template").Parse(content) if err != nil { return trace.Wrap(err) } - w, err := os.Create(targetPath) - if err != nil { - return trace.Wrap(err) - } - defer w.Close() - err = tpl.ExecuteTemplate(w, "template", payload) if err != nil { return trace.Wrap(err) diff --git a/integrations/access/msteams/msapi/config.go b/integrations/access/msteams/msapi/config.go index 5672feaf33084..551599774190d 100644 --- a/integrations/access/msteams/msapi/config.go +++ b/integrations/access/msteams/msapi/config.go @@ -30,10 +30,11 @@ type Config struct { AppSecret string `toml:"app_secret"` // TenantID ms tenant id TenantID string `toml:"tenant_id"` - // Region bot framework api AP region + // Region to be used by the Microsoft Graph API client Region string `toml:"region"` // TeamsAppID represents Teams App ID TeamsAppID string `toml:"teams_app_id"` + // url represents url configuration for testing url struct { tokenBaseURL string diff --git a/integrations/access/msteams/testlib/helpers.go b/integrations/access/msteams/testlib/helpers.go index 9aaa1fcdaf94c..db4c8a8164834 100644 --- a/integrations/access/msteams/testlib/helpers.go +++ b/integrations/access/msteams/testlib/helpers.go @@ -41,7 +41,7 @@ func (s *MsTeamsBaseSuite) checkPluginData(ctx context.Context, reqID string, co func (s *MsTeamsBaseSuite) getNewMessages(ctx context.Context, n int) (MsgSlice, error) { msgs := MsgSlice{} - for i := 0; i < 2; i++ { + for i := 0; i < n; i++ { msg, err := s.fakeTeams.CheckNewMessage(ctx) if err != nil { return nil, trace.Wrap(err) diff --git a/integrations/access/msteams/testlib/suite.go b/integrations/access/msteams/testlib/suite.go index 3e652bea1aa85..a9a209c04cd1e 100644 --- a/integrations/access/msteams/testlib/suite.go +++ b/integrations/access/msteams/testlib/suite.go @@ -79,6 +79,7 @@ func (s *MsTeamsBaseSuite) SetupTest() { apiClient, err := common.GetTeleportClient(context.Background(), s.TeleportConfig()) require.NoError(t, err) conf.Client = apiClient + conf.StatusSink = s.fakeStatusSink conf.MSAPI = s.fakeTeams.Config conf.MSAPI.SetBaseURLs(s.fakeTeams.URL(), s.fakeTeams.URL(), s.fakeTeams.URL()) diff --git a/integrations/access/msteams/validate.go b/integrations/access/msteams/validate.go index 39fba47369250..61d9d25f635e8 100644 --- a/integrations/access/msteams/validate.go +++ b/integrations/access/msteams/validate.go @@ -146,7 +146,7 @@ func loadConfig(configPath string) (*Bot, *Config, error) { if err != nil { return nil, nil, trace.Wrap(err) } - b, err := NewBot(c.MSAPI, "local", "", log) + b, err := NewBot(c, "local", "", log) if err != nil { return nil, nil, trace.Wrap(err) } diff --git a/lib/web/apiserver.go b/lib/web/apiserver.go index 2bbb2bcbdd561..7d932eb129fea 100644 --- a/lib/web/apiserver.go +++ b/lib/web/apiserver.go @@ -977,6 +977,9 @@ func (h *Handler) bindDefaultEndpoints() { h.PUT("/webapi/sites/:site/integrations/:name", h.WithClusterAuth(h.integrationsUpdate)) h.DELETE("/webapi/sites/:site/integrations/:name_or_subkind", h.WithClusterAuth(h.integrationsDelete)) + // GET the Microsoft Teams plugin app.zip file. + h.GET("/webapi/sites/:site/plugins/:plugin/files/msteams_app.zip", h.WithClusterAuth(h.integrationsMsTeamsAppZipGet)) + // AWS OIDC Integration Actions h.GET("/webapi/scripts/integrations/configure/awsoidc-idp.sh", h.WithLimiter(h.awsOIDCConfigureIdP)) h.POST("/webapi/sites/:site/integrations/aws-oidc/:name/ping", h.WithClusterAuth(h.awsOIDCPing)) diff --git a/lib/web/integrations.go b/lib/web/integrations.go index 9e99050bc2b40..665035e048a15 100644 --- a/lib/web/integrations.go +++ b/lib/web/integrations.go @@ -25,7 +25,9 @@ import ( "github.com/gravitational/trace" "github.com/julienschmidt/httprouter" + pluginspb "github.com/gravitational/teleport/api/gen/proto/go/teleport/plugins/v1" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/integrations/access/msteams" "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/httplib" "github.com/gravitational/teleport/lib/reversetunnelclient" @@ -225,3 +227,35 @@ func (h *Handler) integrationsList(w http.ResponseWriter, r *http.Request, p htt NextKey: nextKey, }, nil } + +// integrationsMsTeamsAppZipGet generates and returns the app.zip required for the MsTeams plugin with the given name. +func (h *Handler) integrationsMsTeamsAppZipGet(w http.ResponseWriter, r *http.Request, p httprouter.Params, sctx *SessionContext, site reversetunnelclient.RemoteSite) (interface{}, error) { + clt, err := sctx.GetUserClient(r.Context(), site) + if err != nil { + return nil, trace.Wrap(err) + } + + plugin, err := clt.PluginsClient().GetPlugin(r.Context(), &pluginspb.GetPluginRequest{ + Name: p.ByName("plugin"), + WithSecrets: false, + }) + if err != nil { + return nil, trace.Wrap(err) + } + spec, ok := plugin.Spec.Settings.(*types.PluginSpecV1_Msteams) + if !ok { + return nil, trace.BadParameter("plugin specified was not of type MsTeams") + } + + w.Header().Add("Content-Type", "application/zip") + w.Header().Add("Content-Disposition", "attachment; filename=app.zip") + err = msteams.WriteAppZipTo(w, msteams.ConfigTemplatePayload{ + AppID: spec.Msteams.AppId, + TenantID: spec.Msteams.TenantId, + TeamsAppID: spec.Msteams.TeamsAppId, + }) + if err != nil { + return nil, trace.Wrap(err) + } + return nil, nil +} diff --git a/web/packages/shared/utils/saveOnDisk.ts b/web/packages/shared/utils/saveOnDisk.ts index e201d368a2ade..003c289a02e2a 100644 --- a/web/packages/shared/utils/saveOnDisk.ts +++ b/web/packages/shared/utils/saveOnDisk.ts @@ -18,17 +18,19 @@ /** * saveOnDisk saves content to local disk. - * @param content content to download. + * @param content content to download (string or Blob). * @param filename preset file name. * @param fileType file type. */ export function saveOnDisk( - content: string, + content: string | Blob, filename: string, fileType: string ): void { const a = document.createElement('a'); - const blob = new Blob([content], { type: fileType }); + + const blob = + content instanceof Blob ? content : new Blob([content], { type: fileType }); a.href = window.URL.createObjectURL(blob); a.download = filename; document.body.appendChild(a); diff --git a/web/packages/teleport/src/Integrations/IntegrationList.tsx b/web/packages/teleport/src/Integrations/IntegrationList.tsx index f52a2965ce408..f0fe081768e41 100644 --- a/web/packages/teleport/src/Integrations/IntegrationList.tsx +++ b/web/packages/teleport/src/Integrations/IntegrationList.tsx @@ -25,7 +25,12 @@ import { Box, Flex } from 'design'; import Table, { Cell } from 'design/DataTable'; import { MenuButton, MenuItem } from 'shared/components/MenuAction'; import { ToolTipInfo } from 'shared/components/ToolTip'; +import { useAsync } from 'shared/hooks/useAsync'; import { ResourceIcon } from 'design/ResourceIcon'; +import { saveOnDisk } from 'shared/utils/saveOnDisk'; + +import useStickyClusterId from 'teleport/useStickyClusterId'; +import api from 'teleport/services/api'; import { getStatusCodeDescription, @@ -65,6 +70,18 @@ export function IntegrationList(props: Props) { return { cursor: 'pointer' }; } + const [downloadAttempt, download] = useAsync( + async (clusterId: string, itemName: string) => { + return api + .fetch(cfg.getMsTeamsAppZipRoute(clusterId, itemName)) + .then(response => response.blob()) + .then(blob => { + saveOnDisk(blob, 'app.zip', 'application/zip'); + }); + } + ); + + const { clusterId } = useStickyClusterId(); return ( ) { View Status )} + {item.kind === 'msteams' && ( + download(clusterId, item.name)} + > + Download app.zip + + )} props.onDeletePlugin(item)}> Delete... diff --git a/web/packages/teleport/src/config.ts b/web/packages/teleport/src/config.ts index a429bc7f60ef0..e2fb3fce9da7a 100644 --- a/web/packages/teleport/src/config.ts +++ b/web/packages/teleport/src/config.ts @@ -382,6 +382,9 @@ const cfg = { '/v1/webapi/sites/:clusterId/lastseennotification', notificationStatePath: '/v1/webapi/sites/:clusterId/notificationstate', + msTeamsAppZipPath: + '/v1/webapi/sites/:clusterId/plugins/:plugin/files/msteams_app.zip', + yaml: { parse: '/v1/webapi/yaml/parse/:kind', stringify: '/v1/webapi/yaml/stringify/:kind', @@ -514,6 +517,10 @@ const cfg = { return generatePath(cfg.routes.integrationStatus, { type, name }); }, + getMsTeamsAppZipRoute(clusterId: string, plugin: string) { + return generatePath(cfg.api.msTeamsAppZipPath, { clusterId, plugin }); + }, + getNodesRoute(clusterId: string) { return generatePath(cfg.routes.nodes, { clusterId }); }, diff --git a/web/packages/teleport/src/services/integrations/types.ts b/web/packages/teleport/src/services/integrations/types.ts index e525f72ff6ee6..a50537b7199da 100644 --- a/web/packages/teleport/src/services/integrations/types.ts +++ b/web/packages/teleport/src/services/integrations/types.ts @@ -173,7 +173,8 @@ export type PluginSpec = | PluginMattermostSpec | PluginOpsgenieSpec | PluginDatadogSpec - | PluginEmailSpec; + | PluginEmailSpec + | PluginMsTeamsSpec; // PluginKind represents the type of the plugin // and should be the same value as defined in the backend (check master branch for the latest): @@ -233,6 +234,14 @@ export type PluginMattermostSpec = { reportToEmail: string; }; +export type PluginMsTeamsSpec = { + appID: string; + tenantID: string; + teamsAppID: string; + region: string; + defaultRecipient: string; +}; + export type PluginOpsgenieSpec = { defaultSchedules: string[]; };