Instrumentation of Discovery usage events for the new IAC flow (#64322)

This commit is contained in:
charlestp
2026-03-13 19:04:58 +00:00
committed by GitHub
parent 4424d04dc0
commit 4c18fb78a2
21 changed files with 1669 additions and 836 deletions
+481 -412
View File
@@ -327,6 +327,9 @@ const (
IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_GITHUB_REPO_ACCESS IntegrationEnrollKind = 27
IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_MACHINE_ID_ARGOCD IntegrationEnrollKind = 28
IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_MACHINE_ID_GITHUB_ACTIONS_KUBERNETES IntegrationEnrollKind = 29
IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_AWS_CLOUD IntegrationEnrollKind = 30
IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_AZURE_CLOUD IntegrationEnrollKind = 31
IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_GOOGLE_CLOUD IntegrationEnrollKind = 32
)
var IntegrationEnrollKind_name = map[int32]string{
@@ -360,6 +363,9 @@ var IntegrationEnrollKind_name = map[int32]string{
27: "INTEGRATION_ENROLL_KIND_GITHUB_REPO_ACCESS",
28: "INTEGRATION_ENROLL_KIND_MACHINE_ID_ARGOCD",
29: "INTEGRATION_ENROLL_KIND_MACHINE_ID_GITHUB_ACTIONS_KUBERNETES",
30: "INTEGRATION_ENROLL_KIND_AWS_CLOUD",
31: "INTEGRATION_ENROLL_KIND_AZURE_CLOUD",
32: "INTEGRATION_ENROLL_KIND_GOOGLE_CLOUD",
}
var IntegrationEnrollKind_value = map[string]int32{
@@ -393,6 +399,9 @@ var IntegrationEnrollKind_value = map[string]int32{
"INTEGRATION_ENROLL_KIND_GITHUB_REPO_ACCESS": 27,
"INTEGRATION_ENROLL_KIND_MACHINE_ID_ARGOCD": 28,
"INTEGRATION_ENROLL_KIND_MACHINE_ID_GITHUB_ACTIONS_KUBERNETES": 29,
"INTEGRATION_ENROLL_KIND_AWS_CLOUD": 30,
"INTEGRATION_ENROLL_KIND_AZURE_CLOUD": 31,
"INTEGRATION_ENROLL_KIND_GOOGLE_CLOUD": 32,
}
func (x IntegrationEnrollKind) String() string {
@@ -424,6 +433,8 @@ const (
IntegrationEnrollStep_INTEGRATION_ENROLL_STEP_MWIGHAK8S_CONFIGURE_ACCESS IntegrationEnrollStep = 10
IntegrationEnrollStep_INTEGRATION_ENROLL_STEP_MWIGHAK8S_SETUP_WORKFLOW IntegrationEnrollStep = 11
IntegrationEnrollStep_INTEGRATION_ENROLL_STEP_MWIGHAK8S_WELCOME IntegrationEnrollStep = 12
// General integration setup steps.
IntegrationEnrollStep_INTEGRATION_ENROLL_STEP_VERIFY_INTEGRATION IntegrationEnrollStep = 13
)
var IntegrationEnrollStep_name = map[int32]string{
@@ -440,6 +451,7 @@ var IntegrationEnrollStep_name = map[int32]string{
10: "INTEGRATION_ENROLL_STEP_MWIGHAK8S_CONFIGURE_ACCESS",
11: "INTEGRATION_ENROLL_STEP_MWIGHAK8S_SETUP_WORKFLOW",
12: "INTEGRATION_ENROLL_STEP_MWIGHAK8S_WELCOME",
13: "INTEGRATION_ENROLL_STEP_VERIFY_INTEGRATION",
}
var IntegrationEnrollStep_value = map[string]int32{
@@ -456,6 +468,7 @@ var IntegrationEnrollStep_value = map[string]int32{
"INTEGRATION_ENROLL_STEP_MWIGHAK8S_CONFIGURE_ACCESS": 10,
"INTEGRATION_ENROLL_STEP_MWIGHAK8S_SETUP_WORKFLOW": 11,
"INTEGRATION_ENROLL_STEP_MWIGHAK8S_WELCOME": 12,
"INTEGRATION_ENROLL_STEP_VERIFY_INTEGRATION": 13,
}
func (x IntegrationEnrollStep) String() string {
@@ -4649,10 +4662,13 @@ type ResourceCreateEvent struct {
// if resource_origin == "cloud".
CloudProvider string `protobuf:"bytes,3,opt,name=cloud_provider,json=cloudProvider,proto3" json:"cloud_provider,omitempty"`
// database contains additional database information if resource_type == "db".
Database *DiscoveredDatabaseMetadata `protobuf:"bytes,4,opt,name=database,proto3" json:"database,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
Database *DiscoveredDatabaseMetadata `protobuf:"bytes,4,opt,name=database,proto3" json:"database,omitempty"`
// discovery_config_name is the name of the DiscoveryConfig that triggered discovery.
// Empty for teleport.yaml matcher configuration.
DiscoveryConfigName string `protobuf:"bytes,5,opt,name=discovery_config_name,json=discoveryConfigName,proto3" json:"discovery_config_name,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ResourceCreateEvent) Reset() { *m = ResourceCreateEvent{} }
@@ -4716,6 +4732,13 @@ func (m *ResourceCreateEvent) GetDatabase() *DiscoveredDatabaseMetadata {
return nil
}
func (m *ResourceCreateEvent) GetDiscoveryConfigName() string {
if m != nil {
return m.DiscoveryConfigName
}
return ""
}
// DiscoveredDatabaseMetadata contains additional database information.
type DiscoveredDatabaseMetadata struct {
// database type.
@@ -6323,414 +6346,417 @@ func init() {
}
var fileDescriptor_94cf2ca1c69fd564 = []byte{
// 6507 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7d, 0x5b, 0x6c, 0x1c, 0xc9,
0x75, 0xe8, 0xf4, 0x90, 0x94, 0xc8, 0x92, 0x44, 0xb5, 0x5a, 0x12, 0x35, 0x22, 0x45, 0x3d, 0x46,
0x6f, 0xee, 0x2e, 0xb5, 0xd2, 0x6a, 0xbd, 0xda, 0x87, 0xbd, 0xdb, 0xec, 0x69, 0xce, 0xb4, 0x38,
0x33, 0x3d, 0x5b, 0xdd, 0x23, 0x9a, 0x6b, 0x18, 0x75, 0x9b, 0xd3, 0x45, 0xb2, 0x2f, 0x87, 0xd3,
0xe3, 0xee, 0x1e, 0x72, 0x89, 0x0b, 0xc3, 0xbe, 0xbe, 0xf7, 0x1a, 0x17, 0xd7, 0xf6, 0xb5, 0x03,
0x24, 0x46, 0x80, 0x0d, 0xf2, 0x40, 0x1e, 0x08, 0xe0, 0x00, 0xf9, 0x32, 0xfc, 0x95, 0x8f, 0xfc,
0x05, 0x48, 0x3e, 0x02, 0x04, 0xc8, 0x47, 0xf2, 0x13, 0xf8, 0x2b, 0x7f, 0xfe, 0x4a, 0x80, 0xc4,
0x79, 0xa1, 0x1e, 0x3d, 0xd3, 0x33, 0xd3, 0x3d, 0xdd, 0xda, 0x68, 0x63, 0x43, 0xfb, 0xc7, 0xa9,
0x3a, 0xaf, 0x3a, 0x75, 0xea, 0x9c, 0x53, 0x55, 0xa7, 0x9a, 0xe0, 0x7e, 0x80, 0xdb, 0xb8, 0xeb,
0x7a, 0xc1, 0x83, 0x9e, 0x6f, 0xed, 0x62, 0x7c, 0x88, 0x3b, 0x81, 0xff, 0xe0, 0xf0, 0x61, 0xf4,
0xe7, 0x6a, 0xd7, 0x73, 0x03, 0x57, 0xba, 0x14, 0x82, 0xae, 0x46, 0xfb, 0x0e, 0x1f, 0x2e, 0xde,
0xed, 0xd3, 0xb0, 0x5a, 0x2d, 0xec, 0xfb, 0x6d, 0xc7, 0x0f, 0x08, 0x89, 0xc1, 0x2f, 0x46, 0xa1,
0xb8, 0x02, 0xa4, 0xa6, 0xb6, 0x66, 0x75, 0x3a, 0xd8, 0x53, 0xda, 0x4e, 0x6b, 0x5f, 0x25, 0x24,
0xa4, 0x0b, 0x60, 0xc6, 0x6a, 0x63, 0x2f, 0x28, 0x08, 0xd7, 0x85, 0x7b, 0x73, 0x90, 0xfd, 0x28,
0xae, 0x83, 0x7b, 0x4d, 0x4d, 0xef, 0x6c, 0xbb, 0x96, 0x67, 0x2b, 0xee, 0x41, 0xb7, 0x8d, 0x03,
0x5c, 0x76, 0x4d, 0xb7, 0x64, 0xf9, 0x7b, 0xac, 0x71, 0x40, 0x61, 0x11, 0xcc, 0xf6, 0x7c, 0xec,
0x75, 0xac, 0x03, 0xcc, 0x89, 0xf4, 0x7f, 0x17, 0x6f, 0x83, 0x9b, 0x7d, 0x3a, 0xb2, 0x6d, 0xaf,
0x3b, 0x9e, 0x1f, 0x40, 0xec, 0xbb, 0x3d, 0xaf, 0x85, 0x07, 0x24, 0x8a, 0x2b, 0x11, 0x76, 0xa3,
0x60, 0x55, 0x2b, 0x88, 0x0a, 0x5c, 0x7c, 0x1f, 0xdc, 0xe8, 0xc3, 0x1a, 0x38, 0x50, 0x3c, 0x6c,
0xe3, 0x4e, 0xe0, 0x58, 0x6d, 0xa3, 0xb7, 0x7d, 0xe0, 0x04, 0xe9, 0x32, 0x45, 0x09, 0x7c, 0xd8,
0xc3, 0x7e, 0xe0, 0xb8, 0x9d, 0x8e, 0xe5, 0x78, 0x38, 0x2b, 0x81, 0xaf, 0x83, 0xdb, 0x7d, 0x02,
0x10, 0xef, 0x3a, 0x3e, 0x11, 0x70, 0xcf, 0x6a, 0xb7, 0x71, 0x67, 0x37, 0x2b, 0x11, 0xe9, 0x32,
0x98, 0x3d, 0xd8, 0xb1, 0x50, 0x70, 0xdc, 0xc5, 0x85, 0x3c, 0xed, 0x3b, 0x79, 0xb0, 0x63, 0x99,
0xc7, 0x5d, 0x2c, 0x2d, 0x03, 0xd0, 0x76, 0x77, 0x9d, 0x0e, 0xda, 0x69, 0xbb, 0x47, 0x85, 0x29,
0xda, 0x39, 0x47, 0x5b, 0xd6, 0xdb, 0xee, 0x11, 0x93, 0x1f, 0xe2, 0x96, 0x7b, 0x88, 0xbd, 0x63,
0xc5, 0xb5, 0xb1, 0xaf, 0xb8, 0x9d, 0xc0, 0xe9, 0xf4, 0x70, 0xc6, 0x49, 0x79, 0x17, 0x2c, 0x8f,
0x11, 0xe8, 0x1e, 0x67, 0x44, 0x7e, 0x0f, 0x5c, 0x1d, 0x41, 0x6e, 0x78, 0x4e, 0x27, 0xc8, 0x88,
0x5d, 0x04, 0x62, 0xc9, 0xf1, 0x29, 0x72, 0x0d, 0x07, 0x96, 0x6d, 0x05, 0x96, 0x34, 0x0f, 0xf2,
0x8e, 0xcd, 0x21, 0xf3, 0x8e, 0x5d, 0xb4, 0x40, 0x21, 0x84, 0x09, 0x6d, 0xa0, 0x0f, 0xab, 0x82,
0x59, 0x8f, 0xb7, 0x51, 0x8c, 0xf9, 0x47, 0xf7, 0x57, 0x13, 0x16, 0xc6, 0xea, 0x28, 0x11, 0xd8,
0x47, 0x2d, 0xee, 0x03, 0x29, 0xec, 0x35, 0x02, 0xdc, 0x35, 0x02, 0x2b, 0xe8, 0xf9, 0xd2, 0xfb,
0xe0, 0x84, 0x4f, 0xff, 0xe2, 0xa4, 0xef, 0xa6, 0x92, 0x66, 0x88, 0x90, 0xa3, 0x91, 0xb5, 0x84,
0x3d, 0xcf, 0xf5, 0xf8, 0x84, 0xb2, 0x1f, 0xc5, 0xdf, 0x13, 0xc0, 0x42, 0x53, 0x8b, 0xa0, 0x78,
0x01, 0xb6, 0x99, 0xaa, 0x54, 0x30, 0x7b, 0xc0, 0x87, 0x46, 0x79, 0x9e, 0xca, 0x30, 0x9c, 0x50,
0x17, 0xb0, 0x8f, 0x2a, 0x29, 0x7d, 0xc1, 0xf3, 0x94, 0xc8, 0x2b, 0x19, 0x04, 0x0f, 0x47, 0x1d,
0x0a, 0x5f, 0xfc, 0x57, 0x01, 0x5c, 0x1f, 0x88, 0x19, 0x2a, 0xcd, 0xc0, 0x6d, 0xdc, 0x22, 0x2b,
0xe4, 0x85, 0x0a, 0x5c, 0x8b, 0x4c, 0x23, 0x13, 0xf9, 0x61, 0xe6, 0x69, 0x1c, 0x90, 0x0b, 0x49,
0x44, 0xc6, 0x3f, 0xf5, 0xe9, 0xc7, 0xff, 0x7f, 0xf2, 0xc4, 0x09, 0x85, 0x00, 0x5a, 0x27, 0xc0,
0xbb, 0x9e, 0x45, 0x46, 0x2e, 0x6f, 0x1a, 0xba, 0x56, 0x52, 0x14, 0xb7, 0xd3, 0xc1, 0xad, 0xe0,
0xa5, 0xd7, 0xc3, 0x4f, 0xf2, 0x51, 0x3b, 0x28, 0x59, 0x81, 0xb5, 0x6d, 0xf9, 0x18, 0x96, 0x0c,
0xb5, 0xe3, 0xb9, 0xed, 0xf6, 0xcb, 0x3e, 0x7e, 0xe9, 0x09, 0x28, 0xf8, 0xd4, 0xe8, 0xb1, 0x8d,
0x42, 0xca, 0x3e, 0x6a, 0xb9, 0xbd, 0x4e, 0x50, 0x98, 0xbe, 0x2e, 0xdc, 0x9b, 0x82, 0x0b, 0x61,
0x7f, 0x28, 0x8a, 0xaf, 0x90, 0xde, 0xe2, 0x3f, 0x09, 0xe0, 0xca, 0x40, 0x73, 0x1b, 0xbd, 0x6d,
0xac, 0x6e, 0x7c, 0x4e, 0xb4, 0x56, 0x7c, 0x0a, 0x0a, 0x4d, 0x4d, 0xb1, 0xda, 0x6d, 0xd3, 0x95,
0xa9, 0xbf, 0x88, 0x04, 0x84, 0x55, 0x30, 0xd5, 0xe2, 0x23, 0x9e, 0x7f, 0x74, 0x25, 0x91, 0xba,
0x62, 0xca, 0x90, 0x00, 0x16, 0xbf, 0x37, 0x13, 0xd5, 0x63, 0x09, 0x77, 0xdb, 0xee, 0xb1, 0x81,
0xbd, 0x43, 0xa7, 0x85, 0x5f, 0x7a, 0xeb, 0xdb, 0x05, 0x67, 0x6c, 0x3a, 0x60, 0x74, 0x80, 0x83,
0x3d, 0xd7, 0xa6, 0x26, 0x37, 0xff, 0x68, 0x2d, 0x91, 0xd6, 0x24, 0x45, 0xad, 0xb2, 0xa6, 0x1a,
0xa5, 0x04, 0x4f, 0xdb, 0x91, 0x5f, 0x92, 0x05, 0x4e, 0x71, 0x46, 0x34, 0x05, 0x99, 0xa1, 0x6c,
0x3e, 0xf8, 0xcf, 0xb0, 0x21, 0xb9, 0x0b, 0x04, 0x76, 0xff, 0xef, 0x22, 0x02, 0xa7, 0xa3, 0x02,
0x48, 0xcb, 0xe0, 0x72, 0x49, 0x6d, 0x54, 0xf5, 0x2d, 0x54, 0x53, 0xcd, 0x8a, 0x5e, 0x42, 0xcd,
0xba, 0xd1, 0x50, 0x15, 0x6d, 0x5d, 0x53, 0x4b, 0x62, 0x4e, 0x5a, 0x00, 0xd2, 0x70, 0xb7, 0xdc,
0x34, 0x75, 0x51, 0x90, 0x0a, 0xe0, 0xc2, 0x70, 0x7b, 0x4d, 0xae, 0x37, 0xe5, 0xaa, 0x98, 0x2f,
0x62, 0x00, 0x06, 0xac, 0xa5, 0x25, 0x70, 0x89, 0xc3, 0x99, 0x5b, 0x0d, 0x75, 0x84, 0xf8, 0x55,
0xb0, 0x18, 0xed, 0xd4, 0xea, 0x86, 0x29, 0x57, 0xab, 0xc8, 0x50, 0xa0, 0xd6, 0x30, 0x45, 0x41,
0x5a, 0x04, 0x0b, 0xd1, 0x7e, 0xb9, 0x26, 0x7f, 0xa4, 0xd7, 0x91, 0xaa, 0x18, 0x62, 0xbe, 0xf8,
0xc9, 0x34, 0xb8, 0x35, 0x18, 0xbf, 0xe2, 0x61, 0x2b, 0xc0, 0xe1, 0xaf, 0x63, 0xc5, 0xed, 0xec,
0x38, 0xbb, 0x2f, 0xbd, 0x5d, 0xba, 0xe0, 0x4c, 0x8b, 0x8e, 0x74, 0xd8, 0x2e, 0x9f, 0x66, 0x30,
0x98, 0x64, 0x85, 0xad, 0xb2, 0xbf, 0x43, 0xfb, 0x6c, 0x45, 0x7e, 0x15, 0xff, 0x40, 0x00, 0xa7,
0xa3, 0xdd, 0xc4, 0x7a, 0x14, 0xbd, 0xbe, 0xae, 0x95, 0xe3, 0xad, 0x67, 0xac, 0x5b, 0xde, 0x34,
0x90, 0xaa, 0x3c, 0x42, 0x86, 0x51, 0x13, 0x05, 0x32, 0xff, 0xf1, 0xdd, 0xaa, 0xa6, 0xa8, 0x62,
0x3e, 0x1e, 0x1d, 0x96, 0x0c, 0x6a, 0x02, 0x53, 0xd2, 0x65, 0x70, 0x31, 0x06, 0x7d, 0xc3, 0x10,
0xa7, 0x8b, 0xff, 0x22, 0x80, 0x6b, 0x31, 0xf1, 0x92, 0xef, 0x0b, 0x5e, 0x7a, 0xc7, 0xff, 0x3f,
0xf3, 0xd1, 0xc5, 0x11, 0x0e, 0x9f, 0xcd, 0x5c, 0xcf, 0xc3, 0x35, 0xb3, 0x6a, 0xbc, 0xf4, 0x3a,
0xf8, 0xff, 0x79, 0xf0, 0x30, 0xea, 0x20, 0xfd, 0xfd, 0xc0, 0xed, 0x92, 0x30, 0x78, 0x88, 0x4b,
0x8e, 0x87, 0x5b, 0x81, 0xeb, 0x1d, 0x9b, 0xae, 0xdb, 0xf6, 0xb5, 0x8e, 0x1f, 0x58, 0x9f, 0x83,
0x6c, 0xe0, 0x3b, 0x79, 0xb0, 0x9a, 0xa6, 0x90, 0xbe, 0x89, 0xbc, 0xf4, 0xda, 0xf8, 0xa3, 0x3c,
0xb8, 0x33, 0xd0, 0x86, 0xdc, 0x0b, 0xdc, 0xf0, 0xef, 0x48, 0x0a, 0xf9, 0xd2, 0x47, 0x90, 0xbb,
0xe0, 0x6c, 0x7c, 0x3a, 0x3d, 0xef, 0x0d, 0xa7, 0xd1, 0xdf, 0xcc, 0x83, 0x9b, 0x03, 0x75, 0xa9,
0xca, 0x23, 0xba, 0x6a, 0x3a, 0x9f, 0xa7, 0xbd, 0xe8, 0x3f, 0x0a, 0xe0, 0xf2, 0x68, 0xc6, 0x45,
0x02, 0xd5, 0xe7, 0x6c, 0xe0, 0x2c, 0x73, 0xa8, 0xbb, 0xf6, 0xcb, 0xef, 0x23, 0x7e, 0x2e, 0x80,
0xab, 0xa3, 0x03, 0x97, 0xbb, 0x5d, 0x92, 0x66, 0x7f, 0x0e, 0x92, 0x88, 0x6f, 0xe7, 0xc1, 0xfd,
0x09, 0x49, 0x84, 0x26, 0xd7, 0x1a, 0x6e, 0xdb, 0x69, 0x1d, 0xbf, 0xf4, 0x8a, 0xf8, 0x77, 0x01,
0x14, 0x07, 0x8a, 0x68, 0x78, 0x4e, 0xa7, 0xe5, 0x74, 0xad, 0xb6, 0xff, 0xf9, 0x09, 0x96, 0xff,
0x2c, 0x80, 0xe5, 0x81, 0x06, 0x4c, 0xec, 0x07, 0xfc, 0xe0, 0xed, 0xf3, 0xe0, 0xf7, 0xff, 0x41,
0x00, 0x85, 0x88, 0x17, 0xe0, 0x17, 0x2f, 0xf6, 0x4b, 0x3f, 0xee, 0x25, 0xe2, 0xf5, 0xb9, 0xb7,
0xc7, 0x47, 0xd0, 0x6d, 0x47, 0x2f, 0x87, 0xfe, 0x82, 0x5a, 0xc4, 0x50, 0xaf, 0x61, 0x1d, 0x46,
0x2f, 0x3b, 0x6e, 0x82, 0x33, 0x24, 0x43, 0xb0, 0x2d, 0xcf, 0x46, 0x3d, 0x1f, 0xb3, 0xcb, 0x84,
0x59, 0x78, 0x3a, 0x6c, 0x6c, 0xfa, 0xd8, 0x96, 0x96, 0xc0, 0xdc, 0xb1, 0x75, 0xd0, 0x66, 0x00,
0x79, 0x0a, 0x30, 0x4b, 0x1a, 0x68, 0xe7, 0x1d, 0x70, 0xf6, 0xc0, 0xb5, 0x31, 0x3a, 0xda, 0xc3,
0x1d, 0xe4, 0x5b, 0x87, 0xd8, 0xe6, 0xf7, 0x2e, 0x67, 0x48, 0xf3, 0xe6, 0x1e, 0xee, 0x10, 0x96,
0xb6, 0x24, 0x83, 0xe5, 0x1d, 0x07, 0xb7, 0x6d, 0x1f, 0x1d, 0x39, 0xc1, 0x1e, 0x6a, 0xb9, 0x9d,
0x43, 0xec, 0xf9, 0x8e, 0xdb, 0x41, 0xf4, 0xac, 0xdf, 0x2f, 0x4c, 0x5f, 0x9f, 0xba, 0x37, 0x07,
0x17, 0x19, 0xd0, 0xa6, 0x13, 0xec, 0x29, 0x7d, 0x10, 0x95, 0x42, 0x14, 0x6f, 0x90, 0xed, 0xe2,
0xf0, 0x58, 0x49, 0x72, 0xd3, 0x8e, 0x8c, 0xf8, 0x55, 0xb0, 0x32, 0x02, 0xf2, 0xcc, 0xc1, 0x47,
0x25, 0xb7, 0xd5, 0x3b, 0xc0, 0x9d, 0xc0, 0x1a, 0x3e, 0x5e, 0x2b, 0xfe, 0x58, 0x00, 0x17, 0x65,
0xdf, 0x77, 0xc8, 0x4a, 0xa1, 0x06, 0xd3, 0x5f, 0x29, 0x77, 0xc1, 0x59, 0x2e, 0x21, 0xc5, 0x41,
0xfd, 0x6b, 0x96, 0xf9, 0x68, 0xb3, 0x66, 0x4b, 0x37, 0xc0, 0xe9, 0xc0, 0x0d, 0xac, 0x36, 0x0a,
0xdc, 0x7d, 0xdc, 0x61, 0xd7, 0x08, 0x53, 0xf0, 0x14, 0x6d, 0x33, 0x69, 0x13, 0xd1, 0x71, 0xd7,
0x73, 0x0f, 0xba, 0x41, 0x08, 0x33, 0x45, 0x61, 0x4e, 0xb3, 0x46, 0x0e, 0xf4, 0x0a, 0x38, 0xd7,
0xea, 0xcb, 0x10, 0x02, 0xb2, 0x2c, 0x4f, 0x1c, 0x74, 0x30, 0xe0, 0xe2, 0x5f, 0x09, 0xe0, 0x02,
0x93, 0x5b, 0xfd, 0x18, 0xb7, 0x7a, 0x9f, 0x42, 0xec, 0x65, 0x00, 0x3a, 0x64, 0xd6, 0x58, 0x36,
0xc9, 0x84, 0x9e, 0x23, 0x2d, 0x34, 0x91, 0x1c, 0x1b, 0xd5, 0x54, 0x86, 0x51, 0x4d, 0x67, 0x1d,
0xd5, 0x4c, 0xc2, 0xa8, 0x9e, 0x80, 0x45, 0x36, 0xa8, 0x3a, 0x3e, 0x52, 0x22, 0xe2, 0xf6, 0xef,
0xc6, 0x5a, 0x56, 0x80, 0x77, 0x5d, 0xef, 0x38, 0xbc, 0x1b, 0x0b, 0x7f, 0x17, 0xff, 0x58, 0x00,
0xe7, 0x19, 0xaa, 0x4c, 0xaf, 0x6e, 0x21, 0xfe, 0x5a, 0x0f, 0xfb, 0xd4, 0xba, 0xc3, 0xd5, 0xc6,
0xce, 0xea, 0x18, 0xe2, 0xe9, 0xb0, 0x91, 0x1e, 0x7e, 0xfd, 0x42, 0x66, 0xf0, 0x13, 0x01, 0x9c,
0x0e, 0x25, 0x26, 0xcd, 0xd2, 0x02, 0x38, 0x61, 0xd1, 0xbf, 0xb8, 0x8c, 0xfc, 0xd7, 0x2f, 0x46,
0xba, 0x5b, 0x40, 0x62, 0x8a, 0xac, 0x3a, 0x7e, 0x90, 0x78, 0xdb, 0xf8, 0x0d, 0x50, 0x88, 0x42,
0x1d, 0x6c, 0x47, 0x6e, 0x26, 0x25, 0x30, 0x1d, 0xb9, 0xc5, 0xa4, 0x7f, 0x4b, 0x3a, 0x38, 0x7b,
0x40, 0xa1, 0xfc, 0x3d, 0xa7, 0x8b, 0xf6, 0x9d, 0x0e, 0x73, 0x26, 0xf3, 0x8f, 0xee, 0x0c, 0x1c,
0x5f, 0xe4, 0xea, 0xfd, 0xf0, 0xe1, 0x6a, 0xad, 0x0f, 0xbe, 0xe1, 0x74, 0x6c, 0x38, 0x7f, 0x30,
0xf4, 0xbb, 0xf8, 0x15, 0x20, 0x0e, 0x04, 0x60, 0x8b, 0x5e, 0x2a, 0x8f, 0xb9, 0xfa, 0x64, 0xb7,
0x3a, 0x3e, 0xc6, 0x81, 0xb3, 0x1f, 0x26, 0xde, 0xec, 0xda, 0x9f, 0x1d, 0xf1, 0x12, 0x26, 0xa1,
0xea, 0xc5, 0x11, 0xff, 0x13, 0x01, 0x2c, 0x8c, 0x4e, 0xcc, 0x0b, 0xd6, 0x8e, 0xf4, 0x51, 0x38,
0x97, 0xa8, 0x4f, 0x2f, 0x2d, 0x22, 0x26, 0xd9, 0x4a, 0x38, 0xad, 0xb5, 0x49, 0xf2, 0xbf, 0xe0,
0x09, 0xf8, 0x2f, 0x97, 0xff, 0x05, 0xcf, 0xf1, 0x67, 0x2a, 0xff, 0x6f, 0xe5, 0xa3, 0xf2, 0x97,
0x3d, 0xab, 0x13, 0xf8, 0xa6, 0xdb, 0xf4, 0xb1, 0x27, 0xad, 0x82, 0xf3, 0x34, 0x62, 0x20, 0xcf,
0x6d, 0x63, 0x1f, 0xed, 0x92, 0x3e, 0x9e, 0x34, 0xcc, 0xc0, 0x73, 0xb4, 0x8b, 0xc4, 0x5c, 0xbf,
0xcc, 0x3a, 0x48, 0xd0, 0x67, 0xf0, 0x4e, 0x67, 0x0f, 0x7b, 0x0e, 0xbd, 0x18, 0x1c, 0xc2, 0x9c,
0xa2, 0x98, 0x8b, 0x14, 0x48, 0x0b, 0x61, 0x86, 0x48, 0xbc, 0x0e, 0x2e, 0x30, 0x12, 0x81, 0x67,
0x39, 0xc1, 0x00, 0x33, 0x4f, 0x31, 0x25, 0xda, 0x67, 0xd2, 0xae, 0x10, 0x43, 0x01, 0x57, 0x47,
0x99, 0x8e, 0xe0, 0x4e, 0x53, 0xdc, 0xa5, 0x61, 0xae, 0xc3, 0x44, 0x96, 0xc0, 0x5c, 0xcf, 0xc7,
0x1e, 0xa2, 0x5e, 0x6c, 0x66, 0x50, 0x8b, 0x51, 0xb7, 0x0e, 0x70, 0xf1, 0x87, 0x53, 0x51, 0x0d,
0x41, 0x7c, 0xe8, 0xe0, 0xa3, 0x17, 0xbd, 0xc2, 0x9e, 0x80, 0xcb, 0xb6, 0x75, 0xec, 0xa3, 0xae,
0xe5, 0x07, 0xa8, 0x83, 0x3f, 0x0e, 0x90, 0xd5, 0xb3, 0x9d, 0x00, 0x91, 0x75, 0xc0, 0x07, 0x7f,
0x91, 0x00, 0x34, 0x2c, 0x12, 0x30, 0x3f, 0x0e, 0x64, 0xd2, 0x5b, 0x22, 0x22, 0xac, 0x83, 0x6b,
0x11, 0x3f, 0xeb, 0xe1, 0xaf, 0xf5, 0x1c, 0x0f, 0x93, 0xf4, 0xc7, 0x47, 0xad, 0x3d, 0xab, 0xb3,
0xcb, 0xd5, 0x3e, 0x0b, 0x97, 0x07, 0x60, 0x30, 0x02, 0xa5, 0x30, 0x20, 0xe9, 0x09, 0x28, 0x78,
0x74, 0x68, 0x68, 0x87, 0x10, 0xc1, 0x9d, 0xd6, 0x71, 0x9f, 0xc0, 0x34, 0x25, 0xb0, 0xc0, 0xfa,
0xd7, 0xc3, 0xee, 0x10, 0xf3, 0x3d, 0xb0, 0xc4, 0x31, 0x6d, 0xeb, 0x18, 0xb9, 0x3b, 0xe8, 0xc0,
0xed, 0x90, 0x9c, 0x8f, 0x23, 0xcf, 0x50, 0xe4, 0x4b, 0x0c, 0xa4, 0x64, 0x1d, 0xeb, 0x3b, 0x35,
0xd2, 0x1f, 0x62, 0xbf, 0x0d, 0x2e, 0x77, 0x7a, 0xd4, 0xb6, 0xdd, 0x1d, 0xe4, 0xe1, 0x03, 0xf7,
0x10, 0xdb, 0x88, 0x8b, 0x5a, 0x38, 0x41, 0x47, 0xbe, 0xc0, 0x00, 0xf4, 0x1d, 0xc8, 0xba, 0x79,
0xa0, 0x28, 0xfe, 0xaa, 0x30, 0x3e, 0x31, 0x2f, 0x7a, 0xe9, 0x3d, 0x04, 0x17, 0x59, 0x94, 0x42,
0x24, 0x4c, 0x21, 0x3e, 0x50, 0xc7, 0xe6, 0xa5, 0x2b, 0x92, 0x35, 0xc2, 0x5f, 0xb3, 0x8b, 0xdf,
0x15, 0xc0, 0xe5, 0x48, 0x59, 0x04, 0xbb, 0xd8, 0x4e, 0x8a, 0xab, 0xd2, 0x1a, 0x98, 0x8e, 0x04,
0xc7, 0xd5, 0x44, 0x29, 0xc7, 0x28, 0xd2, 0x20, 0x49, 0x71, 0x87, 0xcd, 0x77, 0x6a, 0xc4, 0x7c,
0x5d, 0xb2, 0x2b, 0x18, 0xc3, 0xa6, 0xe5, 0x35, 0x2c, 0xd7, 0xaa, 0x8f, 0xe9, 0xea, 0x51, 0x76,
0x29, 0x62, 0x22, 0x92, 0x07, 0xae, 0xc7, 0x30, 0x0c, 0x37, 0x69, 0x9f, 0x0d, 0xcf, 0xaf, 0x83,
0xa5, 0x98, 0x21, 0xf6, 0x2b, 0x96, 0x2a, 0x60, 0xba, 0xe5, 0xda, 0x61, 0x29, 0xd4, 0xe3, 0xec,
0xac, 0x18, 0xbe, 0xe2, 0xda, 0x18, 0x52, 0x0a, 0x09, 0xa5, 0x4b, 0xdf, 0xcc, 0x83, 0x2b, 0xb1,
0x4a, 0xc6, 0xdd, 0xcf, 0x64, 0xbc, 0xc4, 0x6a, 0xfc, 0x00, 0x77, 0x9f, 0xdf, 0x6a, 0x88, 0x48,
0x90, 0xe2, 0x4a, 0xd5, 0x91, 0x1d, 0xe9, 0xe3, 0xe7, 0xa3, 0x32, 0x7e, 0x34, 0x75, 0x33, 0x4e,
0x05, 0xec, 0x44, 0x42, 0xef, 0xe2, 0xce, 0x2f, 0xaf, 0x26, 0x36, 0xc0, 0x49, 0x9f, 0xc9, 0x49,
0x55, 0x31, 0x3f, 0x21, 0xae, 0x26, 0x0d, 0x10, 0x86, 0x14, 0x8a, 0xdf, 0xca, 0x83, 0xdb, 0x31,
0x8a, 0x58, 0x27, 0x3b, 0xdd, 0xcf, 0x74, 0x11, 0xbc, 0x10, 0x55, 0xa8, 0x60, 0x86, 0xee, 0xc9,
0xb9, 0x22, 0x1e, 0x64, 0x27, 0x42, 0x07, 0x08, 0x19, 0x76, 0xf1, 0xdf, 0x84, 0x04, 0x27, 0x40,
0xf6, 0x9c, 0xdd, 0xe3, 0x5f, 0xde, 0xf1, 0xaf, 0x83, 0x69, 0xba, 0x77, 0x64, 0xc3, 0x7f, 0x0e,
0x79, 0xc8, 0xd0, 0x68, 0x65, 0x07, 0xc5, 0x2f, 0xfe, 0xb9, 0x00, 0x6e, 0xc4, 0x28, 0xa0, 0xea,
0x74, 0xf6, 0x23, 0x07, 0x32, 0xbf, 0x8c, 0x1a, 0x90, 0xc0, 0x74, 0xdb, 0xe9, 0xec, 0xf3, 0x38,
0x42, 0xff, 0x2e, 0xfe, 0xad, 0x00, 0xce, 0xf7, 0xcb, 0x91, 0x69, 0xea, 0xd3, 0x3f, 0x50, 0x4a,
0xdf, 0x72, 0x47, 0x2e, 0xb4, 0x90, 0xeb, 0x39, 0xbb, 0x4e, 0x87, 0x3b, 0xcf, 0xfe, 0x85, 0x96,
0x4e, 0x5b, 0xa5, 0xdb, 0x60, 0xbe, 0xd5, 0x76, 0x7b, 0x36, 0xea, 0x7a, 0xee, 0xa1, 0x63, 0x63,
0x2f, 0x3c, 0x5b, 0xa2, 0xad, 0x0d, 0xde, 0x28, 0xe9, 0x60, 0xd6, 0xe6, 0x27, 0xdf, 0x34, 0x33,
0x39, 0xf5, 0xe8, 0x8d, 0xd4, 0xb3, 0x34, 0x6c, 0x87, 0x87, 0xe5, 0x03, 0xad, 0x85, 0x44, 0x8a,
0xcf, 0xc0, 0x62, 0x32, 0x9c, 0x74, 0x09, 0x9c, 0xb4, 0xb7, 0xa3, 0xa3, 0x3b, 0x61, 0x6f, 0xd3,
0x71, 0x5d, 0x03, 0xa7, 0xec, 0x6d, 0x44, 0x6b, 0xc6, 0x5b, 0x6e, 0x9b, 0x8f, 0x09, 0xd8, 0xdb,
0x0d, 0xde, 0x52, 0xfc, 0x99, 0x00, 0x16, 0xd7, 0xb1, 0x15, 0xf4, 0x3c, 0x0c, 0x71, 0xcb, 0x3d,
0x38, 0xc0, 0x1d, 0x3b, 0x72, 0xc6, 0x31, 0x14, 0xb5, 0x85, 0xe1, 0xa8, 0x2d, 0xbd, 0x03, 0x4e,
0xee, 0x30, 0x54, 0x3e, 0x99, 0xd7, 0x13, 0xc7, 0x18, 0xb2, 0x08, 0x11, 0xa4, 0x8f, 0xc1, 0x32,
0xff, 0x13, 0x79, 0x43, 0x7c, 0x51, 0xc4, 0xdf, 0x4f, 0x0a, 0x83, 0xb1, 0x42, 0x73, 0x7f, 0xbf,
0xb4, 0x93, 0xdc, 0x59, 0x3c, 0x02, 0x17, 0x4c, 0xb9, 0xcc, 0x8e, 0xa9, 0xf0, 0x87, 0x3d, 0xec,
0xf1, 0x95, 0x7e, 0x0d, 0xb0, 0x33, 0x0c, 0xd4, 0x71, 0x6d, 0xcc, 0xca, 0x86, 0xa7, 0x20, 0xa0,
0x4d, 0x75, 0xd2, 0x32, 0x00, 0xc0, 0xf6, 0x2e, 0x0e, 0xcf, 0x3d, 0x18, 0x80, 0x4a, 0x5a, 0xa4,
0x65, 0x00, 0x1c, 0x1f, 0xf9, 0x3d, 0x9a, 0x6e, 0xf1, 0x8c, 0x76, 0xce, 0xf1, 0x0d, 0xd6, 0x50,
0xfc, 0xfb, 0x29, 0x70, 0x89, 0xe5, 0x71, 0x65, 0xcf, 0xea, 0xee, 0xc9, 0x9b, 0x86, 0xd1, 0xb2,
0x3a, 0x61, 0x59, 0xdd, 0x79, 0x4e, 0xbb, 0xf5, 0x08, 0x39, 0xfc, 0x8e, 0x94, 0x09, 0x31, 0x0d,
0xcf, 0x31, 0x1e, 0xad, 0xfe, 0xe5, 0x69, 0x44, 0x16, 0x32, 0x19, 0x4c, 0x96, 0x69, 0x2e, 0x0b,
0xd9, 0x16, 0xf9, 0x83, 0x53, 0x9a, 0x5d, 0xcf, 0xed, 0x75, 0x99, 0x34, 0xd3, 0xfc, 0x94, 0xa6,
0x4c, 0x9b, 0x06, 0x34, 0xe8, 0x06, 0x88, 0x9a, 0x69, 0x48, 0x83, 0xee, 0x77, 0x88, 0xad, 0x33,
0x80, 0xae, 0xdb, 0x76, 0x5a, 0x0e, 0x66, 0x07, 0x65, 0xd3, 0xf0, 0x0c, 0x6d, 0x6d, 0xf0, 0x46,
0xe9, 0x55, 0x20, 0x71, 0xd9, 0xf7, 0x7d, 0xd4, 0x6a, 0xf7, 0xfc, 0x20, 0x4c, 0x8b, 0xa7, 0xa1,
0xc8, 0x44, 0xdf, 0xf7, 0x15, 0xde, 0x3e, 0x18, 0xa9, 0x67, 0xfb, 0x91, 0x91, 0x9e, 0x8c, 0x8c,
0x14, 0xda, 0xfe, 0x60, 0xa4, 0xf7, 0x00, 0xa3, 0x81, 0xfc, 0x37, 0xd0, 0x76, 0xaf, 0xb5, 0x8f,
0x03, 0xbf, 0x30, 0x4b, 0x81, 0x99, 0x70, 0xc6, 0x1b, 0x6b, 0xac, 0x95, 0xec, 0xcb, 0x38, 0xa4,
0x75, 0xd0, 0xee, 0xaf, 0x4f, 0xbf, 0x30, 0x47, 0xa1, 0x99, 0x8c, 0x86, 0x75, 0xd0, 0x0e, 0x17,
0x69, 0x04, 0xc3, 0x75, 0xec, 0x56, 0x04, 0x03, 0x44, 0x30, 0x74, 0xc7, 0x6e, 0x0d, 0x30, 0xfa,
0x2a, 0xb1, 0x5a, 0x74, 0xaf, 0xe6, 0x17, 0x4e, 0x45, 0x54, 0x22, 0xf3, 0xc6, 0xe2, 0x0f, 0x05,
0x70, 0xab, 0xa9, 0x45, 0x26, 0x5b, 0xf1, 0xdc, 0xa3, 0xce, 0x53, 0x7c, 0x84, 0xdb, 0x25, 0x67,
0x67, 0xe7, 0x99, 0x83, 0x8f, 0xd8, 0xbc, 0x3f, 0x01, 0x05, 0x6b, 0x67, 0x67, 0xb8, 0x40, 0x15,
0x45, 0x6a, 0xe2, 0xe7, 0xe0, 0x42, 0xd8, 0xdf, 0xaf, 0xe2, 0x66, 0x67, 0xf5, 0x8f, 0xc1, 0xc2,
0x38, 0x66, 0xe4, 0x05, 0xc2, 0x85, 0x51, 0x3c, 0x5a, 0xc6, 0xb7, 0x0e, 0xae, 0x18, 0xb8, 0xd5,
0xf3, 0x9c, 0xe0, 0x18, 0xd2, 0x65, 0x55, 0xc6, 0x01, 0xc4, 0x7e, 0xaf, 0xcd, 0xf3, 0xec, 0xb8,
0x53, 0x32, 0x09, 0x4c, 0x93, 0x6d, 0x1d, 0xdf, 0xe2, 0xd1, 0xbf, 0x8b, 0x16, 0x38, 0xdf, 0x2f,
0x02, 0x5b, 0xc7, 0x41, 0x6b, 0x8f, 0xa1, 0x8f, 0x7b, 0x47, 0x21, 0xce, 0x3b, 0x8e, 0xb9, 0xe4,
0xfc, 0xb8, 0x4b, 0x2e, 0x7e, 0x5f, 0x00, 0x12, 0xb1, 0x65, 0xd3, 0xf2, 0xf7, 0xc9, 0xd2, 0xc5,
0x7d, 0x8f, 0x14, 0x58, 0xfe, 0x7e, 0xd4, 0xd9, 0xcd, 0x92, 0x86, 0xf0, 0xb5, 0x85, 0xe3, 0xfb,
0xbd, 0x21, 0xaa, 0x73, 0xb4, 0x85, 0x76, 0x5f, 0x00, 0x33, 0xc4, 0xbb, 0x84, 0xfb, 0x0f, 0xf6,
0x83, 0xf8, 0xfe, 0xbe, 0x1d, 0x46, 0x8a, 0x19, 0x66, 0xe0, 0x7c, 0xbf, 0x99, 0x15, 0x33, 0xfc,
0xc6, 0x07, 0xe0, 0x6c, 0x93, 0x78, 0x21, 0x2a, 0x89, 0xde, 0xc1, 0xfa, 0x8e, 0xd4, 0x04, 0x67,
0x7b, 0x0e, 0xda, 0xa6, 0x2f, 0x71, 0x50, 0x8b, 0x44, 0xcd, 0xd4, 0xbd, 0xdc, 0xf8, 0xc3, 0x9d,
0x4a, 0x0e, 0x9e, 0xe9, 0x39, 0x91, 0x56, 0xe9, 0x13, 0x01, 0xdc, 0xef, 0x39, 0xc8, 0x65, 0x0f,
0x53, 0x10, 0x3f, 0x0f, 0xc5, 0x68, 0xd7, 0x45, 0x81, 0x8b, 0xec, 0xf0, 0xe5, 0x0e, 0xe7, 0xc8,
0x72, 0x63, 0x79, 0x02, 0xc7, 0x6c, 0xcf, 0x7f, 0x2a, 0x39, 0x78, 0xb3, 0xe7, 0xa4, 0xc2, 0x4a,
0xdf, 0x11, 0xc0, 0xcd, 0x88, 0x74, 0x96, 0x6d, 0xa3, 0x1d, 0xc7, 0xa3, 0x5b, 0x4f, 0x3e, 0xab,
0x4c, 0x2e, 0x16, 0xf9, 0xde, 0x4b, 0x97, 0x2b, 0xf9, 0x39, 0x51, 0x25, 0x07, 0xaf, 0xf6, 0x45,
0x8a, 0x05, 0x1b, 0xd5, 0x55, 0x8c, 0x34, 0x6d, 0x2b, 0xe8, 0xcf, 0xce, 0x4c, 0x56, 0x5d, 0xa5,
0xbc, 0x5d, 0x1a, 0xd2, 0x55, 0x32, 0xac, 0xf4, 0xbf, 0x05, 0x70, 0x3d, 0x22, 0x9d, 0x8f, 0x03,
0xd4, 0xea, 0x3f, 0x73, 0x42, 0x3e, 0x7d, 0x61, 0x44, 0x9d, 0xe5, 0xa9, 0x47, 0xef, 0xa4, 0x0b,
0x95, 0xf4, 0x48, 0xaa, 0x92, 0x83, 0x57, 0xfa, 0xd2, 0xc4, 0x00, 0x49, 0x3f, 0x10, 0xc0, 0xad,
0x88, 0x18, 0x1e, 0x2f, 0x69, 0x44, 0xad, 0xf0, 0xad, 0x53, 0x28, 0xca, 0x49, 0x2a, 0xca, 0x97,
0xd2, 0x45, 0x99, 0xf4, 0x5a, 0xaa, 0x92, 0x83, 0xd7, 0xfb, 0xe2, 0x24, 0x00, 0x86, 0x9a, 0xf1,
0xf8, 0xfb, 0x23, 0x44, 0xf6, 0xae, 0x64, 0x01, 0xb2, 0xf7, 0x4f, 0x7c, 0xba, 0x66, 0x53, 0x35,
0x93, 0xf2, 0x7a, 0x8a, 0x69, 0x26, 0x19, 0x48, 0xfa, 0x18, 0x5c, 0x89, 0x93, 0xa2, 0x7b, 0xcc,
0x25, 0x98, 0xa3, 0x12, 0x7c, 0x21, 0xbb, 0x04, 0xd1, 0xe7, 0x57, 0x95, 0x1c, 0x2c, 0x8c, 0x71,
0xe7, 0x00, 0xd2, 0xff, 0x00, 0xcb, 0xe3, 0x9c, 0xbb, 0x9e, 0xd3, 0x09, 0x38, 0x6b, 0x40, 0x59,
0xbf, 0x95, 0x95, 0xf5, 0xc8, 0xe3, 0xad, 0x4a, 0x0e, 0x5e, 0x1e, 0xe1, 0x3d, 0x80, 0x90, 0xda,
0xe0, 0x72, 0xcf, 0x41, 0x36, 0x77, 0xe2, 0x24, 0xeb, 0xf2, 0x48, 0x28, 0xa1, 0xc4, 0x69, 0x50,
0x3b, 0x35, 0x61, 0x63, 0x15, 0xff, 0x04, 0xaa, 0x92, 0x83, 0x0b, 0x3d, 0x27, 0xf6, 0x71, 0xd4,
0x77, 0x98, 0xf9, 0xf5, 0xd9, 0x0d, 0x62, 0x5d, 0x58, 0x07, 0xc6, 0x39, 0x9f, 0xa6, 0x9c, 0xdf,
0xce, 0xc0, 0x39, 0xfe, 0x55, 0x13, 0xb3, 0xbc, 0x94, 0x97, 0x4f, 0xdf, 0xa0, 0x86, 0xd7, 0x17,
0x86, 0xd7, 0xce, 0xfb, 0xac, 0x0c, 0x9e, 0x0b, 0x72, 0x86, 0x0a, 0xf2, 0xe6, 0xa7, 0x2a, 0xa2,
0x67, 0x36, 0x37, 0xe1, 0xd1, 0xc3, 0xff, 0x65, 0x0e, 0x74, 0x20, 0x01, 0x4f, 0xe8, 0x07, 0xeb,
0x92, 0x09, 0x31, 0x4f, 0x85, 0x78, 0x92, 0x45, 0x88, 0xb8, 0x5a, 0xe5, 0x4a, 0x0e, 0x5e, 0x8b,
0xc8, 0x11, 0x5b, 0xce, 0xfc, 0xeb, 0xcc, 0x7b, 0x8e, 0x8b, 0xd2, 0x0a, 0xcb, 0x54, 0xd0, 0x41,
0xd0, 0xf6, 0xb9, 0x40, 0x67, 0xa9, 0x40, 0x5f, 0x7c, 0x0e, 0x81, 0xc6, 0xab, 0x87, 0x2b, 0x39,
0x78, 0x6b, 0x5c, 0xaa, 0x01, 0x5c, 0xd0, 0xe6, 0x05, 0x94, 0x7f, 0x2a, 0x80, 0x27, 0xc3, 0xf3,
0x44, 0x6b, 0x4f, 0x91, 0x45, 0x8b, 0x4f, 0x91, 0x1d, 0x56, 0x9f, 0xa2, 0xc0, 0x75, 0xdb, 0x3c,
0x99, 0x6c, 0xb7, 0xb9, 0xa4, 0x22, 0x95, 0xf4, 0x69, 0xa6, 0xf9, 0xcb, 0x54, 0xe3, 0x5b, 0xc9,
0xc1, 0x87, 0xd1, 0x49, 0xcd, 0x56, 0x18, 0xfc, 0x13, 0x01, 0x3c, 0xce, 0x34, 0x86, 0x81, 0xba,
0x99, 0xfc, 0xe7, 0xa8, 0xfc, 0xe5, 0x4f, 0x2d, 0xff, 0x70, 0x95, 0x51, 0x25, 0x07, 0x57, 0xd3,
0x84, 0x1f, 0xa9, 0x4b, 0xfa, 0x4d, 0x01, 0xbc, 0x12, 0x95, 0xdc, 0xea, 0x91, 0xcc, 0xa3, 0xbf,
0x07, 0x8d, 0xbc, 0xa7, 0x62, 0x02, 0x4b, 0x54, 0xe0, 0xf7, 0x33, 0x08, 0x3c, 0xa9, 0x6a, 0xb6,
0x92, 0x83, 0x77, 0x06, 0x82, 0x4e, 0xac, 0xaf, 0xfd, 0x43, 0x01, 0x3c, 0x48, 0xb1, 0x5c, 0xc7,
0x3a, 0x60, 0x9b, 0x97, 0x63, 0x2e, 0xe4, 0x79, 0x2a, 0xe4, 0xda, 0xa7, 0xb1, 0xdf, 0xe1, 0xc2,
0xb5, 0x4a, 0x0e, 0xde, 0x9f, 0x60, 0xc4, 0x9a, 0x75, 0x10, 0xad, 0x72, 0xfb, 0x15, 0x01, 0xdc,
0x89, 0x8a, 0xda, 0xed, 0x17, 0x83, 0x8d, 0xcd, 0xfb, 0x05, 0x2a, 0xe1, 0xbb, 0x19, 0x24, 0x4c,
0xaa, 0x28, 0xab, 0xe4, 0x60, 0x71, 0x20, 0x5a, 0x62, 0xdd, 0xd9, 0xb7, 0x04, 0x70, 0x23, 0x2a,
0x53, 0x80, 0xfd, 0x80, 0x48, 0xd3, 0x19, 0xf2, 0xc7, 0x17, 0x53, 0xa3, 0xdf, 0x84, 0xf2, 0xae,
0x4a, 0x0e, 0x2e, 0x0f, 0x24, 0x89, 0xab, 0xff, 0xf2, 0xc0, 0x52, 0x54, 0x86, 0x30, 0xcf, 0x0d,
0xe3, 0xd0, 0x42, 0xca, 0x0d, 0x62, 0x52, 0x7d, 0x15, 0x0b, 0xbb, 0x09, 0xb5, 0x57, 0x6d, 0x50,
0xe8, 0x39, 0x24, 0x09, 0xb3, 0x02, 0x8c, 0x3a, 0xf8, 0x88, 0xee, 0x7f, 0x79, 0xc4, 0xbd, 0x94,
0x72, 0xc0, 0x95, 0x58, 0xd9, 0x54, 0xc9, 0xc1, 0x0b, 0x3d, 0x67, 0xbc, 0x53, 0x3a, 0xa6, 0x41,
0x7e, 0x94, 0x9b, 0x6f, 0x1d, 0x86, 0x2c, 0x0b, 0xa9, 0x1a, 0x9e, 0x50, 0x2e, 0xc5, 0x06, 0x1a,
0x0f, 0x20, 0x7d, 0x03, 0x5c, 0x8b, 0x1b, 0x28, 0xad, 0x50, 0xe2, 0xcc, 0x2f, 0xa7, 0x06, 0x98,
0x89, 0xd5, 0x4d, 0x95, 0x1c, 0x5c, 0x1c, 0x1d, 0xf5, 0x00, 0x44, 0xfa, 0x1d, 0xe6, 0x42, 0x46,
0x25, 0x60, 0xf7, 0x70, 0xd1, 0x0a, 0x28, 0x2e, 0xcd, 0x22, 0x95, 0x46, 0xc9, 0x2a, 0xcd, 0x84,
0x42, 0xaa, 0x4a, 0x0e, 0xde, 0x1e, 0x11, 0x2c, 0x1e, 0x5a, 0xfa, 0x7d, 0x01, 0xac, 0x46, 0x4d,
0xd0, 0x19, 0x1c, 0x3b, 0x22, 0xeb, 0xc8, 0x67, 0x47, 0x03, 0x7c, 0x59, 0x70, 0xab, 0x5c, 0x4a,
0xdd, 0x42, 0x64, 0x7b, 0x79, 0x5c, 0xc9, 0xc1, 0x7b, 0x03, 0x2b, 0x8d, 0xc2, 0x1e, 0xf9, 0xba,
0x63, 0xb7, 0x86, 0x5e, 0x29, 0x7f, 0x57, 0x00, 0xb7, 0xe3, 0x53, 0x06, 0xdb, 0x47, 0x98, 0x1e,
0x90, 0x72, 0xf1, 0xae, 0x64, 0x4e, 0xa1, 0xe2, 0x1f, 0x04, 0x0f, 0xa7, 0x50, 0x7d, 0x18, 0xdb,
0x8f, 0x3e, 0x7f, 0x0d, 0x98, 0x59, 0x93, 0x78, 0x1b, 0xb8, 0x88, 0x95, 0x06, 0xb1, 0x59, 0xe4,
0x52, 0x2c, 0xa7, 0x2e, 0xdd, 0xf8, 0x17, 0xa6, 0xdc, 0xa2, 0xe3, 0x5f, 0x9f, 0x7e, 0x15, 0x9c,
0xb3, 0x68, 0x8d, 0x12, 0x1a, 0x54, 0x08, 0x15, 0xae, 0x52, 0x4e, 0xc9, 0x07, 0xc9, 0xb1, 0xf5,
0x74, 0x95, 0x1c, 0x14, 0xad, 0x91, 0x8e, 0xd0, 0x25, 0x46, 0x4d, 0x80, 0x6b, 0x96, 0xa6, 0xc7,
0x7c, 0x64, 0xd7, 0x52, 0x17, 0xec, 0x84, 0x9b, 0x4c, 0xe6, 0x12, 0x27, 0x5d, 0x75, 0xf2, 0x54,
0x39, 0x46, 0x88, 0xfe, 0x29, 0x00, 0x93, 0xe3, 0x7a, 0xea, 0x3c, 0x4f, 0xbe, 0xe0, 0x64, 0xf3,
0x9c, 0x72, 0x09, 0xfa, 0xbf, 0x04, 0xea, 0x44, 0xc2, 0x7d, 0xe3, 0xd7, 0xa2, 0xdf, 0xd8, 0x08,
0xb7, 0x8c, 0x37, 0xb2, 0xee, 0x5e, 0x93, 0xbe, 0xd0, 0x31, 0xb4, 0x7b, 0x8d, 0x01, 0x92, 0x3e,
0x02, 0x7c, 0xb2, 0x10, 0x0e, 0xcb, 0x0b, 0x0b, 0x45, 0xca, 0xf5, 0xb5, 0x94, 0x69, 0x1f, 0x2e,
0x47, 0xac, 0xe4, 0xe0, 0x59, 0x6b, 0xb8, 0x5d, 0x3a, 0x00, 0x97, 0x38, 0x6d, 0xe2, 0xa0, 0xa2,
0x55, 0x89, 0x85, 0x9b, 0x29, 0x27, 0xf7, 0xc9, 0xc5, 0x81, 0x95, 0x1c, 0xbc, 0x68, 0xc5, 0xf5,
0x4a, 0xdb, 0xe0, 0xe2, 0xe0, 0x94, 0x84, 0x39, 0x46, 0x36, 0x9d, 0xb7, 0x28, 0xb3, 0x57, 0x13,
0x99, 0xc5, 0xdc, 0x6d, 0x54, 0x72, 0xf0, 0xbc, 0x17, 0x73, 0xe5, 0x71, 0x04, 0xae, 0x24, 0x1c,
0xae, 0x33, 0x56, 0xb7, 0x53, 0xc6, 0x95, 0x7c, 0x21, 0x40, 0x1c, 0xfe, 0x4e, 0xf2, 0x75, 0xc1,
0x36, 0xe0, 0xa3, 0x46, 0xbc, 0x20, 0xc1, 0x63, 0x75, 0x8f, 0x85, 0x3b, 0x29, 0x83, 0x8b, 0xa9,
0x95, 0x24, 0x83, 0xb3, 0x62, 0x4a, 0x28, 0xab, 0xe0, 0x4c, 0x9f, 0x07, 0x9d, 0xa5, 0xbb, 0x94,
0xf6, 0xed, 0x54, 0xda, 0x04, 0xb8, 0x92, 0x83, 0xa7, 0xad, 0x68, 0x95, 0xe3, 0x16, 0x90, 0xa2,
0xb5, 0x13, 0x6c, 0x46, 0x0a, 0xf7, 0x52, 0x4a, 0xb2, 0x47, 0x8b, 0xfc, 0xa8, 0x37, 0x19, 0x2d,
0xfc, 0x1b, 0x21, 0xdd, 0xa3, 0x05, 0x63, 0x85, 0xfb, 0x99, 0x49, 0xb3, 0x0a, 0xb3, 0x61, 0xd2,
0xbc, 0xea, 0x6c, 0x84, 0xb4, 0x4d, 0x0b, 0x4a, 0x0a, 0x2b, 0x99, 0x49, 0xb3, 0x0a, 0x94, 0x61,
0xd2, 0xbc, 0x2a, 0xa5, 0x0d, 0x2e, 0x47, 0x49, 0xf3, 0x9a, 0x2e, 0xae, 0x97, 0x57, 0x52, 0xce,
0x05, 0xe2, 0x8b, 0xfc, 0x2a, 0x39, 0xb8, 0x60, 0xc5, 0x97, 0xff, 0xc5, 0x73, 0xe3, 0xaa, 0x7a,
0xf5, 0x39, 0xb9, 0xf5, 0x15, 0x36, 0xc6, 0x8d, 0xab, 0x2d, 0x9e, 0x1b, 0xd7, 0xde, 0x6b, 0xcf,
0xc9, 0xad, 0xaf, 0xc3, 0x31, 0x6e, 0x5c, 0x93, 0x07, 0x60, 0x31, 0xca, 0x8d, 0x96, 0x7a, 0xf9,
0x24, 0x5a, 0xf6, 0x7c, 0xec, 0x15, 0x56, 0x33, 0xb3, 0x8b, 0xd6, 0xbb, 0x0d, 0xb3, 0x1b, 0xaa,
0x84, 0xfb, 0x7f, 0x02, 0x28, 0x46, 0x13, 0x84, 0xe8, 0x4d, 0xd2, 0xe0, 0x98, 0xa5, 0xf0, 0x20,
0xf5, 0x4c, 0x36, 0xf5, 0xb5, 0x1e, 0x3b, 0x93, 0xed, 0x83, 0xb5, 0xc6, 0xc1, 0xa4, 0x7d, 0x70,
0x29, 0xe6, 0x84, 0x05, 0x3b, 0x2d, 0x5c, 0x78, 0x3d, 0x35, 0xc5, 0x4e, 0x78, 0x2b, 0xc7, 0x52,
0xec, 0x91, 0x4e, 0xa7, 0x85, 0x47, 0x99, 0x85, 0xe9, 0xa6, 0x6b, 0xe3, 0xc2, 0xc3, 0xcc, 0xcc,
0x46, 0xde, 0xa7, 0x0d, 0x33, 0x1b, 0x74, 0x4a, 0x5f, 0x01, 0xe7, 0x02, 0x6b, 0x97, 0xc7, 0x21,
0x4c, 0x02, 0xa2, 0x77, 0x5c, 0x78, 0x94, 0x12, 0x8b, 0xe2, 0x2e, 0x1c, 0x49, 0x2c, 0x0a, 0xac,
0xdd, 0x68, 0xbb, 0x14, 0x80, 0x45, 0x9f, 0x5f, 0xcf, 0x20, 0x8f, 0x52, 0x42, 0xbb, 0x98, 0x1e,
0x64, 0xf7, 0xda, 0x41, 0xe1, 0x8d, 0x94, 0x23, 0xa9, 0x49, 0x37, 0x3b, 0x95, 0x1c, 0xbc, 0xe4,
0xc7, 0xf7, 0x8f, 0x2e, 0x0b, 0x5e, 0x3f, 0xc6, 0x97, 0xfc, 0xe3, 0xcc, 0x76, 0x1a, 0xad, 0x3a,
0x1c, 0xb6, 0xd3, 0xa1, 0x7a, 0xc4, 0x78, 0x6e, 0x7c, 0x11, 0xbe, 0xf9, 0x9c, 0xdc, 0xe2, 0x16,
0xe1, 0x50, 0x91, 0xdd, 0x36, 0xb8, 0x18, 0x1a, 0xc6, 0x31, 0xda, 0xc1, 0x41, 0x6b, 0x8f, 0xc7,
0xc0, 0x2f, 0xa4, 0x44, 0xa4, 0x98, 0xeb, 0x2d, 0x12, 0x91, 0xec, 0x98, 0x5b, 0xaf, 0xef, 0x8d,
0x9c, 0xe6, 0x71, 0x03, 0x1c, 0xf0, 0x65, 0x7b, 0xfc, 0xc2, 0x5b, 0x99, 0x0f, 0xcf, 0x92, 0x3f,
0xb3, 0x30, 0x7c, 0xa4, 0x17, 0x0b, 0x27, 0x7d, 0x73, 0x64, 0x67, 0xbf, 0xdf, 0xdb, 0xc6, 0xf4,
0x72, 0x76, 0x68, 0x9b, 0xf0, 0x24, 0xf3, 0x01, 0xe7, 0xf8, 0xd7, 0x6f, 0x86, 0x0f, 0x38, 0x69,
0xff, 0xfe, 0xd0, 0xf6, 0xe0, 0xdb, 0xf1, 0x2a, 0xb1, 0xba, 0x5d, 0x7a, 0xcc, 0xda, 0x3f, 0xe0,
0x7c, 0x3b, 0xf5, 0x84, 0x7b, 0xd2, 0x33, 0xca, 0x61, 0x47, 0x14, 0xfb, 0xd0, 0xb2, 0x0b, 0x96,
0xb8, 0xb5, 0xed, 0x7a, 0x56, 0x77, 0x8f, 0x6e, 0xe9, 0xfc, 0x96, 0x15, 0x66, 0x42, 0xef, 0x50,
0xfe, 0xaf, 0xa7, 0xd8, 0xdb, 0xd8, 0x7d, 0x3d, 0x59, 0x4d, 0x56, 0xa4, 0xeb, 0xc8, 0x1f, 0x5c,
0xe5, 0x7f, 0x9f, 0x6d, 0xd4, 0x86, 0xb8, 0xb6, 0x3c, 0xf7, 0xa8, 0x83, 0xfe, 0x3b, 0x3e, 0xc2,
0x6d, 0x64, 0x3b, 0x3b, 0x3b, 0x74, 0x0b, 0x5c, 0x78, 0x37, 0xd5, 0x1e, 0xd2, 0x6f, 0x90, 0x99,
0x3d, 0x4c, 0x84, 0x93, 0xfe, 0x1b, 0xb8, 0x48, 0x8b, 0x38, 0xe8, 0xbd, 0x29, 0xbd, 0xf3, 0xe4,
0xa3, 0x7f, 0x2f, 0xed, 0xa6, 0x72, 0xec, 0xfa, 0xb5, 0x92, 0x83, 0x52, 0x6f, 0xfc, 0x52, 0x96,
0x1d, 0xa8, 0xc7, 0xee, 0x9b, 0x70, 0x97, 0x33, 0xfb, 0x62, 0xaa, 0xbd, 0x25, 0xd7, 0x26, 0x32,
0x7b, 0x9b, 0x50, 0xbb, 0xf8, 0x6b, 0x02, 0xb8, 0x97, 0x20, 0x01, 0x3f, 0xce, 0x72, 0xbb, 0x38,
0x9c, 0xf4, 0x2f, 0xa5, 0x86, 0xc0, 0xd4, 0x12, 0x41, 0x76, 0xfb, 0x97, 0x5e, 0x49, 0xf8, 0x89,
0x00, 0x56, 0xe2, 0xe5, 0xa2, 0x35, 0x68, 0xa3, 0x5b, 0xba, 0xf7, 0x53, 0x2f, 0xdf, 0x32, 0xd4,
0xec, 0xb1, 0xb3, 0x8f, 0x2c, 0xc5, 0x7d, 0xfc, 0x4c, 0x21, 0x76, 0xab, 0x49, 0x9f, 0x62, 0x75,
0xc3, 0x73, 0xd3, 0x0f, 0x3e, 0xcd, 0x5e, 0x33, 0x52, 0x47, 0x97, 0xb8, 0xd7, 0x8c, 0xd6, 0xda,
0x7d, 0x9f, 0x9d, 0x92, 0xc6, 0x88, 0xd3, 0x76, 0x3a, 0xfb, 0x43, 0xa7, 0x0b, 0x72, 0xea, 0x96,
0x33, 0xa5, 0xac, 0xad, 0x92, 0x83, 0x37, 0x62, 0x04, 0x1a, 0x06, 0x5a, 0x3b, 0x09, 0x66, 0x28,
0xcd, 0xa7, 0xd3, 0xb3, 0x79, 0x71, 0x8a, 0xd8, 0x60, 0x7f, 0x27, 0x4c, 0xe2, 0x72, 0x78, 0x69,
0x46, 0x25, 0x5b, 0xf9, 0x91, 0x38, 0xf8, 0x20, 0x62, 0xb8, 0x59, 0x93, 0x6e, 0x80, 0xe5, 0x92,
0x66, 0x28, 0xfa, 0x33, 0x15, 0x22, 0xa8, 0x1a, 0x7a, 0x13, 0x2a, 0xa3, 0x9f, 0x33, 0xba, 0x02,
0x0a, 0xe3, 0x20, 0x86, 0x0a, 0x9f, 0xa9, 0x50, 0x14, 0xa4, 0xeb, 0xe0, 0xca, 0x78, 0xef, 0x46,
0x73, 0x4d, 0x85, 0x75, 0xd5, 0x54, 0x0d, 0x31, 0x2f, 0xbd, 0x01, 0x1e, 0x8c, 0x43, 0x94, 0x64,
0x53, 0x5e, 0x93, 0x0d, 0x15, 0x35, 0x74, 0xc3, 0x2c, 0x43, 0xd5, 0x40, 0x86, 0x5a, 0x5d, 0x47,
0x15, 0xdd, 0x30, 0xd5, 0x92, 0x38, 0x25, 0xbd, 0x0e, 0x5e, 0x9d, 0x80, 0x54, 0xdb, 0x32, 0x3e,
0xac, 0x0e, 0x61, 0x4c, 0x4b, 0x8f, 0xc0, 0xea, 0x24, 0x0c, 0xbd, 0x5e, 0xd6, 0x4b, 0x6b, 0x43,
0x38, 0x33, 0xd2, 0x2b, 0xe0, 0x6e, 0x16, 0xd1, 0x60, 0xc9, 0x10, 0x4f, 0x48, 0xf7, 0xc0, 0xad,
0x54, 0x91, 0x08, 0xe4, 0x49, 0xe9, 0x0e, 0x28, 0x8e, 0x43, 0xca, 0x8d, 0x46, 0x55, 0x53, 0x64,
0x53, 0xd3, 0xeb, 0xa8, 0x62, 0x9a, 0x0d, 0x71, 0x56, 0xba, 0x0d, 0x6e, 0x4c, 0x86, 0x33, 0x95,
0x86, 0x38, 0x17, 0x0f, 0xb6, 0xa9, 0xd5, 0x4b, 0xfa, 0xa6, 0x81, 0x4a, 0xaa, 0xb1, 0x61, 0xea,
0x0d, 0x11, 0x48, 0xaf, 0x82, 0x7b, 0x13, 0xe4, 0x33, 0x3e, 0xac, 0xb2, 0x39, 0xa3, 0x32, 0x9e,
0x4a, 0x51, 0xf0, 0x60, 0xe8, 0x6a, 0xc9, 0xa8, 0x68, 0xeb, 0xa6, 0x78, 0x5a, 0x7a, 0x0c, 0x5e,
0xcf, 0x44, 0x3f, 0xaa, 0xe2, 0x33, 0x29, 0x7c, 0xa0, 0x5a, 0xd2, 0x86, 0xa7, 0x7e, 0x3e, 0xeb,
0xa4, 0x94, 0x95, 0x86, 0x78, 0x36, 0xd3, 0xa4, 0x10, 0x48, 0x31, 0xb3, 0x7a, 0x08, 0xf4, 0x39,
0xe9, 0x5d, 0xf0, 0xd6, 0xf3, 0xa8, 0x87, 0xaf, 0x87, 0xaa, 0x6a, 0x18, 0xa2, 0x24, 0xbd, 0x06,
0xee, 0x67, 0x41, 0x96, 0x3f, 0x6a, 0x42, 0x55, 0x3c, 0x2f, 0xdd, 0x05, 0x37, 0x27, 0x80, 0x97,
0xb6, 0xea, 0x72, 0x4d, 0x2f, 0xad, 0x89, 0x17, 0x52, 0x4c, 0x5c, 0x91, 0x0d, 0x43, 0xae, 0x97,
0xa0, 0x8c, 0x36, 0xd4, 0x2d, 0xa3, 0x21, 0x2b, 0xaa, 0x21, 0x5e, 0x4c, 0x99, 0xb5, 0x01, 0x4e,
0x74, 0x0e, 0x16, 0xa4, 0x27, 0xe0, 0xf1, 0x04, 0x2c, 0xb5, 0x2a, 0x1b, 0xa6, 0xa6, 0x18, 0xaa,
0x0c, 0x95, 0xca, 0x10, 0xe6, 0xa5, 0x4c, 0xf3, 0xcd, 0xf1, 0x65, 0xa5, 0xa2, 0x8a, 0x85, 0x14,
0x6d, 0x31, 0x8c, 0x9a, 0x5a, 0xd3, 0xe1, 0x56, 0x69, 0x4d, 0xbc, 0x9c, 0x89, 0x01, 0xd5, 0x2c,
0x62, 0x0c, 0x16, 0x53, 0x06, 0xc3, 0x30, 0x94, 0x6a, 0xd3, 0x30, 0x47, 0x8c, 0x77, 0x49, 0x5a,
0x01, 0x77, 0x52, 0xad, 0x8b, 0xcd, 0xe2, 0x15, 0x69, 0x15, 0xac, 0x64, 0xb2, 0x2f, 0x06, 0xbf,
0x9c, 0x32, 0x99, 0x03, 0xf8, 0x9a, 0xa6, 0x40, 0xdd, 0xd0, 0xd7, 0x4d, 0xf1, 0xaa, 0xf4, 0x05,
0xf0, 0x68, 0xd2, 0x64, 0xea, 0xca, 0x06, 0xd4, 0x65, 0xa5, 0x32, 0xe2, 0xe7, 0xae, 0xa5, 0xd8,
0x7e, 0xe8, 0x1b, 0x65, 0xb3, 0x2a, 0x1b, 0xe2, 0xf5, 0x94, 0x35, 0x65, 0xd4, 0xf5, 0xcd, 0xf5,
0xaa, 0xbc, 0xa1, 0x8a, 0x37, 0x12, 0xe8, 0xea, 0x4a, 0x44, 0xbb, 0x25, 0x03, 0x35, 0xa0, 0xfe,
0xe5, 0x2d, 0xb1, 0x98, 0x60, 0x8a, 0x51, 0xe8, 0x8a, 0x56, 0xae, 0x20, 0xf9, 0x99, 0xac, 0x55,
0xe5, 0x35, 0xad, 0xaa, 0x99, 0x5b, 0xe2, 0x4d, 0xe9, 0x2d, 0xf0, 0x46, 0x0a, 0x16, 0x5d, 0x21,
0x9a, 0x82, 0xa0, 0x5a, 0xd6, 0x0c, 0x13, 0x52, 0xd7, 0x29, 0xde, 0x8a, 0xf7, 0xc2, 0x86, 0x5c,
0xab, 0x46, 0x5d, 0xac, 0x78, 0x5b, 0x2a, 0x82, 0xab, 0xe3, 0x70, 0xaa, 0xf2, 0x88, 0x7d, 0xb8,
0xaf, 0xae, 0xa8, 0xe2, 0x9d, 0x04, 0xa3, 0xd3, 0x95, 0x51, 0x37, 0x8c, 0xea, 0x7a, 0x1d, 0xc9,
0x25, 0xf1, 0xae, 0x74, 0x0b, 0x5c, 0x9f, 0x14, 0x17, 0xe9, 0x07, 0xdd, 0xee, 0xc5, 0xdb, 0x7e,
0x34, 0x02, 0xc8, 0x9b, 0x06, 0x52, 0xf4, 0xba, 0xa1, 0x57, 0x55, 0xf1, 0xbe, 0x74, 0x0d, 0x2c,
0x8d, 0x83, 0xd7, 0x94, 0x06, 0x32, 0xcc, 0x92, 0xa6, 0x8b, 0x2b, 0xf4, 0xb3, 0x87, 0xf1, 0x00,
0x86, 0x2a, 0xbe, 0x22, 0xdd, 0x07, 0xb7, 0x93, 0xf0, 0xa1, 0x2a, 0xd7, 0xe4, 0xb5, 0xaa, 0xca,
0x62, 0xd3, 0xab, 0x2b, 0xbf, 0x2b, 0x80, 0xf9, 0xe1, 0x4f, 0x0f, 0x0f, 0x71, 0x37, 0x4c, 0xd9,
0x6c, 0x1a, 0x23, 0x99, 0xc2, 0x12, 0xb8, 0x34, 0x0a, 0x60, 0x34, 0x15, 0x85, 0x38, 0x45, 0x21,
0xb6, 0x73, 0x43, 0x6b, 0x34, 0xd4, 0x92, 0x98, 0x97, 0x2e, 0x83, 0x8b, 0xa3, 0x9d, 0x2a, 0x84,
0x3a, 0x14, 0xa7, 0xe2, 0xf0, 0xe4, 0x35, 0x1d, 0xd2, 0xa0, 0xbf, 0xf2, 0xb3, 0x3c, 0x98, 0x52,
0x4c, 0x59, 0x3a, 0x0f, 0xce, 0x2a, 0xa6, 0x3c, 0xfe, 0x91, 0x47, 0xd2, 0x28, 0x37, 0xcd, 0x0a,
0xd1, 0x61, 0x5d, 0x55, 0x4c, 0x9d, 0xa4, 0x2c, 0x97, 0xc0, 0x79, 0xda, 0xae, 0x98, 0xda, 0x33,
0x92, 0xc9, 0x18, 0x86, 0xa6, 0xd7, 0x49, 0xa6, 0xd2, 0xef, 0x20, 0x22, 0x23, 0xa8, 0x7e, 0xd8,
0x54, 0x0d, 0xd3, 0x10, 0xa7, 0xc2, 0x8e, 0x06, 0x54, 0x6b, 0x5a, 0xb3, 0x86, 0x8c, 0x66, 0xa3,
0xa1, 0x43, 0x53, 0x9c, 0x0e, 0x3b, 0x4c, 0x48, 0xbc, 0x47, 0x09, 0x95, 0xd4, 0x67, 0x1a, 0x71,
0xbb, 0x33, 0x21, 0xef, 0x66, 0xa3, 0x0c, 0xe5, 0x92, 0x8a, 0xd6, 0xe4, 0x7a, 0x5d, 0x85, 0xe2,
0x89, 0x10, 0x61, 0x4d, 0xab, 0x56, 0xb5, 0x7a, 0x19, 0x19, 0xcd, 0x5a, 0x4d, 0x86, 0x5b, 0xe2,
0xc9, 0x70, 0x04, 0x9c, 0x77, 0x55, 0x33, 0x4c, 0x71, 0x96, 0x7e, 0x0a, 0x70, 0xd0, 0x58, 0xd3,
0xeb, 0x9a, 0xa9, 0x43, 0xad, 0x5e, 0x16, 0xe7, 0xe8, 0x47, 0x06, 0x4d, 0x19, 0xa9, 0x5f, 0x36,
0x55, 0x58, 0x97, 0xab, 0x48, 0x6e, 0x96, 0x34, 0x13, 0x19, 0xa6, 0x0e, 0xe5, 0xb2, 0x2a, 0x82,
0x50, 0x00, 0x7d, 0x83, 0x48, 0x61, 0x10, 0xdd, 0x6d, 0xd5, 0x15, 0xf1, 0x94, 0x24, 0x82, 0xd3,
0x14, 0xaf, 0x6e, 0x42, 0x19, 0x69, 0x25, 0xf1, 0xb4, 0x74, 0x0e, 0x9c, 0xe9, 0x43, 0x1a, 0x8a,
0x56, 0x13, 0xcf, 0x84, 0x7c, 0xb5, 0x92, 0x5a, 0x37, 0x35, 0x73, 0x0b, 0x19, 0xaa, 0xd2, 0x84,
0x64, 0x39, 0xce, 0xaf, 0xfc, 0x18, 0x80, 0x8b, 0xb1, 0xef, 0xe8, 0x48, 0x18, 0xd3, 0xea, 0xa6,
0x5a, 0x66, 0x0b, 0x10, 0xa9, 0x75, 0xa8, 0x57, 0xab, 0x68, 0x43, 0xab, 0x8f, 0x7e, 0x3e, 0xf1,
0x06, 0x58, 0x4e, 0x02, 0x34, 0xaa, 0xb2, 0xb2, 0x21, 0x0a, 0x64, 0xf5, 0x24, 0x81, 0x90, 0x15,
0xa1, 0x6b, 0x25, 0x45, 0xcc, 0x93, 0xc4, 0x28, 0x09, 0xaa, 0x21, 0x97, 0x55, 0x58, 0x6a, 0x9a,
0x5b, 0xe2, 0xd4, 0x24, 0x7e, 0x6a, 0x4d, 0xd6, 0xaa, 0xe2, 0x34, 0xc9, 0x62, 0x93, 0x40, 0x9e,
0x6a, 0x50, 0x16, 0x67, 0xa4, 0x9b, 0xe0, 0x5a, 0x12, 0x04, 0x35, 0x4f, 0x58, 0x12, 0x4f, 0x10,
0x97, 0x93, 0x04, 0x54, 0x93, 0x4d, 0x53, 0x85, 0x35, 0xdd, 0x30, 0xc5, 0x93, 0x93, 0x86, 0x57,
0x33, 0x90, 0xa9, 0xca, 0x35, 0x43, 0x9c, 0x9d, 0x04, 0xa5, 0x37, 0x8c, 0xb2, 0x5a, 0xd7, 0x54,
0x71, 0x6e, 0x92, 0xe8, 0x64, 0x4a, 0x45, 0x30, 0x71, 0x70, 0x72, 0x6d, 0x5d, 0x3c, 0x35, 0x59,
0x6e, 0xa5, 0xa2, 0xd5, 0x55, 0x66, 0x2a, 0x6f, 0x82, 0x87, 0xe9, 0x70, 0xa8, 0xac, 0x99, 0x95,
0xe6, 0x1a, 0x5d, 0x5f, 0x64, 0x5d, 0x9d, 0x91, 0x1e, 0x80, 0x57, 0x32, 0xa0, 0x29, 0x1a, 0x54,
0xaa, 0xaa, 0xa2, 0x89, 0xf3, 0xc4, 0x2d, 0x66, 0xe3, 0x53, 0x95, 0xd7, 0xc4, 0xb3, 0x24, 0xf4,
0x66, 0x00, 0x7f, 0xaa, 0xd6, 0x37, 0xb4, 0xba, 0x21, 0x8a, 0x19, 0xe1, 0xe5, 0xba, 0xa1, 0xad,
0x55, 0x55, 0xf1, 0xdc, 0x24, 0xf5, 0x90, 0x20, 0xad, 0x29, 0x6a, 0x5d, 0xdf, 0x14, 0xa5, 0x49,
0x13, 0xd6, 0x5f, 0x6f, 0xe7, 0x49, 0x40, 0x4b, 0xb4, 0x24, 0xd9, 0x94, 0x4b, 0x7a, 0x19, 0x69,
0x75, 0x85, 0xae, 0x3d, 0x54, 0x93, 0xeb, 0x72, 0x59, 0xad, 0xa9, 0x75, 0x53, 0xbc, 0x40, 0xb2,
0x91, 0x2c, 0x62, 0x6f, 0x92, 0xb4, 0x2f, 0x1b, 0x2c, 0xc9, 0x75, 0x17, 0x48, 0x14, 0xcf, 0x42,
0x97, 0xe6, 0x2d, 0x34, 0xc1, 0xcb, 0x00, 0x4d, 0xf3, 0xcf, 0x2a, 0xd9, 0x38, 0x14, 0xa4, 0x87,
0xe0, 0xb5, 0x0c, 0x18, 0x91, 0x3d, 0xe3, 0xe5, 0x49, 0x16, 0x43, 0xd6, 0x7f, 0xdf, 0x31, 0x29,
0x6a, 0xdd, 0x54, 0xa1, 0xb8, 0x38, 0x69, 0x4a, 0xb9, 0x39, 0x42, 0xb5, 0xa1, 0x73, 0x4f, 0x2a,
0x2e, 0x65, 0xb4, 0x30, 0x19, 0x96, 0x75, 0xa5, 0x24, 0x5e, 0x91, 0x3e, 0x00, 0xef, 0x3d, 0xb7,
0xe1, 0x47, 0x47, 0xb4, 0xbc, 0xf2, 0xd7, 0x33, 0x31, 0x7e, 0xd3, 0x08, 0x70, 0x37, 0xc1, 0x6f,
0x1a, 0xa6, 0xda, 0x18, 0xf1, 0x9b, 0xf1, 0x63, 0xa4, 0x80, 0xf2, 0xa6, 0xa1, 0x29, 0x61, 0x90,
0x63, 0xee, 0x51, 0x90, 0xbe, 0x04, 0xde, 0x99, 0x0c, 0x6f, 0xa8, 0x26, 0xd7, 0x08, 0x89, 0x37,
0xa8, 0xa4, 0xae, 0xcb, 0xcd, 0xaa, 0x89, 0xf4, 0x4d, 0x12, 0xab, 0xf2, 0xd2, 0x17, 0xc1, 0xdb,
0x93, 0xf1, 0x9b, 0x8d, 0xaa, 0x2e, 0xb3, 0x19, 0xa1, 0x79, 0x95, 0xd1, 0x40, 0x35, 0xd5, 0x94,
0x89, 0x15, 0x8b, 0x53, 0x24, 0x59, 0x9d, 0x8c, 0x6e, 0xaa, 0x86, 0x49, 0x23, 0x4e, 0x28, 0x38,
0xc9, 0xc7, 0xa6, 0x13, 0xd6, 0x07, 0xc5, 0x63, 0x0a, 0x86, 0x32, 0x52, 0xa0, 0x2a, 0x9b, 0x2a,
0x8a, 0xc0, 0x89, 0x33, 0x93, 0x18, 0x8e, 0x22, 0x96, 0xb5, 0x70, 0xcb, 0x26, 0x9e, 0xc8, 0xc6,
0x90, 0x7e, 0x91, 0x97, 0xec, 0x2a, 0x0c, 0xa3, 0x82, 0x14, 0x15, 0x12, 0x37, 0x1e, 0xbf, 0x14,
0x62, 0x19, 0x42, 0x92, 0xc0, 0xcd, 0x92, 0x14, 0x38, 0x09, 0xa3, 0xb6, 0xa9, 0x95, 0x2b, 0xf2,
0xc6, 0x13, 0xa3, 0x3f, 0x8d, 0x8c, 0x86, 0x38, 0x37, 0x69, 0x60, 0x43, 0x58, 0x5c, 0x42, 0x6e,
0xe4, 0x20, 0x1b, 0x37, 0x43, 0x35, 0x9b, 0x0d, 0xb4, 0xa9, 0xc3, 0x8d, 0xf5, 0xaa, 0xbe, 0x29,
0x9e, 0x4a, 0x58, 0x1a, 0x23, 0x58, 0x9b, 0x6a, 0x55, 0xd1, 0x6b, 0xaa, 0x78, 0x7a, 0xe5, 0xe7,
0x42, 0xec, 0xbb, 0xf1, 0xf0, 0xcd, 0x77, 0xa2, 0xd5, 0xd2, 0x4c, 0x4e, 0xd1, 0x4b, 0xa3, 0xc7,
0x4d, 0xf1, 0x9e, 0x2b, 0x0a, 0x3f, 0xc8, 0x29, 0x33, 0xc0, 0xf6, 0x53, 0xcc, 0x7b, 0xe0, 0x56,
0x0a, 0x6c, 0x98, 0x71, 0xa6, 0x53, 0x1d, 0x24, 0xa0, 0x7f, 0x93, 0x07, 0x85, 0xa4, 0x63, 0xd6,
0x24, 0x42, 0xcc, 0xd2, 0x47, 0x86, 0x1d, 0xef, 0x61, 0x42, 0xd8, 0x81, 0xe2, 0x43, 0x1f, 0x53,
0x7a, 0x46, 0xb6, 0x26, 0x24, 0x13, 0x60, 0x51, 0x56, 0xc8, 0x4c, 0x21, 0xb2, 0x09, 0xa9, 0xca,
0x6b, 0x6a, 0x15, 0x35, 0x34, 0x65, 0x83, 0x2e, 0xf8, 0x12, 0xf8, 0xe0, 0x79, 0x29, 0x8c, 0xc9,
0x31, 0x25, 0x55, 0x40, 0xe9, 0x79, 0xa9, 0xf4, 0xf7, 0x22, 0xb0, 0x59, 0x55, 0x43, 0x79, 0xa6,
0x57, 0x7e, 0x70, 0x02, 0x2c, 0xc4, 0x9f, 0x13, 0x27, 0xcc, 0xe6, 0xba, 0xa6, 0x56, 0x47, 0xb3,
0xcd, 0xf7, 0xc0, 0x93, 0x44, 0xc8, 0x31, 0xb5, 0x92, 0x20, 0x61, 0x90, 0x24, 0x7b, 0x0b, 0x35,
0x61, 0x55, 0x14, 0x12, 0x96, 0x50, 0x02, 0xf6, 0x1a, 0x94, 0xeb, 0x4a, 0x45, 0xcc, 0x27, 0x2c,
0xd8, 0x04, 0xac, 0xfe, 0xd2, 0x9b, 0x92, 0xde, 0x06, 0x6f, 0x66, 0xc7, 0x53, 0xeb, 0xcf, 0x34,
0xa8, 0xd7, 0x69, 0x72, 0x30, 0x9d, 0x10, 0x64, 0x13, 0x87, 0xb9, 0x2e, 0xce, 0x24, 0xf8, 0xf7,
0x44, 0x6e, 0xa6, 0x0a, 0x1b, 0x50, 0x33, 0x54, 0x64, 0x54, 0x9b, 0x65, 0xf1, 0x44, 0x82, 0xb5,
0x64, 0x40, 0x37, 0x65, 0x53, 0x53, 0xd0, 0xd3, 0xcd, 0x0d, 0x43, 0x3c, 0x29, 0x3d, 0x01, 0x8f,
0x33, 0x50, 0x19, 0xb5, 0x59, 0x92, 0x1e, 0x3f, 0x37, 0x66, 0x19, 0xea, 0xcd, 0x86, 0x21, 0xce,
0x25, 0x38, 0xfc, 0x09, 0x98, 0x64, 0x03, 0x45, 0x1c, 0x6a, 0xfc, 0x12, 0x9b, 0x80, 0x38, 0x64,
0xd8, 0x86, 0x78, 0x2a, 0x21, 0x26, 0x4f, 0xa0, 0x10, 0x1e, 0x4c, 0xd5, 0x65, 0xea, 0x6d, 0x7f,
0x14, 0xf7, 0x61, 0x94, 0xf0, 0xdd, 0x7c, 0x42, 0x26, 0x47, 0x5d, 0x56, 0xcc, 0xff, 0x29, 0x88,
0x77, 0x4f, 0x03, 0x68, 0x53, 0x85, 0x50, 0x5e, 0xd7, 0x61, 0x2d, 0x71, 0x1d, 0x0c, 0x60, 0x47,
0x52, 0x9f, 0x2d, 0xb9, 0x56, 0x15, 0xf3, 0x2b, 0xef, 0x83, 0x93, 0xbc, 0x56, 0x8b, 0x6c, 0x7c,
0xd7, 0x55, 0xd9, 0x24, 0xf1, 0x69, 0xec, 0xd0, 0x20, 0xec, 0x18, 0xdd, 0x46, 0x0b, 0x2b, 0xbf,
0x2d, 0x80, 0xa5, 0x09, 0x2f, 0xa9, 0x49, 0xac, 0x0a, 0x91, 0xa1, 0xaa, 0xe8, 0xb5, 0x9a, 0x5a,
0x2f, 0x31, 0x09, 0x63, 0x0f, 0x28, 0x56, 0xc0, 0x9d, 0xc9, 0xe0, 0x75, 0xdd, 0x64, 0xb0, 0x02,
0x49, 0xfa, 0x27, 0xc3, 0x96, 0xf4, 0xba, 0x2a, 0xe6, 0xd7, 0xbe, 0xfa, 0x67, 0x3f, 0xbd, 0x2a,
0xfc, 0xe5, 0x4f, 0xaf, 0x0a, 0x7f, 0xf7, 0xd3, 0xab, 0xc2, 0x47, 0xfa, 0xae, 0x13, 0xec, 0xf5,
0xb6, 0x57, 0x5b, 0xee, 0xc1, 0x83, 0x5d, 0xcf, 0x3a, 0x74, 0x58, 0x2d, 0xaf, 0xd5, 0x7e, 0x30,
0xf8, 0xd7, 0x69, 0x5d, 0xe7, 0xc1, 0x2e, 0xee, 0x3c, 0xa0, 0xaf, 0xde, 0x1f, 0xec, 0xba, 0x23,
0xff, 0x8f, 0xed, 0xdd, 0xc8, 0xcf, 0xc3, 0x87, 0xdb, 0x27, 0x28, 0xd8, 0x1b, 0xff, 0x11, 0x00,
0x00, 0xff, 0xff, 0x34, 0x10, 0x18, 0x83, 0xbf, 0x6d, 0x00, 0x00,
// 6558 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7d, 0x4b, 0x6c, 0xe4, 0xc8,
0x79, 0x70, 0xb3, 0x25, 0xcd, 0x48, 0x35, 0x1a, 0x0d, 0x87, 0x33, 0xa3, 0x69, 0x49, 0xa3, 0x79,
0xf4, 0xbc, 0xb5, 0xbb, 0x9a, 0x1d, 0xed, 0xac, 0x77, 0xf6, 0x61, 0xef, 0x52, 0x6c, 0xaa, 0x9b,
0xa3, 0xee, 0x66, 0x6f, 0x91, 0x3d, 0xb2, 0xd6, 0x30, 0xea, 0xa7, 0x9a, 0x25, 0x89, 0xbf, 0x5a,
0xcd, 0x36, 0xc9, 0x96, 0x56, 0x08, 0x0c, 0x3b, 0x4e, 0x62, 0x04, 0xb1, 0x9d, 0x75, 0x80, 0xc4,
0x08, 0xb0, 0x41, 0x1e, 0xc8, 0x03, 0x01, 0x1c, 0xc0, 0xa7, 0xc0, 0xa7, 0x1c, 0x72, 0x0b, 0x90,
0x1c, 0x02, 0xe4, 0x96, 0x53, 0xe0, 0x53, 0x6e, 0x3e, 0x25, 0x40, 0xe2, 0xbc, 0x50, 0x55, 0x24,
0x9b, 0xdd, 0x4d, 0x36, 0x39, 0x9b, 0xd9, 0xd8, 0x98, 0xb9, 0xa9, 0xab, 0xbe, 0x57, 0x7d, 0xf5,
0xd5, 0xf7, 0x7d, 0x55, 0xf5, 0x15, 0x05, 0xee, 0x7b, 0xb8, 0x8d, 0xbb, 0xb6, 0xe3, 0x3d, 0xe8,
0xb9, 0xc6, 0x1e, 0xc6, 0x47, 0xb8, 0xe3, 0xb9, 0x0f, 0x8e, 0x1e, 0x46, 0x7f, 0xae, 0x76, 0x1d,
0xdb, 0xb3, 0x85, 0xcb, 0x01, 0xe8, 0x6a, 0xb4, 0xef, 0xe8, 0xe1, 0xe2, 0xdd, 0x90, 0x86, 0xd1,
0x6a, 0x61, 0xd7, 0x6d, 0x5b, 0xae, 0x47, 0x48, 0xf4, 0x7f, 0x31, 0x0a, 0xc5, 0x15, 0x20, 0x34,
0x95, 0x75, 0xa3, 0xd3, 0xc1, 0x8e, 0xd4, 0xb6, 0x5a, 0x07, 0x32, 0x21, 0x21, 0x5c, 0x04, 0x53,
0x46, 0x1b, 0x3b, 0x5e, 0x81, 0xbb, 0xce, 0xdd, 0x9b, 0x81, 0xec, 0x47, 0x71, 0x03, 0xdc, 0x6b,
0x2a, 0x6a, 0x67, 0xc7, 0x36, 0x1c, 0x53, 0xb2, 0x0f, 0xbb, 0x6d, 0xec, 0xe1, 0xb2, 0xad, 0xdb,
0x25, 0xc3, 0xdd, 0x67, 0x8d, 0x7d, 0x0a, 0x8b, 0x60, 0xba, 0xe7, 0x62, 0xa7, 0x63, 0x1c, 0x62,
0x9f, 0x48, 0xf8, 0xbb, 0x78, 0x1b, 0xdc, 0x0c, 0xe9, 0x88, 0xa6, 0xb9, 0x61, 0x39, 0xae, 0x07,
0xb1, 0x6b, 0xf7, 0x9c, 0x16, 0xee, 0x93, 0x28, 0xae, 0x44, 0xd8, 0x0d, 0x83, 0x55, 0x0d, 0x2f,
0x2a, 0x70, 0xf1, 0x7d, 0x70, 0x23, 0x84, 0xd5, 0xb0, 0x27, 0x39, 0xd8, 0xc4, 0x1d, 0xcf, 0x32,
0xda, 0x5a, 0x6f, 0xe7, 0xd0, 0xf2, 0xd2, 0x65, 0x8a, 0x12, 0xf8, 0xb0, 0x87, 0x5d, 0xcf, 0xb2,
0x3b, 0x1d, 0xc3, 0x72, 0x70, 0x56, 0x02, 0x5f, 0x07, 0xb7, 0x43, 0x02, 0x10, 0xef, 0x59, 0x2e,
0x11, 0x70, 0xdf, 0x68, 0xb7, 0x71, 0x67, 0x2f, 0x2b, 0x11, 0x61, 0x01, 0x4c, 0x1f, 0xee, 0x1a,
0xc8, 0x3b, 0xe9, 0xe2, 0x42, 0x9e, 0xf6, 0x9d, 0x3e, 0xdc, 0x35, 0xf4, 0x93, 0x2e, 0x16, 0x96,
0x01, 0x68, 0xdb, 0x7b, 0x56, 0x07, 0xed, 0xb6, 0xed, 0xe3, 0xc2, 0x04, 0xed, 0x9c, 0xa1, 0x2d,
0x1b, 0x6d, 0xfb, 0x98, 0xc9, 0x0f, 0x71, 0xcb, 0x3e, 0xc2, 0xce, 0x89, 0x64, 0x9b, 0xd8, 0x95,
0xec, 0x8e, 0x67, 0x75, 0x7a, 0x38, 0xe3, 0xa4, 0xbc, 0x0b, 0x96, 0x47, 0x08, 0x74, 0x4f, 0x32,
0x22, 0xbf, 0x07, 0xae, 0x0e, 0x21, 0x37, 0x1c, 0xab, 0xe3, 0x65, 0xc4, 0x2e, 0x02, 0xbe, 0x64,
0xb9, 0x14, 0xb9, 0x86, 0x3d, 0xc3, 0x34, 0x3c, 0x43, 0x98, 0x03, 0x79, 0xcb, 0xf4, 0x21, 0xf3,
0x96, 0x59, 0x34, 0x40, 0x21, 0x80, 0x09, 0x6c, 0x20, 0x84, 0x95, 0xc1, 0xb4, 0xe3, 0xb7, 0x51,
0x8c, 0xb9, 0xb5, 0xfb, 0xab, 0x09, 0x0b, 0x63, 0x75, 0x98, 0x08, 0x0c, 0x51, 0x8b, 0x07, 0x40,
0x08, 0x7a, 0x35, 0x0f, 0x77, 0x35, 0xcf, 0xf0, 0x7a, 0xae, 0xf0, 0x3e, 0x38, 0xe5, 0xd2, 0xbf,
0x7c, 0xd2, 0x77, 0x53, 0x49, 0x33, 0x44, 0xe8, 0xa3, 0x91, 0xb5, 0x84, 0x1d, 0xc7, 0x76, 0xfc,
0x09, 0x65, 0x3f, 0x8a, 0x7f, 0xc2, 0x81, 0xf9, 0xa6, 0x12, 0x41, 0x71, 0x3c, 0x6c, 0x32, 0x55,
0xc9, 0x60, 0xfa, 0xd0, 0x1f, 0x1a, 0xe5, 0x79, 0x26, 0xc3, 0x70, 0x02, 0x5d, 0xc0, 0x10, 0x55,
0x90, 0x42, 0xc1, 0xf3, 0x94, 0xc8, 0x2b, 0x19, 0x04, 0x0f, 0x46, 0x1d, 0x08, 0x5f, 0xfc, 0x4f,
0x0e, 0x5c, 0xef, 0x8b, 0x19, 0x28, 0x4d, 0xc3, 0x6d, 0xdc, 0x22, 0x2b, 0xe4, 0xb9, 0x0a, 0x5c,
0x8b, 0x4c, 0x23, 0x13, 0xf9, 0x61, 0xe6, 0x69, 0xec, 0x93, 0x0b, 0x48, 0x44, 0xc6, 0x3f, 0xf1,
0xd9, 0xc7, 0xff, 0x6b, 0x79, 0xe2, 0x84, 0x02, 0x00, 0xa5, 0xe3, 0xe1, 0x3d, 0xc7, 0x20, 0x23,
0x17, 0xb7, 0x34, 0x55, 0x29, 0x49, 0x92, 0xdd, 0xe9, 0xe0, 0x96, 0xf7, 0xc2, 0xeb, 0xe1, 0xc7,
0xf9, 0xa8, 0x1d, 0x94, 0x0c, 0xcf, 0xd8, 0x31, 0x5c, 0x0c, 0x4b, 0x9a, 0xdc, 0x71, 0xec, 0x76,
0xfb, 0x45, 0x1f, 0xbf, 0xf0, 0x18, 0x14, 0x5c, 0x6a, 0xf4, 0xd8, 0x44, 0x01, 0x65, 0x17, 0xb5,
0xec, 0x5e, 0xc7, 0x2b, 0x4c, 0x5e, 0xe7, 0xee, 0x4d, 0xc0, 0xf9, 0xa0, 0x3f, 0x10, 0xc5, 0x95,
0x48, 0x6f, 0xf1, 0xdf, 0x38, 0x70, 0xa5, 0xaf, 0xb9, 0xcd, 0xde, 0x0e, 0x96, 0x37, 0x5f, 0x12,
0xad, 0x15, 0x9f, 0x80, 0x42, 0x53, 0x91, 0x8c, 0x76, 0x5b, 0xb7, 0x45, 0xea, 0x2f, 0x22, 0x01,
0x61, 0x15, 0x4c, 0xb4, 0xfc, 0x11, 0xcf, 0xad, 0x5d, 0x49, 0xa4, 0x2e, 0xe9, 0x22, 0x24, 0x80,
0xc5, 0xef, 0x4d, 0x45, 0xf5, 0x58, 0xc2, 0xdd, 0xb6, 0x7d, 0xa2, 0x61, 0xe7, 0xc8, 0x6a, 0xe1,
0x17, 0xde, 0xfa, 0xf6, 0xc0, 0x59, 0x93, 0x0e, 0x18, 0x1d, 0x62, 0x6f, 0xdf, 0x36, 0xa9, 0xc9,
0xcd, 0xad, 0xad, 0x27, 0xd2, 0x1a, 0xa7, 0xa8, 0x55, 0xd6, 0x54, 0xa3, 0x94, 0xe0, 0xac, 0x19,
0xf9, 0x25, 0x18, 0xe0, 0x8c, 0xcf, 0x88, 0xa6, 0x20, 0x53, 0x94, 0xcd, 0x07, 0xff, 0x1b, 0x36,
0x24, 0x77, 0x81, 0xc0, 0x0c, 0xff, 0x2e, 0x22, 0x30, 0x1b, 0x15, 0x40, 0x58, 0x06, 0x0b, 0x25,
0xb9, 0x51, 0x55, 0xb7, 0x51, 0x4d, 0xd6, 0x2b, 0x6a, 0x09, 0x35, 0xeb, 0x5a, 0x43, 0x96, 0x94,
0x0d, 0x45, 0x2e, 0xf1, 0x39, 0x61, 0x1e, 0x08, 0x83, 0xdd, 0x62, 0x53, 0x57, 0x79, 0x4e, 0x28,
0x80, 0x8b, 0x83, 0xed, 0x35, 0xb1, 0xde, 0x14, 0xab, 0x7c, 0xbe, 0x88, 0x01, 0xe8, 0xb3, 0x16,
0x96, 0xc0, 0x65, 0x1f, 0x4e, 0xdf, 0x6e, 0xc8, 0x43, 0xc4, 0xaf, 0x82, 0xc5, 0x68, 0xa7, 0x52,
0xd7, 0x74, 0xb1, 0x5a, 0x45, 0x9a, 0x04, 0x95, 0x86, 0xce, 0x73, 0xc2, 0x22, 0x98, 0x8f, 0xf6,
0x8b, 0x35, 0xf1, 0x23, 0xb5, 0x8e, 0x64, 0x49, 0xe3, 0xf3, 0xc5, 0x4f, 0x27, 0xc1, 0xad, 0xfe,
0xf8, 0x25, 0x07, 0x1b, 0x1e, 0x0e, 0x7e, 0x9d, 0x48, 0x76, 0x67, 0xd7, 0xda, 0x7b, 0xe1, 0xed,
0xd2, 0x06, 0x67, 0x5b, 0x74, 0xa4, 0x83, 0x76, 0xf9, 0x24, 0x83, 0xc1, 0x24, 0x2b, 0x6c, 0x95,
0xfd, 0x1d, 0xd8, 0x67, 0x2b, 0xf2, 0xab, 0xf8, 0x67, 0x1c, 0x98, 0x8d, 0x76, 0x13, 0xeb, 0x91,
0xd4, 0xfa, 0x86, 0x52, 0x8e, 0xb7, 0x9e, 0x91, 0x6e, 0x71, 0x4b, 0x43, 0xb2, 0xb4, 0x86, 0x34,
0xad, 0xc6, 0x73, 0x64, 0xfe, 0xe3, 0xbb, 0x65, 0x45, 0x92, 0xf9, 0x7c, 0x3c, 0x3a, 0x2c, 0x69,
0xd4, 0x04, 0x26, 0x84, 0x05, 0x70, 0x29, 0x06, 0x7d, 0x53, 0xe3, 0x27, 0x8b, 0xff, 0xc1, 0x81,
0x6b, 0x31, 0xf1, 0xd2, 0xdf, 0x17, 0xbc, 0xf0, 0x8e, 0xff, 0x97, 0xf3, 0xd1, 0xc5, 0x11, 0x0c,
0x9f, 0xcd, 0x5c, 0xcf, 0xc1, 0x35, 0xbd, 0xaa, 0xbd, 0xf0, 0x3a, 0xf8, 0xcd, 0x3c, 0x78, 0x18,
0x75, 0x90, 0xee, 0x81, 0x67, 0x77, 0x49, 0x18, 0x3c, 0xc2, 0x25, 0xcb, 0xc1, 0x2d, 0xcf, 0x76,
0x4e, 0x74, 0xdb, 0x6e, 0xbb, 0x4a, 0xc7, 0xf5, 0x8c, 0x97, 0x20, 0x1b, 0xf8, 0x4e, 0x1e, 0xac,
0xa6, 0x29, 0x24, 0x34, 0x91, 0x17, 0x5e, 0x1b, 0x7f, 0x91, 0x07, 0x77, 0xfa, 0xda, 0x10, 0x7b,
0x9e, 0x1d, 0xfc, 0x1d, 0x49, 0x21, 0x5f, 0xf8, 0x08, 0x72, 0x17, 0x9c, 0x8b, 0x4f, 0xa7, 0xe7,
0x9c, 0xc1, 0x34, 0xfa, 0x9b, 0x79, 0x70, 0xb3, 0xaf, 0x2e, 0x59, 0x5a, 0xa3, 0xab, 0xa6, 0xf3,
0x32, 0xed, 0x45, 0xff, 0x95, 0x03, 0x0b, 0xc3, 0x19, 0x17, 0x09, 0x54, 0x2f, 0xd9, 0xc0, 0x59,
0xe6, 0x50, 0xb7, 0xcd, 0x17, 0xdf, 0x47, 0xfc, 0x8c, 0x03, 0x57, 0x87, 0x07, 0x2e, 0x76, 0xbb,
0x24, 0xcd, 0x7e, 0x09, 0x92, 0x88, 0x6f, 0xe7, 0xc1, 0xfd, 0x31, 0x49, 0x84, 0x22, 0xd6, 0x1a,
0x76, 0xdb, 0x6a, 0x9d, 0xbc, 0xf0, 0x8a, 0xf8, 0x6f, 0x0e, 0x14, 0xfb, 0x8a, 0x68, 0x38, 0x56,
0xa7, 0x65, 0x75, 0x8d, 0xb6, 0xfb, 0xf2, 0x04, 0xcb, 0x7f, 0xe7, 0xc0, 0x72, 0x5f, 0x03, 0x3a,
0x76, 0x3d, 0xff, 0xe0, 0xed, 0x65, 0xf0, 0xfb, 0xff, 0xc2, 0x81, 0x42, 0xc4, 0x0b, 0xf8, 0x17,
0x2f, 0xe6, 0x0b, 0x3f, 0xee, 0x25, 0xe2, 0xf5, 0x7d, 0x6f, 0x8f, 0x8f, 0xa1, 0xdd, 0x8e, 0x5e,
0x0e, 0xfd, 0x1d, 0xb5, 0x88, 0x81, 0x5e, 0xcd, 0x38, 0x8a, 0x5e, 0x76, 0xdc, 0x04, 0x67, 0x49,
0x86, 0x60, 0x1a, 0x8e, 0x89, 0x7a, 0x2e, 0x66, 0x97, 0x09, 0xd3, 0x70, 0x36, 0x68, 0x6c, 0xba,
0xd8, 0x14, 0x96, 0xc0, 0xcc, 0x89, 0x71, 0xd8, 0x66, 0x00, 0x79, 0x0a, 0x30, 0x4d, 0x1a, 0x68,
0xe7, 0x1d, 0x70, 0xee, 0xd0, 0x36, 0x31, 0x3a, 0xde, 0xc7, 0x1d, 0xe4, 0x1a, 0x47, 0xd8, 0xf4,
0xef, 0x5d, 0xce, 0x92, 0xe6, 0xad, 0x7d, 0xdc, 0x21, 0x2c, 0x4d, 0x41, 0x04, 0xcb, 0xbb, 0x16,
0x6e, 0x9b, 0x2e, 0x3a, 0xb6, 0xbc, 0x7d, 0xd4, 0xb2, 0x3b, 0x47, 0xd8, 0x71, 0x2d, 0xbb, 0x83,
0xe8, 0x59, 0xbf, 0x5b, 0x98, 0xbc, 0x3e, 0x71, 0x6f, 0x06, 0x2e, 0x32, 0xa0, 0x2d, 0xcb, 0xdb,
0x97, 0x42, 0x10, 0x99, 0x42, 0x14, 0x6f, 0x90, 0xed, 0xe2, 0xe0, 0x58, 0x49, 0x72, 0xd3, 0x8e,
0x8c, 0xf8, 0x55, 0xb0, 0x32, 0x04, 0xf2, 0xd4, 0xc2, 0xc7, 0x25, 0xbb, 0xd5, 0x3b, 0xc4, 0x1d,
0xcf, 0x18, 0x3c, 0x5e, 0x2b, 0xfe, 0x25, 0x07, 0x2e, 0x89, 0xae, 0x6b, 0x91, 0x95, 0x42, 0x0d,
0x26, 0x5c, 0x29, 0x77, 0xc1, 0x39, 0x5f, 0x42, 0x8a, 0x83, 0xc2, 0x6b, 0x96, 0xb9, 0x68, 0xb3,
0x62, 0x0a, 0x37, 0xc0, 0xac, 0x67, 0x7b, 0x46, 0x1b, 0x79, 0xf6, 0x01, 0xee, 0xb0, 0x6b, 0x84,
0x09, 0x78, 0x86, 0xb6, 0xe9, 0xb4, 0x89, 0xe8, 0xb8, 0xeb, 0xd8, 0x87, 0x5d, 0x2f, 0x80, 0x99,
0xa0, 0x30, 0xb3, 0xac, 0xd1, 0x07, 0x7a, 0x05, 0x9c, 0x6f, 0x85, 0x32, 0x04, 0x80, 0x2c, 0xcb,
0xe3, 0xfb, 0x1d, 0x0c, 0xb8, 0xf8, 0x0f, 0x1c, 0xb8, 0xc8, 0xe4, 0x96, 0x3f, 0xc6, 0xad, 0xde,
0x67, 0x10, 0x7b, 0x19, 0x80, 0x0e, 0x99, 0x35, 0x96, 0x4d, 0x32, 0xa1, 0x67, 0x48, 0x0b, 0x4d,
0x24, 0x47, 0x46, 0x35, 0x91, 0x61, 0x54, 0x93, 0x59, 0x47, 0x35, 0x95, 0x30, 0xaa, 0xc7, 0x60,
0x91, 0x0d, 0xaa, 0x8e, 0x8f, 0xa5, 0x88, 0xb8, 0xe1, 0xdd, 0x58, 0xcb, 0xf0, 0xf0, 0x9e, 0xed,
0x9c, 0x04, 0x77, 0x63, 0xc1, 0xef, 0xe2, 0x8f, 0x38, 0x70, 0x81, 0xa1, 0x8a, 0xf4, 0xea, 0x16,
0xe2, 0xaf, 0xf5, 0xb0, 0x4b, 0xad, 0x3b, 0x58, 0x6d, 0xec, 0xac, 0x8e, 0x21, 0xce, 0x06, 0x8d,
0xf4, 0xf0, 0xeb, 0xe7, 0x32, 0x83, 0x9f, 0x72, 0x60, 0x36, 0x90, 0x98, 0x34, 0x0b, 0xf3, 0xe0,
0x94, 0x41, 0xff, 0xf2, 0x65, 0xf4, 0x7f, 0xfd, 0x7c, 0xa4, 0xbb, 0x05, 0x04, 0xa6, 0xc8, 0xaa,
0xe5, 0x7a, 0x89, 0xb7, 0x8d, 0xdf, 0x00, 0x85, 0x28, 0xd4, 0xe1, 0x4e, 0xe4, 0x66, 0x52, 0x00,
0x93, 0x91, 0x5b, 0x4c, 0xfa, 0xb7, 0xa0, 0x82, 0x73, 0x87, 0x14, 0xca, 0xdd, 0xb7, 0xba, 0xe8,
0xc0, 0xea, 0x30, 0x67, 0x32, 0xb7, 0x76, 0xa7, 0xef, 0xf8, 0x22, 0x57, 0xef, 0x47, 0x0f, 0x57,
0x6b, 0x21, 0xf8, 0xa6, 0xd5, 0x31, 0xe1, 0xdc, 0xe1, 0xc0, 0xef, 0xe2, 0x57, 0x00, 0xdf, 0x17,
0x80, 0x2d, 0x7a, 0xa1, 0x3c, 0xe2, 0xea, 0x93, 0xdd, 0xea, 0xe8, 0x18, 0xfb, 0xce, 0x7e, 0x90,
0x78, 0xb3, 0x6b, 0x7e, 0x7e, 0xc4, 0x4b, 0x98, 0x84, 0xaa, 0xe7, 0x47, 0xfc, 0xaf, 0x38, 0x30,
0x3f, 0x3c, 0x31, 0xcf, 0x59, 0x3b, 0xc2, 0x47, 0xc1, 0x5c, 0xa2, 0x90, 0x5e, 0x5a, 0x44, 0x4c,
0xb2, 0x95, 0x60, 0x5a, 0x6b, 0xe3, 0xe4, 0x7f, 0xce, 0x13, 0xf0, 0x7f, 0x2e, 0xff, 0x73, 0x9e,
0xe3, 0xcf, 0x55, 0xfe, 0x3f, 0xc8, 0x47, 0xe5, 0x2f, 0x3b, 0x46, 0xc7, 0x73, 0x75, 0xbb, 0xe9,
0x62, 0x47, 0x58, 0x05, 0x17, 0x68, 0xc4, 0x40, 0x8e, 0xdd, 0xc6, 0x2e, 0xda, 0x23, 0x7d, 0x7e,
0xd2, 0x30, 0x05, 0xcf, 0xd3, 0x2e, 0x12, 0x73, 0xdd, 0x32, 0xeb, 0x20, 0x41, 0x9f, 0xc1, 0x5b,
0x9d, 0x7d, 0xec, 0x58, 0xf4, 0x62, 0x70, 0x00, 0x73, 0x82, 0x62, 0x2e, 0x52, 0x20, 0x25, 0x80,
0x19, 0x20, 0xf1, 0x3a, 0xb8, 0xc8, 0x48, 0x78, 0x8e, 0x61, 0x79, 0x7d, 0xcc, 0x3c, 0xc5, 0x14,
0x68, 0x9f, 0x4e, 0xbb, 0x02, 0x0c, 0x09, 0x5c, 0x1d, 0x66, 0x3a, 0x84, 0x3b, 0x49, 0x71, 0x97,
0x06, 0xb9, 0x0e, 0x12, 0x59, 0x02, 0x33, 0x3d, 0x17, 0x3b, 0x88, 0x7a, 0xb1, 0xa9, 0x7e, 0x2d,
0x46, 0xdd, 0x38, 0xc4, 0xc5, 0x1f, 0x4c, 0x44, 0x35, 0x04, 0xf1, 0x91, 0x85, 0x8f, 0x9f, 0xf7,
0x0a, 0x7b, 0x0c, 0x16, 0x4c, 0xe3, 0xc4, 0x45, 0x5d, 0xc3, 0xf5, 0x50, 0x07, 0x7f, 0xec, 0x21,
0xa3, 0x67, 0x5a, 0x1e, 0x22, 0xeb, 0xc0, 0x1f, 0xfc, 0x25, 0x02, 0xd0, 0x30, 0x48, 0xc0, 0xfc,
0xd8, 0x13, 0x49, 0x6f, 0x89, 0x88, 0xb0, 0x01, 0xae, 0x45, 0xfc, 0xac, 0x83, 0xbf, 0xd6, 0xb3,
0x1c, 0x4c, 0xd2, 0x1f, 0x17, 0xb5, 0xf6, 0x8d, 0xce, 0x9e, 0xaf, 0xf6, 0x69, 0xb8, 0xdc, 0x07,
0x83, 0x11, 0x28, 0x89, 0x01, 0x09, 0x8f, 0x41, 0xc1, 0xa1, 0x43, 0x43, 0xbb, 0x84, 0x08, 0xee,
0xb4, 0x4e, 0x42, 0x02, 0x93, 0x94, 0xc0, 0x3c, 0xeb, 0xdf, 0x08, 0xba, 0x03, 0xcc, 0xf7, 0xc0,
0x92, 0x8f, 0x69, 0x1a, 0x27, 0xc8, 0xde, 0x45, 0x87, 0x76, 0x87, 0xe4, 0x7c, 0x3e, 0xf2, 0x14,
0x45, 0xbe, 0xcc, 0x40, 0x4a, 0xc6, 0x89, 0xba, 0x5b, 0x23, 0xfd, 0x01, 0xf6, 0xdb, 0x60, 0xa1,
0xd3, 0xa3, 0xb6, 0x6d, 0xef, 0x22, 0x07, 0x1f, 0xda, 0x47, 0xd8, 0x44, 0xbe, 0xa8, 0x85, 0x53,
0x74, 0xe4, 0xf3, 0x0c, 0x40, 0xdd, 0x85, 0xac, 0xdb, 0x0f, 0x14, 0xc5, 0xdf, 0xe6, 0x46, 0x27,
0xe6, 0x79, 0x2f, 0xbd, 0x87, 0xe0, 0x12, 0x8b, 0x52, 0x88, 0x84, 0x29, 0xe4, 0x0f, 0xd4, 0x32,
0xfd, 0xd2, 0x15, 0xc1, 0x18, 0xe2, 0xaf, 0x98, 0xc5, 0xef, 0x72, 0x60, 0x21, 0x52, 0x16, 0xc1,
0x2e, 0xb6, 0x93, 0xe2, 0xaa, 0xb0, 0x0e, 0x26, 0x23, 0xc1, 0x71, 0x35, 0x51, 0xca, 0x11, 0x8a,
0x34, 0x48, 0x52, 0xdc, 0x41, 0xf3, 0x9d, 0x18, 0x32, 0x5f, 0x9b, 0xec, 0x0a, 0x46, 0xb0, 0x69,
0x79, 0x0d, 0xcb, 0xb5, 0xea, 0x23, 0xba, 0x5a, 0xcb, 0x2e, 0x45, 0x4c, 0x44, 0x72, 0xc0, 0xf5,
0x18, 0x86, 0xc1, 0x26, 0xed, 0xf3, 0xe1, 0xf9, 0x75, 0xb0, 0x14, 0x33, 0xc4, 0xb0, 0x62, 0xa9,
0x02, 0x26, 0x5b, 0xb6, 0x19, 0x94, 0x42, 0x3d, 0xca, 0xce, 0x8a, 0xe1, 0x4b, 0xb6, 0x89, 0x21,
0xa5, 0x90, 0x50, 0xba, 0xf4, 0xcd, 0x3c, 0xb8, 0x12, 0xab, 0x64, 0xdc, 0xfd, 0x5c, 0xc6, 0x4b,
0xac, 0xc6, 0xf5, 0x70, 0xf7, 0xd9, 0xad, 0x86, 0x88, 0x04, 0x29, 0xae, 0x50, 0x1d, 0xda, 0x91,
0x3e, 0x7a, 0x36, 0x2a, 0xa3, 0x47, 0x53, 0x37, 0xe3, 0x54, 0xc0, 0x4e, 0x24, 0xd4, 0x2e, 0xee,
0xfc, 0xe2, 0x6a, 0x62, 0x13, 0x9c, 0x76, 0x99, 0x9c, 0x54, 0x15, 0x73, 0x63, 0xe2, 0x6a, 0xd2,
0x00, 0x61, 0x40, 0xa1, 0xf8, 0xad, 0x3c, 0xb8, 0x1d, 0xa3, 0x88, 0x0d, 0xb2, 0xd3, 0xfd, 0x5c,
0x17, 0xc1, 0x73, 0x51, 0x85, 0x0c, 0xa6, 0xe8, 0x9e, 0xdc, 0x57, 0xc4, 0x83, 0xec, 0x44, 0xe8,
0x00, 0x21, 0xc3, 0x2e, 0xfe, 0x17, 0x97, 0xe0, 0x04, 0xc8, 0x9e, 0xb3, 0x7b, 0xf2, 0x8b, 0x3b,
0xfe, 0x0d, 0x30, 0x49, 0xf7, 0x8e, 0x6c, 0xf8, 0xcf, 0x20, 0x0f, 0x19, 0x1a, 0xad, 0xec, 0xa0,
0xf8, 0xc5, 0xbf, 0xe5, 0xc0, 0x8d, 0x18, 0x05, 0x54, 0xad, 0xce, 0x41, 0xe4, 0x40, 0xe6, 0x17,
0x51, 0x03, 0x02, 0x98, 0x6c, 0x5b, 0x9d, 0x03, 0x3f, 0x8e, 0xd0, 0xbf, 0x8b, 0x9f, 0xe4, 0xc1,
0x85, 0xb0, 0x1c, 0x99, 0xa6, 0x3e, 0xe1, 0x81, 0x52, 0xfa, 0x96, 0x3b, 0x72, 0xa1, 0x85, 0x6c,
0xc7, 0xda, 0xb3, 0x3a, 0xbe, 0xf3, 0x0c, 0x2f, 0xb4, 0x54, 0xda, 0x2a, 0xdc, 0x06, 0x73, 0xad,
0xb6, 0xdd, 0x33, 0x51, 0xd7, 0xb1, 0x8f, 0x2c, 0x13, 0x3b, 0xc1, 0xd9, 0x12, 0x6d, 0x6d, 0xf8,
0x8d, 0x82, 0x0a, 0xa6, 0x4d, 0xff, 0xe4, 0x9b, 0x66, 0x26, 0x67, 0xd6, 0xde, 0x48, 0x3d, 0x4b,
0xc3, 0x66, 0x70, 0x58, 0xde, 0xd7, 0x5a, 0x40, 0x44, 0x58, 0x03, 0x97, 0xcc, 0xa0, 0xea, 0x02,
0xf9, 0xd5, 0x1b, 0x91, 0x4c, 0xf0, 0x82, 0x39, 0x58, 0x92, 0x41, 0xa3, 0xea, 0x53, 0xb0, 0x98,
0x4c, 0x5b, 0xb8, 0x0c, 0x4e, 0x9b, 0x3b, 0x51, 0x8d, 0x9c, 0x32, 0x77, 0xa8, 0x2e, 0xae, 0x81,
0x33, 0xe6, 0x0e, 0xa2, 0x75, 0xe6, 0x2d, 0xbb, 0xed, 0xeb, 0x01, 0x98, 0x3b, 0x0d, 0xbf, 0xa5,
0xf8, 0x53, 0x0e, 0x2c, 0x6e, 0x60, 0xc3, 0xeb, 0x39, 0x18, 0xe2, 0x96, 0x7d, 0x78, 0x88, 0x3b,
0x66, 0xe4, 0x5c, 0x64, 0x20, 0xd2, 0x73, 0x83, 0x91, 0x5e, 0x78, 0x07, 0x9c, 0xde, 0x65, 0xa8,
0xbe, 0x01, 0x5c, 0x4f, 0xd4, 0x4b, 0xc0, 0x22, 0x40, 0x10, 0x3e, 0x06, 0xcb, 0xfe, 0x9f, 0xc8,
0x19, 0xe0, 0x8b, 0x22, 0x31, 0x62, 0x5c, 0xe8, 0x8c, 0x15, 0xda, 0x8f, 0x11, 0x4b, 0xbb, 0xc9,
0x9d, 0xc5, 0x63, 0x70, 0x51, 0x17, 0xcb, 0xec, 0x68, 0x0b, 0x7f, 0xd8, 0xc3, 0x8e, 0xef, 0x1d,
0xae, 0x01, 0x76, 0xee, 0x81, 0x3a, 0xb6, 0x89, 0x59, 0xa9, 0xf1, 0x04, 0x04, 0xb4, 0xa9, 0x4e,
0x5a, 0xfa, 0x00, 0xd8, 0xdc, 0xc3, 0xc1, 0x59, 0x09, 0x03, 0x90, 0x49, 0x8b, 0xb0, 0x0c, 0x80,
0xe5, 0x22, 0xb7, 0x47, 0x53, 0x34, 0x3f, 0x0b, 0x9e, 0xb1, 0x5c, 0x8d, 0x35, 0x14, 0xff, 0x79,
0x02, 0x5c, 0x66, 0xb9, 0x5f, 0xd9, 0x31, 0xba, 0xfb, 0xe2, 0x96, 0xa6, 0xb5, 0x8c, 0x4e, 0x50,
0x8a, 0x77, 0xc1, 0xa7, 0xdd, 0x5a, 0x43, 0x96, 0x7f, 0xaf, 0xca, 0x84, 0x98, 0x84, 0xe7, 0x19,
0x8f, 0x56, 0x78, 0xe1, 0x1a, 0x91, 0x85, 0x4c, 0x06, 0x93, 0x65, 0xd2, 0x97, 0x85, 0x6c, 0xa5,
0xdc, 0xfe, 0xc9, 0xce, 0x9e, 0x63, 0xf7, 0xba, 0x4c, 0x9a, 0x49, 0xff, 0x64, 0xa7, 0x4c, 0x9b,
0xfa, 0x34, 0xe8, 0xa6, 0x89, 0x9a, 0x76, 0x40, 0x83, 0xee, 0x91, 0xc8, 0xfa, 0x60, 0x00, 0x5d,
0xbb, 0x6d, 0xb5, 0x2c, 0xcc, 0x0e, 0xd7, 0x26, 0xe1, 0x59, 0xda, 0xda, 0xf0, 0x1b, 0x85, 0x57,
0x81, 0xe0, 0xcb, 0x7e, 0xe0, 0xa2, 0x56, 0xbb, 0xe7, 0x7a, 0x41, 0x2a, 0x3d, 0x09, 0x79, 0x26,
0xfa, 0x81, 0x2b, 0xf9, 0xed, 0xfd, 0x91, 0x3a, 0xa6, 0x1b, 0x19, 0xe9, 0xe9, 0xc8, 0x48, 0xa1,
0xe9, 0xf6, 0x47, 0x7a, 0x0f, 0x30, 0x1a, 0xc8, 0x7d, 0x03, 0xed, 0xf4, 0x5a, 0x07, 0xd8, 0x73,
0x0b, 0xd3, 0x14, 0x98, 0x09, 0xa7, 0xbd, 0xb1, 0xce, 0x5a, 0xc9, 0x5e, 0xce, 0x87, 0x34, 0x0e,
0xdb, 0xe1, 0x9a, 0x76, 0x0b, 0x33, 0x14, 0x9a, 0xc9, 0xa8, 0x19, 0x87, 0xed, 0x60, 0x61, 0x47,
0x30, 0x6c, 0xcb, 0x6c, 0x45, 0x30, 0x40, 0x04, 0x43, 0xb5, 0xcc, 0x56, 0x1f, 0x23, 0x54, 0x89,
0xd1, 0xa2, 0xfb, 0x3b, 0xb7, 0x70, 0x26, 0xa2, 0x12, 0xd1, 0x6f, 0x2c, 0xfe, 0x80, 0x03, 0xb7,
0x9a, 0x4a, 0x64, 0xb2, 0x25, 0xc7, 0x3e, 0xee, 0x3c, 0xc1, 0xc7, 0xb8, 0x5d, 0xb2, 0x76, 0x77,
0x9f, 0x5a, 0xf8, 0x98, 0xcd, 0xfb, 0x63, 0x50, 0x30, 0x76, 0x77, 0x07, 0x8b, 0x5a, 0x51, 0xa4,
0x8e, 0x7e, 0x06, 0xce, 0x07, 0xfd, 0x61, 0xe5, 0x37, 0x3b, 0xdf, 0x7f, 0x04, 0xe6, 0x47, 0x31,
0x23, 0xaf, 0x16, 0x2e, 0x0e, 0xe3, 0xd1, 0xd2, 0xbf, 0x0d, 0x70, 0x45, 0xc3, 0xad, 0x9e, 0x63,
0x79, 0x27, 0x90, 0x2e, 0xab, 0x32, 0xf6, 0x20, 0x76, 0x7b, 0x6d, 0x3f, 0x37, 0x8f, 0x3b, 0x59,
0x13, 0xc0, 0x24, 0xd9, 0x0a, 0xfa, 0xdb, 0x42, 0xfa, 0x77, 0xd1, 0x00, 0x17, 0xc2, 0xc2, 0xb1,
0x0d, 0xec, 0xb5, 0xf6, 0x19, 0xfa, 0xa8, 0x47, 0xe5, 0xe2, 0x3c, 0xea, 0x88, 0x1b, 0xcf, 0x8f,
0xba, 0xf1, 0xe2, 0x27, 0x1c, 0x10, 0x88, 0x2d, 0xeb, 0x86, 0x7b, 0x40, 0x96, 0x2e, 0x0e, 0x3d,
0x92, 0x67, 0xb8, 0x07, 0x51, 0x67, 0x37, 0x4d, 0x1a, 0x82, 0x17, 0x1a, 0x96, 0xeb, 0xf6, 0x06,
0xa8, 0xce, 0xd0, 0x16, 0xda, 0x7d, 0x11, 0x4c, 0x11, 0xef, 0x12, 0xec, 0x59, 0xd8, 0x0f, 0x12,
0x2f, 0x42, 0x3b, 0x8c, 0x14, 0x40, 0x4c, 0xc1, 0xb9, 0xb0, 0x99, 0x15, 0x40, 0xfc, 0xde, 0x07,
0xe0, 0x5c, 0x93, 0x78, 0x21, 0x2a, 0x89, 0xda, 0xc1, 0xea, 0xae, 0xd0, 0x04, 0xe7, 0x7a, 0x16,
0xda, 0xa1, 0xaf, 0x77, 0x50, 0x8b, 0x44, 0xda, 0xd4, 0xfd, 0xdf, 0xe8, 0x63, 0x9f, 0x4a, 0x0e,
0x9e, 0xed, 0x59, 0x91, 0x56, 0xe1, 0x53, 0x0e, 0xdc, 0xef, 0x59, 0xc8, 0x66, 0x8f, 0x59, 0x90,
0x7f, 0x86, 0x8a, 0xd1, 0x9e, 0x8d, 0x3c, 0x1b, 0x99, 0xc1, 0x6b, 0x1f, 0x9f, 0x23, 0xcb, 0xa7,
0xc5, 0x31, 0x1c, 0xb3, 0x3d, 0x19, 0xaa, 0xe4, 0xe0, 0xcd, 0x9e, 0x95, 0x0a, 0x2b, 0x7c, 0x87,
0x03, 0x37, 0x23, 0xd2, 0x19, 0xa6, 0x89, 0x76, 0x2d, 0x87, 0x6e, 0x57, 0xfd, 0x59, 0x65, 0x72,
0xb1, 0x68, 0xf9, 0x5e, 0xba, 0x5c, 0xc9, 0x4f, 0x90, 0x2a, 0x39, 0x78, 0x35, 0x14, 0x29, 0x16,
0x6c, 0x58, 0x57, 0x31, 0xd2, 0xb4, 0x0d, 0x2f, 0x9c, 0x9d, 0xa9, 0xac, 0xba, 0x4a, 0x79, 0xef,
0x34, 0xa0, 0xab, 0x64, 0x58, 0xe1, 0x57, 0x39, 0x70, 0x3d, 0x22, 0x9d, 0x8b, 0x3d, 0xd4, 0x0a,
0x9f, 0x46, 0x21, 0x97, 0xbe, 0x4a, 0xa2, 0xce, 0xf2, 0xcc, 0xda, 0x3b, 0xe9, 0x42, 0x25, 0x3d,
0xac, 0xaa, 0xe4, 0xe0, 0x95, 0x50, 0x9a, 0x18, 0x20, 0xe1, 0xfb, 0x1c, 0xb8, 0x15, 0x11, 0xc3,
0xf1, 0xcb, 0x20, 0x51, 0x2b, 0x78, 0x1f, 0x15, 0x88, 0x72, 0x9a, 0x8a, 0xf2, 0xa5, 0x74, 0x51,
0xc6, 0xbd, 0xb0, 0xaa, 0xe4, 0xe0, 0xf5, 0x50, 0x9c, 0x04, 0xc0, 0x40, 0x33, 0x0e, 0x0e, 0x33,
0x21, 0x93, 0x2e, 0x40, 0xf6, 0x66, 0xca, 0x9f, 0xae, 0xe9, 0x54, 0xcd, 0xa4, 0xbc, 0xb8, 0x62,
0x9a, 0x49, 0x06, 0x12, 0x3e, 0x06, 0x57, 0xe2, 0xa4, 0xe8, 0x9e, 0xf8, 0x12, 0xcc, 0x50, 0x09,
0xbe, 0x90, 0x5d, 0x82, 0xe8, 0x93, 0xad, 0x4a, 0x0e, 0x16, 0x46, 0xb8, 0xfb, 0x00, 0xc2, 0x2f,
0x81, 0xe5, 0x51, 0xce, 0x5d, 0xc7, 0xea, 0x78, 0x3e, 0x6b, 0x40, 0x59, 0xbf, 0x95, 0x95, 0xf5,
0xd0, 0x83, 0xaf, 0x4a, 0x0e, 0x2e, 0x0c, 0xf1, 0xee, 0x43, 0x08, 0x6d, 0xb0, 0xd0, 0xb3, 0x50,
0x90, 0x6a, 0x92, 0xac, 0xcb, 0x21, 0xa1, 0x84, 0x12, 0xa7, 0x41, 0xed, 0xcc, 0x98, 0xcd, 0x58,
0xfc, 0xb3, 0xa9, 0x4a, 0x0e, 0xce, 0xf7, 0xac, 0xd8, 0x07, 0x55, 0xdf, 0x61, 0xe6, 0x17, 0xb2,
0xeb, 0xc7, 0xba, 0xa0, 0x76, 0xcc, 0xe7, 0x3c, 0x4b, 0x39, 0xbf, 0x9d, 0x81, 0x73, 0xfc, 0x4b,
0x28, 0x66, 0x79, 0x29, 0xaf, 0xa5, 0xbe, 0x41, 0x0d, 0x2f, 0x14, 0xc6, 0xaf, 0xb7, 0x77, 0x59,
0xe9, 0xbc, 0x2f, 0xc8, 0x59, 0x2a, 0xc8, 0x9b, 0x9f, 0xa9, 0xf0, 0x9e, 0xd9, 0xdc, 0x98, 0x87,
0x12, 0xbf, 0xce, 0x1c, 0x68, 0x5f, 0x02, 0x3f, 0xa1, 0xef, 0xaf, 0x4b, 0x26, 0xc4, 0x1c, 0x15,
0xe2, 0x71, 0x16, 0x21, 0xe2, 0xea, 0x9b, 0x2b, 0x39, 0x78, 0x2d, 0x22, 0x47, 0x6c, 0x09, 0xf4,
0xef, 0x32, 0xef, 0x39, 0x2a, 0x4a, 0x2b, 0x28, 0x6d, 0x41, 0x87, 0x5e, 0xdb, 0xf5, 0x05, 0x3a,
0x47, 0x05, 0xfa, 0xe2, 0x33, 0x08, 0x34, 0x5a, 0x71, 0x5c, 0xc9, 0xc1, 0x5b, 0xa3, 0x52, 0xf5,
0xe1, 0xbc, 0xb6, 0x5f, 0x74, 0xf9, 0xd7, 0x1c, 0x78, 0x3c, 0x38, 0x4f, 0xb4, 0x5e, 0x15, 0x19,
0xb4, 0x60, 0x15, 0x99, 0x41, 0xc5, 0x2a, 0xf2, 0x6c, 0xbb, 0xed, 0x27, 0x93, 0xed, 0xb6, 0x2f,
0x29, 0x4f, 0x25, 0x7d, 0x92, 0x69, 0xfe, 0x32, 0xd5, 0x05, 0x57, 0x72, 0xf0, 0x61, 0x74, 0x52,
0xb3, 0x15, 0x13, 0xff, 0x98, 0x03, 0x8f, 0x32, 0x8d, 0xa1, 0xaf, 0x6e, 0x26, 0xff, 0x79, 0x2a,
0x7f, 0xf9, 0x33, 0xcb, 0x3f, 0x58, 0x99, 0x54, 0xc9, 0xc1, 0xd5, 0x34, 0xe1, 0x87, 0x6a, 0x99,
0x7e, 0x9f, 0x03, 0xaf, 0x44, 0x25, 0x37, 0x7a, 0x24, 0xf3, 0x08, 0xf7, 0xa0, 0x91, 0x37, 0x58,
0x4c, 0x60, 0x81, 0x0a, 0xfc, 0x7e, 0x06, 0x81, 0xc7, 0x55, 0xda, 0x56, 0x72, 0xf0, 0x4e, 0x5f,
0xd0, 0xb1, 0x35, 0xb9, 0x7f, 0xce, 0x81, 0x07, 0x29, 0x96, 0x6b, 0x19, 0x87, 0x6c, 0xf3, 0x72,
0xe2, 0x0b, 0x79, 0x81, 0x0a, 0xb9, 0xfe, 0x59, 0xec, 0x77, 0xb0, 0xd8, 0xad, 0x92, 0x83, 0xf7,
0xc7, 0x18, 0xb1, 0x62, 0x1c, 0x46, 0x2b, 0xe3, 0x7e, 0x8b, 0x03, 0x77, 0xa2, 0xa2, 0x76, 0xc3,
0x02, 0xb2, 0x91, 0x79, 0xbf, 0x48, 0x25, 0x7c, 0x37, 0x83, 0x84, 0x49, 0x55, 0x68, 0x95, 0x1c,
0x2c, 0xf6, 0x45, 0x4b, 0xac, 0x55, 0xfb, 0x16, 0x07, 0x6e, 0x44, 0x65, 0xf2, 0xb0, 0xeb, 0x11,
0x69, 0x3a, 0x03, 0xfe, 0xf8, 0x52, 0x6a, 0xf4, 0x1b, 0x53, 0x12, 0x56, 0xc9, 0xc1, 0xe5, 0xbe,
0x24, 0x71, 0x35, 0x63, 0x0e, 0x58, 0x8a, 0xca, 0x10, 0xe4, 0xb9, 0x41, 0x1c, 0x9a, 0x4f, 0xb9,
0x75, 0x4c, 0xaa, 0xc9, 0x62, 0x61, 0x37, 0xa1, 0x5e, 0xab, 0x0d, 0x0a, 0x3d, 0x8b, 0x24, 0x61,
0x86, 0x87, 0x51, 0x07, 0x1f, 0xd3, 0xfd, 0xaf, 0x1f, 0x71, 0x2f, 0xa7, 0x1c, 0x8a, 0x25, 0x56,
0x43, 0x55, 0x72, 0xf0, 0x62, 0xcf, 0x1a, 0xed, 0x14, 0x4e, 0x68, 0x90, 0x1f, 0xe6, 0xe6, 0x1a,
0x47, 0x01, 0xcb, 0x42, 0xaa, 0x86, 0xc7, 0x94, 0x58, 0xb1, 0x81, 0xc6, 0x03, 0x08, 0xdf, 0x00,
0xd7, 0xe2, 0x06, 0x4a, 0xab, 0x9a, 0x7c, 0xe6, 0x0b, 0xa9, 0x01, 0x66, 0x6c, 0x45, 0x54, 0x25,
0x07, 0x17, 0x87, 0x47, 0xdd, 0x07, 0x11, 0xfe, 0x88, 0xb9, 0x90, 0x61, 0x09, 0xd8, 0xdd, 0x5d,
0xb4, 0x6a, 0xca, 0x97, 0x66, 0x91, 0x4a, 0x23, 0x65, 0x95, 0x66, 0x4c, 0xf1, 0x55, 0x25, 0x07,
0x6f, 0x0f, 0x09, 0x16, 0x0f, 0x2d, 0xfc, 0x29, 0x07, 0x56, 0xa3, 0x26, 0x68, 0xf5, 0x8f, 0x2a,
0x91, 0x71, 0xec, 0xb2, 0xa3, 0x01, 0x7f, 0x59, 0xf8, 0x56, 0xb9, 0x94, 0xba, 0x85, 0xc8, 0xf6,
0x5a, 0xb9, 0x92, 0x83, 0xf7, 0xfa, 0x56, 0x1a, 0x85, 0x3d, 0x76, 0x55, 0xcb, 0x6c, 0x0d, 0xbc,
0x6c, 0xfe, 0x2e, 0x07, 0x6e, 0xc7, 0xa7, 0x0c, 0xa6, 0x8b, 0x30, 0x3d, 0x54, 0xf5, 0xc5, 0xbb,
0x92, 0x39, 0x85, 0x8a, 0x7f, 0x44, 0x3c, 0x98, 0x42, 0x85, 0x30, 0xa6, 0x1b, 0x7d, 0x32, 0xeb,
0x31, 0xb3, 0x26, 0xf1, 0xd6, 0xb3, 0x11, 0x2b, 0x27, 0x62, 0xb3, 0xe8, 0x4b, 0xb1, 0x9c, 0xba,
0x74, 0xe3, 0x5f, 0xa5, 0xfa, 0x16, 0x1d, 0xff, 0x62, 0xf5, 0xab, 0xe0, 0xbc, 0x41, 0xeb, 0x9a,
0x50, 0xbf, 0xaa, 0xa8, 0x70, 0x95, 0x72, 0x4a, 0x3e, 0x7c, 0x8e, 0xad, 0xc1, 0xab, 0xe4, 0x20,
0x6f, 0x0c, 0x75, 0x04, 0x2e, 0x31, 0x6a, 0x02, 0xbe, 0x66, 0x69, 0x7a, 0xec, 0x8f, 0xec, 0x5a,
0xea, 0x82, 0x1d, 0x73, 0xfb, 0xc9, 0x5c, 0xe2, 0xb8, 0xeb, 0x51, 0x3f, 0x55, 0x8e, 0x11, 0x22,
0x3c, 0x05, 0x60, 0x72, 0x5c, 0x4f, 0x9d, 0xe7, 0xf1, 0x97, 0xa2, 0x6c, 0x9e, 0x53, 0x2e, 0x4e,
0x7f, 0x85, 0xa3, 0x4e, 0x24, 0xd8, 0x37, 0x7e, 0x2d, 0xfa, 0x5d, 0x8e, 0x60, 0xcb, 0x78, 0x23,
0xeb, 0xee, 0x35, 0xe9, 0xab, 0x1e, 0x03, 0xbb, 0xd7, 0x18, 0x20, 0xe1, 0x23, 0xe0, 0x4f, 0x16,
0xc2, 0x41, 0x49, 0x62, 0xa1, 0x48, 0xb9, 0xbe, 0x96, 0x32, 0xed, 0x83, 0x25, 0x8c, 0x95, 0x1c,
0x3c, 0x67, 0x0c, 0xb6, 0x0b, 0x87, 0xe0, 0xb2, 0x4f, 0x9b, 0x38, 0xa8, 0x68, 0x25, 0x63, 0xe1,
0x66, 0xca, 0x69, 0x7f, 0x72, 0x41, 0x61, 0x25, 0x07, 0x2f, 0x19, 0x71, 0xbd, 0xc2, 0x0e, 0xb8,
0xd4, 0x3f, 0x25, 0x61, 0x8e, 0x91, 0x4d, 0xe7, 0x2d, 0xca, 0xec, 0xd5, 0x44, 0x66, 0x31, 0xf7,
0x21, 0x95, 0x1c, 0xbc, 0xe0, 0xc4, 0x5c, 0x93, 0x1c, 0x83, 0x2b, 0x09, 0x87, 0xeb, 0x8c, 0xd5,
0xed, 0x94, 0x71, 0x25, 0x5f, 0x08, 0x10, 0x87, 0xbf, 0x9b, 0x7c, 0x5d, 0xb0, 0x03, 0xfc, 0x51,
0x23, 0xbf, 0x88, 0xc1, 0x61, 0xb5, 0x92, 0x85, 0x3b, 0x29, 0x83, 0x8b, 0xa9, 0xaf, 0x24, 0x83,
0x33, 0x62, 0xca, 0x2e, 0xab, 0xe0, 0x6c, 0xc8, 0x83, 0xce, 0xd2, 0x5d, 0x4a, 0xfb, 0x76, 0x2a,
0x6d, 0x02, 0x5c, 0xc9, 0xc1, 0x59, 0x23, 0x5a, 0x19, 0xb9, 0x0d, 0x84, 0x68, 0xbd, 0x05, 0x9b,
0x91, 0xc2, 0xbd, 0x94, 0x32, 0xee, 0xe1, 0xc2, 0x40, 0xea, 0x4d, 0x86, 0x8b, 0x05, 0x87, 0x48,
0xf7, 0x68, 0x91, 0x59, 0xe1, 0x7e, 0x66, 0xd2, 0xac, 0x2a, 0x6d, 0x90, 0xb4, 0x5f, 0xa9, 0x36,
0x44, 0xda, 0xa4, 0x45, 0x28, 0x85, 0x95, 0xcc, 0xa4, 0x59, 0xd5, 0xca, 0x20, 0x69, 0xbf, 0x92,
0xa5, 0x0d, 0x16, 0xa2, 0xa4, 0xfd, 0x3a, 0x30, 0x5f, 0x2f, 0xaf, 0xa4, 0x9c, 0x0b, 0xc4, 0x17,
0x06, 0x56, 0x72, 0x70, 0xde, 0x88, 0x2f, 0x19, 0x8c, 0xe7, 0xe6, 0xab, 0xea, 0xd5, 0x67, 0xe4,
0x16, 0x2a, 0x6c, 0x84, 0x9b, 0xaf, 0xb6, 0x78, 0x6e, 0xbe, 0xf6, 0x5e, 0x7b, 0x46, 0x6e, 0xa1,
0x0e, 0x47, 0xb8, 0xf9, 0x9a, 0x3c, 0x04, 0x8b, 0x51, 0x6e, 0xb4, 0x3c, 0xcc, 0x25, 0xd1, 0xb2,
0xe7, 0x62, 0xa7, 0xb0, 0x9a, 0x99, 0x5d, 0xb4, 0x46, 0x6e, 0x90, 0xdd, 0x40, 0xf5, 0xdc, 0x6f,
0x70, 0xa0, 0x18, 0x4d, 0x10, 0xa2, 0x37, 0x49, 0xfd, 0x63, 0x96, 0xc2, 0x83, 0xd4, 0x33, 0xd9,
0xd4, 0x17, 0x7e, 0xec, 0x4c, 0x36, 0x04, 0x6b, 0x8d, 0x82, 0x09, 0x07, 0xe0, 0x72, 0xcc, 0x09,
0x0b, 0xb6, 0x5a, 0xb8, 0xf0, 0x7a, 0x6a, 0x8a, 0x9d, 0xf0, 0xbe, 0x8e, 0xa5, 0xd8, 0x43, 0x9d,
0x56, 0x0b, 0x0f, 0x33, 0x0b, 0xd2, 0x4d, 0xdb, 0xc4, 0x85, 0x87, 0x99, 0x99, 0x0d, 0xbd, 0x69,
0x1b, 0x64, 0xd6, 0xef, 0x14, 0xbe, 0x02, 0xce, 0x7b, 0xc6, 0x9e, 0x1f, 0x87, 0x30, 0x09, 0x88,
0xce, 0x49, 0x61, 0x2d, 0x25, 0x16, 0xc5, 0x5d, 0x38, 0x92, 0x58, 0xe4, 0x19, 0x7b, 0xd1, 0x76,
0xc1, 0x03, 0x8b, 0xae, 0x7f, 0x3d, 0x83, 0x1c, 0x4a, 0x09, 0xed, 0x61, 0x7a, 0x90, 0xdd, 0x6b,
0x7b, 0x85, 0x37, 0x52, 0x8e, 0xa4, 0xc6, 0xdd, 0xec, 0x54, 0x72, 0xf0, 0xb2, 0x1b, 0xdf, 0x3f,
0xbc, 0x2c, 0xfc, 0x9a, 0x33, 0x7f, 0xc9, 0x3f, 0xca, 0x6c, 0xa7, 0xd1, 0x4a, 0xc5, 0x41, 0x3b,
0x1d, 0xa8, 0x61, 0x8c, 0xe7, 0xe6, 0x2f, 0xc2, 0x37, 0x9f, 0x91, 0x5b, 0xdc, 0x22, 0x1c, 0x28,
0xcc, 0xdb, 0x89, 0xde, 0xb5, 0xef, 0x62, 0xaf, 0xb5, 0xef, 0xc7, 0xc0, 0x2f, 0xa4, 0x44, 0xa4,
0x98, 0xeb, 0x2d, 0x12, 0x91, 0xcc, 0x98, 0x5b, 0xaf, 0xef, 0x0d, 0x9d, 0xe6, 0xf9, 0x06, 0x38,
0x7c, 0xc7, 0x5f, 0x78, 0x2b, 0xf3, 0xe1, 0x59, 0xf2, 0xa7, 0x19, 0x06, 0x8f, 0xf4, 0x62, 0xe1,
0x84, 0x6f, 0x0e, 0xed, 0xec, 0x0f, 0x7a, 0x3b, 0x98, 0x5e, 0xce, 0x0e, 0x6c, 0x13, 0x1e, 0x67,
0x3e, 0xe0, 0x1c, 0xfd, 0x62, 0xce, 0xe0, 0x01, 0x27, 0xed, 0x3f, 0x18, 0xd8, 0x1e, 0x7c, 0x3b,
0x5e, 0x25, 0x46, 0xb7, 0x4b, 0x8f, 0x59, 0xc3, 0x03, 0xce, 0xb7, 0x53, 0x4f, 0xb8, 0xc7, 0x3d,
0xbd, 0x1c, 0x74, 0x44, 0xb1, 0x8f, 0x33, 0xbb, 0x60, 0xc9, 0xb7, 0xb6, 0x3d, 0xc7, 0xe8, 0xee,
0xd3, 0x2d, 0x9d, 0xdb, 0x32, 0x82, 0x4c, 0xe8, 0x1d, 0xca, 0xff, 0xf5, 0x14, 0x7b, 0x1b, 0xb9,
0xaf, 0x27, 0xab, 0xc9, 0x88, 0x74, 0x1d, 0xbb, 0xfd, 0xab, 0xfc, 0x4f, 0xd8, 0x46, 0x6d, 0x80,
0x6b, 0xcb, 0xb1, 0x8f, 0x3b, 0xe8, 0xff, 0xe3, 0x63, 0xdc, 0x46, 0xa6, 0xb5, 0xbb, 0x4b, 0xb7,
0xc0, 0x85, 0x77, 0x53, 0xed, 0x21, 0xfd, 0x06, 0x99, 0xd9, 0xc3, 0x58, 0x38, 0xe1, 0xff, 0x81,
0x4b, 0xb4, 0x88, 0x83, 0xde, 0x9b, 0xd2, 0x3b, 0x4f, 0x7f, 0xf4, 0xef, 0xa5, 0xdd, 0x54, 0x8e,
0x5c, 0xbf, 0x56, 0x72, 0x50, 0xe8, 0x8d, 0x5e, 0xca, 0xb2, 0x03, 0xf5, 0xd8, 0x7d, 0x13, 0xee,
0xfa, 0xcc, 0xbe, 0x98, 0x6a, 0x6f, 0xc9, 0xf5, 0x8c, 0xcc, 0xde, 0xc6, 0xd4, 0x3b, 0xfe, 0x0e,
0x07, 0xee, 0x25, 0x48, 0xe0, 0x1f, 0x67, 0xd9, 0x5d, 0x1c, 0x4c, 0xfa, 0x97, 0x52, 0x43, 0x60,
0x6a, 0x59, 0x21, 0xbb, 0xfd, 0x4b, 0xaf, 0x3e, 0xfc, 0x94, 0x03, 0x2b, 0xf1, 0x72, 0xd1, 0xba,
0xb5, 0xe1, 0x2d, 0xdd, 0xfb, 0xa9, 0x97, 0x6f, 0x19, 0xea, 0xfc, 0xd8, 0xd9, 0x47, 0x96, 0x82,
0x40, 0xff, 0x4c, 0x21, 0x76, 0xab, 0x49, 0x9f, 0x6f, 0x75, 0x83, 0x73, 0xd3, 0x0f, 0x3e, 0xcb,
0x5e, 0x33, 0x52, 0x7b, 0x97, 0xb8, 0xd7, 0x8c, 0xd6, 0xe7, 0x7d, 0xc2, 0x4e, 0x49, 0x63, 0xc4,
0x69, 0x5b, 0x9d, 0x83, 0x81, 0xd3, 0x05, 0x31, 0x75, 0xcb, 0x99, 0x52, 0x0a, 0x57, 0xc9, 0xc1,
0x1b, 0x31, 0x02, 0x0d, 0x02, 0xad, 0x9f, 0x06, 0x53, 0x94, 0xe6, 0x93, 0xc9, 0xe9, 0x3c, 0x3f,
0x41, 0x6c, 0x30, 0xdc, 0x09, 0x93, 0xb8, 0x1c, 0x5c, 0x9a, 0x51, 0xc9, 0x56, 0x7e, 0xc8, 0xf7,
0x3f, 0xa2, 0x18, 0x6c, 0xd6, 0x84, 0x1b, 0x60, 0xb9, 0xa4, 0x68, 0x92, 0xfa, 0x54, 0x86, 0x08,
0xca, 0x9a, 0xda, 0x84, 0xd2, 0xf0, 0x27, 0x90, 0xae, 0x80, 0xc2, 0x28, 0x88, 0x26, 0xc3, 0xa7,
0x32, 0xe4, 0x39, 0xe1, 0x3a, 0xb8, 0x32, 0xda, 0xbb, 0xd9, 0x5c, 0x97, 0x61, 0x5d, 0xd6, 0x65,
0x8d, 0xcf, 0x0b, 0x6f, 0x80, 0x07, 0xa3, 0x10, 0x25, 0x51, 0x17, 0xd7, 0x45, 0x4d, 0x46, 0x0d,
0x55, 0xd3, 0xcb, 0x50, 0xd6, 0x90, 0x26, 0x57, 0x37, 0x50, 0x45, 0xd5, 0x74, 0xb9, 0xc4, 0x4f,
0x08, 0xaf, 0x83, 0x57, 0xc7, 0x20, 0xd5, 0xb6, 0xb5, 0x0f, 0xab, 0x03, 0x18, 0x93, 0xc2, 0x1a,
0x58, 0x1d, 0x87, 0xa1, 0xd6, 0xcb, 0x6a, 0x69, 0x7d, 0x00, 0x67, 0x4a, 0x78, 0x05, 0xdc, 0xcd,
0x22, 0x1a, 0x2c, 0x69, 0xfc, 0x29, 0xe1, 0x1e, 0xb8, 0x95, 0x2a, 0x12, 0x81, 0x3c, 0x2d, 0xdc,
0x01, 0xc5, 0x51, 0x48, 0xb1, 0xd1, 0xa8, 0x2a, 0x92, 0xa8, 0x2b, 0x6a, 0x1d, 0x55, 0x74, 0xbd,
0xc1, 0x4f, 0x0b, 0xb7, 0xc1, 0x8d, 0xf1, 0x70, 0xba, 0xd4, 0xe0, 0x67, 0xe2, 0xc1, 0xb6, 0x94,
0x7a, 0x49, 0xdd, 0xd2, 0x50, 0x49, 0xd6, 0x36, 0x75, 0xb5, 0xc1, 0x03, 0xe1, 0x55, 0x70, 0x6f,
0x8c, 0x7c, 0xda, 0x87, 0x55, 0x36, 0x67, 0x54, 0xc6, 0x33, 0x29, 0x0a, 0xee, 0x0f, 0x5d, 0x2e,
0x69, 0x15, 0x65, 0x43, 0xe7, 0x67, 0x85, 0x47, 0xe0, 0xf5, 0x4c, 0xf4, 0xa3, 0x2a, 0x3e, 0x9b,
0xc2, 0x07, 0xca, 0x25, 0x65, 0x70, 0xea, 0xe7, 0xb2, 0x4e, 0x4a, 0x59, 0x6a, 0xf0, 0xe7, 0x32,
0x4d, 0x0a, 0x81, 0xe4, 0x33, 0xab, 0x87, 0x40, 0x9f, 0x17, 0xde, 0x05, 0x6f, 0x3d, 0x8b, 0x7a,
0xfc, 0xf5, 0x50, 0x95, 0x35, 0x8d, 0x17, 0x84, 0xd7, 0xc0, 0xfd, 0x2c, 0xc8, 0xe2, 0x47, 0x4d,
0x28, 0xf3, 0x17, 0x84, 0xbb, 0xe0, 0xe6, 0x18, 0xf0, 0xd2, 0x76, 0x5d, 0xac, 0xa9, 0xa5, 0x75,
0xfe, 0x62, 0x8a, 0x89, 0x4b, 0xa2, 0xa6, 0x89, 0xf5, 0x12, 0x14, 0xd1, 0xa6, 0xbc, 0xad, 0x35,
0x44, 0x49, 0xd6, 0xf8, 0x4b, 0x29, 0xb3, 0xd6, 0xc7, 0x89, 0xce, 0xc1, 0xbc, 0xf0, 0x18, 0x3c,
0x1a, 0x83, 0x25, 0x57, 0x45, 0x4d, 0x57, 0x24, 0x4d, 0x16, 0xa1, 0x54, 0x19, 0xc0, 0xbc, 0x9c,
0x69, 0xbe, 0x7d, 0x7c, 0x51, 0xaa, 0xc8, 0x7c, 0x21, 0x45, 0x5b, 0x0c, 0xa3, 0x26, 0xd7, 0x54,
0xb8, 0x5d, 0x5a, 0xe7, 0x17, 0x32, 0x31, 0xa0, 0x9a, 0x45, 0x8c, 0xc1, 0x62, 0xca, 0x60, 0x18,
0x86, 0x54, 0x6d, 0x6a, 0xfa, 0x90, 0xf1, 0x2e, 0x09, 0x2b, 0xe0, 0x4e, 0xaa, 0x75, 0xb1, 0x59,
0xbc, 0x22, 0xac, 0x82, 0x95, 0x4c, 0xf6, 0xc5, 0xe0, 0x97, 0x53, 0x26, 0xb3, 0x0f, 0x5f, 0x53,
0x24, 0xa8, 0x6a, 0xea, 0x86, 0xce, 0x5f, 0x15, 0xbe, 0x00, 0xd6, 0xc6, 0x4d, 0xa6, 0x2a, 0x6d,
0x42, 0x55, 0x94, 0x2a, 0x43, 0x7e, 0xee, 0x5a, 0x8a, 0xed, 0x07, 0xbe, 0x51, 0xd4, 0xab, 0xa2,
0xc6, 0x5f, 0x4f, 0x59, 0x53, 0x5a, 0x5d, 0xdd, 0xda, 0xa8, 0x8a, 0x9b, 0x32, 0x7f, 0x23, 0x81,
0xae, 0x2a, 0x45, 0xb4, 0x5b, 0xd2, 0x50, 0x03, 0xaa, 0x5f, 0xde, 0xe6, 0x8b, 0x09, 0xa6, 0x18,
0x85, 0xae, 0x28, 0xe5, 0x0a, 0x12, 0x9f, 0x8a, 0x4a, 0x55, 0x5c, 0x57, 0xaa, 0x8a, 0xbe, 0xcd,
0xdf, 0x14, 0xde, 0x02, 0x6f, 0xa4, 0x60, 0xd1, 0x15, 0xa2, 0x48, 0x08, 0xca, 0x65, 0x45, 0xd3,
0x21, 0x75, 0x9d, 0xfc, 0xad, 0x78, 0x2f, 0xac, 0x89, 0xb5, 0x6a, 0xd4, 0xc5, 0xf2, 0xb7, 0x85,
0x22, 0xb8, 0x3a, 0x0a, 0x27, 0x4b, 0x6b, 0xec, 0x63, 0x7f, 0x75, 0x49, 0xe6, 0xef, 0x24, 0x18,
0x9d, 0x2a, 0x0d, 0xbb, 0x61, 0x54, 0x57, 0xeb, 0x48, 0x2c, 0xf1, 0x77, 0x85, 0x5b, 0xe0, 0xfa,
0xb8, 0xb8, 0x48, 0x3f, 0x02, 0x77, 0x2f, 0xde, 0xf6, 0xa3, 0x11, 0x40, 0xdc, 0xd2, 0x90, 0xa4,
0xd6, 0x35, 0xb5, 0x2a, 0xf3, 0xf7, 0x85, 0x6b, 0x60, 0x69, 0x14, 0xbc, 0x26, 0x35, 0x90, 0xa6,
0x97, 0x14, 0x95, 0x5f, 0xa1, 0x9f, 0x4a, 0x8c, 0x07, 0xd0, 0x64, 0xfe, 0x15, 0xe1, 0x3e, 0xb8,
0x9d, 0x84, 0x0f, 0x65, 0xb1, 0x26, 0xae, 0x57, 0x65, 0x16, 0x9b, 0x5e, 0x5d, 0xf9, 0x63, 0x0e,
0xcc, 0x0d, 0x7e, 0xae, 0x78, 0x80, 0xbb, 0xa6, 0x8b, 0x7a, 0x53, 0x1b, 0xca, 0x14, 0x96, 0xc0,
0xe5, 0x61, 0x00, 0xad, 0x29, 0x49, 0xc4, 0x29, 0x72, 0xb1, 0x9d, 0x9b, 0x4a, 0xa3, 0x21, 0x97,
0xf8, 0xbc, 0xb0, 0x00, 0x2e, 0x0d, 0x77, 0xca, 0x10, 0xaa, 0x90, 0x9f, 0x88, 0xc3, 0x13, 0xd7,
0x55, 0x48, 0x83, 0xfe, 0xca, 0x4f, 0xf3, 0x60, 0x42, 0xd2, 0x45, 0xe1, 0x02, 0x38, 0x27, 0xe9,
0xe2, 0xe8, 0x87, 0x21, 0x49, 0xa3, 0xd8, 0xd4, 0x2b, 0x44, 0x87, 0x75, 0x59, 0xd2, 0x55, 0x92,
0xb2, 0x5c, 0x06, 0x17, 0x68, 0xbb, 0xa4, 0x2b, 0x4f, 0x49, 0x26, 0xa3, 0x69, 0x8a, 0x5a, 0x27,
0x99, 0x4a, 0xd8, 0x41, 0x44, 0x46, 0x50, 0xfe, 0xb0, 0x29, 0x6b, 0xba, 0xc6, 0x4f, 0x04, 0x1d,
0x0d, 0x28, 0xd7, 0x94, 0x66, 0x0d, 0x69, 0xcd, 0x46, 0x43, 0x85, 0x3a, 0x3f, 0x19, 0x74, 0xe8,
0x90, 0x78, 0x8f, 0x12, 0x2a, 0xc9, 0x4f, 0x15, 0xe2, 0x76, 0xa7, 0x02, 0xde, 0xcd, 0x46, 0x19,
0x8a, 0x25, 0x19, 0xad, 0x8b, 0xf5, 0xba, 0x0c, 0xf9, 0x53, 0x01, 0xc2, 0xba, 0x52, 0xad, 0x2a,
0xf5, 0x32, 0xd2, 0x9a, 0xb5, 0x9a, 0x08, 0xb7, 0xf9, 0xd3, 0xc1, 0x08, 0x7c, 0xde, 0x55, 0x45,
0xd3, 0xf9, 0x69, 0xfa, 0xf9, 0xc0, 0x7e, 0x63, 0x4d, 0xad, 0x2b, 0xba, 0x0a, 0x95, 0x7a, 0x99,
0x9f, 0xa1, 0x1f, 0x26, 0xd4, 0x45, 0x24, 0x7f, 0x59, 0x97, 0x61, 0x5d, 0xac, 0x22, 0xb1, 0x59,
0x52, 0x74, 0xa4, 0xe9, 0x2a, 0x14, 0xcb, 0x32, 0x0f, 0x02, 0x01, 0xd4, 0x4d, 0x22, 0x85, 0x46,
0x74, 0xb7, 0x5d, 0x97, 0xf8, 0x33, 0x02, 0x0f, 0x66, 0x29, 0x5e, 0x5d, 0x87, 0x22, 0x52, 0x4a,
0xfc, 0xac, 0x70, 0x1e, 0x9c, 0x0d, 0x21, 0x35, 0x49, 0xa9, 0xf1, 0x67, 0x03, 0xbe, 0x4a, 0x49,
0xae, 0xeb, 0x8a, 0xbe, 0x8d, 0x34, 0x59, 0x6a, 0x42, 0xb2, 0x1c, 0xe7, 0x56, 0x7e, 0x74, 0x06,
0x5c, 0x8a, 0x7d, 0x7b, 0x47, 0xc2, 0x98, 0x52, 0xd7, 0xe5, 0x32, 0x5b, 0x80, 0x48, 0xae, 0x43,
0xb5, 0x5a, 0x45, 0x9b, 0x4a, 0x7d, 0xf8, 0x93, 0x8b, 0x37, 0xc0, 0x72, 0x12, 0xa0, 0x56, 0x15,
0xa5, 0x4d, 0x9e, 0x23, 0xab, 0x27, 0x09, 0x84, 0xac, 0x08, 0x55, 0x29, 0x49, 0x7c, 0x9e, 0x24,
0x46, 0x49, 0x50, 0x0d, 0xb1, 0x2c, 0xc3, 0x52, 0x53, 0xdf, 0xe6, 0x27, 0xc6, 0xf1, 0x93, 0x6b,
0xa2, 0x52, 0xe5, 0x27, 0x49, 0x16, 0x9b, 0x04, 0xf2, 0x44, 0x81, 0x22, 0x3f, 0x25, 0xdc, 0x04,
0xd7, 0x92, 0x20, 0xa8, 0x79, 0xc2, 0x12, 0x7f, 0x8a, 0xb8, 0x9c, 0x24, 0xa0, 0x9a, 0xa8, 0xeb,
0x32, 0xac, 0xa9, 0x9a, 0xce, 0x9f, 0x1e, 0x37, 0xbc, 0x9a, 0x86, 0x74, 0x59, 0xac, 0x69, 0xfc,
0xf4, 0x38, 0x28, 0xb5, 0xa1, 0x95, 0xe5, 0xba, 0x22, 0xf3, 0x33, 0xe3, 0x44, 0x27, 0x53, 0xca,
0x83, 0xb1, 0x83, 0x13, 0x6b, 0x1b, 0xfc, 0x99, 0xf1, 0x72, 0x4b, 0x15, 0xa5, 0x2e, 0x33, 0x53,
0x79, 0x13, 0x3c, 0x4c, 0x87, 0x43, 0x65, 0x45, 0xaf, 0x34, 0xd7, 0xe9, 0xfa, 0x22, 0xeb, 0xea,
0xac, 0xf0, 0x00, 0xbc, 0x92, 0x01, 0x4d, 0x52, 0xa0, 0x54, 0x95, 0x25, 0x85, 0x9f, 0x23, 0x6e,
0x31, 0x1b, 0x9f, 0xaa, 0xb8, 0xce, 0x9f, 0x23, 0xa1, 0x37, 0x03, 0xf8, 0x13, 0xb9, 0xbe, 0xa9,
0xd4, 0x35, 0x9e, 0xcf, 0x08, 0x2f, 0xd6, 0x35, 0x65, 0xbd, 0x2a, 0xf3, 0xe7, 0xc7, 0xa9, 0x87,
0x04, 0x69, 0x45, 0x92, 0xeb, 0xea, 0x16, 0x2f, 0x8c, 0x9b, 0xb0, 0x70, 0xbd, 0x5d, 0x20, 0x01,
0x2d, 0xd1, 0x92, 0x44, 0x5d, 0x2c, 0xa9, 0x65, 0xa4, 0xd4, 0x25, 0xba, 0xf6, 0x50, 0x4d, 0xac,
0x8b, 0x65, 0xb9, 0x26, 0xd7, 0x75, 0xfe, 0x22, 0xc9, 0x46, 0xb2, 0x88, 0xbd, 0x45, 0xd2, 0xbe,
0x6c, 0xb0, 0x24, 0xd7, 0x9d, 0x27, 0x51, 0x3c, 0x0b, 0x5d, 0x9a, 0xb7, 0xd0, 0x04, 0x2f, 0x03,
0x34, 0xcd, 0x3f, 0xab, 0x64, 0xe3, 0x50, 0x10, 0x1e, 0x82, 0xd7, 0x32, 0x60, 0x44, 0xf6, 0x8c,
0x0b, 0xe3, 0x2c, 0x86, 0xac, 0xff, 0xd0, 0x31, 0x49, 0x72, 0x5d, 0x97, 0x21, 0xbf, 0x38, 0x6e,
0x4a, 0x7d, 0x73, 0x84, 0x72, 0x43, 0xf5, 0x3d, 0x29, 0xbf, 0x94, 0xd1, 0xc2, 0x44, 0x58, 0x56,
0xa5, 0x12, 0x7f, 0x45, 0xf8, 0x00, 0xbc, 0xf7, 0xcc, 0x86, 0x1f, 0x1d, 0xd1, 0xf2, 0x38, 0x5f,
0x45, 0x63, 0x7c, 0x55, 0x6d, 0x96, 0xf8, 0xab, 0xe3, 0x9c, 0xa8, 0x9f, 0xd4, 0x52, 0xc0, 0x6b,
0x24, 0x49, 0x4b, 0x1c, 0xb0, 0xaa, 0x96, 0xab, 0x01, 0xe4, 0xf5, 0x95, 0x6f, 0x9f, 0x8a, 0xf1,
0xd8, 0x9a, 0x87, 0xbb, 0x09, 0xcc, 0x34, 0x5d, 0x6e, 0x0c, 0x79, 0xec, 0x78, 0xed, 0x52, 0x40,
0x71, 0x4b, 0x53, 0xa4, 0x20, 0xbc, 0x32, 0xc7, 0xcc, 0x09, 0x5f, 0x02, 0xef, 0x8c, 0x87, 0xd7,
0x64, 0xdd, 0x9f, 0x0b, 0x12, 0xe9, 0x50, 0x49, 0xde, 0x10, 0x9b, 0x55, 0x1d, 0xa9, 0x5b, 0x24,
0x4a, 0xe6, 0x85, 0x2f, 0x82, 0xb7, 0xc7, 0xe3, 0x37, 0x1b, 0x55, 0x55, 0x64, 0x9a, 0xa3, 0x19,
0x9d, 0xd6, 0x40, 0x35, 0x59, 0x17, 0xc9, 0xfa, 0xe1, 0x27, 0x48, 0x9a, 0x3c, 0x1e, 0x5d, 0x97,
0x35, 0x9d, 0xc6, 0xba, 0x40, 0x70, 0x92, 0x09, 0x4e, 0x26, 0xac, 0x4c, 0x8a, 0xc7, 0xa6, 0x16,
0x8a, 0x48, 0x82, 0xb2, 0xa8, 0xcb, 0x28, 0x02, 0xc7, 0x4f, 0x8d, 0x63, 0x38, 0x8c, 0x58, 0x56,
0x82, 0xcd, 0x22, 0x7f, 0x2a, 0x1b, 0x43, 0xfa, 0xfd, 0x60, 0x32, 0xf5, 0x9a, 0x56, 0x41, 0x92,
0x0c, 0x49, 0x00, 0x89, 0x5f, 0x84, 0xb1, 0x0c, 0x21, 0x49, 0x1d, 0xa7, 0x49, 0xf2, 0x9d, 0x84,
0x51, 0xdb, 0x52, 0xca, 0x15, 0x71, 0xf3, 0xb1, 0x16, 0x4e, 0x23, 0xa3, 0xc1, 0xcf, 0x8c, 0x1b,
0xd8, 0x00, 0x96, 0x2f, 0xa1, 0xbf, 0xbc, 0x40, 0x36, 0x6e, 0x9a, 0xac, 0x37, 0x1b, 0x68, 0x4b,
0x85, 0x9b, 0x1b, 0x55, 0x75, 0x8b, 0x3f, 0x93, 0xb0, 0x28, 0x87, 0xb0, 0xb6, 0xe4, 0xaa, 0xa4,
0xd6, 0x64, 0x7e, 0x76, 0x9c, 0x55, 0x3e, 0x95, 0xa1, 0xb2, 0xb1, 0x3d, 0x30, 0x4b, 0x67, 0x57,
0x7e, 0xc6, 0xc5, 0xbe, 0x8a, 0x0f, 0x5e, 0xb4, 0x27, 0xd2, 0xa3, 0x39, 0xa7, 0xa4, 0x96, 0x86,
0x0f, 0xc6, 0xe2, 0x7d, 0x6c, 0x14, 0xbe, 0x9f, 0xfd, 0x66, 0x80, 0x0d, 0x93, 0xe1, 0xf8, 0xa5,
0x1d, 0x85, 0x0d, 0x72, 0xe3, 0x74, 0xaa, 0xfd, 0x54, 0xf9, 0x1f, 0xf3, 0xa0, 0x90, 0x74, 0x20,
0x9c, 0x44, 0x88, 0xad, 0x8c, 0xa1, 0x61, 0xc7, 0xfb, 0xc2, 0x00, 0xb6, 0x3f, 0x51, 0x81, 0x37,
0x2c, 0x3d, 0x25, 0x9b, 0x28, 0x92, 0xb3, 0xb0, 0x7c, 0x80, 0xcb, 0x4c, 0x21, 0xb2, 0x5d, 0xaa,
0x8a, 0xeb, 0x72, 0x15, 0x35, 0x14, 0x69, 0x93, 0x3a, 0x88, 0x12, 0xf8, 0xe0, 0x59, 0x29, 0x8c,
0xc8, 0x31, 0x21, 0x54, 0x40, 0xe9, 0x59, 0xa9, 0x84, 0xbb, 0x26, 0xd8, 0xac, 0xca, 0x81, 0x3c,
0x93, 0x2b, 0xdf, 0x3f, 0x05, 0xe6, 0xe3, 0x4f, 0xb4, 0x13, 0x66, 0x73, 0x43, 0x91, 0xab, 0xc3,
0x79, 0xf1, 0x7b, 0xe0, 0x71, 0x22, 0xe4, 0x88, 0x5a, 0x49, 0x38, 0xd3, 0xc8, 0x76, 0x60, 0x1b,
0x35, 0x61, 0x95, 0xe7, 0x12, 0x96, 0x5c, 0x02, 0xf6, 0x3a, 0x14, 0xeb, 0x52, 0x85, 0xcf, 0x27,
0x2c, 0xf0, 0x04, 0xac, 0x70, 0xa9, 0x4e, 0x08, 0x6f, 0x83, 0x37, 0xb3, 0xe3, 0xc9, 0xf5, 0xa7,
0x0a, 0x54, 0xeb, 0x34, 0x8d, 0x99, 0x4c, 0x48, 0x07, 0x12, 0x87, 0xb9, 0xc1, 0x4f, 0x25, 0xc4,
0x83, 0x44, 0x6e, 0xba, 0x0c, 0x1b, 0x50, 0xd1, 0x64, 0xa4, 0x55, 0x9b, 0x65, 0xfe, 0x54, 0x82,
0xb5, 0x64, 0x40, 0xd7, 0x45, 0x5d, 0x91, 0xd0, 0x93, 0xad, 0x4d, 0x8d, 0x3f, 0x2d, 0x3c, 0x06,
0x8f, 0x32, 0x50, 0x19, 0xb6, 0x59, 0x92, 0xc8, 0x3f, 0x33, 0x66, 0x19, 0xaa, 0xcd, 0x86, 0xc6,
0xcf, 0x24, 0x04, 0x88, 0x31, 0x98, 0x64, 0xab, 0x47, 0x1c, 0x70, 0xfc, 0x12, 0x1b, 0x83, 0x38,
0x60, 0xd8, 0x1a, 0x7f, 0x26, 0x21, 0x86, 0x8f, 0xa1, 0x10, 0x1c, 0xa1, 0xd5, 0x45, 0xe2, 0x9d,
0x57, 0x7e, 0x18, 0xf7, 0xd9, 0x97, 0xe0, 0xab, 0x00, 0x09, 0x39, 0x27, 0x75, 0x59, 0x31, 0xff,
0x85, 0x21, 0xde, 0x3d, 0xf5, 0xa1, 0x75, 0x19, 0x42, 0x71, 0x43, 0x85, 0xb5, 0xc4, 0x75, 0xd0,
0x87, 0x1d, 0x4a, 0xd2, 0xb6, 0xc5, 0x5a, 0x95, 0xcf, 0xaf, 0xbc, 0x0f, 0x4e, 0xfb, 0x55, 0x65,
0x64, 0x8b, 0xbe, 0x21, 0x8b, 0x3a, 0x89, 0x67, 0x23, 0xc7, 0x1b, 0x41, 0xc7, 0xf0, 0x86, 0x9f,
0x5b, 0xf9, 0x43, 0x0e, 0x2c, 0x8d, 0x79, 0xf3, 0x4d, 0x62, 0x5b, 0x80, 0x0c, 0x65, 0x49, 0xad,
0xd5, 0xe4, 0x7a, 0x89, 0x49, 0x18, 0x7b, 0x94, 0xb2, 0x02, 0xee, 0x8c, 0x07, 0xaf, 0xab, 0x3a,
0x83, 0xe5, 0xc8, 0xf6, 0x64, 0x3c, 0x6c, 0x49, 0xad, 0xcb, 0x7c, 0x7e, 0xfd, 0xab, 0x7f, 0xf3,
0x93, 0xab, 0xdc, 0xdf, 0xff, 0xe4, 0x2a, 0xf7, 0x4f, 0x3f, 0xb9, 0xca, 0x7d, 0xa4, 0xee, 0x59,
0xde, 0x7e, 0x6f, 0x67, 0xb5, 0x65, 0x1f, 0x3e, 0xd8, 0x73, 0x8c, 0x23, 0x8b, 0x55, 0x1d, 0x1b,
0xed, 0x07, 0xfd, 0x7f, 0x0c, 0xd7, 0xb5, 0x1e, 0xec, 0xe1, 0xce, 0x03, 0xfa, 0x3e, 0xff, 0xc1,
0x9e, 0x3d, 0xf4, 0xdf, 0xe6, 0xde, 0x8d, 0xfc, 0x3c, 0x7a, 0xb8, 0x73, 0x8a, 0x82, 0xbd, 0xf1,
0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x42, 0x1c, 0xf6, 0xfb, 0x9d, 0x6e, 0x00, 0x00,
}
func (m *UIBannerClickEvent) Marshal() (dAtA []byte, err error) {
@@ -9825,6 +9851,13 @@ func (m *ResourceCreateEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i -= len(m.XXX_unrecognized)
copy(dAtA[i:], m.XXX_unrecognized)
}
if len(m.DiscoveryConfigName) > 0 {
i -= len(m.DiscoveryConfigName)
copy(dAtA[i:], m.DiscoveryConfigName)
i = encodeVarintUsageevents(dAtA, i, uint64(len(m.DiscoveryConfigName)))
i--
dAtA[i] = 0x2a
}
if m.Database != nil {
{
size, err := m.Database.MarshalToSizedBuffer(dAtA[:i])
@@ -13069,6 +13102,10 @@ func (m *ResourceCreateEvent) Size() (n int) {
l = m.Database.Size()
n += 1 + l + sovUsageevents(uint64(l))
}
l = len(m.DiscoveryConfigName)
if l > 0 {
n += 1 + l + sovUsageevents(uint64(l))
}
if m.XXX_unrecognized != nil {
n += len(m.XXX_unrecognized)
}
@@ -21927,6 +21964,38 @@ func (m *ResourceCreateEvent) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
case 5:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field DiscoveryConfigName", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowUsageevents
}
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 ErrInvalidLengthUsageevents
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthUsageevents
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.DiscoveryConfigName = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipUsageevents(dAtA[iNdEx:])
@@ -619,6 +619,9 @@ enum IntegrationEnrollKind {
INTEGRATION_ENROLL_KIND_GITHUB_REPO_ACCESS = 27;
INTEGRATION_ENROLL_KIND_MACHINE_ID_ARGOCD = 28;
INTEGRATION_ENROLL_KIND_MACHINE_ID_GITHUB_ACTIONS_KUBERNETES = 29;
INTEGRATION_ENROLL_KIND_AWS_CLOUD = 30;
INTEGRATION_ENROLL_KIND_AZURE_CLOUD = 31;
INTEGRATION_ENROLL_KIND_GOOGLE_CLOUD = 32;
}
// IntegrationEnrollMetadata contains common metadata
@@ -667,6 +670,9 @@ enum IntegrationEnrollStep {
INTEGRATION_ENROLL_STEP_MWIGHAK8S_CONFIGURE_ACCESS = 10;
INTEGRATION_ENROLL_STEP_MWIGHAK8S_SETUP_WORKFLOW = 11;
INTEGRATION_ENROLL_STEP_MWIGHAK8S_WELCOME = 12;
// General integration setup steps.
INTEGRATION_ENROLL_STEP_VERIFY_INTEGRATION = 13;
}
// IntegrationEnrollStatusCode defines status code for an integration enroll step.
@@ -802,6 +808,9 @@ message ResourceCreateEvent {
string cloud_provider = 3;
// database contains additional database information if resource_type == "db".
DiscoveredDatabaseMetadata database = 4;
// discovery_config_name is the name of the DiscoveryConfig that triggered discovery.
// Empty for teleport.yaml matcher configuration.
string discovery_config_name = 5;
}
// DiscoveredDatabaseMetadata contains additional database information.
+2
View File
@@ -960,6 +960,8 @@ const (
DiscoveryPublicAddr = TeleportNamespace + "/public-addr"
// DiscoveryDescription specifies the description for a discovered app created from a Kubernetes service.
DiscoveryDescription = TeleportNamespace + "/description"
// IACToolLabel is a resource metadata label that identifies which infrastructure-as-code tool created the resource.
DiscoveryIACToolLabel = TeleportNamespace + "/iac-tool"
// ReqAnnotationApproveSchedulesLabel is the request annotation key at which schedules are stored for access plugins.
ReqAnnotationApproveSchedulesLabel = "/schedules"
File diff suppressed because it is too large Load Diff
+212 -5
View File
@@ -164,6 +164,13 @@ export interface ResourceCreateEvent {
* @generated from protobuf field: prehog.v1alpha.DiscoveredDatabaseMetadata database = 4;
*/
database?: DiscoveredDatabaseMetadata;
/**
* discovery_config_name is the anonymized name of the DiscoveryConfig that triggered discovery.
* Empty for teleport.yaml matcher configuration.
*
* @generated from protobuf field: string discovery_config_name = 5;
*/
discoveryConfigName: string;
}
/**
* DiscoveredDatabaseMetadata contains additional database information.
@@ -2959,6 +2966,15 @@ export interface UserTaskStateEvent {
* @generated from protobuf field: int32 instances_count = 4;
*/
instancesCount: number;
/**
* discovery_config_name is the anonymized name of the DiscoveryConfig used when
* the issue was created.
*
* PostHog property: tp.usertask.discovery_config_name
*
* @generated from protobuf field: string discovery_config_name = 5;
*/
discoveryConfigName: string;
}
/**
* AccessRequestCreateEvent is emitted when an Access Request is created.
@@ -3161,6 +3177,45 @@ export interface SessionSummaryCreateEvent {
*/
isCloudDefaultModel: boolean;
}
/**
* DiscoveryConfigEvent is emitted when a DiscoveryConfig resource is created, updated, or deleted.
*
* PostHog event: tp.discovery.config
*
* @generated from protobuf message prehog.v1alpha.DiscoveryConfigEvent
*/
export interface DiscoveryConfigEvent {
/**
* action is the operation performed on the DiscoveryConfig.
*
* @generated from protobuf field: prehog.v1alpha.DiscoveryConfigAction action = 1;
*/
action: DiscoveryConfigAction;
/**
* discovery_config_name is the anonymized name of the DiscoveryConfig.
*
* @generated from protobuf field: string discovery_config_name = 2;
*/
discoveryConfigName: string;
/**
* resource_types is the list of resource types configured for discovery (e.g., "ec2", "rds", "eks").
*
* @generated from protobuf field: repeated string resource_types = 3;
*/
resourceTypes: string[];
/**
* cloud_providers is the list of cloud providers the config has matchers for.
*
* @generated from protobuf field: repeated string cloud_providers = 4;
*/
cloudProviders: string[];
/**
* creation_method specifies the flow used to create the config ("iac" or "guided")
*
* @generated from protobuf field: string creation_method = 5;
*/
creationMethod: string;
}
/**
* @generated from protobuf message prehog.v1alpha.SubmitEventRequest
*/
@@ -3803,6 +3858,12 @@ export interface SubmitEventRequest {
* @generated from protobuf field: prehog.v1alpha.SessionSummaryAccessEvent session_summary_access_event = 106;
*/
sessionSummaryAccessEvent: SessionSummaryAccessEvent;
} | {
oneofKind: "discoveryConfig";
/**
* @generated from protobuf field: prehog.v1alpha.DiscoveryConfigEvent discovery_config = 107;
*/
discoveryConfig: DiscoveryConfigEvent;
} | {
oneofKind: undefined;
};
@@ -4411,7 +4472,19 @@ export enum IntegrationEnrollKind {
/**
* @generated from protobuf enum value: INTEGRATION_ENROLL_KIND_MACHINE_ID_GITHUB_ACTIONS_KUBERNETES = 29;
*/
MACHINE_ID_GITHUB_ACTIONS_KUBERNETES = 29
MACHINE_ID_GITHUB_ACTIONS_KUBERNETES = 29,
/**
* @generated from protobuf enum value: INTEGRATION_ENROLL_KIND_AWS_CLOUD = 30;
*/
AWS_CLOUD = 30,
/**
* @generated from protobuf enum value: INTEGRATION_ENROLL_KIND_AZURE_CLOUD = 31;
*/
AZURE_CLOUD = 31,
/**
* @generated from protobuf enum value: INTEGRATION_ENROLL_KIND_GOOGLE_CLOUD = 32;
*/
GOOGLE_CLOUD = 32
}
/**
* IntegrationEnrollStep defines inner configuration steps
@@ -4477,7 +4550,13 @@ export enum IntegrationEnrollStep {
/**
* @generated from protobuf enum value: INTEGRATION_ENROLL_STEP_MWIGHAK8S_WELCOME = 12;
*/
MWIGHAK8S_WELCOME = 12
MWIGHAK8S_WELCOME = 12,
/**
* General integration setup steps
*
* @generated from protobuf enum value: INTEGRATION_ENROLL_STEP_VERIFY_INTEGRATION = 13;
*/
VERIFY_INTEGRATION = 13
}
/**
* IntegrationEnrollStatusCode defines status code for an integration enroll step.
@@ -4715,6 +4794,29 @@ export enum LicenseLimit {
*/
DEVICE_TRUST_TEAM_USAGE = 2
}
/**
* DiscoveryConfigAction is the action performed on a DiscoveryConfig.
*
* @generated from protobuf enum prehog.v1alpha.DiscoveryConfigAction
*/
export enum DiscoveryConfigAction {
/**
* @generated from protobuf enum value: DISCOVERY_CONFIG_ACTION_UNSPECIFIED = 0;
*/
UNSPECIFIED = 0,
/**
* @generated from protobuf enum value: DISCOVERY_CONFIG_ACTION_CREATE = 1;
*/
CREATE = 1,
/**
* @generated from protobuf enum value: DISCOVERY_CONFIG_ACTION_UPDATE = 2;
*/
UPDATE = 2,
/**
* @generated from protobuf enum value: DISCOVERY_CONFIG_ACTION_DELETE = 3;
*/
DELETE = 3
}
// @generated message type with reflection information, may provide speed optimized methods
class UserLoginEvent$Type extends MessageType<UserLoginEvent> {
constructor() {
@@ -4919,7 +5021,8 @@ class ResourceCreateEvent$Type extends MessageType<ResourceCreateEvent> {
{ no: 1, name: "resource_type", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
{ no: 2, name: "resource_origin", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
{ no: 3, name: "cloud_provider", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
{ no: 4, name: "database", kind: "message", T: () => DiscoveredDatabaseMetadata }
{ no: 4, name: "database", kind: "message", T: () => DiscoveredDatabaseMetadata },
{ no: 5, name: "discovery_config_name", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
]);
}
create(value?: PartialMessage<ResourceCreateEvent>): ResourceCreateEvent {
@@ -4927,6 +5030,7 @@ class ResourceCreateEvent$Type extends MessageType<ResourceCreateEvent> {
message.resourceType = "";
message.resourceOrigin = "";
message.cloudProvider = "";
message.discoveryConfigName = "";
if (value !== undefined)
reflectionMergePartial<ResourceCreateEvent>(this, message, value);
return message;
@@ -4948,6 +5052,9 @@ class ResourceCreateEvent$Type extends MessageType<ResourceCreateEvent> {
case /* prehog.v1alpha.DiscoveredDatabaseMetadata database */ 4:
message.database = DiscoveredDatabaseMetadata.internalBinaryRead(reader, reader.uint32(), options, message.database);
break;
case /* string discovery_config_name */ 5:
message.discoveryConfigName = reader.string();
break;
default:
let u = options.readUnknownField;
if (u === "throw")
@@ -4972,6 +5079,9 @@ class ResourceCreateEvent$Type extends MessageType<ResourceCreateEvent> {
/* prehog.v1alpha.DiscoveredDatabaseMetadata database = 4; */
if (message.database)
DiscoveredDatabaseMetadata.internalBinaryWrite(message.database, writer.tag(4, WireType.LengthDelimited).fork(), options).join();
/* string discovery_config_name = 5; */
if (message.discoveryConfigName !== "")
writer.tag(5, WireType.LengthDelimited).string(message.discoveryConfigName);
let u = options.writeUnknownFields;
if (u !== false)
(u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
@@ -11400,7 +11510,8 @@ class UserTaskStateEvent$Type extends MessageType<UserTaskStateEvent> {
{ no: 1, name: "task_type", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
{ no: 2, name: "issue_type", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
{ no: 3, name: "state", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
{ no: 4, name: "instances_count", kind: "scalar", T: 5 /*ScalarType.INT32*/ }
{ no: 4, name: "instances_count", kind: "scalar", T: 5 /*ScalarType.INT32*/ },
{ no: 5, name: "discovery_config_name", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
]);
}
create(value?: PartialMessage<UserTaskStateEvent>): UserTaskStateEvent {
@@ -11409,6 +11520,7 @@ class UserTaskStateEvent$Type extends MessageType<UserTaskStateEvent> {
message.issueType = "";
message.state = "";
message.instancesCount = 0;
message.discoveryConfigName = "";
if (value !== undefined)
reflectionMergePartial<UserTaskStateEvent>(this, message, value);
return message;
@@ -11430,6 +11542,9 @@ class UserTaskStateEvent$Type extends MessageType<UserTaskStateEvent> {
case /* int32 instances_count */ 4:
message.instancesCount = reader.int32();
break;
case /* string discovery_config_name */ 5:
message.discoveryConfigName = reader.string();
break;
default:
let u = options.readUnknownField;
if (u === "throw")
@@ -11454,6 +11569,9 @@ class UserTaskStateEvent$Type extends MessageType<UserTaskStateEvent> {
/* int32 instances_count = 4; */
if (message.instancesCount !== 0)
writer.tag(4, WireType.Varint).int32(message.instancesCount);
/* string discovery_config_name = 5; */
if (message.discoveryConfigName !== "")
writer.tag(5, WireType.LengthDelimited).string(message.discoveryConfigName);
let u = options.writeUnknownFields;
if (u !== false)
(u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
@@ -11757,6 +11875,85 @@ class SessionSummaryCreateEvent$Type extends MessageType<SessionSummaryCreateEve
*/
export const SessionSummaryCreateEvent = new SessionSummaryCreateEvent$Type();
// @generated message type with reflection information, may provide speed optimized methods
class DiscoveryConfigEvent$Type extends MessageType<DiscoveryConfigEvent> {
constructor() {
super("prehog.v1alpha.DiscoveryConfigEvent", [
{ no: 1, name: "action", kind: "enum", T: () => ["prehog.v1alpha.DiscoveryConfigAction", DiscoveryConfigAction, "DISCOVERY_CONFIG_ACTION_"] },
{ no: 2, name: "discovery_config_name", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
{ no: 3, name: "resource_types", kind: "scalar", repeat: 2 /*RepeatType.UNPACKED*/, T: 9 /*ScalarType.STRING*/ },
{ no: 4, name: "cloud_providers", kind: "scalar", repeat: 2 /*RepeatType.UNPACKED*/, T: 9 /*ScalarType.STRING*/ },
{ no: 5, name: "creation_method", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
]);
}
create(value?: PartialMessage<DiscoveryConfigEvent>): DiscoveryConfigEvent {
const message = globalThis.Object.create((this.messagePrototype!));
message.action = 0;
message.discoveryConfigName = "";
message.resourceTypes = [];
message.cloudProviders = [];
message.creationMethod = "";
if (value !== undefined)
reflectionMergePartial<DiscoveryConfigEvent>(this, message, value);
return message;
}
internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: DiscoveryConfigEvent): DiscoveryConfigEvent {
let message = target ?? this.create(), end = reader.pos + length;
while (reader.pos < end) {
let [fieldNo, wireType] = reader.tag();
switch (fieldNo) {
case /* prehog.v1alpha.DiscoveryConfigAction action */ 1:
message.action = reader.int32();
break;
case /* string discovery_config_name */ 2:
message.discoveryConfigName = reader.string();
break;
case /* repeated string resource_types */ 3:
message.resourceTypes.push(reader.string());
break;
case /* repeated string cloud_providers */ 4:
message.cloudProviders.push(reader.string());
break;
case /* string creation_method */ 5:
message.creationMethod = reader.string();
break;
default:
let u = options.readUnknownField;
if (u === "throw")
throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
let d = reader.skip(wireType);
if (u !== false)
(u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
}
}
return message;
}
internalBinaryWrite(message: DiscoveryConfigEvent, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
/* prehog.v1alpha.DiscoveryConfigAction action = 1; */
if (message.action !== 0)
writer.tag(1, WireType.Varint).int32(message.action);
/* string discovery_config_name = 2; */
if (message.discoveryConfigName !== "")
writer.tag(2, WireType.LengthDelimited).string(message.discoveryConfigName);
/* repeated string resource_types = 3; */
for (let i = 0; i < message.resourceTypes.length; i++)
writer.tag(3, WireType.LengthDelimited).string(message.resourceTypes[i]);
/* repeated string cloud_providers = 4; */
for (let i = 0; i < message.cloudProviders.length; i++)
writer.tag(4, WireType.LengthDelimited).string(message.cloudProviders[i]);
/* string creation_method = 5; */
if (message.creationMethod !== "")
writer.tag(5, WireType.LengthDelimited).string(message.creationMethod);
let u = options.writeUnknownFields;
if (u !== false)
(u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
return writer;
}
}
/**
* @generated MessageType for protobuf message prehog.v1alpha.DiscoveryConfigEvent
*/
export const DiscoveryConfigEvent = new DiscoveryConfigEvent$Type();
// @generated message type with reflection information, may provide speed optimized methods
class SubmitEventRequest$Type extends MessageType<SubmitEventRequest> {
constructor() {
super("prehog.v1alpha.SubmitEventRequest", [
@@ -11862,7 +12059,8 @@ class SubmitEventRequest$Type extends MessageType<SubmitEventRequest> {
{ no: 103, name: "ui_integration_enroll_code_copy_event", kind: "message", oneof: "event", T: () => UIIntegrationEnrollCodeCopyEvent },
{ no: 104, name: "ui_integration_enroll_link_click_event", kind: "message", oneof: "event", T: () => UIIntegrationEnrollLinkClickEvent },
{ no: 105, name: "session_summary_create_event", kind: "message", oneof: "event", T: () => SessionSummaryCreateEvent },
{ no: 106, name: "session_summary_access_event", kind: "message", oneof: "event", T: () => SessionSummaryAccessEvent }
{ no: 106, name: "session_summary_access_event", kind: "message", oneof: "event", T: () => SessionSummaryAccessEvent },
{ no: 107, name: "discovery_config", kind: "message", oneof: "event", T: () => DiscoveryConfigEvent }
]);
}
create(value?: PartialMessage<SubmitEventRequest>): SubmitEventRequest {
@@ -12488,6 +12686,12 @@ class SubmitEventRequest$Type extends MessageType<SubmitEventRequest> {
sessionSummaryAccessEvent: SessionSummaryAccessEvent.internalBinaryRead(reader, reader.uint32(), options, (message.event as any).sessionSummaryAccessEvent)
};
break;
case /* prehog.v1alpha.DiscoveryConfigEvent discovery_config */ 107:
message.event = {
oneofKind: "discoveryConfig",
discoveryConfig: DiscoveryConfigEvent.internalBinaryRead(reader, reader.uint32(), options, (message.event as any).discoveryConfig)
};
break;
default:
let u = options.readUnknownField;
if (u === "throw")
@@ -12809,6 +13013,9 @@ class SubmitEventRequest$Type extends MessageType<SubmitEventRequest> {
/* prehog.v1alpha.SessionSummaryAccessEvent session_summary_access_event = 106; */
if (message.event.oneofKind === "sessionSummaryAccessEvent")
SessionSummaryAccessEvent.internalBinaryWrite(message.event.sessionSummaryAccessEvent, writer.tag(106, WireType.LengthDelimited).fork(), options).join();
/* prehog.v1alpha.DiscoveryConfigEvent discovery_config = 107; */
if (message.event.oneofKind === "discoveryConfig")
DiscoveryConfigEvent.internalBinaryWrite(message.event.discoveryConfig, writer.tag(107, WireType.LengthDelimited).fork(), options).join();
let u = options.writeUnknownFields;
if (u !== false)
(u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
@@ -0,0 +1,28 @@
/*
* Teleport
* Copyright (C) 2026 Gravitational, Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package discoveryconfigv1
const (
// CreationMethodGuided used in usage events to specify a discovery config was created through
// a guided (UI) flow.
CreationMethodGuided = "guided"
// CreationMethodIAC used in usage events to specify a discovery config was created through an
// infrastructure-as-code flow
CreationMethodIAC = "iac"
)
@@ -22,6 +22,9 @@ import (
"context"
"fmt"
"log/slog"
"maps"
"slices"
"strings"
"github.com/coreos/go-semver/semver"
"github.com/gravitational/trace"
@@ -36,9 +39,11 @@ import (
conv "github.com/gravitational/teleport/api/types/discoveryconfig/convert/v1"
apievents "github.com/gravitational/teleport/api/types/events"
"github.com/gravitational/teleport/api/utils/aws"
prehogv1a "github.com/gravitational/teleport/gen/proto/go/prehog/v1alpha"
"github.com/gravitational/teleport/lib/authz"
"github.com/gravitational/teleport/lib/events"
"github.com/gravitational/teleport/lib/services"
usagereporter "github.com/gravitational/teleport/lib/usagereporter/teleport"
"github.com/gravitational/teleport/lib/utils"
)
@@ -58,6 +63,9 @@ type ServiceConfig struct {
// Emitter emits audit events.
Emitter apievents.Emitter
// UsageReporter is the reporter for sending usage events.
UsageReporter func() usagereporter.UsageReporter
}
// CheckAndSetDefaults checks the ServiceConfig fields and returns an error if
@@ -73,6 +81,9 @@ func (s *ServiceConfig) CheckAndSetDefaults() error {
if s.Emitter == nil {
return trace.BadParameter("emitter is required")
}
if s.UsageReporter == nil {
return trace.BadParameter("usage reporter is required")
}
if s.Logger == nil {
s.Logger = slog.With(teleport.ComponentKey, "discoveryconfig_crud_service")
@@ -89,11 +100,12 @@ func (s *ServiceConfig) CheckAndSetDefaults() error {
type Service struct {
discoveryconfigv1.UnimplementedDiscoveryConfigServiceServer
log *slog.Logger
authorizer authz.Authorizer
backend services.DiscoveryConfigs
clock clockwork.Clock
emitter apievents.Emitter
log *slog.Logger
authorizer authz.Authorizer
backend services.DiscoveryConfigs
clock clockwork.Clock
emitter apievents.Emitter
usageReporter func() usagereporter.UsageReporter
}
// NewService returns a new DiscoveryConfigs gRPC service.
@@ -103,11 +115,12 @@ func NewService(cfg ServiceConfig) (*Service, error) {
}
return &Service{
log: cfg.Logger,
authorizer: cfg.Authorizer,
backend: cfg.Backend,
clock: cfg.Clock,
emitter: cfg.Emitter,
log: cfg.Logger,
authorizer: cfg.Authorizer,
backend: cfg.Backend,
clock: cfg.Clock,
emitter: cfg.Emitter,
usageReporter: cfg.UsageReporter,
}, nil
}
@@ -206,6 +219,8 @@ func (s *Service) CreateDiscoveryConfig(ctx context.Context, req *discoveryconfi
s.log.WarnContext(ctx, "Failed to emit discovery config create event.", "error", err)
}
s.emitUsageEvent(resp, prehogv1a.DiscoveryConfigAction_DISCOVERY_CONFIG_ACTION_CREATE)
return conv.ToProto(resp), nil
}
@@ -252,6 +267,8 @@ func (s *Service) UpdateDiscoveryConfig(ctx context.Context, req *discoveryconfi
s.log.WarnContext(ctx, "Failed to emit discovery config update event.", "error", err)
}
s.emitUsageEvent(resp, prehogv1a.DiscoveryConfigAction_DISCOVERY_CONFIG_ACTION_UPDATE)
return conv.ToProto(resp), nil
}
@@ -295,6 +312,8 @@ func (s *Service) UpsertDiscoveryConfig(ctx context.Context, req *discoveryconfi
s.log.WarnContext(ctx, "Failed to emit discovery config create event.", "error", err)
}
s.emitUsageEvent(resp, prehogv1a.DiscoveryConfigAction_DISCOVERY_CONFIG_ACTION_CREATE)
return conv.ToProto(resp), nil
}
@@ -309,6 +328,14 @@ func (s *Service) DeleteDiscoveryConfig(ctx context.Context, req *discoveryconfi
return nil, trace.Wrap(err)
}
// Fetch the DiscoveryConfig before deletion to capture metadata for the usage event.
dc, err := s.backend.GetDiscoveryConfig(ctx, req.GetName())
if err != nil && !trace.IsNotFound(err) {
s.log.WarnContext(ctx, "Skipping DiscoveryConfig delete usage event due to GetDiscoveryConfig failure.",
"discovery_config_name", req.GetName(),
"error", err)
}
if err := s.backend.DeleteDiscoveryConfig(ctx, req.GetName()); err != nil {
return nil, trace.Wrap(err)
}
@@ -327,6 +354,10 @@ func (s *Service) DeleteDiscoveryConfig(ctx context.Context, req *discoveryconfi
s.log.WarnContext(ctx, "Failed to emit discovery config delete event.", "error", err)
}
if dc != nil {
s.emitUsageEvent(dc, prehogv1a.DiscoveryConfigAction_DISCOVERY_CONFIG_ACTION_DELETE)
}
return &emptypb.Empty{}, nil
}
@@ -392,6 +423,60 @@ func (s *Service) UpdateDiscoveryConfigStatus(ctx context.Context, req *discover
}
}
// emitUsageEvent emits a DiscoveryConfigEvent usage event.
func (s *Service) emitUsageEvent(dc *discoveryconfig.DiscoveryConfig, action prehogv1a.DiscoveryConfigAction) {
resourceTypes, cloudProviders := extractDiscoveryConfigMetadata(dc)
creationMethod := CreationMethodGuided
if _, ok := dc.GetMetadata().Labels[types.DiscoveryIACToolLabel]; ok {
creationMethod = CreationMethodIAC
}
s.usageReporter().AnonymizeAndSubmit(&usagereporter.DiscoveryConfigEvent{
Action: action,
DiscoveryConfigName: dc.GetName(),
ResourceTypes: resourceTypes,
CloudProviders: cloudProviders,
CreationMethod: creationMethod,
})
}
// extractDiscoveryConfigMetadata extracts resource types and cloud providers
// for DiscoveryConfigEvent fields.
func extractDiscoveryConfigMetadata(dc *discoveryconfig.DiscoveryConfig) (resourceTypes, cloudProviders []string) {
cloudProviderSet := make(map[string]struct{})
resourceTypeSet := make(map[string]struct{})
addMatcher := func(cloud string, types []string) {
if len(types) == 0 {
return
}
c := strings.ToLower(cloud)
cloudProviderSet[c] = struct{}{}
for _, t := range types {
label := c + ":" + t
resourceTypeSet[label] = struct{}{}
}
}
for _, m := range dc.Spec.AWS {
addMatcher(types.CloudAWS, m.Types)
}
for _, m := range dc.Spec.Azure {
addMatcher(types.CloudAzure, m.Types)
}
for _, m := range dc.Spec.GCP {
addMatcher(types.CloudGCP, m.Types)
}
for _, m := range dc.Spec.Kube {
addMatcher(types.DiscoveredResourceKubernetes, m.Types)
}
return slices.Collect(maps.Keys(resourceTypeSet)), slices.Collect(maps.Keys(cloudProviderSet))
}
// MaybeDowngradeDiscoveryConfig tests the client version passed through the gRPC metadata,
// and if necessary downgrades the Discovery Config resource for compatibility with the older client.
// The following rules are applied:
@@ -40,6 +40,7 @@ import (
"github.com/gravitational/teleport/lib/services"
"github.com/gravitational/teleport/lib/services/local"
"github.com/gravitational/teleport/lib/tlsca"
usagereporter "github.com/gravitational/teleport/lib/usagereporter/teleport"
)
func TestDiscoveryConfigCRUD(t *testing.T) {
@@ -544,9 +545,10 @@ func initSvc(t *testing.T, clusterName string) (context.Context, localClient, *S
emitter := events.NewDiscardEmitter()
resourceSvc, err := NewService(ServiceConfig{
Backend: localResourceService,
Authorizer: authorizer,
Emitter: emitter,
Backend: localResourceService,
Authorizer: authorizer,
Emitter: emitter,
UsageReporter: func() usagereporter.UsageReporter { return usagereporter.DiscardUsageReporter{} },
})
require.NoError(t, err)
@@ -561,6 +563,36 @@ func initSvc(t *testing.T, clusterName string) (context.Context, localClient, *S
}, resourceSvc
}
func TestExtractDiscoveryConfigMetadata(t *testing.T) {
t.Parallel()
dc, err := discoveryconfig.NewDiscoveryConfig(
header.Metadata{Name: "test"},
discoveryconfig.Spec{
DiscoveryGroup: "group",
AWS: []types.AWSMatcher{
{Types: []string{"ec2", "rds"}, Regions: []string{"us-east-1"}},
{Types: []string{"ec2"}, Regions: []string{"us-east-1"}}, // duplicate should be deduped
},
Azure: []types.AzureMatcher{
{Types: []string{"aks"}},
},
GCP: []types.GCPMatcher{
{Types: []string{"gke"}, ProjectIDs: []string{"my-project"}},
},
Kube: []types.KubernetesMatcher{
{Types: []string{"app"}},
},
},
)
require.NoError(t, err)
resourceTypes, cloudProviders := extractDiscoveryConfigMetadata(dc)
require.ElementsMatch(t, []string{"aws:ec2", "aws:rds", "azure:aks", "gcp:gke", "k8s:app"}, resourceTypes)
require.ElementsMatch(t, []string{"aws", "azure", "gcp", "k8s"}, cloudProviders)
}
func TestDowngrade(t *testing.T) {
for _, tc := range []struct {
name string
+4 -1
View File
@@ -6345,7 +6345,10 @@ func NewGRPCServer(cfg GRPCServerConfig) (*GRPCServer, error) {
Backend: cfg.AuthServer.Services,
Clock: cfg.AuthServer.clock,
Emitter: cfg.Emitter,
Logger: cfg.AuthServer.logger.With(teleport.ComponentKey, "discoveryconfig_crud_service"),
// This must be a function because cfg.AuthServer.UsageReporter is changed after `NewGRPCServer` is called.
// It starts as a DiscardUsageReporter, but when running in Cloud, gets replaced by a real reporter.
UsageReporter: func() usagereporter.UsageReporter { return cfg.AuthServer.UsageReporter },
Logger: cfg.AuthServer.logger.With(teleport.ComponentKey, "discoveryconfig_crud_service"),
})
if err != nil {
return nil, trace.Wrap(err)
+2 -1
View File
@@ -181,6 +181,8 @@ func userTaskToUserTaskStateEvent(ut *usertasksv1.UserTask) *usagereporter.UserT
ret.InstancesCount = int32(len(ut.GetSpec().GetDiscoverEks().GetClusters()))
case usertasks.TaskTypeDiscoverRDS:
ret.InstancesCount = int32(len(ut.GetSpec().GetDiscoverRds().GetDatabases()))
case usertasks.TaskTypeDiscoverAzureVM:
ret.InstancesCount = int32(len(ut.GetSpec().GetDiscoverAzureVm().GetInstances()))
}
return ret
}
@@ -249,7 +251,6 @@ func (s *Service) GetUserTask(ctx context.Context, req *usertasksv1.GetUserTaskR
}
return rsp, nil
}
// UpdateUserTask updates user task resource.
+4 -3
View File
@@ -252,9 +252,10 @@ func (s *Server) onDatabaseCreate(ctx context.Context, database types.Database)
}
err = s.emitUsageEvents(map[string]*usageeventsv1.ResourceCreateEvent{
databaseEventPrefix + database.GetName(): {
ResourceType: types.DiscoveredResourceDatabase,
ResourceOrigin: types.OriginCloud,
CloudProvider: database.GetCloud(),
ResourceType: types.DiscoveredResourceDatabase,
ResourceOrigin: types.OriginCloud,
CloudProvider: database.GetCloud(),
DiscoveryConfigName: database.GetStaticLabels()[types.TeleportInternalDiscoveryConfigName],
Database: &usageeventsv1.DiscoveredDatabaseMetadata{
DbType: database.GetType(),
DbProtocol: database.GetProtocol(),
+3 -2
View File
@@ -133,8 +133,9 @@ func (s *Server) onAppCreate(ctx context.Context, app types.Application) error {
}
err = s.emitUsageEvents(map[string]*usageeventsv1.ResourceCreateEvent{
appEventPrefix + app.GetName(): {
ResourceType: types.DiscoveredResourceApp,
ResourceOrigin: types.OriginKubernetes,
ResourceType: types.DiscoveredResourceApp,
ResourceOrigin: types.OriginKubernetes,
DiscoveryConfigName: app.GetStaticLabels()[types.TeleportInternalDiscoveryConfigName],
// CloudProvider is not set for apps created from Kubernetes services
},
})
+4 -3
View File
@@ -152,9 +152,10 @@ func (s *Server) onKubeCreate(ctx context.Context, kubeCluster types.KubeCluster
}
err = s.emitUsageEvents(map[string]*usageeventsv1.ResourceCreateEvent{
kubeEventPrefix + kubeCluster.GetName(): {
ResourceType: types.DiscoveredResourceKubernetes,
ResourceOrigin: types.OriginCloud,
CloudProvider: kubeCluster.GetCloud(),
ResourceType: types.DiscoveredResourceKubernetes,
ResourceOrigin: types.OriginCloud,
CloudProvider: kubeCluster.GetCloud(),
DiscoveryConfigName: kubeCluster.GetStaticLabels()[types.TeleportInternalDiscoveryConfigName],
},
})
if err != nil {
+4 -3
View File
@@ -78,9 +78,10 @@ func (instances *AzureInstances) MakeEvents(failures []AzureInstallFailure) map[
continue
}
events[azureEventPrefix+id] = &usageeventsv1.ResourceCreateEvent{
ResourceType: resourceType,
ResourceOrigin: types.OriginCloud,
CloudProvider: types.CloudAzure,
ResourceType: resourceType,
ResourceOrigin: types.OriginCloud,
CloudProvider: types.CloudAzure,
DiscoveryConfigName: instances.DiscoveryConfigName,
}
}
return events
+4 -3
View File
@@ -159,9 +159,10 @@ func (instances *EC2Instances) MakeEvents() map[string]*usageeventsv1.ResourceCr
events := make(map[string]*usageeventsv1.ResourceCreateEvent, len(instances.Instances))
for _, inst := range instances.Instances {
events[awsEventPrefix+inst.InstanceID] = &usageeventsv1.ResourceCreateEvent{
ResourceType: resourceType,
ResourceOrigin: types.OriginCloud,
CloudProvider: types.CloudAWS,
ResourceType: resourceType,
ResourceOrigin: types.OriginCloud,
CloudProvider: types.CloudAWS,
DiscoveryConfigName: instances.DiscoveryConfigName,
}
}
return events
+11 -7
View File
@@ -45,6 +45,8 @@ type GCPInstances struct {
InstallerParams *types.InstallerParams
// Instances is a list of discovered GCP virtual machines.
Instances []*gcpimds.Instance
// DiscoveryConfigName is the name of the DiscoveryConfig that triggered this discovery.
DiscoveryConfigName string
}
// MakeEvents generates MakeEvents for these instances.
@@ -56,9 +58,10 @@ func (instances *GCPInstances) MakeEvents() map[string]*usageeventsv1.ResourceCr
events := make(map[string]*usageeventsv1.ResourceCreateEvent, len(instances.Instances))
for _, inst := range instances.Instances {
events[fmt.Sprintf("%s%s/%s", gcpEventPrefix, inst.ProjectID, inst.Name)] = &usageeventsv1.ResourceCreateEvent{
ResourceType: resourceType,
ResourceOrigin: types.OriginCloud,
CloudProvider: types.CloudGCP,
ResourceType: resourceType,
ResourceOrigin: types.OriginCloud,
CloudProvider: types.CloudGCP,
DiscoveryConfigName: instances.DiscoveryConfigName,
}
}
return events
@@ -164,10 +167,11 @@ func (f *gcpInstanceFetcher) GetInstances(ctx context.Context, _ bool) ([]*GCPIn
for zone, vms := range vmsByZone {
if len(vms) > 0 {
instances = append(instances, &GCPInstances{
InstallerParams: f.InstallerParams,
ProjectID: projectID,
Zone: zone,
Instances: vms,
InstallerParams: f.InstallerParams,
ProjectID: projectID,
Zone: zone,
Instances: vms,
DiscoveryConfigName: f.DiscoveryConfigName,
})
}
}
+39 -10
View File
@@ -171,10 +171,15 @@ func (u *SessionStartEvent) Anonymize(a utils.Anonymizer) prehogv1a.SubmitEventR
type ResourceCreateEvent prehogv1a.ResourceCreateEvent
func (u *ResourceCreateEvent) Anonymize(a utils.Anonymizer) prehogv1a.SubmitEventRequest {
var discoveryConfigName string
if u.DiscoveryConfigName != "" {
discoveryConfigName = a.AnonymizeString(u.DiscoveryConfigName)
}
event := &prehogv1a.ResourceCreateEvent{
ResourceType: u.ResourceType,
ResourceOrigin: u.ResourceOrigin,
CloudProvider: u.CloudProvider,
ResourceType: u.ResourceType,
ResourceOrigin: u.ResourceOrigin,
CloudProvider: u.CloudProvider,
DiscoveryConfigName: discoveryConfigName,
}
if db := u.Database; db != nil {
event.Database = &prehogv1a.DiscoveredDatabaseMetadata{
@@ -1443,13 +1448,18 @@ func (u *SPIFFESVIDIssuedEvent) Anonymize(a utils.Anonymizer) prehogv1a.SubmitEv
type UserTaskStateEvent prehogv1a.UserTaskStateEvent
func (u *UserTaskStateEvent) Anonymize(a utils.Anonymizer) prehogv1a.SubmitEventRequest {
var discoveryConfigName string
if u.DiscoveryConfigName != "" {
discoveryConfigName = a.AnonymizeString(u.DiscoveryConfigName)
}
return prehogv1a.SubmitEventRequest{
Event: &prehogv1a.SubmitEventRequest_UserTaskState{
UserTaskState: &prehogv1a.UserTaskStateEvent{
TaskType: u.TaskType,
IssueType: u.IssueType,
State: u.State,
InstancesCount: u.InstancesCount,
TaskType: u.TaskType,
IssueType: u.IssueType,
State: u.State,
InstancesCount: u.InstancesCount,
DiscoveryConfigName: discoveryConfigName,
},
},
}
@@ -1877,9 +1887,10 @@ func ConvertUsageEvent(event *usageeventsv1.UsageEventOneOf, userMD UserMetadata
return ret, nil
case *usageeventsv1.UsageEventOneOf_ResourceCreateEvent:
ret := &ResourceCreateEvent{
ResourceType: e.ResourceCreateEvent.ResourceType,
ResourceOrigin: e.ResourceCreateEvent.ResourceOrigin,
CloudProvider: e.ResourceCreateEvent.CloudProvider,
ResourceType: e.ResourceCreateEvent.ResourceType,
ResourceOrigin: e.ResourceCreateEvent.ResourceOrigin,
CloudProvider: e.ResourceCreateEvent.CloudProvider,
DiscoveryConfigName: e.ResourceCreateEvent.DiscoveryConfigName,
}
if db := e.ResourceCreateEvent.Database; db != nil {
ret.Database = &prehogv1a.DiscoveredDatabaseMetadata{
@@ -2106,3 +2117,21 @@ func (e *SessionSummaryCreateEvent) Anonymize(a utils.Anonymizer) prehogv1a.Subm
},
}
}
// DiscoveryConfigEvent is emitted when a DiscoveryConfig resource is created, updated, or deleted.
type DiscoveryConfigEvent prehogv1a.DiscoveryConfigEvent
// Anonymize anonymizes the event.
func (e *DiscoveryConfigEvent) Anonymize(a utils.Anonymizer) prehogv1a.SubmitEventRequest {
return prehogv1a.SubmitEventRequest{
Event: &prehogv1a.SubmitEventRequest_DiscoveryConfig{
DiscoveryConfig: &prehogv1a.DiscoveryConfigEvent{
Action: e.Action,
DiscoveryConfigName: a.AnonymizeString(e.DiscoveryConfigName),
ResourceTypes: e.ResourceTypes,
CloudProviders: e.CloudProviders,
CreationMethod: e.CreationMethod,
},
},
}
}
+41
View File
@@ -111,6 +111,9 @@ message ResourceCreateEvent {
string cloud_provider = 3;
// database contains additional database information if resource_type == "db".
DiscoveredDatabaseMetadata database = 4;
// discovery_config_name is the anonymized name of the DiscoveryConfig that triggered discovery.
// Empty for teleport.yaml matcher configuration.
string discovery_config_name = 5;
}
// DiscoveredDatabaseMetadata contains additional database information.
@@ -1156,6 +1159,9 @@ enum IntegrationEnrollKind {
INTEGRATION_ENROLL_KIND_GITHUB_REPO_ACCESS = 27;
INTEGRATION_ENROLL_KIND_MACHINE_ID_ARGOCD = 28;
INTEGRATION_ENROLL_KIND_MACHINE_ID_GITHUB_ACTIONS_KUBERNETES = 29;
INTEGRATION_ENROLL_KIND_AWS_CLOUD = 30;
INTEGRATION_ENROLL_KIND_AZURE_CLOUD = 31;
INTEGRATION_ENROLL_KIND_GOOGLE_CLOUD = 32;
}
// IntegrationEnrollMetadata contains common metadata
@@ -1204,6 +1210,9 @@ enum IntegrationEnrollStep {
INTEGRATION_ENROLL_STEP_MWIGHAK8S_CONFIGURE_ACCESS = 10;
INTEGRATION_ENROLL_STEP_MWIGHAK8S_SETUP_WORKFLOW = 11;
INTEGRATION_ENROLL_STEP_MWIGHAK8S_WELCOME = 12;
// General integration setup steps
INTEGRATION_ENROLL_STEP_VERIFY_INTEGRATION = 13;
}
// IntegrationEnrollStatusCode defines status code for an integration enroll step.
@@ -1721,6 +1730,12 @@ message UserTaskStateEvent {
//
// PostHog property: tp.usertask.discover_ec2.instances_count
int32 instances_count = 4;
// discovery_config_name is the anonymized name of the DiscoveryConfig used when
// the issue was created.
//
// PostHog property: tp.usertask.discovery_config_name
string discovery_config_name = 5;
}
// AccessRequestCreateEvent is emitted when an Access Request is created.
@@ -1842,6 +1857,30 @@ message SessionSummaryCreateEvent {
bool is_cloud_default_model = 7;
}
// DiscoveryConfigAction is the action performed on a DiscoveryConfig.
enum DiscoveryConfigAction {
DISCOVERY_CONFIG_ACTION_UNSPECIFIED = 0;
DISCOVERY_CONFIG_ACTION_CREATE = 1;
DISCOVERY_CONFIG_ACTION_UPDATE = 2;
DISCOVERY_CONFIG_ACTION_DELETE = 3;
}
// DiscoveryConfigEvent is emitted when a DiscoveryConfig resource is created, updated, or deleted.
//
// PostHog event: tp.discovery.config
message DiscoveryConfigEvent {
// action is the operation performed on the DiscoveryConfig.
DiscoveryConfigAction action = 1;
// discovery_config_name is the anonymized name of the DiscoveryConfig.
string discovery_config_name = 2;
// resource_types is the list of resource types configured for discovery (e.g., "ec2", "rds", "eks").
repeated string resource_types = 3;
// cloud_providers is the list of cloud providers the config has matchers for.
repeated string cloud_providers = 4;
// creation_method specifies the flow used to create the config ("iac" or "guided")
string creation_method = 5;
}
message SubmitEventRequest {
// anonymized, 32 bytes (HMAC-SHA-256) encoded in base64
//
@@ -2020,6 +2059,8 @@ message SubmitEventRequest {
SessionSummaryCreateEvent session_summary_create_event = 105;
SessionSummaryAccessEvent session_summary_access_event = 106;
DiscoveryConfigEvent discovery_config = 107;
}
reserved 8; // UIOnboardGetStartedClickEvent
@@ -29,6 +29,13 @@ import { ContentMinWidth } from 'teleport/Main/Main';
import { createTeleportContext } from 'teleport/mocks/contexts';
import { ApiError } from 'teleport/services/api/parseError';
import { integrationService } from 'teleport/services/integrations';
import { userEventService } from 'teleport/services/userEvent';
import {
IntegrationEnrollCodeType,
IntegrationEnrollEvent,
IntegrationEnrollKind,
IntegrationEnrollStep,
} from 'teleport/services/userEvent/types';
import { EnrollAws } from './EnrollAws';
@@ -66,6 +73,9 @@ describe('EnrollAws', () => {
jest.clearAllMocks();
queryClient.clear();
cfg.proxyCluster = 'my-cluster.cloud.gravitational.io';
jest
.spyOn(userEventService, 'captureIntegrationEnrollEvent')
.mockImplementation();
});
afterEach(() => {
@@ -73,6 +83,19 @@ describe('EnrollAws', () => {
cfg.proxyCluster = defaultProxyCluster;
});
test('emits start event on mount', () => {
renderEnrollAws();
expect(userEventService.captureIntegrationEnrollEvent).toHaveBeenCalledWith(
expect.objectContaining({
event: IntegrationEnrollEvent.Started,
eventData: expect.objectContaining({
kind: IntegrationEnrollKind.AwsCloud,
}),
})
);
});
test('terraform template renders', async () => {
renderEnrollAws();
@@ -120,6 +143,16 @@ describe('EnrollAws', () => {
expect(copyToClipboard).toHaveBeenCalledWith(
expect.stringContaining('"test-integration"')
);
expect(userEventService.captureIntegrationEnrollEvent).toHaveBeenCalledWith(
expect.objectContaining({
event: IntegrationEnrollEvent.CodeCopy,
eventData: expect.objectContaining({
kind: IntegrationEnrollKind.AwsCloud,
codeType: IntegrationEnrollCodeType.Terraform,
}),
})
);
});
test('check integration button validates form', async () => {
@@ -160,9 +193,28 @@ describe('EnrollAws', () => {
});
fireEvent.click(checkButton);
expect(userEventService.captureIntegrationEnrollEvent).toHaveBeenCalledWith(
expect.objectContaining({
event: IntegrationEnrollEvent.Step,
eventData: expect.objectContaining({
kind: IntegrationEnrollKind.AwsCloud,
step: IntegrationEnrollStep.VerifyIntegration,
}),
})
);
const success = await screen.findByText(/successfully added/i);
expect(success).toBeInTheDocument();
expect(userEventService.captureIntegrationEnrollEvent).toHaveBeenCalledWith(
expect.objectContaining({
event: IntegrationEnrollEvent.Complete,
eventData: expect.objectContaining({
kind: IntegrationEnrollKind.AwsCloud,
}),
})
);
const viewIntegrationLinks = screen.getAllByRole('link', {
name: /^view integration$/i,
});
@@ -202,6 +254,14 @@ describe('EnrollAws', () => {
screen.getByRole('button', { name: /^view integration$/i })
).toBeDisabled();
expect(
userEventService.captureIntegrationEnrollEvent
).not.toHaveBeenCalledWith(
expect.objectContaining({
event: IntegrationEnrollEvent.Complete,
})
);
jest.useRealTimers();
});
@@ -17,7 +17,7 @@
*/
import { useQuery, useQueryClient } from '@tanstack/react-query';
import { useMemo, useState } from 'react';
import { useEffect, useMemo, useState } from 'react';
import { Link as InternalLink } from 'react-router';
import styled from 'styled-components';
@@ -46,6 +46,14 @@ import {
IntegrationKind,
integrationService,
} from 'teleport/services/integrations';
import { userEventService } from 'teleport/services/userEvent';
import {
IntegrationEnrollCodeType,
IntegrationEnrollEvent,
IntegrationEnrollEventData,
IntegrationEnrollKind,
IntegrationEnrollStep,
} from 'teleport/services/userEvent/types';
import { useClusterVersion } from 'teleport/useClusterVersion';
import { DeploymentMethodSection } from './DeploymentMethodSection';
@@ -70,6 +78,28 @@ const INTEGRATION_CHECK_RETRY_DELAY = 5000;
export function EnrollAws() {
useNoMinWidth();
const [eventId] = useState(() => crypto.randomUUID());
function emitEvent(
event: IntegrationEnrollEvent,
extra?: Partial<IntegrationEnrollEventData>
) {
userEventService.captureIntegrationEnrollEvent({
event,
eventData: {
id: eventId,
kind: IntegrationEnrollKind.AwsCloud,
...extra,
},
});
}
useEffect(() => {
emitEvent(IntegrationEnrollEvent.Started);
// Only send once on init.
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
const { clusterVersion } = useClusterVersion();
const [integrationName, setIntegrationName] = useState(() => {
@@ -129,7 +159,14 @@ export function EnrollAws() {
const queryClient = useQueryClient();
const checkIntegration = () => {
refetch();
emitEvent(IntegrationEnrollEvent.Step, {
step: IntegrationEnrollStep.VerifyIntegration,
});
refetch().then(result => {
if (result.isSuccess) {
emitEvent(IntegrationEnrollEvent.Complete);
}
});
};
const integrationExists = !!integrationData;
@@ -187,6 +224,9 @@ export function EnrollAws() {
handleCopy={() => {
if (validator.validate() && terraformConfig) {
copyToClipboard(terraformConfig);
emitEvent(IntegrationEnrollEvent.CodeCopy, {
codeType: IntegrationEnrollCodeType.Terraform,
});
}
}}
integrationExists={integrationExists}
@@ -256,6 +296,9 @@ export function EnrollAws() {
handleCopy={() => {
if (validator.validate() && terraformConfig) {
copyToClipboard(terraformConfig);
emitEvent(IntegrationEnrollEvent.CodeCopy, {
codeType: IntegrationEnrollCodeType.Terraform,
});
}
}}
/>
@@ -86,6 +86,9 @@ export enum IntegrationEnrollKind {
DatadogIncidentManagement = 'INTEGRATION_ENROLL_KIND_DATADOG_INCIDENT_MANAGEMENT',
AwsIdentityCenter = 'INTEGRATION_ENROLL_KIND_AWS_IDENTITY_CENTER',
GitHubRepoAccess = 'INTEGRATION_ENROLL_KIND_GITHUB_REPO_ACCESS',
AwsCloud = 'INTEGRATION_ENROLL_KIND_AWS_CLOUD',
AzureCloud = 'INTEGRATION_ENROLL_KIND_AZURE_CLOUD',
GoogleCloud = 'INTEGRATION_ENROLL_KIND_GOOGLE_CLOUD',
}
/**
@@ -116,6 +119,8 @@ export enum IntegrationEnrollStep {
MWIGHAK8SConnectGitHub = 'INTEGRATION_ENROLL_STEP_MWIGHAK8S_CONNECT_GITHUB',
MWIGHAK8SConfigureAccess = 'INTEGRATION_ENROLL_STEP_MWIGHAK8S_CONFIGURE_ACCESS',
MWIGHAK8SSetupWorkflow = 'INTEGRATION_ENROLL_STEP_MWIGHAK8S_SETUP_WORKFLOW',
VerifyIntegration = 'INTEGRATION_ENROLL_STEP_VERIFY_INTEGRATION',
}
/**