From 5c6deb7d9da0c86a6d7ba2aaee4ce41764c69aa3 Mon Sep 17 00:00:00 2001 From: "STeve (Xin) Huang" Date: Fri, 13 May 2022 11:09:20 -0400 Subject: [PATCH] ElastiCache support - the basics (#12209) --- .github/ISSUE_TEMPLATE/testplan.md | 3 + api/types/database.go | 46 +- api/types/database_test.go | 49 + api/types/types.pb.go | 2507 ++++++++++++--------- api/types/types.proto | 16 + api/utils/aws/endpoint.go | 219 ++ api/utils/aws/endpoint_test.go | 132 ++ api/utils/aws/region.go | 80 +- api/utils/aws/region_test.go | 88 + lib/config/configuration.go | 5 +- lib/config/database.go | 38 +- lib/config/fileconf.go | 10 +- lib/configurators/databases/aws.go | 96 +- lib/configurators/databases/aws_test.go | 55 + lib/configurators/databases/databases.go | 4 +- lib/service/cfg.go | 8 + lib/service/db.go | 3 + lib/services/database.go | 168 +- lib/services/database_test.go | 248 ++ lib/services/matchers.go | 2 + lib/srv/db/ca.go | 27 +- lib/srv/db/cloud/meta.go | 79 +- lib/srv/db/cloud/meta_test.go | 38 +- lib/srv/db/cloud/mocks.go | 48 + lib/srv/db/cloud/watchers/elasticache.go | 252 +++ lib/srv/db/cloud/watchers/rds.go | 42 +- lib/srv/db/cloud/watchers/redshift.go | 11 +- lib/srv/db/cloud/watchers/watcher.go | 21 + lib/srv/db/cloud/watchers/watcher_test.go | 99 +- lib/srv/db/common/auth.go | 5 +- lib/srv/db/common/cloud.go | 21 +- lib/srv/db/redis/client.go | 1 - lib/srv/db/redis/connection.go | 10 +- lib/srv/db/redis/engine.go | 28 +- tool/teleport/common/configurator.go | 14 +- tool/teleport/common/teleport.go | 5 +- tool/tsh/tsh_test.go | 6 +- 37 files changed, 3287 insertions(+), 1197 deletions(-) create mode 100644 api/utils/aws/region_test.go create mode 100644 lib/srv/db/cloud/watchers/elasticache.go diff --git a/.github/ISSUE_TEMPLATE/testplan.md b/.github/ISSUE_TEMPLATE/testplan.md index 633930f8ecc..622d244fc1f 100644 --- a/.github/ISSUE_TEMPLATE/testplan.md +++ b/.github/ISSUE_TEMPLATE/testplan.md @@ -809,6 +809,7 @@ and non interactive tsh bench loads. - [ ] AWS Aurora Postgres. - [ ] AWS Aurora MySQL. - [ ] AWS Redshift. + - [ ] AWS ElastiCache. - [ ] GCP Cloud SQL Postgres. - [ ] GCP Cloud SQL MySQL. - [ ] Connect to a database within a remote cluster via a trusted cluster. @@ -820,6 +821,7 @@ and non interactive tsh bench loads. - [ ] AWS Aurora Postgres. - [ ] AWS Aurora MySQL. - [ ] AWS Redshift. + - [ ] AWS ElastiCache. - [ ] GCP Cloud SQL Postgres. - [ ] GCP Cloud SQL MySQL. - [ ] Verify audit events. @@ -843,6 +845,7 @@ and non interactive tsh bench loads. - [ ] Can detect and register RDS instances. - [ ] Can detect and register Aurora clusters, and their reader and custom endpoints. - [ ] Can detect and register Redshift clusters. + - [ ] Can detect and register ElastiCache Redis clusters. - [ ] Test Databases screen in the web UI (tab is located on left side nav on dashboard): - [ ] Verify that all dbs registered are shown with correct `name`, `description`, `type`, and `labels` - [ ] Verify that clicking on a rows connect button renders a dialogue on manual instructions with `Step 2` login value matching the rows `name` column diff --git a/api/types/database.go b/api/types/database.go index 7ffd78c5793..3443c891c07 100644 --- a/api/types/database.go +++ b/api/types/database.go @@ -22,11 +22,13 @@ import ( "strings" "time" - "github.com/gogo/protobuf/proto" - "github.com/google/go-cmp/cmp" "github.com/gravitational/teleport/api/utils" awsutils "github.com/gravitational/teleport/api/utils/aws" + + "github.com/gogo/protobuf/proto" + "github.com/google/go-cmp/cmp" "github.com/gravitational/trace" + "github.com/sirupsen/logrus" ) // Database represents a database proxied by a database server. @@ -94,7 +96,11 @@ type Database interface { IsCloudSQL() bool // IsAzure returns true if this is an Azure database. IsAzure() bool - // IsCloudHosted returns true if database is hosted in the cloud (AWS RDS/Aurora/Redshift, Azure or Cloud SQL). + // IsElastiCache returns true if this is an AWS ElastiCache database. + IsElastiCache() bool + // IsAWSHosted returns true if database is hosted by AWS. + IsAWSHosted() bool + // IsCloudHosted returns true if database is hosted in the cloud (AWS, Azure or Cloud SQL). IsCloudHosted() bool // Copy returns a copy of this database resource. Copy() *DatabaseV3 @@ -331,9 +337,20 @@ func (d *DatabaseV3) IsAzure() bool { return d.GetType() == DatabaseTypeAzure } -// IsCloudHosted returns true if database is hosted in the cloud (AWS RDS/Aurora/Redshift, Azure or Cloud SQL). +// IsElastiCache returns true if this is an AWS ElastiCache database. +func (d *DatabaseV3) IsElastiCache() bool { + return d.GetType() == DatabaseTypeElastiCache +} + +// IsAWSHosted returns true if database is hosted by AWS. +func (d *DatabaseV3) IsAWSHosted() bool { + return d.IsRDS() || d.IsRedshift() || d.IsElastiCache() +} + +// IsCloudHosted returns true if database is hosted in the cloud (AWS, Azure or +// Cloud SQL). func (d *DatabaseV3) IsCloudHosted() bool { - return d.IsRDS() || d.IsRedshift() || d.IsCloudSQL() || d.IsAzure() + return d.IsAWSHosted() || d.IsCloudSQL() || d.IsAzure() } // GetType returns the database type. @@ -341,6 +358,9 @@ func (d *DatabaseV3) GetType() string { if d.GetAWS().Redshift.ClusterID != "" { return DatabaseTypeRedshift } + if d.GetAWS().ElastiCache.ReplicationGroupID != "" { + return DatabaseTypeElastiCache + } if d.GetAWS().Region != "" || d.GetAWS().RDS.InstanceID != "" || d.GetAWS().RDS.ClusterID != "" { return DatabaseTypeRDS } @@ -431,6 +451,20 @@ func (d *DatabaseV3) CheckAndSetDefaults() error { if d.Spec.AWS.Region == "" { d.Spec.AWS.Region = region } + case awsutils.IsElastiCacheEndpoint(d.Spec.URI): + endpointInfo, err := awsutils.ParseElastiCacheEndpoint(d.Spec.URI) + if err != nil { + logrus.WithError(err).Warnf("Failed to parse %v as ElastiCache endpoint", d.Spec.URI) + break + } + if d.Spec.AWS.ElastiCache.ReplicationGroupID == "" { + d.Spec.AWS.ElastiCache.ReplicationGroupID = endpointInfo.ID + } + if d.Spec.AWS.Region == "" { + d.Spec.AWS.Region = endpointInfo.Region + } + d.Spec.AWS.ElastiCache.TransitEncryptionEnabled = endpointInfo.TransitEncryptionEnabled + d.Spec.AWS.ElastiCache.EndpointType = endpointInfo.EndpointType case strings.Contains(d.Spec.URI, AzureEndpointSuffix): name, err := parseAzureEndpoint(d.Spec.URI) if err != nil { @@ -550,6 +584,8 @@ const ( DatabaseTypeCloudSQL = "gcp" // DatabaseTypeAzure is Azure-hosted database. DatabaseTypeAzure = "azure" + // DatabaseTypeElastiCache is AWS-hosted ElastiCache database. + DatabaseTypeElastiCache = "elasticache" ) // DeduplicateDatabases deduplicates databases by name. diff --git a/api/types/database_test.go b/api/types/database_test.go index 86f20b6bf9d..a568fa5f355 100644 --- a/api/types/database_test.go +++ b/api/types/database_test.go @@ -77,6 +77,55 @@ func TestDatabaseStatus(t *testing.T) { require.Equal(t, awsMeta, database.GetAWS()) } +func TestDatabaseElastiCacheEndpoint(t *testing.T) { + t.Run("valid URI", func(t *testing.T) { + database, err := NewDatabaseV3(Metadata{ + Name: "elasticache", + }, DatabaseSpecV3{ + Protocol: "redis", + URI: "clustercfg.my-redis-cluster.xxxxxx.cac1.cache.amazonaws.com:6379", + }) + + require.NoError(t, err) + require.Equal(t, AWS{ + Region: "ca-central-1", + ElastiCache: ElastiCache{ + ReplicationGroupID: "my-redis-cluster", + TransitEncryptionEnabled: true, + EndpointType: "configuration", + }, + }, database.GetAWS()) + require.True(t, database.IsElastiCache()) + require.True(t, database.IsAWSHosted()) + require.True(t, database.IsCloudHosted()) + }) + + t.Run("invalid URI", func(t *testing.T) { + database, err := NewDatabaseV3(Metadata{ + Name: "elasticache", + }, DatabaseSpecV3{ + Protocol: "redis", + URI: "some.endpoint.cache.amazonaws.com:6379", + AWS: AWS{ + Region: "us-east-5", + ElastiCache: ElastiCache{ + ReplicationGroupID: "some-id", + }, + }, + }) + + // A warning is logged, no error is returned, and AWS metadata is not + // updated. + require.NoError(t, err) + require.Equal(t, AWS{ + Region: "us-east-5", + ElastiCache: ElastiCache{ + ReplicationGroupID: "some-id", + }, + }, database.GetAWS()) + }) +} + func TestMySQLVersionValidation(t *testing.T) { t.Parallel() diff --git a/api/types/types.pb.go b/api/types/types.pb.go index 3a4e02b910c..d8ebc940414 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -379,7 +379,7 @@ func (x CertAuthoritySpecV2_SigningAlgType) String() string { } func (CertAuthoritySpecV2_SigningAlgType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{35, 0} + return fileDescriptor_d938547f84707355, []int{36, 0} } type KeepAlive struct { @@ -979,10 +979,12 @@ type AWS struct { // RDS contains RDS specific metadata. RDS RDS `protobuf:"bytes,3,opt,name=RDS,proto3" json:"rds,omitempty"` // AccountID is the AWS account ID this database belongs to. - AccountID string `protobuf:"bytes,4,opt,name=AccountID,proto3" json:"account_id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + AccountID string `protobuf:"bytes,4,opt,name=AccountID,proto3" json:"account_id,omitempty"` + // ElastiCache contains AWS ElastiCache Redis specific metadata. + ElastiCache ElastiCache `protobuf:"bytes,5,opt,name=ElastiCache,proto3" json:"elasticache,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *AWS) Reset() { *m = AWS{} } @@ -1108,6 +1110,54 @@ func (m *RDS) XXX_DiscardUnknown() { var xxx_messageInfo_RDS proto.InternalMessageInfo +// ElastiCache contains AWS ElastiCache Redis specific metadata. +type ElastiCache struct { + // ReplicationGroupID is the Redis replication group ID. + ReplicationGroupID string `protobuf:"bytes,1,opt,name=ReplicationGroupID,proto3" json:"replication_group_id,omitempty"` + // UserGroupIDs is a list of user group IDs. + UserGroupIDs []string `protobuf:"bytes,2,rep,name=UserGroupIDs,proto3" json:"user_group_ids,omitempty"` + // TransitEncryptionEnabled indicates whether in-transit encryption (TLS) is enabled. + TransitEncryptionEnabled bool `protobuf:"varint,3,opt,name=TransitEncryptionEnabled,proto3" json:"transit_encryption_enabled,omitempty"` + // EndpointType is the type of the endpoint. + EndpointType string `protobuf:"bytes,4,opt,name=EndpointType,proto3" json:"endpoint_type,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ElastiCache) Reset() { *m = ElastiCache{} } +func (m *ElastiCache) String() string { return proto.CompactTextString(m) } +func (*ElastiCache) ProtoMessage() {} +func (*ElastiCache) Descriptor() ([]byte, []int) { + return fileDescriptor_d938547f84707355, []int{14} +} +func (m *ElastiCache) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ElastiCache) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ElastiCache.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ElastiCache) XXX_Merge(src proto.Message) { + xxx_messageInfo_ElastiCache.Merge(m, src) +} +func (m *ElastiCache) XXX_Size() int { + return m.Size() +} +func (m *ElastiCache) XXX_DiscardUnknown() { + xxx_messageInfo_ElastiCache.DiscardUnknown(m) +} + +var xxx_messageInfo_ElastiCache proto.InternalMessageInfo + // GCPCloudSQL contains parameters specific to GCP Cloud SQL databases. type GCPCloudSQL struct { // ProjectID is the GCP project ID the Cloud SQL instance resides in. @@ -1123,7 +1173,7 @@ func (m *GCPCloudSQL) Reset() { *m = GCPCloudSQL{} } func (m *GCPCloudSQL) String() string { return proto.CompactTextString(m) } func (*GCPCloudSQL) ProtoMessage() {} func (*GCPCloudSQL) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{14} + return fileDescriptor_d938547f84707355, []int{15} } func (m *GCPCloudSQL) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1165,7 +1215,7 @@ func (m *Azure) Reset() { *m = Azure{} } func (m *Azure) String() string { return proto.CompactTextString(m) } func (*Azure) ProtoMessage() {} func (*Azure) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{15} + return fileDescriptor_d938547f84707355, []int{16} } func (m *Azure) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1213,7 +1263,7 @@ func (m *AD) Reset() { *m = AD{} } func (m *AD) String() string { return proto.CompactTextString(m) } func (*AD) ProtoMessage() {} func (*AD) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{16} + return fileDescriptor_d938547f84707355, []int{17} } func (m *AD) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1261,7 +1311,7 @@ func (m *DatabaseTLS) Reset() { *m = DatabaseTLS{} } func (m *DatabaseTLS) String() string { return proto.CompactTextString(m) } func (*DatabaseTLS) ProtoMessage() {} func (*DatabaseTLS) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{17} + return fileDescriptor_d938547f84707355, []int{18} } func (m *DatabaseTLS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1304,7 +1354,7 @@ func (m *MySQLOptions) Reset() { *m = MySQLOptions{} } func (m *MySQLOptions) String() string { return proto.CompactTextString(m) } func (*MySQLOptions) ProtoMessage() {} func (*MySQLOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{18} + return fileDescriptor_d938547f84707355, []int{19} } func (m *MySQLOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1353,7 +1403,7 @@ type ServerV2 struct { func (m *ServerV2) Reset() { *m = ServerV2{} } func (*ServerV2) ProtoMessage() {} func (*ServerV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{19} + return fileDescriptor_d938547f84707355, []int{20} } func (m *ServerV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1396,7 +1446,7 @@ func (m *ServerV2List) Reset() { *m = ServerV2List{} } func (m *ServerV2List) String() string { return proto.CompactTextString(m) } func (*ServerV2List) ProtoMessage() {} func (*ServerV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{20} + return fileDescriptor_d938547f84707355, []int{21} } func (m *ServerV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1462,7 +1512,7 @@ func (m *ServerSpecV2) Reset() { *m = ServerSpecV2{} } func (m *ServerSpecV2) String() string { return proto.CompactTextString(m) } func (*ServerSpecV2) ProtoMessage() {} func (*ServerSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{21} + return fileDescriptor_d938547f84707355, []int{22} } func (m *ServerSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1511,7 +1561,7 @@ type AppServerV3 struct { func (m *AppServerV3) Reset() { *m = AppServerV3{} } func (*AppServerV3) ProtoMessage() {} func (*AppServerV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{22} + return fileDescriptor_d938547f84707355, []int{23} } func (m *AppServerV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1561,7 +1611,7 @@ func (m *AppServerSpecV3) Reset() { *m = AppServerSpecV3{} } func (m *AppServerSpecV3) String() string { return proto.CompactTextString(m) } func (*AppServerSpecV3) ProtoMessage() {} func (*AppServerSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{23} + return fileDescriptor_d938547f84707355, []int{24} } func (m *AppServerSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1603,7 +1653,7 @@ func (m *AppV3List) Reset() { *m = AppV3List{} } func (m *AppV3List) String() string { return proto.CompactTextString(m) } func (*AppV3List) ProtoMessage() {} func (*AppV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{24} + return fileDescriptor_d938547f84707355, []int{25} } func (m *AppV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1652,7 +1702,7 @@ type AppV3 struct { func (m *AppV3) Reset() { *m = AppV3{} } func (*AppV3) ProtoMessage() {} func (*AppV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{25} + return fileDescriptor_d938547f84707355, []int{26} } func (m *AppV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1702,7 +1752,7 @@ func (m *AppSpecV3) Reset() { *m = AppSpecV3{} } func (m *AppSpecV3) String() string { return proto.CompactTextString(m) } func (*AppSpecV3) ProtoMessage() {} func (*AppSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{26} + return fileDescriptor_d938547f84707355, []int{27} } func (m *AppSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1762,7 +1812,7 @@ func (m *App) Reset() { *m = App{} } func (m *App) String() string { return proto.CompactTextString(m) } func (*App) ProtoMessage() {} func (*App) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{27} + return fileDescriptor_d938547f84707355, []int{28} } func (m *App) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1808,7 +1858,7 @@ func (m *Rewrite) Reset() { *m = Rewrite{} } func (m *Rewrite) String() string { return proto.CompactTextString(m) } func (*Rewrite) ProtoMessage() {} func (*Rewrite) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{28} + return fileDescriptor_d938547f84707355, []int{29} } func (m *Rewrite) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1852,7 +1902,7 @@ func (m *Header) Reset() { *m = Header{} } func (m *Header) String() string { return proto.CompactTextString(m) } func (*Header) ProtoMessage() {} func (*Header) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{29} + return fileDescriptor_d938547f84707355, []int{30} } func (m *Header) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1899,7 +1949,7 @@ func (m *CommandLabelV2) Reset() { *m = CommandLabelV2{} } func (m *CommandLabelV2) String() string { return proto.CompactTextString(m) } func (*CommandLabelV2) ProtoMessage() {} func (*CommandLabelV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{30} + return fileDescriptor_d938547f84707355, []int{31} } func (m *CommandLabelV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1945,7 +1995,7 @@ func (m *SSHKeyPair) Reset() { *m = SSHKeyPair{} } func (m *SSHKeyPair) String() string { return proto.CompactTextString(m) } func (*SSHKeyPair) ProtoMessage() {} func (*SSHKeyPair) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{31} + return fileDescriptor_d938547f84707355, []int{32} } func (m *SSHKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1991,7 +2041,7 @@ func (m *TLSKeyPair) Reset() { *m = TLSKeyPair{} } func (m *TLSKeyPair) String() string { return proto.CompactTextString(m) } func (*TLSKeyPair) ProtoMessage() {} func (*TLSKeyPair) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{32} + return fileDescriptor_d938547f84707355, []int{33} } func (m *TLSKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2037,7 +2087,7 @@ func (m *JWTKeyPair) Reset() { *m = JWTKeyPair{} } func (m *JWTKeyPair) String() string { return proto.CompactTextString(m) } func (*JWTKeyPair) ProtoMessage() {} func (*JWTKeyPair) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{33} + return fileDescriptor_d938547f84707355, []int{34} } func (m *JWTKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2086,7 +2136,7 @@ type CertAuthorityV2 struct { func (m *CertAuthorityV2) Reset() { *m = CertAuthorityV2{} } func (*CertAuthorityV2) ProtoMessage() {} func (*CertAuthorityV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{34} + return fileDescriptor_d938547f84707355, []int{35} } func (m *CertAuthorityV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2166,7 +2216,7 @@ func (m *CertAuthoritySpecV2) Reset() { *m = CertAuthoritySpecV2{} } func (m *CertAuthoritySpecV2) String() string { return proto.CompactTextString(m) } func (*CertAuthoritySpecV2) ProtoMessage() {} func (*CertAuthoritySpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{35} + return fileDescriptor_d938547f84707355, []int{36} } func (m *CertAuthoritySpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2212,7 +2262,7 @@ func (m *CAKeySet) Reset() { *m = CAKeySet{} } func (m *CAKeySet) String() string { return proto.CompactTextString(m) } func (*CAKeySet) ProtoMessage() {} func (*CAKeySet) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{36} + return fileDescriptor_d938547f84707355, []int{37} } func (m *CAKeySet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2257,7 +2307,7 @@ func (m *RoleMapping) Reset() { *m = RoleMapping{} } func (m *RoleMapping) String() string { return proto.CompactTextString(m) } func (*RoleMapping) ProtoMessage() {} func (*RoleMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{37} + return fileDescriptor_d938547f84707355, []int{38} } func (m *RoleMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2305,7 +2355,7 @@ type ProvisionTokenV1 struct { func (m *ProvisionTokenV1) Reset() { *m = ProvisionTokenV1{} } func (*ProvisionTokenV1) ProtoMessage() {} func (*ProvisionTokenV1) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{38} + return fileDescriptor_d938547f84707355, []int{39} } func (m *ProvisionTokenV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2354,7 +2404,7 @@ type ProvisionTokenV2 struct { func (m *ProvisionTokenV2) Reset() { *m = ProvisionTokenV2{} } func (*ProvisionTokenV2) ProtoMessage() {} func (*ProvisionTokenV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{39} + return fileDescriptor_d938547f84707355, []int{40} } func (m *ProvisionTokenV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2396,7 +2446,7 @@ func (m *ProvisionTokenV2List) Reset() { *m = ProvisionTokenV2List{} } func (m *ProvisionTokenV2List) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenV2List) ProtoMessage() {} func (*ProvisionTokenV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{40} + return fileDescriptor_d938547f84707355, []int{41} } func (m *ProvisionTokenV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2448,7 +2498,7 @@ func (m *TokenRule) Reset() { *m = TokenRule{} } func (m *TokenRule) String() string { return proto.CompactTextString(m) } func (*TokenRule) ProtoMessage() {} func (*TokenRule) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{41} + return fileDescriptor_d938547f84707355, []int{42} } func (m *TokenRule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2503,7 +2553,7 @@ func (m *ProvisionTokenSpecV2) Reset() { *m = ProvisionTokenSpecV2{} } func (m *ProvisionTokenSpecV2) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2) ProtoMessage() {} func (*ProvisionTokenSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{42} + return fileDescriptor_d938547f84707355, []int{43} } func (m *ProvisionTokenSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2552,7 +2602,7 @@ type StaticTokensV2 struct { func (m *StaticTokensV2) Reset() { *m = StaticTokensV2{} } func (*StaticTokensV2) ProtoMessage() {} func (*StaticTokensV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{43} + return fileDescriptor_d938547f84707355, []int{44} } func (m *StaticTokensV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2595,7 +2645,7 @@ func (m *StaticTokensSpecV2) Reset() { *m = StaticTokensSpecV2{} } func (m *StaticTokensSpecV2) String() string { return proto.CompactTextString(m) } func (*StaticTokensSpecV2) ProtoMessage() {} func (*StaticTokensSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{44} + return fileDescriptor_d938547f84707355, []int{45} } func (m *StaticTokensSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2644,7 +2694,7 @@ type ClusterNameV2 struct { func (m *ClusterNameV2) Reset() { *m = ClusterNameV2{} } func (*ClusterNameV2) ProtoMessage() {} func (*ClusterNameV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{45} + return fileDescriptor_d938547f84707355, []int{46} } func (m *ClusterNameV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2690,7 +2740,7 @@ func (m *ClusterNameSpecV2) Reset() { *m = ClusterNameSpecV2{} } func (m *ClusterNameSpecV2) String() string { return proto.CompactTextString(m) } func (*ClusterNameSpecV2) ProtoMessage() {} func (*ClusterNameSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{46} + return fileDescriptor_d938547f84707355, []int{47} } func (m *ClusterNameSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2740,7 +2790,7 @@ func (m *ClusterAuditConfigV2) Reset() { *m = ClusterAuditConfigV2{} } func (m *ClusterAuditConfigV2) String() string { return proto.CompactTextString(m) } func (*ClusterAuditConfigV2) ProtoMessage() {} func (*ClusterAuditConfigV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{47} + return fileDescriptor_d938547f84707355, []int{48} } func (m *ClusterAuditConfigV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2808,7 +2858,7 @@ func (m *ClusterAuditConfigSpecV2) Reset() { *m = ClusterAuditConfigSpec func (m *ClusterAuditConfigSpecV2) String() string { return proto.CompactTextString(m) } func (*ClusterAuditConfigSpecV2) ProtoMessage() {} func (*ClusterAuditConfigSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{48} + return fileDescriptor_d938547f84707355, []int{49} } func (m *ClusterAuditConfigSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2858,7 +2908,7 @@ func (m *ClusterNetworkingConfigV2) Reset() { *m = ClusterNetworkingConf func (m *ClusterNetworkingConfigV2) String() string { return proto.CompactTextString(m) } func (*ClusterNetworkingConfigV2) ProtoMessage() {} func (*ClusterNetworkingConfigV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{49} + return fileDescriptor_d938547f84707355, []int{50} } func (m *ClusterNetworkingConfigV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2921,7 +2971,7 @@ func (m *ClusterNetworkingConfigSpecV2) Reset() { *m = ClusterNetworking func (m *ClusterNetworkingConfigSpecV2) String() string { return proto.CompactTextString(m) } func (*ClusterNetworkingConfigSpecV2) ProtoMessage() {} func (*ClusterNetworkingConfigSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{50} + return fileDescriptor_d938547f84707355, []int{51} } func (m *ClusterNetworkingConfigSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2971,7 +3021,7 @@ func (m *SessionRecordingConfigV2) Reset() { *m = SessionRecordingConfig func (m *SessionRecordingConfigV2) String() string { return proto.CompactTextString(m) } func (*SessionRecordingConfigV2) ProtoMessage() {} func (*SessionRecordingConfigV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{51} + return fileDescriptor_d938547f84707355, []int{52} } func (m *SessionRecordingConfigV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3017,7 +3067,7 @@ func (m *SessionRecordingConfigSpecV2) Reset() { *m = SessionRecordingCo func (m *SessionRecordingConfigSpecV2) String() string { return proto.CompactTextString(m) } func (*SessionRecordingConfigSpecV2) ProtoMessage() {} func (*SessionRecordingConfigSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{52} + return fileDescriptor_d938547f84707355, []int{53} } func (m *SessionRecordingConfigSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3066,7 +3116,7 @@ type AuthPreferenceV2 struct { func (m *AuthPreferenceV2) Reset() { *m = AuthPreferenceV2{} } func (*AuthPreferenceV2) ProtoMessage() {} func (*AuthPreferenceV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{53} + return fileDescriptor_d938547f84707355, []int{54} } func (m *AuthPreferenceV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3133,7 +3183,7 @@ func (m *AuthPreferenceSpecV2) Reset() { *m = AuthPreferenceSpecV2{} } func (m *AuthPreferenceSpecV2) String() string { return proto.CompactTextString(m) } func (*AuthPreferenceSpecV2) ProtoMessage() {} func (*AuthPreferenceSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{54} + return fileDescriptor_d938547f84707355, []int{55} } func (m *AuthPreferenceSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3182,7 +3232,7 @@ func (m *U2F) Reset() { *m = U2F{} } func (m *U2F) String() string { return proto.CompactTextString(m) } func (*U2F) ProtoMessage() {} func (*U2F) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{55} + return fileDescriptor_d938547f84707355, []int{56} } func (m *U2F) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3250,7 +3300,7 @@ func (m *Webauthn) Reset() { *m = Webauthn{} } func (m *Webauthn) String() string { return proto.CompactTextString(m) } func (*Webauthn) ProtoMessage() {} func (*Webauthn) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{56} + return fileDescriptor_d938547f84707355, []int{57} } func (m *Webauthn) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3300,7 +3350,7 @@ func (m *Namespace) Reset() { *m = Namespace{} } func (m *Namespace) String() string { return proto.CompactTextString(m) } func (*Namespace) ProtoMessage() {} func (*Namespace) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{57} + return fileDescriptor_d938547f84707355, []int{58} } func (m *Namespace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3340,7 +3390,7 @@ func (m *NamespaceSpec) Reset() { *m = NamespaceSpec{} } func (m *NamespaceSpec) String() string { return proto.CompactTextString(m) } func (*NamespaceSpec) ProtoMessage() {} func (*NamespaceSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{58} + return fileDescriptor_d938547f84707355, []int{59} } func (m *NamespaceSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3388,7 +3438,7 @@ type UserTokenV3 struct { func (m *UserTokenV3) Reset() { *m = UserTokenV3{} } func (*UserTokenV3) ProtoMessage() {} func (*UserTokenV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{59} + return fileDescriptor_d938547f84707355, []int{60} } func (m *UserTokenV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3435,7 +3485,7 @@ func (m *UserTokenSpecV3) Reset() { *m = UserTokenSpecV3{} } func (m *UserTokenSpecV3) String() string { return proto.CompactTextString(m) } func (*UserTokenSpecV3) ProtoMessage() {} func (*UserTokenSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{60} + return fileDescriptor_d938547f84707355, []int{61} } func (m *UserTokenSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3483,7 +3533,7 @@ type UserTokenSecretsV3 struct { func (m *UserTokenSecretsV3) Reset() { *m = UserTokenSecretsV3{} } func (*UserTokenSecretsV3) ProtoMessage() {} func (*UserTokenSecretsV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{61} + return fileDescriptor_d938547f84707355, []int{62} } func (m *UserTokenSecretsV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3528,7 +3578,7 @@ func (m *UserTokenSecretsSpecV3) Reset() { *m = UserTokenSecretsSpecV3{} func (m *UserTokenSecretsSpecV3) String() string { return proto.CompactTextString(m) } func (*UserTokenSecretsSpecV3) ProtoMessage() {} func (*UserTokenSecretsSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{62} + return fileDescriptor_d938547f84707355, []int{63} } func (m *UserTokenSecretsSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3577,7 +3627,7 @@ type AccessRequestV3 struct { func (m *AccessRequestV3) Reset() { *m = AccessRequestV3{} } func (*AccessRequestV3) ProtoMessage() {} func (*AccessRequestV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{63} + return fileDescriptor_d938547f84707355, []int{64} } func (m *AccessRequestV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3629,7 +3679,7 @@ func (m *AccessReviewThreshold) Reset() { *m = AccessReviewThreshold{} } func (m *AccessReviewThreshold) String() string { return proto.CompactTextString(m) } func (*AccessReviewThreshold) ProtoMessage() {} func (*AccessReviewThreshold) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{64} + return fileDescriptor_d938547f84707355, []int{65} } func (m *AccessReviewThreshold) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3685,7 +3735,7 @@ func (m *AccessReview) Reset() { *m = AccessReview{} } func (m *AccessReview) String() string { return proto.CompactTextString(m) } func (*AccessReview) ProtoMessage() {} func (*AccessReview) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{65} + return fileDescriptor_d938547f84707355, []int{66} } func (m *AccessReview) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3730,7 +3780,7 @@ func (m *AccessReviewSubmission) Reset() { *m = AccessReviewSubmission{} func (m *AccessReviewSubmission) String() string { return proto.CompactTextString(m) } func (*AccessReviewSubmission) ProtoMessage() {} func (*AccessReviewSubmission) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{66} + return fileDescriptor_d938547f84707355, []int{67} } func (m *AccessReviewSubmission) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3773,7 +3823,7 @@ func (m *ThresholdIndexSet) Reset() { *m = ThresholdIndexSet{} } func (m *ThresholdIndexSet) String() string { return proto.CompactTextString(m) } func (*ThresholdIndexSet) ProtoMessage() {} func (*ThresholdIndexSet) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{67} + return fileDescriptor_d938547f84707355, []int{68} } func (m *ThresholdIndexSet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3816,7 +3866,7 @@ func (m *ThresholdIndexSets) Reset() { *m = ThresholdIndexSets{} } func (m *ThresholdIndexSets) String() string { return proto.CompactTextString(m) } func (*ThresholdIndexSets) ProtoMessage() {} func (*ThresholdIndexSets) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{68} + return fileDescriptor_d938547f84707355, []int{69} } func (m *ThresholdIndexSets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3903,7 +3953,7 @@ func (m *AccessRequestSpecV3) Reset() { *m = AccessRequestSpecV3{} } func (m *AccessRequestSpecV3) String() string { return proto.CompactTextString(m) } func (*AccessRequestSpecV3) ProtoMessage() {} func (*AccessRequestSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{69} + return fileDescriptor_d938547f84707355, []int{70} } func (m *AccessRequestSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3949,7 +3999,7 @@ func (m *AccessRequestFilter) Reset() { *m = AccessRequestFilter{} } func (m *AccessRequestFilter) String() string { return proto.CompactTextString(m) } func (*AccessRequestFilter) ProtoMessage() {} func (*AccessRequestFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{70} + return fileDescriptor_d938547f84707355, []int{71} } func (m *AccessRequestFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3995,7 +4045,7 @@ func (m *AccessCapabilities) Reset() { *m = AccessCapabilities{} } func (m *AccessCapabilities) String() string { return proto.CompactTextString(m) } func (*AccessCapabilities) ProtoMessage() {} func (*AccessCapabilities) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{71} + return fileDescriptor_d938547f84707355, []int{72} } func (m *AccessCapabilities) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4044,7 +4094,7 @@ func (m *AccessCapabilitiesRequest) Reset() { *m = AccessCapabilitiesReq func (m *AccessCapabilitiesRequest) String() string { return proto.CompactTextString(m) } func (*AccessCapabilitiesRequest) ProtoMessage() {} func (*AccessCapabilitiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{72} + return fileDescriptor_d938547f84707355, []int{73} } func (m *AccessCapabilitiesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4090,7 +4140,7 @@ func (m *ResourceID) Reset() { *m = ResourceID{} } func (m *ResourceID) String() string { return proto.CompactTextString(m) } func (*ResourceID) ProtoMessage() {} func (*ResourceID) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{73} + return fileDescriptor_d938547f84707355, []int{74} } func (m *ResourceID) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4139,7 +4189,7 @@ type PluginDataV3 struct { func (m *PluginDataV3) Reset() { *m = PluginDataV3{} } func (*PluginDataV3) ProtoMessage() {} func (*PluginDataV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{74} + return fileDescriptor_d938547f84707355, []int{75} } func (m *PluginDataV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4182,7 +4232,7 @@ func (m *PluginDataEntry) Reset() { *m = PluginDataEntry{} } func (m *PluginDataEntry) String() string { return proto.CompactTextString(m) } func (*PluginDataEntry) ProtoMessage() {} func (*PluginDataEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{75} + return fileDescriptor_d938547f84707355, []int{76} } func (m *PluginDataEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4224,7 +4274,7 @@ func (m *PluginDataSpecV3) Reset() { *m = PluginDataSpecV3{} } func (m *PluginDataSpecV3) String() string { return proto.CompactTextString(m) } func (*PluginDataSpecV3) ProtoMessage() {} func (*PluginDataSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{76} + return fileDescriptor_d938547f84707355, []int{77} } func (m *PluginDataSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4271,7 +4321,7 @@ func (m *PluginDataFilter) Reset() { *m = PluginDataFilter{} } func (m *PluginDataFilter) String() string { return proto.CompactTextString(m) } func (*PluginDataFilter) ProtoMessage() {} func (*PluginDataFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{77} + return fileDescriptor_d938547f84707355, []int{78} } func (m *PluginDataFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4322,7 +4372,7 @@ func (m *PluginDataUpdateParams) Reset() { *m = PluginDataUpdateParams{} func (m *PluginDataUpdateParams) String() string { return proto.CompactTextString(m) } func (*PluginDataUpdateParams) ProtoMessage() {} func (*PluginDataUpdateParams) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{78} + return fileDescriptor_d938547f84707355, []int{79} } func (m *PluginDataUpdateParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4371,7 +4421,7 @@ type RoleV5 struct { func (m *RoleV5) Reset() { *m = RoleV5{} } func (*RoleV5) ProtoMessage() {} func (*RoleV5) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{79} + return fileDescriptor_d938547f84707355, []int{80} } func (m *RoleV5) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4418,7 +4468,7 @@ func (m *RoleSpecV5) Reset() { *m = RoleSpecV5{} } func (m *RoleSpecV5) String() string { return proto.CompactTextString(m) } func (*RoleSpecV5) ProtoMessage() {} func (*RoleSpecV5) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{80} + return fileDescriptor_d938547f84707355, []int{81} } func (m *RoleSpecV5) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4509,7 +4559,7 @@ func (m *RoleOptions) Reset() { *m = RoleOptions{} } func (m *RoleOptions) String() string { return proto.CompactTextString(m) } func (*RoleOptions) ProtoMessage() {} func (*RoleOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{81} + return fileDescriptor_d938547f84707355, []int{82} } func (m *RoleOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4551,7 +4601,7 @@ func (m *RecordSession) Reset() { *m = RecordSession{} } func (m *RecordSession) String() string { return proto.CompactTextString(m) } func (*RecordSession) ProtoMessage() {} func (*RecordSession) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{82} + return fileDescriptor_d938547f84707355, []int{83} } func (m *RecordSession) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4601,7 +4651,7 @@ func (m *CertExtension) Reset() { *m = CertExtension{} } func (m *CertExtension) String() string { return proto.CompactTextString(m) } func (*CertExtension) ProtoMessage() {} func (*CertExtension) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{83} + return fileDescriptor_d938547f84707355, []int{84} } func (m *CertExtension) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4686,7 +4736,7 @@ func (m *RoleConditions) Reset() { *m = RoleConditions{} } func (m *RoleConditions) String() string { return proto.CompactTextString(m) } func (*RoleConditions) ProtoMessage() {} func (*RoleConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{84} + return fileDescriptor_d938547f84707355, []int{85} } func (m *RoleConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4739,7 +4789,7 @@ func (m *SessionRequirePolicy) Reset() { *m = SessionRequirePolicy{} } func (m *SessionRequirePolicy) String() string { return proto.CompactTextString(m) } func (*SessionRequirePolicy) ProtoMessage() {} func (*SessionRequirePolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{85} + return fileDescriptor_d938547f84707355, []int{86} } func (m *SessionRequirePolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4787,7 +4837,7 @@ func (m *SessionJoinPolicy) Reset() { *m = SessionJoinPolicy{} } func (m *SessionJoinPolicy) String() string { return proto.CompactTextString(m) } func (*SessionJoinPolicy) ProtoMessage() {} func (*SessionJoinPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{86} + return fileDescriptor_d938547f84707355, []int{87} } func (m *SessionJoinPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4851,7 +4901,7 @@ func (m *AccessRequestConditions) Reset() { *m = AccessRequestConditions func (m *AccessRequestConditions) String() string { return proto.CompactTextString(m) } func (*AccessRequestConditions) ProtoMessage() {} func (*AccessRequestConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{87} + return fileDescriptor_d938547f84707355, []int{88} } func (m *AccessRequestConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4899,7 +4949,7 @@ func (m *AccessReviewConditions) Reset() { *m = AccessReviewConditions{} func (m *AccessReviewConditions) String() string { return proto.CompactTextString(m) } func (*AccessReviewConditions) ProtoMessage() {} func (*AccessReviewConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{88} + return fileDescriptor_d938547f84707355, []int{89} } func (m *AccessReviewConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4945,7 +4995,7 @@ func (m *ClaimMapping) Reset() { *m = ClaimMapping{} } func (m *ClaimMapping) String() string { return proto.CompactTextString(m) } func (*ClaimMapping) ProtoMessage() {} func (*ClaimMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{89} + return fileDescriptor_d938547f84707355, []int{90} } func (m *ClaimMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4991,7 +5041,7 @@ func (m *TraitMapping) Reset() { *m = TraitMapping{} } func (m *TraitMapping) String() string { return proto.CompactTextString(m) } func (*TraitMapping) ProtoMessage() {} func (*TraitMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{90} + return fileDescriptor_d938547f84707355, []int{91} } func (m *TraitMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5040,7 +5090,7 @@ func (m *Rule) Reset() { *m = Rule{} } func (m *Rule) String() string { return proto.CompactTextString(m) } func (*Rule) ProtoMessage() {} func (*Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{91} + return fileDescriptor_d938547f84707355, []int{92} } func (m *Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5088,7 +5138,7 @@ func (m *ImpersonateConditions) Reset() { *m = ImpersonateConditions{} } func (m *ImpersonateConditions) String() string { return proto.CompactTextString(m) } func (*ImpersonateConditions) ProtoMessage() {} func (*ImpersonateConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{92} + return fileDescriptor_d938547f84707355, []int{93} } func (m *ImpersonateConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5130,7 +5180,7 @@ func (m *BoolValue) Reset() { *m = BoolValue{} } func (m *BoolValue) String() string { return proto.CompactTextString(m) } func (*BoolValue) ProtoMessage() {} func (*BoolValue) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{93} + return fileDescriptor_d938547f84707355, []int{94} } func (m *BoolValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5179,7 +5229,7 @@ type UserV2 struct { func (m *UserV2) Reset() { *m = UserV2{} } func (*UserV2) ProtoMessage() {} func (*UserV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{94} + return fileDescriptor_d938547f84707355, []int{95} } func (m *UserV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5243,7 +5293,7 @@ func (m *UserSpecV2) Reset() { *m = UserSpecV2{} } func (m *UserSpecV2) String() string { return proto.CompactTextString(m) } func (*UserSpecV2) ProtoMessage() {} func (*UserSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{95} + return fileDescriptor_d938547f84707355, []int{96} } func (m *UserSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5288,7 +5338,7 @@ type ExternalIdentity struct { func (m *ExternalIdentity) Reset() { *m = ExternalIdentity{} } func (*ExternalIdentity) ProtoMessage() {} func (*ExternalIdentity) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{96} + return fileDescriptor_d938547f84707355, []int{97} } func (m *ExternalIdentity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5340,7 +5390,7 @@ func (m *LoginStatus) Reset() { *m = LoginStatus{} } func (m *LoginStatus) String() string { return proto.CompactTextString(m) } func (*LoginStatus) ProtoMessage() {} func (*LoginStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{97} + return fileDescriptor_d938547f84707355, []int{98} } func (m *LoginStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5385,7 +5435,7 @@ type CreatedBy struct { func (m *CreatedBy) Reset() { *m = CreatedBy{} } func (*CreatedBy) ProtoMessage() {} func (*CreatedBy) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{98} + return fileDescriptor_d938547f84707355, []int{99} } func (m *CreatedBy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5434,7 +5484,7 @@ func (m *LocalAuthSecrets) Reset() { *m = LocalAuthSecrets{} } func (m *LocalAuthSecrets) String() string { return proto.CompactTextString(m) } func (*LocalAuthSecrets) ProtoMessage() {} func (*LocalAuthSecrets) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{99} + return fileDescriptor_d938547f84707355, []int{100} } func (m *LocalAuthSecrets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5489,7 +5539,7 @@ func (m *MFADevice) Reset() { *m = MFADevice{} } func (m *MFADevice) String() string { return proto.CompactTextString(m) } func (*MFADevice) ProtoMessage() {} func (*MFADevice) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{100} + return fileDescriptor_d938547f84707355, []int{101} } func (m *MFADevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5587,7 +5637,7 @@ func (m *TOTPDevice) Reset() { *m = TOTPDevice{} } func (m *TOTPDevice) String() string { return proto.CompactTextString(m) } func (*TOTPDevice) ProtoMessage() {} func (*TOTPDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{101} + return fileDescriptor_d938547f84707355, []int{102} } func (m *TOTPDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5633,7 +5683,7 @@ func (m *U2FDevice) Reset() { *m = U2FDevice{} } func (m *U2FDevice) String() string { return proto.CompactTextString(m) } func (*U2FDevice) ProtoMessage() {} func (*U2FDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{102} + return fileDescriptor_d938547f84707355, []int{103} } func (m *U2FDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5700,7 +5750,7 @@ func (m *WebauthnDevice) Reset() { *m = WebauthnDevice{} } func (m *WebauthnDevice) String() string { return proto.CompactTextString(m) } func (*WebauthnDevice) ProtoMessage() {} func (*WebauthnDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{103} + return fileDescriptor_d938547f84707355, []int{104} } func (m *WebauthnDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5743,7 +5793,7 @@ func (m *WebauthnLocalAuth) Reset() { *m = WebauthnLocalAuth{} } func (m *WebauthnLocalAuth) String() string { return proto.CompactTextString(m) } func (*WebauthnLocalAuth) ProtoMessage() {} func (*WebauthnLocalAuth) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{104} + return fileDescriptor_d938547f84707355, []int{105} } func (m *WebauthnLocalAuth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5789,7 +5839,7 @@ func (m *ConnectorRef) Reset() { *m = ConnectorRef{} } func (m *ConnectorRef) String() string { return proto.CompactTextString(m) } func (*ConnectorRef) ProtoMessage() {} func (*ConnectorRef) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{105} + return fileDescriptor_d938547f84707355, []int{106} } func (m *ConnectorRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5831,7 +5881,7 @@ func (m *UserRef) Reset() { *m = UserRef{} } func (m *UserRef) String() string { return proto.CompactTextString(m) } func (*UserRef) ProtoMessage() {} func (*UserRef) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{106} + return fileDescriptor_d938547f84707355, []int{107} } func (m *UserRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5881,7 +5931,7 @@ func (m *ReverseTunnelV2) Reset() { *m = ReverseTunnelV2{} } func (m *ReverseTunnelV2) String() string { return proto.CompactTextString(m) } func (*ReverseTunnelV2) ProtoMessage() {} func (*ReverseTunnelV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{107} + return fileDescriptor_d938547f84707355, []int{108} } func (m *ReverseTunnelV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5928,7 +5978,7 @@ func (m *ReverseTunnelSpecV2) Reset() { *m = ReverseTunnelSpecV2{} } func (m *ReverseTunnelSpecV2) String() string { return proto.CompactTextString(m) } func (*ReverseTunnelSpecV2) ProtoMessage() {} func (*ReverseTunnelSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{108} + return fileDescriptor_d938547f84707355, []int{109} } func (m *ReverseTunnelSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5977,7 +6027,7 @@ type TunnelConnectionV2 struct { func (m *TunnelConnectionV2) Reset() { *m = TunnelConnectionV2{} } func (*TunnelConnectionV2) ProtoMessage() {} func (*TunnelConnectionV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{109} + return fileDescriptor_d938547f84707355, []int{110} } func (m *TunnelConnectionV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6025,7 +6075,7 @@ func (m *TunnelConnectionSpecV2) Reset() { *m = TunnelConnectionSpecV2{} func (m *TunnelConnectionSpecV2) String() string { return proto.CompactTextString(m) } func (*TunnelConnectionSpecV2) ProtoMessage() {} func (*TunnelConnectionSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{110} + return fileDescriptor_d938547f84707355, []int{111} } func (m *TunnelConnectionSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6073,7 +6123,7 @@ func (m *SemaphoreFilter) Reset() { *m = SemaphoreFilter{} } func (m *SemaphoreFilter) String() string { return proto.CompactTextString(m) } func (*SemaphoreFilter) ProtoMessage() {} func (*SemaphoreFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{111} + return fileDescriptor_d938547f84707355, []int{112} } func (m *SemaphoreFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6124,7 +6174,7 @@ func (m *AcquireSemaphoreRequest) Reset() { *m = AcquireSemaphoreRequest func (m *AcquireSemaphoreRequest) String() string { return proto.CompactTextString(m) } func (*AcquireSemaphoreRequest) ProtoMessage() {} func (*AcquireSemaphoreRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{112} + return fileDescriptor_d938547f84707355, []int{113} } func (m *AcquireSemaphoreRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6172,7 +6222,7 @@ func (m *SemaphoreLease) Reset() { *m = SemaphoreLease{} } func (m *SemaphoreLease) String() string { return proto.CompactTextString(m) } func (*SemaphoreLease) ProtoMessage() {} func (*SemaphoreLease) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{113} + return fileDescriptor_d938547f84707355, []int{114} } func (m *SemaphoreLease) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6218,7 +6268,7 @@ func (m *SemaphoreLeaseRef) Reset() { *m = SemaphoreLeaseRef{} } func (m *SemaphoreLeaseRef) String() string { return proto.CompactTextString(m) } func (*SemaphoreLeaseRef) ProtoMessage() {} func (*SemaphoreLeaseRef) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{114} + return fileDescriptor_d938547f84707355, []int{115} } func (m *SemaphoreLeaseRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6267,7 +6317,7 @@ type SemaphoreV3 struct { func (m *SemaphoreV3) Reset() { *m = SemaphoreV3{} } func (*SemaphoreV3) ProtoMessage() {} func (*SemaphoreV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{115} + return fileDescriptor_d938547f84707355, []int{116} } func (m *SemaphoreV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6309,7 +6359,7 @@ func (m *SemaphoreSpecV3) Reset() { *m = SemaphoreSpecV3{} } func (m *SemaphoreSpecV3) String() string { return proto.CompactTextString(m) } func (*SemaphoreSpecV3) ProtoMessage() {} func (*SemaphoreSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{116} + return fileDescriptor_d938547f84707355, []int{117} } func (m *SemaphoreSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6358,7 +6408,7 @@ type WebSessionV2 struct { func (m *WebSessionV2) Reset() { *m = WebSessionV2{} } func (*WebSessionV2) ProtoMessage() {} func (*WebSessionV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{117} + return fileDescriptor_d938547f84707355, []int{118} } func (m *WebSessionV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6419,7 +6469,7 @@ func (m *WebSessionSpecV2) Reset() { *m = WebSessionSpecV2{} } func (m *WebSessionSpecV2) String() string { return proto.CompactTextString(m) } func (*WebSessionSpecV2) ProtoMessage() {} func (*WebSessionSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{118} + return fileDescriptor_d938547f84707355, []int{119} } func (m *WebSessionSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6461,7 +6511,7 @@ func (m *WebSessionFilter) Reset() { *m = WebSessionFilter{} } func (m *WebSessionFilter) String() string { return proto.CompactTextString(m) } func (*WebSessionFilter) ProtoMessage() {} func (*WebSessionFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{119} + return fileDescriptor_d938547f84707355, []int{120} } func (m *WebSessionFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6510,7 +6560,7 @@ type RemoteClusterV3 struct { func (m *RemoteClusterV3) Reset() { *m = RemoteClusterV3{} } func (*RemoteClusterV3) ProtoMessage() {} func (*RemoteClusterV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{120} + return fileDescriptor_d938547f84707355, []int{121} } func (m *RemoteClusterV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6554,7 +6604,7 @@ func (m *RemoteClusterStatusV3) Reset() { *m = RemoteClusterStatusV3{} } func (m *RemoteClusterStatusV3) String() string { return proto.CompactTextString(m) } func (*RemoteClusterStatusV3) ProtoMessage() {} func (*RemoteClusterStatusV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{121} + return fileDescriptor_d938547f84707355, []int{122} } func (m *RemoteClusterStatusV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6604,7 +6654,7 @@ func (m *KubernetesCluster) Reset() { *m = KubernetesCluster{} } func (m *KubernetesCluster) String() string { return proto.CompactTextString(m) } func (*KubernetesCluster) ProtoMessage() {} func (*KubernetesCluster) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{122} + return fileDescriptor_d938547f84707355, []int{123} } func (m *KubernetesCluster) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6653,7 +6703,7 @@ type KubernetesClusterV3 struct { func (m *KubernetesClusterV3) Reset() { *m = KubernetesClusterV3{} } func (*KubernetesClusterV3) ProtoMessage() {} func (*KubernetesClusterV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{123} + return fileDescriptor_d938547f84707355, []int{124} } func (m *KubernetesClusterV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6695,7 +6745,7 @@ func (m *KubernetesClusterSpecV3) Reset() { *m = KubernetesClusterSpecV3 func (m *KubernetesClusterSpecV3) String() string { return proto.CompactTextString(m) } func (*KubernetesClusterSpecV3) ProtoMessage() {} func (*KubernetesClusterSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{124} + return fileDescriptor_d938547f84707355, []int{125} } func (m *KubernetesClusterSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6747,7 +6797,7 @@ type WebTokenV3 struct { func (m *WebTokenV3) Reset() { *m = WebTokenV3{} } func (*WebTokenV3) ProtoMessage() {} func (*WebTokenV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{125} + return fileDescriptor_d938547f84707355, []int{126} } func (m *WebTokenV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6791,7 +6841,7 @@ func (m *WebTokenSpecV3) Reset() { *m = WebTokenSpecV3{} } func (m *WebTokenSpecV3) String() string { return proto.CompactTextString(m) } func (*WebTokenSpecV3) ProtoMessage() {} func (*WebTokenSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{126} + return fileDescriptor_d938547f84707355, []int{127} } func (m *WebTokenSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6835,7 +6885,7 @@ func (m *GetWebSessionRequest) Reset() { *m = GetWebSessionRequest{} } func (m *GetWebSessionRequest) String() string { return proto.CompactTextString(m) } func (*GetWebSessionRequest) ProtoMessage() {} func (*GetWebSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{127} + return fileDescriptor_d938547f84707355, []int{128} } func (m *GetWebSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6879,7 +6929,7 @@ func (m *DeleteWebSessionRequest) Reset() { *m = DeleteWebSessionRequest func (m *DeleteWebSessionRequest) String() string { return proto.CompactTextString(m) } func (*DeleteWebSessionRequest) ProtoMessage() {} func (*DeleteWebSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{128} + return fileDescriptor_d938547f84707355, []int{129} } func (m *DeleteWebSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6923,7 +6973,7 @@ func (m *GetWebTokenRequest) Reset() { *m = GetWebTokenRequest{} } func (m *GetWebTokenRequest) String() string { return proto.CompactTextString(m) } func (*GetWebTokenRequest) ProtoMessage() {} func (*GetWebTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{129} + return fileDescriptor_d938547f84707355, []int{130} } func (m *GetWebTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6967,7 +7017,7 @@ func (m *DeleteWebTokenRequest) Reset() { *m = DeleteWebTokenRequest{} } func (m *DeleteWebTokenRequest) String() string { return proto.CompactTextString(m) } func (*DeleteWebTokenRequest) ProtoMessage() {} func (*DeleteWebTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{130} + return fileDescriptor_d938547f84707355, []int{131} } func (m *DeleteWebTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7009,7 +7059,7 @@ func (m *ResourceRequest) Reset() { *m = ResourceRequest{} } func (m *ResourceRequest) String() string { return proto.CompactTextString(m) } func (*ResourceRequest) ProtoMessage() {} func (*ResourceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{131} + return fileDescriptor_d938547f84707355, []int{132} } func (m *ResourceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7053,7 +7103,7 @@ func (m *ResourceWithSecretsRequest) Reset() { *m = ResourceWithSecretsR func (m *ResourceWithSecretsRequest) String() string { return proto.CompactTextString(m) } func (*ResourceWithSecretsRequest) ProtoMessage() {} func (*ResourceWithSecretsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{132} + return fileDescriptor_d938547f84707355, []int{133} } func (m *ResourceWithSecretsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7095,7 +7145,7 @@ func (m *ResourcesWithSecretsRequest) Reset() { *m = ResourcesWithSecret func (m *ResourcesWithSecretsRequest) String() string { return proto.CompactTextString(m) } func (*ResourcesWithSecretsRequest) ProtoMessage() {} func (*ResourcesWithSecretsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{133} + return fileDescriptor_d938547f84707355, []int{134} } func (m *ResourcesWithSecretsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7139,7 +7189,7 @@ func (m *ResourceInNamespaceRequest) Reset() { *m = ResourceInNamespaceR func (m *ResourceInNamespaceRequest) String() string { return proto.CompactTextString(m) } func (*ResourceInNamespaceRequest) ProtoMessage() {} func (*ResourceInNamespaceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{134} + return fileDescriptor_d938547f84707355, []int{135} } func (m *ResourceInNamespaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7181,7 +7231,7 @@ func (m *ResourcesInNamespaceRequest) Reset() { *m = ResourcesInNamespac func (m *ResourcesInNamespaceRequest) String() string { return proto.CompactTextString(m) } func (*ResourcesInNamespaceRequest) ProtoMessage() {} func (*ResourcesInNamespaceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{135} + return fileDescriptor_d938547f84707355, []int{136} } func (m *ResourcesInNamespaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7231,7 +7281,7 @@ func (m *OIDCConnectorV3) Reset() { *m = OIDCConnectorV3{} } func (m *OIDCConnectorV3) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorV3) ProtoMessage() {} func (*OIDCConnectorV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{136} + return fileDescriptor_d938547f84707355, []int{137} } func (m *OIDCConnectorV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7273,7 +7323,7 @@ func (m *OIDCConnectorV3List) Reset() { *m = OIDCConnectorV3List{} } func (m *OIDCConnectorV3List) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorV3List) ProtoMessage() {} func (*OIDCConnectorV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{137} + return fileDescriptor_d938547f84707355, []int{138} } func (m *OIDCConnectorV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7346,7 +7396,7 @@ func (m *OIDCConnectorSpecV3) Reset() { *m = OIDCConnectorSpecV3{} } func (m *OIDCConnectorSpecV3) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorSpecV3) ProtoMessage() {} func (*OIDCConnectorSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{138} + return fileDescriptor_d938547f84707355, []int{139} } func (m *OIDCConnectorSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7396,7 +7446,7 @@ func (m *SAMLConnectorV2) Reset() { *m = SAMLConnectorV2{} } func (m *SAMLConnectorV2) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorV2) ProtoMessage() {} func (*SAMLConnectorV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{139} + return fileDescriptor_d938547f84707355, []int{140} } func (m *SAMLConnectorV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7438,7 +7488,7 @@ func (m *SAMLConnectorV2List) Reset() { *m = SAMLConnectorV2List{} } func (m *SAMLConnectorV2List) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorV2List) ProtoMessage() {} func (*SAMLConnectorV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{140} + return fileDescriptor_d938547f84707355, []int{141} } func (m *SAMLConnectorV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7507,7 +7557,7 @@ func (m *SAMLConnectorSpecV2) Reset() { *m = SAMLConnectorSpecV2{} } func (m *SAMLConnectorSpecV2) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorSpecV2) ProtoMessage() {} func (*SAMLConnectorSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{141} + return fileDescriptor_d938547f84707355, []int{142} } func (m *SAMLConnectorSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7553,7 +7603,7 @@ func (m *AttributeMapping) Reset() { *m = AttributeMapping{} } func (m *AttributeMapping) String() string { return proto.CompactTextString(m) } func (*AttributeMapping) ProtoMessage() {} func (*AttributeMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{142} + return fileDescriptor_d938547f84707355, []int{143} } func (m *AttributeMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7598,7 +7648,7 @@ func (m *AsymmetricKeyPair) Reset() { *m = AsymmetricKeyPair{} } func (m *AsymmetricKeyPair) String() string { return proto.CompactTextString(m) } func (*AsymmetricKeyPair) ProtoMessage() {} func (*AsymmetricKeyPair) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{143} + return fileDescriptor_d938547f84707355, []int{144} } func (m *AsymmetricKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7648,7 +7698,7 @@ func (m *GithubConnectorV3) Reset() { *m = GithubConnectorV3{} } func (m *GithubConnectorV3) String() string { return proto.CompactTextString(m) } func (*GithubConnectorV3) ProtoMessage() {} func (*GithubConnectorV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{144} + return fileDescriptor_d938547f84707355, []int{145} } func (m *GithubConnectorV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7690,7 +7740,7 @@ func (m *GithubConnectorV3List) Reset() { *m = GithubConnectorV3List{} } func (m *GithubConnectorV3List) String() string { return proto.CompactTextString(m) } func (*GithubConnectorV3List) ProtoMessage() {} func (*GithubConnectorV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{145} + return fileDescriptor_d938547f84707355, []int{146} } func (m *GithubConnectorV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7740,7 +7790,7 @@ func (m *GithubConnectorSpecV3) Reset() { *m = GithubConnectorSpecV3{} } func (m *GithubConnectorSpecV3) String() string { return proto.CompactTextString(m) } func (*GithubConnectorSpecV3) ProtoMessage() {} func (*GithubConnectorSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{146} + return fileDescriptor_d938547f84707355, []int{147} } func (m *GithubConnectorSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7784,7 +7834,7 @@ func (m *SSOWarnings) Reset() { *m = SSOWarnings{} } func (m *SSOWarnings) String() string { return proto.CompactTextString(m) } func (*SSOWarnings) ProtoMessage() {} func (*SSOWarnings) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{147} + return fileDescriptor_d938547f84707355, []int{148} } func (m *SSOWarnings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7840,7 +7890,7 @@ func (m *CreateUserParams) Reset() { *m = CreateUserParams{} } func (m *CreateUserParams) String() string { return proto.CompactTextString(m) } func (*CreateUserParams) ProtoMessage() {} func (*CreateUserParams) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{148} + return fileDescriptor_d938547f84707355, []int{149} } func (m *CreateUserParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7902,7 +7952,7 @@ func (m *SSODiagnosticInfo) Reset() { *m = SSODiagnosticInfo{} } func (m *SSODiagnosticInfo) String() string { return proto.CompactTextString(m) } func (*SSODiagnosticInfo) ProtoMessage() {} func (*SSODiagnosticInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{149} + return fileDescriptor_d938547f84707355, []int{150} } func (m *SSODiagnosticInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7952,7 +8002,7 @@ func (m *TeamMapping) Reset() { *m = TeamMapping{} } func (m *TeamMapping) String() string { return proto.CompactTextString(m) } func (*TeamMapping) ProtoMessage() {} func (*TeamMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{150} + return fileDescriptor_d938547f84707355, []int{151} } func (m *TeamMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8001,7 +8051,7 @@ type TrustedClusterV2 struct { func (m *TrustedClusterV2) Reset() { *m = TrustedClusterV2{} } func (*TrustedClusterV2) ProtoMessage() {} func (*TrustedClusterV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{151} + return fileDescriptor_d938547f84707355, []int{152} } func (m *TrustedClusterV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8043,7 +8093,7 @@ func (m *TrustedClusterV2List) Reset() { *m = TrustedClusterV2List{} } func (m *TrustedClusterV2List) String() string { return proto.CompactTextString(m) } func (*TrustedClusterV2List) ProtoMessage() {} func (*TrustedClusterV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{152} + return fileDescriptor_d938547f84707355, []int{153} } func (m *TrustedClusterV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8099,7 +8149,7 @@ func (m *TrustedClusterSpecV2) Reset() { *m = TrustedClusterSpecV2{} } func (m *TrustedClusterSpecV2) String() string { return proto.CompactTextString(m) } func (*TrustedClusterSpecV2) ProtoMessage() {} func (*TrustedClusterSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{153} + return fileDescriptor_d938547f84707355, []int{154} } func (m *TrustedClusterSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8152,7 +8202,7 @@ func (m *LockV2) Reset() { *m = LockV2{} } func (m *LockV2) String() string { return proto.CompactTextString(m) } func (*LockV2) ProtoMessage() {} func (*LockV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{154} + return fileDescriptor_d938547f84707355, []int{155} } func (m *LockV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8198,7 +8248,7 @@ func (m *LockSpecV2) Reset() { *m = LockSpecV2{} } func (m *LockSpecV2) String() string { return proto.CompactTextString(m) } func (*LockSpecV2) ProtoMessage() {} func (*LockSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{155} + return fileDescriptor_d938547f84707355, []int{156} } func (m *LockSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8253,7 +8303,7 @@ type LockTarget struct { func (m *LockTarget) Reset() { *m = LockTarget{} } func (*LockTarget) ProtoMessage() {} func (*LockTarget) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{156} + return fileDescriptor_d938547f84707355, []int{157} } func (m *LockTarget) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8297,7 +8347,7 @@ func (m *AddressCondition) Reset() { *m = AddressCondition{} } func (m *AddressCondition) String() string { return proto.CompactTextString(m) } func (*AddressCondition) ProtoMessage() {} func (*AddressCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{157} + return fileDescriptor_d938547f84707355, []int{158} } func (m *AddressCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8340,7 +8390,7 @@ func (m *NetworkRestrictionsSpecV4) Reset() { *m = NetworkRestrictionsSp func (m *NetworkRestrictionsSpecV4) String() string { return proto.CompactTextString(m) } func (*NetworkRestrictionsSpecV4) ProtoMessage() {} func (*NetworkRestrictionsSpecV4) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{158} + return fileDescriptor_d938547f84707355, []int{159} } func (m *NetworkRestrictionsSpecV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8393,7 +8443,7 @@ func (m *NetworkRestrictionsV4) Reset() { *m = NetworkRestrictionsV4{} } func (m *NetworkRestrictionsV4) String() string { return proto.CompactTextString(m) } func (*NetworkRestrictionsV4) ProtoMessage() {} func (*NetworkRestrictionsV4) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{159} + return fileDescriptor_d938547f84707355, []int{160} } func (m *NetworkRestrictionsV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8437,7 +8487,7 @@ func (m *WindowsDesktopServiceV3) Reset() { *m = WindowsDesktopServiceV3 func (m *WindowsDesktopServiceV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopServiceV3) ProtoMessage() {} func (*WindowsDesktopServiceV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{160} + return fileDescriptor_d938547f84707355, []int{161} } func (m *WindowsDesktopServiceV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8483,7 +8533,7 @@ func (m *WindowsDesktopServiceSpecV3) Reset() { *m = WindowsDesktopServi func (m *WindowsDesktopServiceSpecV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopServiceSpecV3) ProtoMessage() {} func (*WindowsDesktopServiceSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{161} + return fileDescriptor_d938547f84707355, []int{162} } func (m *WindowsDesktopServiceSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8527,7 +8577,7 @@ func (m *WindowsDesktopFilter) Reset() { *m = WindowsDesktopFilter{} } func (m *WindowsDesktopFilter) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopFilter) ProtoMessage() {} func (*WindowsDesktopFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{162} + return fileDescriptor_d938547f84707355, []int{163} } func (m *WindowsDesktopFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8571,7 +8621,7 @@ func (m *WindowsDesktopV3) Reset() { *m = WindowsDesktopV3{} } func (m *WindowsDesktopV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopV3) ProtoMessage() {} func (*WindowsDesktopV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{163} + return fileDescriptor_d938547f84707355, []int{164} } func (m *WindowsDesktopV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8617,7 +8667,7 @@ func (m *WindowsDesktopSpecV3) Reset() { *m = WindowsDesktopSpecV3{} } func (m *WindowsDesktopSpecV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopSpecV3) ProtoMessage() {} func (*WindowsDesktopSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{164} + return fileDescriptor_d938547f84707355, []int{165} } func (m *WindowsDesktopSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8683,7 +8733,7 @@ func (m *RegisterUsingTokenRequest) Reset() { *m = RegisterUsingTokenReq func (m *RegisterUsingTokenRequest) String() string { return proto.CompactTextString(m) } func (*RegisterUsingTokenRequest) ProtoMessage() {} func (*RegisterUsingTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{165} + return fileDescriptor_d938547f84707355, []int{166} } func (m *RegisterUsingTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8737,7 +8787,7 @@ func (m *RecoveryCodesV1) Reset() { *m = RecoveryCodesV1{} } func (m *RecoveryCodesV1) String() string { return proto.CompactTextString(m) } func (*RecoveryCodesV1) ProtoMessage() {} func (*RecoveryCodesV1) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{166} + return fileDescriptor_d938547f84707355, []int{167} } func (m *RecoveryCodesV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8782,7 +8832,7 @@ func (m *RecoveryCodesSpecV1) Reset() { *m = RecoveryCodesSpecV1{} } func (m *RecoveryCodesSpecV1) String() string { return proto.CompactTextString(m) } func (*RecoveryCodesSpecV1) ProtoMessage() {} func (*RecoveryCodesSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{167} + return fileDescriptor_d938547f84707355, []int{168} } func (m *RecoveryCodesSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8826,7 +8876,7 @@ func (m *RecoveryCode) Reset() { *m = RecoveryCode{} } func (m *RecoveryCode) String() string { return proto.CompactTextString(m) } func (*RecoveryCode) ProtoMessage() {} func (*RecoveryCode) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{168} + return fileDescriptor_d938547f84707355, []int{169} } func (m *RecoveryCode) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8870,7 +8920,7 @@ func (m *SessionTrackerV1) Reset() { *m = SessionTrackerV1{} } func (m *SessionTrackerV1) String() string { return proto.CompactTextString(m) } func (*SessionTrackerV1) ProtoMessage() {} func (*SessionTrackerV1) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{169} + return fileDescriptor_d938547f84707355, []int{170} } func (m *SessionTrackerV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8960,7 +9010,7 @@ func (m *SessionTrackerSpecV1) Reset() { *m = SessionTrackerSpecV1{} } func (m *SessionTrackerSpecV1) String() string { return proto.CompactTextString(m) } func (*SessionTrackerSpecV1) ProtoMessage() {} func (*SessionTrackerSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{170} + return fileDescriptor_d938547f84707355, []int{171} } func (m *SessionTrackerSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9007,7 +9057,7 @@ func (m *SessionTrackerPolicySet) Reset() { *m = SessionTrackerPolicySet func (m *SessionTrackerPolicySet) String() string { return proto.CompactTextString(m) } func (*SessionTrackerPolicySet) ProtoMessage() {} func (*SessionTrackerPolicySet) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{171} + return fileDescriptor_d938547f84707355, []int{172} } func (m *SessionTrackerPolicySet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9055,7 +9105,7 @@ func (m *Participant) Reset() { *m = Participant{} } func (m *Participant) String() string { return proto.CompactTextString(m) } func (*Participant) ProtoMessage() {} func (*Participant) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{172} + return fileDescriptor_d938547f84707355, []int{173} } func (m *Participant) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9099,7 +9149,7 @@ func (m *SortBy) Reset() { *m = SortBy{} } func (m *SortBy) String() string { return proto.CompactTextString(m) } func (*SortBy) ProtoMessage() {} func (*SortBy) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{173} + return fileDescriptor_d938547f84707355, []int{174} } func (m *SortBy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9157,6 +9207,7 @@ func init() { proto.RegisterType((*AWS)(nil), "types.AWS") proto.RegisterType((*Redshift)(nil), "types.Redshift") proto.RegisterType((*RDS)(nil), "types.RDS") + proto.RegisterType((*ElastiCache)(nil), "types.ElastiCache") proto.RegisterType((*GCPCloudSQL)(nil), "types.GCPCloudSQL") proto.RegisterType((*Azure)(nil), "types.Azure") proto.RegisterType((*AD)(nil), "types.AD") @@ -9334,778 +9385,787 @@ func init() { func init() { proto.RegisterFile("types.proto", fileDescriptor_d938547f84707355) } var fileDescriptor_d938547f84707355 = []byte{ - // 12329 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0xbd, 0x5d, 0x6c, 0x24, 0x49, - 0x72, 0x18, 0x3c, 0xd5, 0xdd, 0x24, 0xbb, 0x83, 0x4d, 0xb2, 0x99, 0xf3, 0xc7, 0x99, 0x9d, 0xdd, - 0x9e, 0xab, 0xdd, 0x9d, 0x9d, 0x9d, 0xdb, 0x1d, 0xde, 0x70, 0x6e, 0xf7, 0xb4, 0xb7, 0x7f, 0xd7, - 0x4d, 0x72, 0x66, 0xb8, 0xc3, 0x21, 0xb9, 0xd5, 0xfc, 0xb9, 0xd3, 0xdd, 0xa9, 0x54, 0xec, 0x4a, - 0x92, 0xb5, 0xec, 0xee, 0xea, 0xab, 0xaa, 0x9e, 0x19, 0x4a, 0x9f, 0x20, 0x09, 0x1f, 0xee, 0x13, - 0x04, 0x41, 0x77, 0xba, 0x0f, 0x27, 0x4b, 0x32, 0x64, 0x48, 0x16, 0x2c, 0xdb, 0xb2, 0x71, 0x82, - 0x21, 0x1b, 0xb0, 0x0d, 0x1b, 0x36, 0x04, 0x18, 0xc2, 0x3d, 0xd8, 0xb0, 0x5e, 0x0c, 0x43, 0xb2, - 0x41, 0x5b, 0x77, 0x7a, 0x31, 0x01, 0x03, 0x06, 0x04, 0x18, 0xd0, 0xd9, 0x02, 0x8c, 0x8c, 0xcc, - 0xac, 0xca, 0xac, 0xae, 0x26, 0x9b, 0x3b, 0xb3, 0xb0, 0x66, 0x9f, 0xc8, 0x8e, 0x8c, 0x88, 0xca, - 0x9f, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0x48, 0x18, 0x8f, 0x0e, 0xba, 0x34, 0xbc, 0xd9, 0x0d, 0xfc, - 0xc8, 0x27, 0x23, 0xf8, 0xe3, 0xf2, 0xb9, 0x5d, 0x7f, 0xd7, 0x47, 0xc8, 0x2c, 0xfb, 0x8f, 0x17, - 0x5e, 0xae, 0xee, 0xfa, 0xfe, 0x6e, 0x8b, 0xce, 0xe2, 0xaf, 0xed, 0xde, 0xce, 0x6c, 0xe4, 0xb5, - 0x69, 0x18, 0x39, 0xed, 0xae, 0x40, 0x98, 0xdf, 0xf5, 0xa2, 0xbd, 0xde, 0xf6, 0xcd, 0xa6, 0xdf, - 0x9e, 0xdd, 0x0d, 0x9c, 0x87, 0x5e, 0xe4, 0x44, 0x9e, 0xdf, 0x71, 0x5a, 0xb3, 0x11, 0x6d, 0xd1, - 0xae, 0x1f, 0x44, 0xb3, 0x4e, 0xd7, 0x9b, 0xc5, 0x6f, 0xcc, 0x3e, 0x0a, 0x9c, 0x6e, 0x97, 0x06, - 0xc9, 0x3f, 0x9c, 0x89, 0xf9, 0xb7, 0xf3, 0x50, 0xba, 0x4f, 0x69, 0xb7, 0xd6, 0xf2, 0x1e, 0x52, - 0xf2, 0x22, 0x14, 0x56, 0x9c, 0x36, 0x9d, 0x31, 0xae, 0x1a, 0xd7, 0x4b, 0xf5, 0xa9, 0xa3, 0xc3, - 0xea, 0x78, 0x48, 0x83, 0x87, 0x34, 0xb0, 0x3b, 0x4e, 0x9b, 0x5a, 0x58, 0x48, 0x3e, 0x0b, 0x25, - 0xf6, 0x37, 0xec, 0x3a, 0x4d, 0x3a, 0x93, 0x43, 0xcc, 0x89, 0xa3, 0xc3, 0x6a, 0xa9, 0x23, 0x81, - 0x56, 0x52, 0x4e, 0xae, 0xc1, 0xd8, 0x32, 0x75, 0x42, 0xba, 0xb4, 0x30, 0x93, 0xbf, 0x6a, 0x5c, - 0xcf, 0xd7, 0xcb, 0x47, 0x87, 0xd5, 0x62, 0x8b, 0x81, 0x6c, 0xcf, 0xb5, 0x64, 0x21, 0x59, 0x82, - 0xb1, 0xc5, 0xc7, 0x5d, 0x2f, 0xa0, 0xe1, 0x4c, 0xe1, 0xaa, 0x71, 0x7d, 0x7c, 0xee, 0xf2, 0x4d, - 0xde, 0xfe, 0x9b, 0xb2, 0xfd, 0x37, 0xd7, 0x65, 0xfb, 0xeb, 0x67, 0xbf, 0x7f, 0x58, 0x3d, 0x73, - 0x74, 0x58, 0x1d, 0xa3, 0x9c, 0xe4, 0x57, 0xfe, 0x4b, 0xd5, 0xb0, 0x24, 0x3d, 0x79, 0x07, 0x0a, - 0xeb, 0x07, 0x5d, 0x3a, 0x53, 0xba, 0x6a, 0x5c, 0x9f, 0x9c, 0x7b, 0xe1, 0x26, 0xef, 0xf1, 0xb8, - 0x91, 0xc9, 0x7f, 0x0c, 0xab, 0x5e, 0x3c, 0x3a, 0xac, 0x16, 0x18, 0x8a, 0x85, 0x54, 0xe4, 0x75, - 0x18, 0xbd, 0xe7, 0x87, 0xd1, 0xd2, 0xc2, 0x0c, 0x60, 0xd3, 0xce, 0x1f, 0x1d, 0x56, 0xa7, 0xf7, - 0xfc, 0x30, 0xb2, 0x3d, 0xf7, 0x35, 0xbf, 0xed, 0x45, 0xb4, 0xdd, 0x8d, 0x0e, 0x2c, 0x81, 0x64, - 0x6e, 0xc3, 0x84, 0xc6, 0x8f, 0x8c, 0xc3, 0xd8, 0xc6, 0xca, 0xfd, 0x95, 0xd5, 0xad, 0x95, 0xca, - 0x19, 0x52, 0x84, 0xc2, 0xca, 0xea, 0xc2, 0x62, 0xc5, 0x20, 0x63, 0x90, 0xaf, 0xad, 0xad, 0x55, - 0x72, 0xa4, 0x0c, 0xc5, 0x85, 0xda, 0x7a, 0xad, 0x5e, 0x6b, 0x2c, 0x56, 0xf2, 0xe4, 0x2c, 0x4c, - 0x6d, 0x2d, 0xad, 0x2c, 0xac, 0x6e, 0x35, 0xec, 0x85, 0xc5, 0xc6, 0xfd, 0xf5, 0xd5, 0xb5, 0x4a, - 0x81, 0x4c, 0x02, 0xdc, 0xdf, 0xa8, 0x2f, 0x5a, 0x2b, 0x8b, 0xeb, 0x8b, 0x8d, 0xca, 0x88, 0xf9, - 0x0b, 0x79, 0x28, 0x3e, 0xa0, 0x91, 0xe3, 0x3a, 0x91, 0x43, 0xae, 0x68, 0x43, 0x84, 0xb5, 0x57, - 0xc6, 0xe6, 0xc5, 0xfe, 0xb1, 0x19, 0x39, 0x3a, 0xac, 0x1a, 0xaf, 0xab, 0x63, 0xf2, 0x36, 0x8c, - 0x2f, 0xd0, 0xb0, 0x19, 0x78, 0x5d, 0x26, 0x2f, 0x38, 0x2e, 0xa5, 0xfa, 0xa5, 0xa3, 0xc3, 0xea, - 0x79, 0x37, 0x01, 0x2b, 0x6d, 0x55, 0xb1, 0xc9, 0x12, 0x8c, 0x2e, 0x3b, 0xdb, 0xb4, 0x15, 0xce, - 0x8c, 0x5c, 0xcd, 0x5f, 0x1f, 0x9f, 0x7b, 0x4e, 0xf4, 0xaf, 0xac, 0xe0, 0x4d, 0x5e, 0xba, 0xd8, - 0x89, 0x82, 0x83, 0xfa, 0xb9, 0xa3, 0xc3, 0x6a, 0xa5, 0x85, 0x00, 0xb5, 0xef, 0x38, 0x0a, 0x69, - 0x24, 0x63, 0x3e, 0x7a, 0xe2, 0x98, 0x3f, 0xff, 0xfd, 0xc3, 0xaa, 0xc1, 0xc6, 0x42, 0x8c, 0x79, - 0xc2, 0x4f, 0x1f, 0xfd, 0xab, 0x90, 0x5b, 0x5a, 0x98, 0x19, 0x43, 0x59, 0xab, 0x1c, 0x1d, 0x56, - 0xcb, 0xda, 0xb0, 0xe5, 0x96, 0x16, 0x2e, 0xbf, 0x05, 0xe3, 0x4a, 0x1d, 0x49, 0x05, 0xf2, 0xfb, - 0xf4, 0x80, 0xf7, 0xa7, 0xc5, 0xfe, 0x25, 0xe7, 0x60, 0xe4, 0xa1, 0xd3, 0xea, 0x89, 0x0e, 0xb4, - 0xf8, 0x8f, 0x2f, 0xe6, 0x7e, 0xcc, 0x30, 0xff, 0xff, 0x02, 0x14, 0x2d, 0x9f, 0xcf, 0x33, 0xf2, - 0x2a, 0x8c, 0x34, 0x22, 0x27, 0x92, 0x43, 0x71, 0xf6, 0xe8, 0xb0, 0x3a, 0x15, 0x32, 0x80, 0xf2, - 0x3d, 0x8e, 0xc1, 0x50, 0xd7, 0xf6, 0x9c, 0x50, 0x0e, 0x09, 0xa2, 0x76, 0x19, 0x40, 0x45, 0x45, - 0x0c, 0x72, 0x0d, 0x0a, 0x0f, 0x7c, 0x97, 0x8a, 0x51, 0x21, 0x47, 0x87, 0xd5, 0xc9, 0xb6, 0xef, - 0xaa, 0x88, 0x58, 0x4e, 0x5e, 0x83, 0xd2, 0x7c, 0x2f, 0x08, 0x68, 0x87, 0x89, 0x6a, 0x01, 0x91, - 0x27, 0x8f, 0x0e, 0xab, 0xd0, 0xe4, 0x40, 0x36, 0xb9, 0x12, 0x04, 0xd6, 0xd5, 0x8d, 0xc8, 0x09, - 0x22, 0xea, 0xce, 0x8c, 0x0c, 0xd5, 0xd5, 0x6c, 0x7a, 0x4d, 0x87, 0x9c, 0x24, 0xdd, 0xd5, 0x82, - 0x13, 0xb9, 0x07, 0xe3, 0x77, 0x03, 0xa7, 0x49, 0xd7, 0x68, 0xe0, 0xf9, 0x2e, 0x8e, 0x61, 0xbe, - 0x7e, 0xed, 0xe8, 0xb0, 0x7a, 0x61, 0x97, 0x81, 0xed, 0x2e, 0xc2, 0x13, 0xea, 0x1f, 0x1d, 0x56, - 0x8b, 0x0b, 0xbd, 0x00, 0x7b, 0xcf, 0x52, 0x49, 0xc9, 0x4f, 0xb2, 0x21, 0x09, 0x23, 0xec, 0x5a, - 0xea, 0xe2, 0xe8, 0x1d, 0x5f, 0x45, 0x53, 0x54, 0xf1, 0x42, 0xcb, 0x09, 0x23, 0x3b, 0xe0, 0x74, - 0xa9, 0x7a, 0xaa, 0x2c, 0xc9, 0x2a, 0x14, 0x1b, 0xcd, 0x3d, 0xea, 0xf6, 0x5a, 0x74, 0xa6, 0x88, - 0xec, 0x2f, 0x0a, 0xc1, 0x95, 0xe3, 0x29, 0x8b, 0xeb, 0x97, 0x05, 0x6f, 0x12, 0x0a, 0x88, 0xd2, - 0xf7, 0x31, 0x93, 0x2f, 0x16, 0x7f, 0xfd, 0xb7, 0xab, 0x67, 0x7e, 0xee, 0x3f, 0x5f, 0x3d, 0x63, - 0xfe, 0xd3, 0x1c, 0x54, 0xd2, 0x4c, 0xc8, 0x0e, 0x4c, 0x6c, 0x74, 0x5d, 0x27, 0xa2, 0xf3, 0x2d, - 0x8f, 0x76, 0xa2, 0x10, 0x85, 0xe4, 0xf8, 0x36, 0xbd, 0x24, 0xbe, 0x3b, 0xd3, 0x43, 0x42, 0xbb, - 0xc9, 0x29, 0x53, 0xad, 0xd2, 0xd9, 0x26, 0xdf, 0x69, 0xa0, 0x9e, 0x0e, 0x51, 0xc2, 0x4e, 0xf7, - 0x1d, 0xae, 0xe1, 0x07, 0x7c, 0x47, 0xb0, 0x15, 0x02, 0xd4, 0x71, 0xb7, 0x0f, 0x50, 0x32, 0x87, - 0x17, 0x20, 0x46, 0x92, 0x21, 0x40, 0x0c, 0x6c, 0xfe, 0xb9, 0x01, 0x93, 0x16, 0x0d, 0xfd, 0x5e, - 0xd0, 0xa4, 0xf7, 0xa8, 0xe3, 0xd2, 0x80, 0x89, 0xff, 0x7d, 0xaf, 0xe3, 0x8a, 0x39, 0x85, 0xe2, - 0xbf, 0xef, 0x75, 0xd4, 0x29, 0x8c, 0xe5, 0xe4, 0x73, 0x30, 0xd6, 0xe8, 0x6d, 0x23, 0x2a, 0x9f, - 0x53, 0x17, 0x70, 0xc4, 0x7a, 0xdb, 0x76, 0x0a, 0x5d, 0xa2, 0x91, 0x59, 0x18, 0xdb, 0xa4, 0x41, - 0x98, 0x68, 0x3c, 0xd4, 0xec, 0x0f, 0x39, 0x48, 0x25, 0x10, 0x58, 0xe4, 0x6e, 0xa2, 0x75, 0xc5, - 0x9a, 0x34, 0x95, 0xd2, 0x75, 0x89, 0xa8, 0xb4, 0x05, 0x44, 0x15, 0x15, 0x89, 0x65, 0x7e, 0x27, - 0x07, 0x95, 0x05, 0x27, 0x72, 0xb6, 0x9d, 0x50, 0xf4, 0xe7, 0xe6, 0x6d, 0xa6, 0xc7, 0x95, 0x86, - 0xa2, 0x1e, 0x67, 0x35, 0xff, 0xd8, 0xcd, 0x7b, 0x39, 0xdd, 0xbc, 0x71, 0xb6, 0x40, 0x8a, 0xe6, - 0x25, 0x8d, 0x7a, 0xf7, 0xe4, 0x46, 0x55, 0x44, 0xa3, 0x8a, 0xb2, 0x51, 0x49, 0x53, 0xc8, 0xbb, - 0x50, 0x68, 0x74, 0x69, 0x53, 0x28, 0x11, 0xa9, 0xfb, 0xf5, 0xc6, 0x31, 0x84, 0xcd, 0xdb, 0xf5, - 0xb2, 0x60, 0x53, 0x08, 0xbb, 0xb4, 0x69, 0x21, 0x99, 0x32, 0x69, 0xbe, 0x3b, 0x0a, 0xe7, 0xb2, - 0xc8, 0xc8, 0xbb, 0xfa, 0xe2, 0xc4, 0xbb, 0xe7, 0xb9, 0x81, 0x8b, 0xd3, 0x8c, 0xa1, 0x2f, 0x4f, - 0x37, 0xa0, 0xb8, 0xc6, 0x04, 0xb2, 0xe9, 0xb7, 0x44, 0xcf, 0x31, 0xad, 0x58, 0xec, 0x4a, 0x98, - 0x61, 0xc5, 0xe5, 0xe4, 0x39, 0xc8, 0x6f, 0x58, 0x4b, 0xa2, 0xbb, 0x4a, 0x47, 0x87, 0xd5, 0x7c, - 0x2f, 0xf0, 0x66, 0x0c, 0x8b, 0x41, 0xc9, 0x2c, 0x8c, 0xce, 0xd7, 0xe6, 0x69, 0x10, 0x61, 0x37, - 0x95, 0xeb, 0x17, 0x99, 0xb4, 0x34, 0x1d, 0xbb, 0x49, 0x83, 0x48, 0xfb, 0xbc, 0x40, 0x23, 0x9f, - 0x85, 0x7c, 0x6d, 0xab, 0x21, 0x7a, 0x06, 0x44, 0xcf, 0xd4, 0xb6, 0x1a, 0xf5, 0x09, 0xd1, 0x11, - 0x79, 0xe7, 0x51, 0xc8, 0xb8, 0xd7, 0xb6, 0x1a, 0xea, 0x68, 0x8d, 0x1e, 0x33, 0x5a, 0xd7, 0xa1, - 0xc8, 0xec, 0x0c, 0xb6, 0xc0, 0xa3, 0x52, 0x2c, 0x71, 0xf3, 0x69, 0x4f, 0xc0, 0xac, 0xb8, 0x94, - 0xbc, 0x18, 0x9b, 0x2d, 0xc5, 0x84, 0x9f, 0x30, 0x5b, 0xa4, 0xb1, 0x42, 0x1e, 0xc3, 0xc4, 0xc2, - 0x41, 0xc7, 0x69, 0x7b, 0x4d, 0xb1, 0x84, 0x97, 0x70, 0x09, 0xbf, 0x79, 0xcc, 0x30, 0xde, 0xd4, - 0x08, 0xf8, 0xaa, 0x2e, 0x95, 0xef, 0x8c, 0xcb, 0xcb, 0xec, 0xf4, 0x0a, 0x3f, 0x63, 0x58, 0xfa, - 0x87, 0xd8, 0x5c, 0x92, 0x2a, 0x12, 0xed, 0xaa, 0x44, 0xec, 0x24, 0x38, 0x99, 0x4b, 0x81, 0x80, - 0xa8, 0x73, 0x29, 0x5e, 0x74, 0xdf, 0x85, 0xfc, 0xdd, 0xf9, 0xb5, 0x99, 0x71, 0xe4, 0x41, 0x04, - 0x8f, 0xbb, 0xf3, 0x6b, 0xf3, 0x2d, 0xbf, 0xe7, 0x36, 0x3e, 0x5c, 0xae, 0x5f, 0x14, 0x6c, 0x26, - 0x76, 0x9b, 0x5d, 0xad, 0x46, 0x8c, 0x8e, 0x2c, 0x42, 0x51, 0xb6, 0x72, 0xa6, 0x8c, 0x3c, 0xa6, - 0x53, 0x8d, 0xdf, 0xbc, 0xcd, 0xe7, 0x9a, 0x2b, 0x7e, 0xab, 0xb5, 0x90, 0x38, 0x97, 0xb7, 0x80, - 0xf4, 0xf7, 0x4b, 0x86, 0x25, 0xf1, 0x59, 0xd5, 0x92, 0x18, 0x9f, 0x3b, 0x2f, 0xbe, 0x35, 0xef, - 0xb7, 0xdb, 0x4e, 0xc7, 0x45, 0xda, 0xcd, 0x39, 0xd5, 0xc0, 0xa8, 0xc1, 0x64, 0x52, 0x91, 0x65, - 0x2f, 0x8c, 0xc8, 0x2c, 0x94, 0x24, 0x84, 0x2d, 0x22, 0xf9, 0xcc, 0x2a, 0x5b, 0x09, 0x8e, 0xf9, - 0x47, 0x39, 0x80, 0xa4, 0xe4, 0x19, 0xd5, 0x33, 0x5f, 0xd0, 0xf4, 0xcc, 0xf9, 0xb4, 0x80, 0x0e, - 0xd4, 0x30, 0xe4, 0x7d, 0x18, 0x65, 0x26, 0x57, 0x4f, 0x9a, 0x94, 0x17, 0xd3, 0xa4, 0x58, 0xb8, - 0x79, 0xbb, 0x3e, 0x29, 0x88, 0x47, 0x43, 0x84, 0x58, 0x82, 0x4c, 0x51, 0x51, 0x7f, 0x30, 0x92, - 0x0c, 0x86, 0x50, 0x4e, 0xd7, 0x15, 0xed, 0x62, 0x24, 0xf3, 0x51, 0x6a, 0x17, 0x45, 0xb7, 0x5c, - 0xe2, 0xba, 0x85, 0x77, 0xea, 0x98, 0xd0, 0x2d, 0x69, 0xcd, 0xc2, 0x3b, 0xf0, 0x44, 0xcd, 0xd2, - 0x4d, 0x4f, 0xdb, 0x02, 0x8a, 0xc1, 0xf5, 0xcc, 0x5e, 0xc9, 0x9a, 0xb0, 0x57, 0x4f, 0x9a, 0xb0, - 0xe9, 0xe9, 0x7a, 0x7b, 0x90, 0x2e, 0x3b, 0x2f, 0x67, 0x97, 0xf3, 0x48, 0x25, 0x47, 0x9d, 0xf6, - 0x36, 0x9f, 0x9a, 0xa3, 0x03, 0xa7, 0xe6, 0xf9, 0xcc, 0xa9, 0xc9, 0x27, 0xe6, 0xdb, 0x30, 0x52, - 0xfb, 0xa9, 0x5e, 0x40, 0x85, 0xed, 0x57, 0x96, 0xdf, 0x64, 0xb0, 0x78, 0x4e, 0x4f, 0x39, 0xec, - 0xa7, 0x6a, 0x33, 0x63, 0x39, 0xfb, 0xf2, 0xfa, 0x72, 0x43, 0xd8, 0x75, 0x24, 0xd5, 0x2d, 0xeb, - 0xcb, 0x4a, 0xb5, 0x23, 0xad, 0xd5, 0x8c, 0x8a, 0xcc, 0x42, 0xae, 0xb6, 0x80, 0x9b, 0xc5, 0xf1, - 0xb9, 0x92, 0xfc, 0xec, 0x42, 0xfd, 0x9c, 0x20, 0x29, 0x3b, 0xda, 0xfe, 0xa1, 0xb6, 0x40, 0xea, - 0x30, 0xf2, 0xe0, 0xa0, 0xf1, 0xe1, 0xb2, 0x50, 0x64, 0x67, 0xa5, 0x5c, 0x33, 0xd8, 0x2a, 0xae, - 0x42, 0x61, 0x52, 0xe3, 0xf6, 0x41, 0xf8, 0x8d, 0x96, 0x5a, 0x63, 0x44, 0xfb, 0xe4, 0x14, 0xc8, - 0x3f, 0x32, 0x14, 0x5b, 0x43, 0xc8, 0x3a, 0xdb, 0xd3, 0x0a, 0x89, 0x33, 0x12, 0xcb, 0xa7, 0x4f, - 0xe2, 0x62, 0x79, 0x7b, 0x95, 0x8f, 0x7e, 0xae, 0x6f, 0xf4, 0xc7, 0x95, 0x95, 0x8c, 0x8f, 0x79, - 0xdc, 0x17, 0xf9, 0x8f, 0xdd, 0x17, 0xe6, 0x7f, 0x33, 0xf0, 0x7b, 0xe4, 0x35, 0x18, 0xb5, 0xe8, - 0x6e, 0xb2, 0xe8, 0xe3, 0xe6, 0x31, 0x40, 0x88, 0x5a, 0x49, 0x8e, 0x83, 0x2b, 0x0a, 0x75, 0xc3, - 0x3d, 0x6f, 0x27, 0x12, 0x35, 0x8d, 0x57, 0x14, 0x01, 0x56, 0x56, 0x14, 0x01, 0xd1, 0x56, 0x14, - 0x01, 0x63, 0xb2, 0x6e, 0x2d, 0x34, 0x44, 0x03, 0x64, 0x6b, 0xad, 0x05, 0x45, 0x68, 0x02, 0x57, - 0x13, 0x1a, 0x6b, 0xa1, 0x41, 0xde, 0x84, 0x52, 0xad, 0xd9, 0xf4, 0x7b, 0xca, 0xee, 0x6b, 0xe6, - 0xe8, 0xb0, 0x7a, 0xce, 0xe1, 0x40, 0xdd, 0x57, 0x90, 0xa0, 0x9a, 0xf5, 0xa4, 0xd6, 0x8c, 0xc7, - 0x7c, 0xab, 0x17, 0x46, 0x34, 0x58, 0x5a, 0x10, 0x4d, 0x46, 0x1e, 0x4d, 0x0e, 0x4c, 0xf1, 0x88, - 0x51, 0xcd, 0xff, 0x64, 0x60, 0x8d, 0xc9, 0x5b, 0x00, 0x4b, 0x1d, 0x66, 0x61, 0x37, 0x69, 0xcc, - 0x00, 0x77, 0xf1, 0x9e, 0x80, 0xea, 0x1c, 0x14, 0x64, 0xfd, 0xd3, 0xb9, 0xa1, 0x3f, 0xcd, 0x3e, - 0x29, 0xed, 0x75, 0xe1, 0xd0, 0x11, 0x9f, 0x0c, 0x04, 0x34, 0xf5, 0xc9, 0x04, 0x99, 0x5c, 0x83, - 0xb1, 0xa5, 0xda, 0x83, 0x5a, 0x2f, 0xda, 0xc3, 0xfe, 0x2a, 0x72, 0xcd, 0xe9, 0x39, 0x6d, 0xdb, - 0xe9, 0x45, 0x7b, 0x96, 0x2c, 0x34, 0x7f, 0xce, 0x80, 0x71, 0x45, 0x69, 0xb0, 0xaa, 0xae, 0x05, - 0xfe, 0x47, 0xb4, 0x19, 0xe9, 0xbd, 0xd4, 0xe5, 0xc0, 0x54, 0x55, 0x63, 0xd4, 0x54, 0xef, 0xe4, - 0x4e, 0xd1, 0x3b, 0xe6, 0xac, 0xd0, 0x45, 0x6c, 0x33, 0xa2, 0xf8, 0x5a, 0x70, 0x33, 0xc2, 0x8c, - 0x2d, 0x75, 0x33, 0xc2, 0xca, 0xcd, 0xdf, 0x33, 0x98, 0x0e, 0x21, 0xb3, 0x00, 0xf7, 0xe9, 0x41, - 0xe4, 0x6c, 0xdf, 0xf1, 0x5a, 0x9a, 0x0f, 0x6d, 0x1f, 0xa1, 0xf6, 0x8e, 0xd7, 0xa2, 0x96, 0x82, - 0x42, 0x6e, 0x43, 0xf1, 0x7e, 0xb0, 0xfd, 0x06, 0xa2, 0xe7, 0xe2, 0xb5, 0xe0, 0xec, 0x7e, 0xb0, - 0xfd, 0x06, 0x22, 0xab, 0xf2, 0x2a, 0x11, 0x89, 0x09, 0xa3, 0x0b, 0x7e, 0xdb, 0xf1, 0xe4, 0xfa, - 0x0b, 0x6c, 0x11, 0x73, 0x11, 0x62, 0x89, 0x12, 0xb6, 0xfa, 0x34, 0xd6, 0x56, 0x84, 0x60, 0xe2, - 0xea, 0x13, 0x76, 0x3b, 0x16, 0x83, 0x99, 0xdf, 0x33, 0x60, 0x5c, 0x51, 0x8d, 0xe4, 0xf3, 0xc2, - 0xdf, 0x60, 0xa0, 0xb7, 0xec, 0x42, 0xbf, 0xf2, 0x64, 0xa5, 0xdc, 0x6e, 0x68, 0xfb, 0x2e, 0x15, - 0xde, 0x87, 0x44, 0xa3, 0xe4, 0x86, 0xd1, 0x28, 0x6f, 0x01, 0x70, 0xa3, 0x12, 0xbb, 0x53, 0x91, - 0x1b, 0xc5, 0xbb, 0xa8, 0x0e, 0x46, 0x82, 0x6c, 0x5a, 0x50, 0x56, 0xb5, 0x09, 0xa9, 0xc3, 0x84, - 0xd8, 0x43, 0x09, 0x2b, 0x84, 0xf7, 0xf3, 0x15, 0xb6, 0xbc, 0x09, 0x6e, 0xfd, 0x7b, 0x3a, 0x9d, - 0xc4, 0xfc, 0xf9, 0x1c, 0x14, 0x05, 0x64, 0xee, 0x19, 0x35, 0x90, 0xde, 0xd0, 0x0c, 0x24, 0xa9, - 0x77, 0x15, 0xcb, 0x7d, 0xee, 0x84, 0x0d, 0xd8, 0x5b, 0x50, 0x96, 0x5d, 0x80, 0x76, 0xe6, 0xab, - 0x30, 0x26, 0x5d, 0x08, 0xdc, 0xca, 0x9c, 0xd2, 0x78, 0x6e, 0xce, 0x59, 0xb2, 0xdc, 0xfc, 0xce, - 0x88, 0xa4, 0xe5, 0x5f, 0x62, 0x5d, 0x58, 0x73, 0xdd, 0x40, 0xed, 0x42, 0xc7, 0x75, 0x03, 0x0b, - 0xa1, 0x6c, 0xf0, 0xd7, 0x7a, 0xdb, 0x2d, 0xaf, 0x89, 0x38, 0xca, 0x4c, 0xec, 0x22, 0xd4, 0x66, - 0xa8, 0xea, 0xe0, 0x27, 0xc8, 0xda, 0xfe, 0x27, 0x7f, 0xec, 0xfe, 0xe7, 0x27, 0xa0, 0x34, 0xdf, - 0x76, 0x35, 0xfb, 0xc8, 0xcc, 0xe8, 0x94, 0x9b, 0x31, 0x12, 0xb7, 0x8c, 0xae, 0x88, 0x3e, 0x3a, - 0xd7, 0x6c, 0xbb, 0xfd, 0x56, 0x51, 0xc2, 0x52, 0xdb, 0xc0, 0x8c, 0x3c, 0xc9, 0x06, 0xe6, 0x4d, - 0x28, 0x6d, 0x84, 0x74, 0xbd, 0xd7, 0xe9, 0xd0, 0x16, 0xda, 0x4a, 0x45, 0xae, 0xcf, 0x7a, 0x21, + // 12476 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0xbd, 0x7d, 0x6c, 0x24, 0xc9, + 0x75, 0x18, 0xbe, 0x3d, 0x33, 0x24, 0x67, 0x1e, 0x87, 0xe4, 0xb0, 0xf6, 0x8b, 0xbb, 0xb7, 0x77, + 0xb3, 0xea, 0xbb, 0xdb, 0xdb, 0x5b, 0xdd, 0x2d, 0xb5, 0x5c, 0xdd, 0xc9, 0xa7, 0xfb, 0x9c, 0x21, + 0xb9, 0xbb, 0xbc, 0xe5, 0x92, 0xbc, 0x1e, 0x7e, 0x48, 0x96, 0xe4, 0x76, 0x73, 0xba, 0x48, 0xf6, + 0x71, 0x66, 0x7a, 0xd4, 0xdd, 0xb3, 0xbb, 0xb4, 0x7f, 0x86, 0x6d, 0xfc, 0xa0, 0x18, 0x86, 0x61, + 0xc9, 0x0a, 0xe4, 0xd8, 0x0e, 0x1c, 0xd8, 0x31, 0xe2, 0x24, 0x4e, 0x20, 0x23, 0x70, 0x02, 0x24, + 0x41, 0x02, 0x07, 0x06, 0x02, 0x43, 0x08, 0x12, 0xc4, 0xff, 0x04, 0x81, 0x9d, 0x80, 0x89, 0x25, + 0xff, 0x45, 0x20, 0x40, 0x00, 0x03, 0x01, 0xac, 0xc4, 0x40, 0x50, 0xaf, 0xaa, 0xba, 0xab, 0x7a, + 0x7a, 0xc8, 0xe1, 0xdd, 0x1e, 0xa2, 0xbd, 0xbf, 0xc8, 0x79, 0xf5, 0xde, 0xeb, 0xfa, 0x78, 0xf5, + 0xea, 0xd5, 0xab, 0x57, 0xaf, 0x60, 0x3c, 0x3a, 0xe8, 0xd2, 0xf0, 0x66, 0x37, 0xf0, 0x23, 0x9f, + 0x8c, 0xe0, 0x8f, 0xcb, 0xe7, 0x76, 0xfd, 0x5d, 0x1f, 0x21, 0xb3, 0xec, 0x3f, 0x5e, 0x78, 0xb9, + 0xba, 0xeb, 0xfb, 0xbb, 0x2d, 0x3a, 0x8b, 0xbf, 0xb6, 0x7b, 0x3b, 0xb3, 0x91, 0xd7, 0xa6, 0x61, + 0xe4, 0xb4, 0xbb, 0x02, 0x61, 0x7e, 0xd7, 0x8b, 0xf6, 0x7a, 0xdb, 0x37, 0x9b, 0x7e, 0x7b, 0x76, + 0x37, 0x70, 0x1e, 0x7a, 0x91, 0x13, 0x79, 0x7e, 0xc7, 0x69, 0xcd, 0x46, 0xb4, 0x45, 0xbb, 0x7e, + 0x10, 0xcd, 0x3a, 0x5d, 0x6f, 0x16, 0xbf, 0x31, 0xfb, 0x28, 0x70, 0xba, 0x5d, 0x1a, 0x24, 0xff, + 0x70, 0x26, 0xe6, 0xdf, 0xcd, 0x43, 0xe9, 0x3e, 0xa5, 0xdd, 0x5a, 0xcb, 0x7b, 0x48, 0xc9, 0xf3, + 0x50, 0x58, 0x71, 0xda, 0x74, 0xc6, 0xb8, 0x6a, 0x5c, 0x2f, 0xd5, 0xa7, 0x8e, 0x0e, 0xab, 0xe3, + 0x21, 0x0d, 0x1e, 0xd2, 0xc0, 0xee, 0x38, 0x6d, 0x6a, 0x61, 0x21, 0xf9, 0x2c, 0x94, 0xd8, 0xdf, + 0xb0, 0xeb, 0x34, 0xe9, 0x4c, 0x0e, 0x31, 0x27, 0x8e, 0x0e, 0xab, 0xa5, 0x8e, 0x04, 0x5a, 0x49, + 0x39, 0xb9, 0x06, 0x63, 0xcb, 0xd4, 0x09, 0xe9, 0xd2, 0xc2, 0x4c, 0xfe, 0xaa, 0x71, 0x3d, 0x5f, + 0x2f, 0x1f, 0x1d, 0x56, 0x8b, 0x2d, 0x06, 0xb2, 0x3d, 0xd7, 0x92, 0x85, 0x64, 0x09, 0xc6, 0x16, + 0x1f, 0x77, 0xbd, 0x80, 0x86, 0x33, 0x85, 0xab, 0xc6, 0xf5, 0xf1, 0xb9, 0xcb, 0x37, 0x79, 0xfb, + 0x6f, 0xca, 0xf6, 0xdf, 0x5c, 0x97, 0xed, 0xaf, 0x9f, 0xfd, 0xde, 0x61, 0xf5, 0xcc, 0xd1, 0x61, + 0x75, 0x8c, 0x72, 0x92, 0x5f, 0xf9, 0x6f, 0x55, 0xc3, 0x92, 0xf4, 0xe4, 0x2d, 0x28, 0xac, 0x1f, + 0x74, 0xe9, 0x4c, 0xe9, 0xaa, 0x71, 0x7d, 0x72, 0xee, 0xb9, 0x9b, 0xbc, 0xc7, 0xe3, 0x46, 0x26, + 0xff, 0x31, 0xac, 0x7a, 0xf1, 0xe8, 0xb0, 0x5a, 0x60, 0x28, 0x16, 0x52, 0x91, 0x57, 0x61, 0xf4, + 0x9e, 0x1f, 0x46, 0x4b, 0x0b, 0x33, 0x80, 0x4d, 0x3b, 0x7f, 0x74, 0x58, 0x9d, 0xde, 0xf3, 0xc3, + 0xc8, 0xf6, 0xdc, 0x57, 0xfc, 0xb6, 0x17, 0xd1, 0x76, 0x37, 0x3a, 0xb0, 0x04, 0x92, 0xb9, 0x0d, + 0x13, 0x1a, 0x3f, 0x32, 0x0e, 0x63, 0x1b, 0x2b, 0xf7, 0x57, 0x56, 0xb7, 0x56, 0x2a, 0x67, 0x48, + 0x11, 0x0a, 0x2b, 0xab, 0x0b, 0x8b, 0x15, 0x83, 0x8c, 0x41, 0xbe, 0xb6, 0xb6, 0x56, 0xc9, 0x91, + 0x32, 0x14, 0x17, 0x6a, 0xeb, 0xb5, 0x7a, 0xad, 0xb1, 0x58, 0xc9, 0x93, 0xb3, 0x30, 0xb5, 0xb5, + 0xb4, 0xb2, 0xb0, 0xba, 0xd5, 0xb0, 0x17, 0x16, 0x1b, 0xf7, 0xd7, 0x57, 0xd7, 0x2a, 0x05, 0x32, + 0x09, 0x70, 0x7f, 0xa3, 0xbe, 0x68, 0xad, 0x2c, 0xae, 0x2f, 0x36, 0x2a, 0x23, 0xe6, 0x2f, 0xe4, + 0xa1, 0xf8, 0x80, 0x46, 0x8e, 0xeb, 0x44, 0x0e, 0xb9, 0xa2, 0x0d, 0x11, 0xd6, 0x5e, 0x19, 0x9b, + 0xe7, 0xfb, 0xc7, 0x66, 0xe4, 0xe8, 0xb0, 0x6a, 0xbc, 0xaa, 0x8e, 0xc9, 0x9b, 0x30, 0xbe, 0x40, + 0xc3, 0x66, 0xe0, 0x75, 0x99, 0xbc, 0xe0, 0xb8, 0x94, 0xea, 0x97, 0x8e, 0x0e, 0xab, 0xe7, 0xdd, + 0x04, 0xac, 0xb4, 0x55, 0xc5, 0x26, 0x4b, 0x30, 0xba, 0xec, 0x6c, 0xd3, 0x56, 0x38, 0x33, 0x72, + 0x35, 0x7f, 0x7d, 0x7c, 0xee, 0x19, 0xd1, 0xbf, 0xb2, 0x82, 0x37, 0x79, 0xe9, 0x62, 0x27, 0x0a, + 0x0e, 0xea, 0xe7, 0x8e, 0x0e, 0xab, 0x95, 0x16, 0x02, 0xd4, 0xbe, 0xe3, 0x28, 0xa4, 0x91, 0x8c, + 0xf9, 0xe8, 0x89, 0x63, 0xfe, 0xec, 0xf7, 0x0e, 0xab, 0x06, 0x1b, 0x0b, 0x31, 0xe6, 0x09, 0x3f, + 0x7d, 0xf4, 0xaf, 0x42, 0x6e, 0x69, 0x61, 0x66, 0x0c, 0x65, 0xad, 0x72, 0x74, 0x58, 0x2d, 0x6b, + 0xc3, 0x96, 0x5b, 0x5a, 0xb8, 0xfc, 0x06, 0x8c, 0x2b, 0x75, 0x24, 0x15, 0xc8, 0xef, 0xd3, 0x03, + 0xde, 0x9f, 0x16, 0xfb, 0x97, 0x9c, 0x83, 0x91, 0x87, 0x4e, 0xab, 0x27, 0x3a, 0xd0, 0xe2, 0x3f, + 0xbe, 0x98, 0xfb, 0x31, 0xc3, 0xfc, 0x9b, 0x05, 0x28, 0x5a, 0x3e, 0x9f, 0x67, 0xe4, 0x65, 0x18, + 0x69, 0x44, 0x4e, 0x24, 0x87, 0xe2, 0xec, 0xd1, 0x61, 0x75, 0x2a, 0x64, 0x00, 0xe5, 0x7b, 0x1c, + 0x83, 0xa1, 0xae, 0xed, 0x39, 0xa1, 0x1c, 0x12, 0x44, 0xed, 0x32, 0x80, 0x8a, 0x8a, 0x18, 0xe4, + 0x1a, 0x14, 0x1e, 0xf8, 0x2e, 0x15, 0xa3, 0x42, 0x8e, 0x0e, 0xab, 0x93, 0x6d, 0xdf, 0x55, 0x11, + 0xb1, 0x9c, 0xbc, 0x02, 0xa5, 0xf9, 0x5e, 0x10, 0xd0, 0x0e, 0x13, 0xd5, 0x02, 0x22, 0x4f, 0x1e, + 0x1d, 0x56, 0xa1, 0xc9, 0x81, 0x6c, 0x72, 0x25, 0x08, 0xac, 0xab, 0x1b, 0x91, 0x13, 0x44, 0xd4, + 0x9d, 0x19, 0x19, 0xaa, 0xab, 0xd9, 0xf4, 0x9a, 0x0e, 0x39, 0x49, 0xba, 0xab, 0x05, 0x27, 0x72, + 0x0f, 0xc6, 0xef, 0x06, 0x4e, 0x93, 0xae, 0xd1, 0xc0, 0xf3, 0x5d, 0x1c, 0xc3, 0x7c, 0xfd, 0xda, + 0xd1, 0x61, 0xf5, 0xc2, 0x2e, 0x03, 0xdb, 0x5d, 0x84, 0x27, 0xd4, 0x3f, 0x3c, 0xac, 0x16, 0x17, + 0x7a, 0x01, 0xf6, 0x9e, 0xa5, 0x92, 0x92, 0x9f, 0x64, 0x43, 0x12, 0x46, 0xd8, 0xb5, 0xd4, 0xc5, + 0xd1, 0x3b, 0xbe, 0x8a, 0xa6, 0xa8, 0xe2, 0x85, 0x96, 0x13, 0x46, 0x76, 0xc0, 0xe9, 0x52, 0xf5, + 0x54, 0x59, 0x92, 0x55, 0x28, 0x36, 0x9a, 0x7b, 0xd4, 0xed, 0xb5, 0xe8, 0x4c, 0x11, 0xd9, 0x5f, + 0x14, 0x82, 0x2b, 0xc7, 0x53, 0x16, 0xd7, 0x2f, 0x0b, 0xde, 0x24, 0x14, 0x10, 0xa5, 0xef, 0x63, + 0x26, 0x5f, 0x2c, 0xfe, 0xfa, 0x6f, 0x57, 0xcf, 0xfc, 0xdc, 0x7f, 0xbd, 0x7a, 0xc6, 0xfc, 0xe7, + 0x39, 0xa8, 0xa4, 0x99, 0x90, 0x1d, 0x98, 0xd8, 0xe8, 0xba, 0x4e, 0x44, 0xe7, 0x5b, 0x1e, 0xed, + 0x44, 0x21, 0x0a, 0xc9, 0xf1, 0x6d, 0x7a, 0x41, 0x7c, 0x77, 0xa6, 0x87, 0x84, 0x76, 0x93, 0x53, + 0xa6, 0x5a, 0xa5, 0xb3, 0x4d, 0xbe, 0xd3, 0x40, 0x3d, 0x1d, 0xa2, 0x84, 0x9d, 0xee, 0x3b, 0x5c, + 0xc3, 0x0f, 0xf8, 0x8e, 0x60, 0x2b, 0x04, 0xa8, 0xe3, 0x6e, 0x1f, 0xa0, 0x64, 0x0e, 0x2f, 0x40, + 0x8c, 0x24, 0x43, 0x80, 0x18, 0xd8, 0xfc, 0x0b, 0x03, 0x26, 0x2d, 0x1a, 0xfa, 0xbd, 0xa0, 0x49, + 0xef, 0x51, 0xc7, 0xa5, 0x01, 0x13, 0xff, 0xfb, 0x5e, 0xc7, 0x15, 0x73, 0x0a, 0xc5, 0x7f, 0xdf, + 0xeb, 0xa8, 0x53, 0x18, 0xcb, 0xc9, 0xe7, 0x60, 0xac, 0xd1, 0xdb, 0x46, 0x54, 0x3e, 0xa7, 0x2e, + 0xe0, 0x88, 0xf5, 0xb6, 0xed, 0x14, 0xba, 0x44, 0x23, 0xb3, 0x30, 0xb6, 0x49, 0x83, 0x30, 0xd1, + 0x78, 0xa8, 0xd9, 0x1f, 0x72, 0x90, 0x4a, 0x20, 0xb0, 0xc8, 0xdd, 0x44, 0xeb, 0x8a, 0x35, 0x69, + 0x2a, 0xa5, 0xeb, 0x12, 0x51, 0x69, 0x0b, 0x88, 0x2a, 0x2a, 0x12, 0xcb, 0xfc, 0x76, 0x0e, 0x2a, + 0x0b, 0x4e, 0xe4, 0x6c, 0x3b, 0xa1, 0xe8, 0xcf, 0xcd, 0xdb, 0x4c, 0x8f, 0x2b, 0x0d, 0x45, 0x3d, + 0xce, 0x6a, 0xfe, 0x91, 0x9b, 0xf7, 0x62, 0xba, 0x79, 0xe3, 0x6c, 0x81, 0x14, 0xcd, 0x4b, 0x1a, + 0xf5, 0xf6, 0xc9, 0x8d, 0xaa, 0x88, 0x46, 0x15, 0x65, 0xa3, 0x92, 0xa6, 0x90, 0xb7, 0xa1, 0xd0, + 0xe8, 0xd2, 0xa6, 0x50, 0x22, 0x52, 0xf7, 0xeb, 0x8d, 0x63, 0x08, 0x9b, 0xb7, 0xeb, 0x65, 0xc1, + 0xa6, 0x10, 0x76, 0x69, 0xd3, 0x42, 0x32, 0x65, 0xd2, 0x7c, 0x67, 0x14, 0xce, 0x65, 0x91, 0x91, + 0xb7, 0xf5, 0xc5, 0x89, 0x77, 0xcf, 0x33, 0x03, 0x17, 0xa7, 0x19, 0x43, 0x5f, 0x9e, 0x6e, 0x40, + 0x71, 0x8d, 0x09, 0x64, 0xd3, 0x6f, 0x89, 0x9e, 0x63, 0x5a, 0xb1, 0xd8, 0x95, 0x30, 0xc3, 0x8a, + 0xcb, 0xc9, 0x33, 0x90, 0xdf, 0xb0, 0x96, 0x44, 0x77, 0x95, 0x8e, 0x0e, 0xab, 0xf9, 0x5e, 0xe0, + 0xcd, 0x18, 0x16, 0x83, 0x92, 0x59, 0x18, 0x9d, 0xaf, 0xcd, 0xd3, 0x20, 0xc2, 0x6e, 0x2a, 0xd7, + 0x2f, 0x32, 0x69, 0x69, 0x3a, 0x76, 0x93, 0x06, 0x91, 0xf6, 0x79, 0x81, 0x46, 0x3e, 0x0b, 0xf9, + 0xda, 0x56, 0x43, 0xf4, 0x0c, 0x88, 0x9e, 0xa9, 0x6d, 0x35, 0xea, 0x13, 0xa2, 0x23, 0xf2, 0xce, + 0xa3, 0x90, 0x71, 0xaf, 0x6d, 0x35, 0xd4, 0xd1, 0x1a, 0x3d, 0x66, 0xb4, 0xae, 0x43, 0x91, 0xd9, + 0x19, 0x6c, 0x81, 0x47, 0xa5, 0x58, 0xe2, 0xe6, 0xd3, 0x9e, 0x80, 0x59, 0x71, 0x29, 0x79, 0x3e, + 0x36, 0x5b, 0x8a, 0x09, 0x3f, 0x61, 0xb6, 0x48, 0x63, 0x85, 0x3c, 0x86, 0x89, 0x85, 0x83, 0x8e, + 0xd3, 0xf6, 0x9a, 0x62, 0x09, 0x2f, 0xe1, 0x12, 0x7e, 0xf3, 0x98, 0x61, 0xbc, 0xa9, 0x11, 0xf0, + 0x55, 0x5d, 0x2a, 0xdf, 0x19, 0x97, 0x97, 0xd9, 0xe9, 0x15, 0x7e, 0xc6, 0xb0, 0xf4, 0x0f, 0xb1, + 0xb9, 0x24, 0x55, 0x24, 0xda, 0x55, 0x89, 0xd8, 0x49, 0x70, 0x32, 0x97, 0x02, 0x01, 0x51, 0xe7, + 0x52, 0xbc, 0xe8, 0xbe, 0x0d, 0xf9, 0xbb, 0xf3, 0x6b, 0x33, 0xe3, 0xc8, 0x83, 0x08, 0x1e, 0x77, + 0xe7, 0xd7, 0xe6, 0x5b, 0x7e, 0xcf, 0x6d, 0x7c, 0xb0, 0x5c, 0xbf, 0x28, 0xd8, 0x4c, 0xec, 0x36, + 0xbb, 0x5a, 0x8d, 0x18, 0x1d, 0x59, 0x84, 0xa2, 0x6c, 0xe5, 0x4c, 0x19, 0x79, 0x4c, 0xa7, 0x1a, + 0xbf, 0x79, 0x9b, 0xcf, 0x35, 0x57, 0xfc, 0x56, 0x6b, 0x21, 0x71, 0x2e, 0x6f, 0x01, 0xe9, 0xef, + 0x97, 0x0c, 0x4b, 0xe2, 0xb3, 0xaa, 0x25, 0x31, 0x3e, 0x77, 0x5e, 0x7c, 0x6b, 0xde, 0x6f, 0xb7, + 0x9d, 0x8e, 0x8b, 0xb4, 0x9b, 0x73, 0xaa, 0x81, 0x51, 0x83, 0xc9, 0xa4, 0x22, 0xcb, 0x5e, 0x18, + 0x91, 0x59, 0x28, 0x49, 0x08, 0x5b, 0x44, 0xf2, 0x99, 0x55, 0xb6, 0x12, 0x1c, 0xf3, 0x8f, 0x73, + 0x00, 0x49, 0xc9, 0x53, 0xaa, 0x67, 0xbe, 0xa0, 0xe9, 0x99, 0xf3, 0x69, 0x01, 0x1d, 0xa8, 0x61, + 0xc8, 0xbb, 0x30, 0xca, 0x4c, 0xae, 0x9e, 0x34, 0x29, 0x2f, 0xa6, 0x49, 0xb1, 0x70, 0xf3, 0x76, + 0x7d, 0x52, 0x10, 0x8f, 0x86, 0x08, 0xb1, 0x04, 0x99, 0xa2, 0xa2, 0xfe, 0x60, 0x24, 0x19, 0x0c, + 0xa1, 0x9c, 0xae, 0x2b, 0xda, 0xc5, 0x48, 0xe6, 0xa3, 0xd4, 0x2e, 0x8a, 0x6e, 0xb9, 0xc4, 0x75, + 0x0b, 0xef, 0xd4, 0x31, 0xa1, 0x5b, 0xd2, 0x9a, 0x85, 0x77, 0xe0, 0x89, 0x9a, 0xa5, 0x9b, 0x9e, + 0xb6, 0x05, 0x14, 0x83, 0xeb, 0x99, 0xbd, 0x92, 0x35, 0x61, 0xaf, 0x9e, 0x34, 0x61, 0xd3, 0xd3, + 0xf5, 0xf6, 0x20, 0x5d, 0x76, 0x5e, 0xce, 0x2e, 0xe7, 0x91, 0x4a, 0x8e, 0x3a, 0xed, 0x4d, 0x3e, + 0x35, 0x47, 0x07, 0x4e, 0xcd, 0xf3, 0x99, 0x53, 0x93, 0x4f, 0xcc, 0x37, 0x61, 0xa4, 0xf6, 0x53, + 0xbd, 0x80, 0x0a, 0xdb, 0xaf, 0x2c, 0xbf, 0xc9, 0x60, 0xf1, 0x9c, 0x9e, 0x72, 0xd8, 0x4f, 0xd5, + 0x66, 0xc6, 0x72, 0xf6, 0xe5, 0xf5, 0xe5, 0x86, 0xb0, 0xeb, 0x48, 0xaa, 0x5b, 0xd6, 0x97, 0x95, + 0x6a, 0x47, 0x5a, 0xab, 0x19, 0x15, 0x99, 0x85, 0x5c, 0x6d, 0x01, 0x37, 0x8b, 0xe3, 0x73, 0x25, + 0xf9, 0xd9, 0x85, 0xfa, 0x39, 0x41, 0x52, 0x76, 0xb4, 0xfd, 0x43, 0x6d, 0x81, 0xd4, 0x61, 0xe4, + 0xc1, 0x41, 0xe3, 0x83, 0x65, 0xa1, 0xc8, 0xce, 0x4a, 0xb9, 0x66, 0xb0, 0x55, 0x5c, 0x85, 0xc2, + 0xa4, 0xc6, 0xed, 0x83, 0xf0, 0xeb, 0x2d, 0xb5, 0xc6, 0x88, 0xf6, 0xc9, 0x29, 0x90, 0x7f, 0x62, + 0x28, 0xb6, 0x86, 0x90, 0x75, 0xb6, 0xa7, 0x15, 0x12, 0x67, 0x24, 0x96, 0x4f, 0x9f, 0xc4, 0xc5, + 0xf2, 0xf6, 0x32, 0x1f, 0xfd, 0x5c, 0xdf, 0xe8, 0x8f, 0x2b, 0x2b, 0x19, 0x1f, 0xf3, 0xb8, 0x2f, + 0xf2, 0x1f, 0xb9, 0x2f, 0xcc, 0x3f, 0xcc, 0xe1, 0xf7, 0xc8, 0x2b, 0x30, 0x6a, 0xd1, 0xdd, 0x64, + 0xd1, 0xc7, 0xcd, 0x63, 0x80, 0x10, 0xb5, 0x92, 0x1c, 0x07, 0x57, 0x14, 0xea, 0x86, 0x7b, 0xde, + 0x4e, 0x24, 0x6a, 0x1a, 0xaf, 0x28, 0x02, 0xac, 0xac, 0x28, 0x02, 0xa2, 0xad, 0x28, 0x02, 0xc6, + 0x64, 0xdd, 0x5a, 0x68, 0x88, 0x06, 0xc8, 0xd6, 0x5a, 0x0b, 0x8a, 0xd0, 0x04, 0xae, 0x26, 0x34, + 0xd6, 0x42, 0x83, 0xbc, 0x0e, 0xa5, 0x5a, 0xb3, 0xe9, 0xf7, 0x94, 0xdd, 0xd7, 0xcc, 0xd1, 0x61, + 0xf5, 0x9c, 0xc3, 0x81, 0xba, 0xaf, 0x20, 0x41, 0x25, 0x0d, 0x18, 0x5f, 0x64, 0x5b, 0x16, 0x6f, + 0xde, 0x69, 0xee, 0x51, 0x31, 0xc1, 0xa4, 0xc4, 0x2a, 0x25, 0xb1, 0x09, 0x7d, 0x9e, 0x22, 0xb0, + 0xc9, 0x80, 0xea, 0x96, 0x5c, 0xc1, 0x35, 0xeb, 0x49, 0x57, 0xb0, 0x8a, 0xcd, 0xb7, 0x7a, 0x61, + 0x44, 0x83, 0xa5, 0x05, 0xd1, 0x8f, 0x58, 0xb1, 0x26, 0x07, 0xa6, 0x2a, 0x16, 0xa3, 0x9a, 0xff, + 0xc5, 0xc0, 0x6e, 0x20, 0x6f, 0x00, 0x2c, 0x75, 0x98, 0xd9, 0xde, 0xa4, 0x31, 0x03, 0x74, 0x0d, + 0x78, 0x02, 0xaa, 0x73, 0x50, 0x90, 0xf5, 0x4f, 0xe7, 0x86, 0xfe, 0x34, 0xfb, 0xa4, 0xdc, 0x04, + 0x08, 0x2f, 0x91, 0xf8, 0x64, 0x20, 0xa0, 0xa9, 0x4f, 0x26, 0xc8, 0xe4, 0x1a, 0x8c, 0x2d, 0xd5, + 0x1e, 0xd4, 0x7a, 0xd1, 0x1e, 0x0e, 0x42, 0x91, 0xab, 0x63, 0xcf, 0x69, 0xdb, 0x4e, 0x2f, 0xda, + 0xb3, 0x64, 0xa1, 0xf9, 0xef, 0x72, 0x5a, 0xbf, 0x13, 0x0b, 0x88, 0x45, 0xbb, 0x2d, 0xaf, 0x89, + 0x46, 0xc5, 0xdd, 0xc0, 0xef, 0x75, 0xe3, 0xd6, 0x9a, 0x47, 0x87, 0xd5, 0xe7, 0x82, 0xa4, 0xd4, + 0xde, 0x65, 0xc5, 0x7a, 0x1d, 0x32, 0xa8, 0xc9, 0x7b, 0x50, 0xde, 0x08, 0x69, 0x20, 0x7e, 0xb2, + 0x8d, 0x58, 0xfe, 0x7a, 0xa9, 0x7e, 0x05, 0x37, 0x5a, 0x21, 0x0d, 0x62, 0x36, 0xaa, 0x2c, 0x69, + 0x14, 0xc4, 0x85, 0x99, 0xf5, 0xc0, 0xe9, 0x84, 0x5e, 0xb4, 0xd8, 0x69, 0x06, 0x07, 0x38, 0x7d, + 0x16, 0x3b, 0xce, 0x76, 0x8b, 0xba, 0xd8, 0x2d, 0xc5, 0xfa, 0xf5, 0xa3, 0xc3, 0xea, 0x0b, 0x11, + 0xc7, 0xb1, 0x69, 0x8c, 0x64, 0x53, 0x8e, 0xa5, 0x70, 0x1e, 0xc8, 0x89, 0xbc, 0x0b, 0xe5, 0xc5, + 0x8e, 0xdb, 0xf5, 0xbd, 0x4e, 0x84, 0x6e, 0xb2, 0x42, 0x6c, 0x61, 0x5f, 0xa4, 0x02, 0x6e, 0x33, + 0x79, 0x54, 0xab, 0xa9, 0x12, 0x98, 0x3f, 0x67, 0xc0, 0xb8, 0xa2, 0xd6, 0xd9, 0xb8, 0xaf, 0x05, + 0xfe, 0x87, 0xb4, 0x19, 0xe9, 0x22, 0xd7, 0xe5, 0xc0, 0xd4, 0xb8, 0xc7, 0xa8, 0x29, 0x51, 0xcb, + 0x9d, 0x42, 0xd4, 0xcc, 0x59, 0xb1, 0x5a, 0xb0, 0xed, 0xa2, 0xe2, 0x0d, 0xc3, 0xed, 0x22, 0x33, + 0x87, 0xd5, 0xed, 0x22, 0x2b, 0x37, 0x7f, 0xcf, 0x60, 0x5a, 0x9e, 0xcc, 0x02, 0xdc, 0xa7, 0x07, + 0x91, 0xb3, 0x7d, 0xc7, 0x6b, 0x69, 0x5e, 0xce, 0x7d, 0x84, 0xda, 0x3b, 0x5e, 0x8b, 0x5a, 0x0a, + 0x0a, 0xb9, 0x0d, 0xc5, 0xfb, 0xc1, 0xf6, 0x6b, 0x88, 0x9e, 0x8b, 0x57, 0xeb, 0xb3, 0xfb, 0xc1, + 0xf6, 0x6b, 0x88, 0xac, 0x6a, 0x14, 0x89, 0x48, 0x4c, 0x18, 0x5d, 0xf0, 0xdb, 0x8e, 0x27, 0x2d, + 0x24, 0x60, 0x66, 0x86, 0x8b, 0x10, 0x4b, 0x94, 0x30, 0xfb, 0xa0, 0xb1, 0xb6, 0x22, 0x3a, 0x1f, + 0xed, 0x83, 0xb0, 0xdb, 0xb1, 0x18, 0xcc, 0xfc, 0xae, 0x01, 0xe3, 0xca, 0xe2, 0x45, 0x3e, 0x2f, + 0x3c, 0x42, 0x06, 0xfa, 0x33, 0x2f, 0xf4, 0x2f, 0x6f, 0xac, 0x94, 0x5b, 0x76, 0x6d, 0xdf, 0xa5, + 0xc2, 0x3f, 0x94, 0xe8, 0xfc, 0xdc, 0x30, 0x3a, 0xff, 0x0d, 0x00, 0x6e, 0xf6, 0x63, 0x77, 0x2a, + 0x93, 0x50, 0xf1, 0xff, 0xaa, 0x83, 0x91, 0x20, 0x9b, 0x16, 0x94, 0x55, 0x7d, 0x4f, 0xea, 0x30, + 0x21, 0x76, 0xb9, 0xc2, 0x4e, 0xe4, 0xfd, 0x8c, 0x33, 0x41, 0x70, 0xeb, 0xdf, 0x75, 0xeb, 0x24, + 0xe6, 0xcf, 0xe7, 0xa0, 0x28, 0x20, 0x73, 0x4f, 0xa9, 0x09, 0xfb, 0x9a, 0x66, 0xc2, 0xca, 0x95, + 0x51, 0xd9, 0x5b, 0xcd, 0x9d, 0xb0, 0x45, 0x7e, 0x03, 0xca, 0xb2, 0x0b, 0x70, 0x27, 0xf0, 0x32, + 0x8c, 0x49, 0x27, 0x0f, 0xdf, 0x07, 0x4c, 0x69, 0x3c, 0x37, 0xe7, 0x2c, 0x59, 0x6e, 0x7e, 0x7b, + 0x44, 0xd2, 0xf2, 0x2f, 0xb1, 0x2e, 0xac, 0xb9, 0x6e, 0xa0, 0x76, 0xa1, 0xe3, 0xba, 0x81, 0x85, + 0x50, 0x36, 0xf8, 0x6b, 0xbd, 0xed, 0x96, 0xd7, 0x44, 0x1c, 0x65, 0x26, 0x76, 0x11, 0x6a, 0x33, + 0x54, 0x75, 0xf0, 0x13, 0x64, 0x6d, 0x87, 0x9a, 0x3f, 0x76, 0x87, 0xfa, 0x13, 0x50, 0x9a, 0x6f, + 0xbb, 0x9a, 0x05, 0x6b, 0x66, 0x74, 0xca, 0xcd, 0x18, 0x89, 0xdb, 0xae, 0x57, 0x44, 0x1f, 0x9d, + 0x6b, 0xb6, 0xdd, 0x7e, 0xbb, 0x35, 0x61, 0xa9, 0x6d, 0x31, 0x47, 0x3e, 0xce, 0x16, 0xf3, 0x75, + 0x28, 0x6d, 0x84, 0x74, 0xbd, 0xd7, 0xe9, 0xd0, 0x16, 0x5a, 0xb3, 0x45, 0xae, 0xcf, 0x7a, 0x21, 0xb5, 0x23, 0x84, 0xaa, 0x15, 0x88, 0x51, 0x55, 0xb1, 0x1a, 0x3b, 0x46, 0xac, 0x3e, 0x0f, 0x85, - 0x5a, 0xb7, 0x2b, 0x77, 0x76, 0xf1, 0xe2, 0xdd, 0xed, 0xe2, 0x72, 0x3a, 0xe9, 0x74, 0xbb, 0xfa, - 0x3e, 0x0d, 0xb1, 0x09, 0x05, 0x72, 0xbf, 0xb7, 0x4d, 0x83, 0x0e, 0x8d, 0x68, 0x28, 0xd4, 0x7d, - 0x38, 0x03, 0xc8, 0x63, 0x46, 0x3a, 0xd0, 0xd3, 0x08, 0xb8, 0x2b, 0xbf, 0xb8, 0xdf, 0xdb, 0xa6, - 0xb6, 0x58, 0x37, 0xd4, 0xbe, 0xcb, 0x60, 0x78, 0xb9, 0x01, 0x93, 0x7a, 0xff, 0x3f, 0x05, 0x8b, - 0xe7, 0x83, 0x42, 0xb1, 0x58, 0x29, 0x99, 0xbf, 0x90, 0x83, 0xf1, 0x5a, 0xb7, 0xfb, 0x8c, 0xbb, - 0x57, 0x7e, 0x4c, 0x9b, 0xd5, 0x17, 0x92, 0xd1, 0x3b, 0x85, 0x67, 0xe5, 0x2f, 0x0d, 0x98, 0x4a, - 0x51, 0xa8, 0xb5, 0x37, 0x86, 0x74, 0x37, 0xe4, 0x86, 0x74, 0x37, 0xe4, 0x07, 0xbb, 0x1b, 0xd4, - 0x39, 0x53, 0x78, 0x92, 0x39, 0xf3, 0x0a, 0xe4, 0x6b, 0xdd, 0xae, 0xe8, 0x95, 0x72, 0xd2, 0x2b, - 0x9b, 0xb7, 0xf9, 0xe2, 0xe6, 0x74, 0xbb, 0x16, 0xc3, 0x30, 0x5f, 0x87, 0x12, 0x82, 0x51, 0xa3, - 0x5d, 0x15, 0x53, 0x81, 0xab, 0x33, 0x8d, 0x8c, 0x8b, 0xbd, 0xf9, 0xbf, 0x0c, 0x18, 0xc1, 0xdf, - 0xcf, 0xa8, 0xb8, 0xcc, 0x69, 0xe2, 0x52, 0x51, 0xc4, 0x65, 0x18, 0x41, 0xf9, 0x83, 0x3c, 0xf6, - 0x96, 0x10, 0x11, 0xb1, 0x61, 0x35, 0x32, 0x36, 0xac, 0x4f, 0xa0, 0xc0, 0xf7, 0xd3, 0x5b, 0xd7, - 0x3c, 0x0e, 0xc6, 0x8b, 0xe9, 0xaa, 0x3e, 0x95, 0x5d, 0xeb, 0x3d, 0x20, 0x4b, 0x9d, 0x90, 0x36, - 0x7b, 0x01, 0x6d, 0xec, 0x7b, 0xdd, 0x4d, 0x1a, 0x78, 0x3b, 0x07, 0xc2, 0xda, 0x44, 0x1d, 0xeb, - 0x89, 0x52, 0x3b, 0xdc, 0xf7, 0xba, 0xcc, 0x4c, 0xf0, 0x76, 0x0e, 0xac, 0x0c, 0x1a, 0xf2, 0x3e, - 0x8c, 0x59, 0xf4, 0x51, 0xe0, 0x45, 0x54, 0xf4, 0xed, 0x64, 0xbc, 0xb7, 0x40, 0x28, 0xb7, 0x77, - 0x02, 0xfe, 0x43, 0x1d, 0x7f, 0x51, 0xfe, 0xc9, 0xed, 0xef, 0xbe, 0x3b, 0x82, 0x73, 0xe1, 0x84, - 0x63, 0xc0, 0x63, 0xbc, 0x0f, 0xfa, 0x60, 0xe6, 0x4f, 0x33, 0x98, 0x9b, 0x50, 0x66, 0x5b, 0xca, - 0x94, 0x1b, 0xe2, 0x4a, 0x32, 0x96, 0x37, 0xd5, 0xe2, 0xe3, 0x4e, 0x00, 0x35, 0x3e, 0xc4, 0x4e, - 0x0b, 0x09, 0x3f, 0x59, 0x7c, 0x5e, 0x61, 0x9c, 0x21, 0x1e, 0xb1, 0xea, 0x68, 0xf2, 0xce, 0x3a, - 0xb5, 0x60, 0x8c, 0x3e, 0x99, 0x60, 0x8c, 0x7d, 0x1c, 0xc1, 0x48, 0x9f, 0xbd, 0x16, 0x4f, 0x73, - 0xf6, 0x7a, 0xf9, 0x7d, 0x98, 0xee, 0xeb, 0xe1, 0xd3, 0x9c, 0x5f, 0x7e, 0x72, 0x62, 0xf9, 0x33, - 0x71, 0xbf, 0x90, 0x39, 0xdc, 0xe2, 0x7a, 0x01, 0x6d, 0x46, 0xa8, 0x7a, 0x85, 0xb6, 0x0c, 0x04, - 0x2c, 0xb5, 0x07, 0x47, 0x18, 0x79, 0x0f, 0xc6, 0xf8, 0xf9, 0x4f, 0x38, 0x93, 0xc3, 0xb1, 0x9f, - 0x10, 0x5f, 0xe4, 0x50, 0x71, 0x08, 0xcf, 0x31, 0xd4, 0x5e, 0x15, 0x44, 0xe6, 0x5d, 0x18, 0x15, - 0xe7, 0x47, 0xc7, 0xcf, 0x8b, 0x2a, 0x8c, 0x6c, 0x26, 0x3d, 0x83, 0x3e, 0x7f, 0xde, 0x08, 0x8b, - 0xc3, 0xcd, 0x5f, 0x32, 0x60, 0x52, 0x6f, 0x25, 0xb9, 0x09, 0xa3, 0xe2, 0x80, 0xd3, 0xc0, 0x03, - 0x4e, 0xd6, 0x9a, 0x51, 0x7e, 0xb4, 0xa9, 0x1d, 0x68, 0x0a, 0x2c, 0xa6, 0xfa, 0x05, 0x07, 0x6c, - 0x8b, 0x50, 0xfd, 0x42, 0x48, 0x2d, 0x59, 0xc6, 0xb6, 0x71, 0x16, 0x0d, 0x7b, 0xad, 0x48, 0xdd, - 0xc6, 0x05, 0x08, 0xb1, 0x44, 0x89, 0x79, 0x68, 0x00, 0x34, 0x1a, 0xf7, 0xee, 0xd3, 0x83, 0x35, - 0xc7, 0x0b, 0x70, 0x2b, 0x8c, 0xb3, 0xf1, 0xbe, 0x18, 0xad, 0xb2, 0xd8, 0x0a, 0xf3, 0x99, 0xbb, - 0x4f, 0x0f, 0xb4, 0xad, 0xb0, 0x44, 0xc5, 0x29, 0x1f, 0x78, 0x0f, 0x9d, 0x88, 0x32, 0xc2, 0x1c, - 0x12, 0xf2, 0x29, 0xcf, 0xa1, 0x29, 0x4a, 0x05, 0x99, 0x7c, 0x1d, 0x26, 0x93, 0x5f, 0x18, 0x55, - 0x91, 0xc7, 0x7d, 0xa2, 0x94, 0x08, 0xbd, 0xb0, 0xfe, 0xc2, 0xd1, 0x61, 0xf5, 0xb2, 0xc2, 0xd5, - 0x66, 0x58, 0x0a, 0xeb, 0x14, 0x33, 0xf3, 0x77, 0x0c, 0x80, 0xf5, 0xe5, 0x86, 0x6c, 0xe0, 0x35, - 0x28, 0xc4, 0x5e, 0xaa, 0x32, 0xdf, 0x6f, 0xa7, 0x36, 0x94, 0x58, 0x4e, 0x5e, 0x84, 0x7c, 0xd2, - 0x92, 0xe9, 0xa3, 0xc3, 0xea, 0x84, 0xde, 0x02, 0x56, 0x4a, 0xee, 0xc2, 0xd8, 0x50, 0x75, 0x46, - 0xe9, 0xcc, 0xa8, 0xab, 0xa4, 0xc6, 0x51, 0xf8, 0x60, 0x6b, 0xfd, 0xd3, 0x3b, 0x0a, 0xdf, 0xce, - 0xc1, 0x14, 0xeb, 0xd7, 0x5a, 0x2f, 0xda, 0xf3, 0x03, 0x2f, 0x3a, 0x78, 0x66, 0x77, 0xc5, 0xef, - 0x68, 0x06, 0xd1, 0x65, 0xa9, 0xb6, 0xd4, 0xb6, 0x0d, 0xb5, 0x39, 0xfe, 0xb3, 0x31, 0x38, 0x9b, - 0x41, 0x45, 0x5e, 0x13, 0xa1, 0x45, 0x89, 0x1f, 0x0a, 0x43, 0x87, 0x7e, 0x74, 0x58, 0x2d, 0x4b, - 0xf4, 0xf5, 0x24, 0x94, 0x68, 0x0e, 0xc6, 0xc5, 0xd6, 0x67, 0x25, 0xb1, 0xa8, 0x31, 0x26, 0x45, - 0xfa, 0xd9, 0x50, 0x35, 0xa9, 0x48, 0xa4, 0x06, 0xe5, 0xf9, 0x3d, 0xda, 0xdc, 0xf7, 0x3a, 0xbb, - 0xf7, 0xe9, 0x01, 0xb7, 0x97, 0xca, 0xf5, 0xe7, 0xd9, 0x4e, 0xab, 0x29, 0xe0, 0x6c, 0x48, 0xf5, - 0x4d, 0x9c, 0x46, 0x42, 0xde, 0x83, 0xf1, 0x86, 0xb7, 0xdb, 0x91, 0x1c, 0x0a, 0xc8, 0xe1, 0xca, - 0xd1, 0x61, 0xf5, 0x42, 0xc8, 0xc1, 0xfd, 0x0c, 0x54, 0x02, 0xf2, 0x2a, 0x8c, 0x58, 0x7e, 0x8b, - 0xf2, 0x65, 0x58, 0x04, 0xab, 0x04, 0x0c, 0xa0, 0xba, 0x6e, 0x11, 0x83, 0xdc, 0x83, 0x31, 0xf6, - 0xcf, 0x03, 0xa7, 0x3b, 0x33, 0x8a, 0x7a, 0x9b, 0xc4, 0x06, 0x3e, 0x42, 0xbb, 0x5e, 0x67, 0x57, - 0xb5, 0xf1, 0x5b, 0xd4, 0x6e, 0x3b, 0x5d, 0x6d, 0x5d, 0xe4, 0x88, 0x64, 0x13, 0xc6, 0x13, 0x45, - 0x10, 0xce, 0x8c, 0x69, 0x07, 0x5d, 0x49, 0x49, 0xfd, 0x33, 0x82, 0xd9, 0xc5, 0xa8, 0x15, 0xa2, - 0x6c, 0x77, 0x19, 0xbe, 0xde, 0x18, 0x85, 0x91, 0xb6, 0x07, 0x29, 0x0e, 0xde, 0x83, 0x18, 0x27, - 0xee, 0x41, 0x5c, 0x00, 0xd1, 0x49, 0xb5, 0xd6, 0xae, 0x88, 0x2d, 0x7b, 0x75, 0xb0, 0x80, 0xdd, - 0x4c, 0x90, 0x71, 0x4e, 0x72, 0x6f, 0x97, 0xe8, 0x7f, 0xa7, 0xb5, 0xab, 0x79, 0xbb, 0x62, 0x54, - 0xd6, 0x0d, 0x89, 0xaa, 0x91, 0x3b, 0x70, 0xd9, 0x0d, 0x49, 0x49, 0xd2, 0x0d, 0x1f, 0x3d, 0x8a, - 0x06, 0x75, 0x83, 0xc2, 0x88, 0xac, 0x00, 0xd4, 0x9a, 0x91, 0xf7, 0x90, 0xa2, 0x48, 0x8c, 0x6b, - 0x1d, 0x31, 0x5f, 0xbb, 0x4f, 0x0f, 0x1a, 0x34, 0x8a, 0xc3, 0x36, 0xce, 0x3b, 0x88, 0x9a, 0x12, - 0x13, 0x4b, 0xe1, 0x40, 0xba, 0x70, 0xbe, 0xe6, 0xba, 0x1e, 0x8f, 0x37, 0x5c, 0x0f, 0x98, 0xfc, - 0xba, 0xc8, 0xba, 0x9c, 0xcd, 0xfa, 0x55, 0xc1, 0xfa, 0x33, 0x4e, 0x4c, 0x65, 0x47, 0x9c, 0x2c, - 0xfd, 0x99, 0x6c, 0xc6, 0xe6, 0x2a, 0x4c, 0xea, 0x5d, 0xaa, 0x47, 0xda, 0x95, 0xa1, 0x68, 0x35, - 0x6a, 0x76, 0xe3, 0x5e, 0xed, 0x56, 0xc5, 0x20, 0x15, 0x28, 0x8b, 0x5f, 0x73, 0xf6, 0xdc, 0x1b, - 0x6f, 0x56, 0x72, 0x1a, 0xe4, 0x8d, 0x5b, 0x73, 0x95, 0xbc, 0xf9, 0x07, 0x06, 0x14, 0x65, 0xfd, - 0xc8, 0x9b, 0x90, 0x6f, 0x34, 0xee, 0xa5, 0xce, 0x57, 0x93, 0xa5, 0x97, 0x2f, 0x32, 0x61, 0xb8, - 0xa7, 0x2e, 0x32, 0x8d, 0xc6, 0x3d, 0x46, 0xb7, 0xbe, 0xdc, 0x10, 0x46, 0x4b, 0x86, 0xb8, 0x4e, - 0x0f, 0x38, 0x74, 0x7a, 0x13, 0xf2, 0x1f, 0x6c, 0xad, 0x8b, 0xdd, 0x50, 0xc6, 0xf8, 0x22, 0xdd, - 0x47, 0x8f, 0xd4, 0xa5, 0x8f, 0x11, 0x98, 0x16, 0x8c, 0x2b, 0x53, 0x8b, 0x1b, 0x11, 0x6d, 0x3f, - 0x8e, 0x41, 0x13, 0x46, 0x04, 0x83, 0x58, 0xa2, 0x84, 0xd9, 0x3c, 0xcb, 0x7e, 0xd3, 0x69, 0x09, - 0x6b, 0x04, 0x6d, 0x9e, 0x16, 0x03, 0x58, 0x1c, 0x6e, 0xfe, 0xa1, 0x01, 0x95, 0xb5, 0xc0, 0x7f, - 0xe8, 0x31, 0x0d, 0xbc, 0xee, 0xef, 0xd3, 0xce, 0xe6, 0x2d, 0xf2, 0xba, 0x54, 0x02, 0xdc, 0x84, - 0xbb, 0xc8, 0xa8, 0x50, 0x09, 0xfc, 0xe8, 0xb0, 0x0a, 0x8d, 0x83, 0x30, 0xa2, 0x6d, 0x56, 0x2e, - 0x15, 0x81, 0x12, 0xca, 0x97, 0x1b, 0x3e, 0x3c, 0xe8, 0x84, 0x50, 0xbe, 0x2a, 0x8c, 0x60, 0x75, - 0x94, 0x08, 0x8d, 0x91, 0x88, 0x01, 0x2c, 0x0e, 0x57, 0x14, 0xf6, 0x77, 0x72, 0x7d, 0x6d, 0x98, - 0xfb, 0x54, 0x85, 0xd8, 0xe8, 0x8d, 0x1b, 0x6a, 0x11, 0xfb, 0x0a, 0x9c, 0x4b, 0x77, 0x09, 0xfa, - 0x45, 0x6a, 0x30, 0xa5, 0xc3, 0xa5, 0x8b, 0xe4, 0x62, 0xe6, 0xb7, 0x36, 0xe7, 0xac, 0x34, 0xbe, - 0xf9, 0x03, 0x03, 0x4a, 0xf8, 0xaf, 0xd5, 0x6b, 0x51, 0x66, 0xd9, 0xd4, 0xb6, 0x1a, 0xe2, 0x90, - 0x4b, 0x3d, 0x88, 0x72, 0x1e, 0x85, 0xb6, 0x38, 0x11, 0xd3, 0xf4, 0x48, 0x8c, 0x2c, 0x48, 0xf9, - 0x91, 0x5e, 0x28, 0x24, 0x34, 0x26, 0xe5, 0x67, 0x7f, 0x61, 0x8a, 0x54, 0x20, 0xb3, 0xf1, 0x63, - 0xbf, 0xfc, 0x96, 0x74, 0x0d, 0xe3, 0xf8, 0x21, 0x9d, 0xaf, 0x1d, 0x9d, 0x48, 0x34, 0xf2, 0x3a, - 0x8c, 0xb2, 0x4f, 0x5b, 0xf2, 0x60, 0x04, 0x77, 0x15, 0x58, 0xc7, 0x40, 0x3b, 0x61, 0xe4, 0x48, - 0xe6, 0x3f, 0xcb, 0xa5, 0x3b, 0x50, 0x58, 0x01, 0xa7, 0x9c, 0x1b, 0x6f, 0xc3, 0x48, 0xad, 0xd5, - 0xf2, 0x1f, 0x09, 0x2d, 0x21, 0xdd, 0x34, 0x71, 0xff, 0xf1, 0x15, 0xd6, 0x61, 0x28, 0xda, 0xd1, - 0x36, 0x03, 0x90, 0x79, 0x28, 0xd5, 0xb6, 0x1a, 0x4b, 0x4b, 0x0b, 0xeb, 0xeb, 0xcb, 0x22, 0x82, - 0xfa, 0x65, 0xd9, 0x3f, 0x9e, 0xe7, 0xda, 0x51, 0xd4, 0x1a, 0x10, 0x60, 0x99, 0xd0, 0x91, 0x77, - 0x01, 0x3e, 0xf0, 0xbd, 0xce, 0x03, 0x1a, 0xed, 0xf9, 0xae, 0x68, 0x3c, 0x33, 0x29, 0xc6, 0x3f, - 0xf2, 0xbd, 0x8e, 0xdd, 0x46, 0x30, 0xab, 0x7b, 0x82, 0x64, 0x29, 0xff, 0xb3, 0x9e, 0xae, 0xfb, - 0x11, 0xda, 0x30, 0x23, 0x49, 0x4f, 0x6f, 0xfb, 0x51, 0xfa, 0xdc, 0x46, 0xa2, 0x99, 0xbf, 0x9c, - 0x83, 0x49, 0xbe, 0x53, 0xe5, 0x02, 0xf3, 0xcc, 0x4e, 0xc6, 0xb7, 0xb5, 0xc9, 0x78, 0x49, 0x2e, - 0x0c, 0x4a, 0xd3, 0x86, 0x9a, 0x8a, 0x7b, 0x40, 0xfa, 0x69, 0x88, 0x25, 0xfd, 0x29, 0xc3, 0xcc, - 0xc2, 0x5b, 0xc9, 0x79, 0x74, 0x88, 0x44, 0x36, 0xaa, 0xc2, 0xd0, 0xd2, 0x78, 0x98, 0xbf, 0x94, - 0x83, 0x09, 0xc5, 0x9e, 0x7c, 0x66, 0x3b, 0xfe, 0x8b, 0x5a, 0xc7, 0xcb, 0x33, 0x08, 0xa5, 0x65, - 0x43, 0xf5, 0x7b, 0x0f, 0xa6, 0xfb, 0x48, 0xd2, 0x66, 0xb9, 0x31, 0x8c, 0x59, 0xfe, 0x5a, 0xff, - 0x81, 0x39, 0x8f, 0xb6, 0x8e, 0x0f, 0xcc, 0xd5, 0x13, 0xfa, 0x6f, 0xe7, 0xe0, 0x9c, 0xf8, 0x55, - 0xeb, 0xb9, 0x5e, 0x34, 0xef, 0x77, 0x76, 0xbc, 0xdd, 0x67, 0x76, 0x2c, 0x6a, 0xda, 0x58, 0x54, - 0xf5, 0xb1, 0x50, 0x1a, 0x38, 0x78, 0x48, 0xcc, 0x7f, 0x59, 0x84, 0x99, 0x41, 0x04, 0x6c, 0xdb, - 0xaf, 0xec, 0xaa, 0x70, 0xdb, 0x9f, 0xda, 0xb1, 0xf2, 0xfd, 0x54, 0x12, 0x20, 0x92, 0x1b, 0x22, - 0x40, 0x64, 0x19, 0x2a, 0xf8, 0xa9, 0x06, 0x0d, 0x59, 0x27, 0x84, 0x49, 0xa8, 0xe7, 0xd5, 0xa3, - 0xc3, 0xea, 0x15, 0x87, 0x95, 0xd9, 0xa1, 0x28, 0xb4, 0x7b, 0x81, 0xa7, 0xf0, 0xe8, 0xa3, 0x24, - 0xbf, 0x63, 0xc0, 0x24, 0x02, 0x17, 0x1f, 0xd2, 0x4e, 0x84, 0xcc, 0x0a, 0xe2, 0x90, 0x26, 0xbe, - 0x51, 0xd3, 0x88, 0x02, 0xaf, 0xb3, 0x8b, 0x8e, 0xa4, 0xb0, 0xbe, 0xcd, 0x7a, 0xe1, 0x4f, 0x0f, - 0xab, 0xef, 0x7c, 0x9c, 0x5b, 0x3a, 0x82, 0x55, 0xc8, 0x36, 0xf2, 0xbc, 0xa2, 0x14, 0x3f, 0x9b, - 0xaa, 0x66, 0xaa, 0x46, 0xe4, 0xc7, 0xe1, 0xe2, 0x62, 0xc7, 0xd9, 0x6e, 0xd1, 0x79, 0xbf, 0x13, - 0x79, 0x9d, 0x9e, 0xdf, 0x0b, 0xeb, 0x4e, 0x73, 0xbf, 0xd7, 0x0d, 0x85, 0xb3, 0x13, 0x5b, 0xde, - 0x8c, 0x0b, 0xed, 0x6d, 0x5e, 0xaa, 0xb0, 0x1c, 0xc4, 0x80, 0xdc, 0x83, 0x69, 0x5e, 0x54, 0xeb, - 0x45, 0x7e, 0xa3, 0xe9, 0xb4, 0xbc, 0xce, 0x2e, 0xfa, 0x40, 0x8b, 0xf5, 0xcb, 0x6c, 0x6f, 0xe9, - 0xf4, 0x22, 0xdf, 0x0e, 0x39, 0x5c, 0xe1, 0xd7, 0x4f, 0x44, 0x96, 0x60, 0xca, 0xa2, 0x8e, 0xfb, - 0xc0, 0x79, 0x3c, 0xef, 0x74, 0x9d, 0xa6, 0x17, 0x1d, 0xe0, 0xce, 0x2c, 0x5f, 0xaf, 0x1e, 0x1d, - 0x56, 0x9f, 0x0b, 0xa8, 0xe3, 0xda, 0x6d, 0xe7, 0xb1, 0xdd, 0x14, 0x85, 0x0a, 0xb3, 0x34, 0x5d, - 0xcc, 0xca, 0xeb, 0xc4, 0xac, 0x4a, 0x69, 0x56, 0x5e, 0x67, 0x30, 0xab, 0x84, 0x4e, 0xb2, 0x5a, - 0x77, 0x82, 0x5d, 0x1a, 0x71, 0x27, 0x21, 0x5c, 0x35, 0xae, 0x1b, 0x0a, 0xab, 0x08, 0xcb, 0x6c, - 0x74, 0x18, 0xa6, 0x59, 0x29, 0x74, 0x4c, 0xf2, 0xb6, 0x02, 0x2f, 0xa2, 0x6a, 0x0b, 0xc7, 0xb1, - 0x5a, 0xd8, 0xff, 0xe8, 0x26, 0x1d, 0xd4, 0xc4, 0x3e, 0xca, 0x84, 0x9b, 0xd2, 0xc8, 0x72, 0x1f, - 0xb7, 0xec, 0x56, 0xf6, 0x51, 0xc6, 0xdc, 0xd4, 0x76, 0x4e, 0x60, 0x3b, 0x15, 0x6e, 0x03, 0x1a, - 0xda, 0x47, 0x49, 0x56, 0x58, 0xa7, 0x45, 0xb4, 0xc3, 0x24, 0x5a, 0x38, 0x49, 0x27, 0xb1, 0x6a, - 0x2f, 0x89, 0x3d, 0x75, 0x25, 0x90, 0xc5, 0x76, 0x86, 0xcb, 0x34, 0x4d, 0xfc, 0x41, 0xa1, 0x38, - 0x52, 0x19, 0xb5, 0x2a, 0x5c, 0xe4, 0x23, 0x26, 0x38, 0xa8, 0x8b, 0xcd, 0xdf, 0xc8, 0xc1, 0x25, - 0xa9, 0x8e, 0x69, 0xf4, 0xc8, 0x0f, 0xf6, 0xbd, 0xce, 0xee, 0x33, 0xae, 0x55, 0xef, 0x68, 0x5a, - 0xf5, 0xa5, 0xd4, 0x0a, 0x97, 0x6a, 0xe5, 0x31, 0xaa, 0xf5, 0x4f, 0x46, 0xe0, 0xf9, 0x63, 0xa9, - 0xc8, 0x87, 0x6c, 0x15, 0xf4, 0x68, 0x27, 0x5a, 0x72, 0x5b, 0x94, 0x6d, 0xc3, 0xfc, 0x5e, 0x24, - 0x9c, 0xd9, 0x2f, 0x1e, 0x1d, 0x56, 0xcf, 0xf2, 0x8b, 0x26, 0xb6, 0xe7, 0xb6, 0xa8, 0x1d, 0xf1, - 0x62, 0x6d, 0x98, 0xfa, 0xa9, 0x19, 0xcb, 0xf8, 0xda, 0xdb, 0x52, 0x27, 0xa2, 0xc1, 0x43, 0x87, - 0xc7, 0xdb, 0x0b, 0x96, 0xfb, 0x94, 0x76, 0x6d, 0x87, 0x95, 0xda, 0x9e, 0x28, 0xd6, 0x59, 0xf6, - 0x51, 0x93, 0x3b, 0x0a, 0xcb, 0x79, 0xb6, 0x39, 0x78, 0xe0, 0x3c, 0x16, 0x16, 0x2f, 0xfa, 0x57, - 0x15, 0x96, 0x3c, 0xc6, 0xae, 0xed, 0x3c, 0xb6, 0xfa, 0x49, 0xc8, 0xd7, 0xe1, 0xbc, 0x50, 0xdc, - 0x4c, 0x89, 0x05, 0x7e, 0x4b, 0xb6, 0xb8, 0x80, 0xbc, 0x5e, 0x39, 0x3a, 0xac, 0x5e, 0x14, 0x6a, - 0xdf, 0x6e, 0x72, 0x8c, 0xcc, 0x56, 0x67, 0x73, 0x21, 0xeb, 0x6c, 0x21, 0x4b, 0x75, 0xc7, 0x03, - 0x1a, 0x86, 0xce, 0xae, 0xb4, 0x8e, 0xf9, 0x89, 0x92, 0xd2, 0x99, 0x76, 0x9b, 0x97, 0x5b, 0x03, - 0x29, 0xc9, 0x3d, 0x98, 0xdc, 0xa2, 0xdb, 0xea, 0xf8, 0x8c, 0xc6, 0x53, 0xbc, 0xf2, 0x88, 0x6e, - 0x0f, 0x1e, 0x9c, 0x14, 0x1d, 0xf1, 0x60, 0x7a, 0x2d, 0xf0, 0x1f, 0x1f, 0xb0, 0xad, 0x1e, 0xed, - 0xd0, 0x00, 0x83, 0xbb, 0xc6, 0xd0, 0x5d, 0x35, 0x93, 0x58, 0x96, 0x7a, 0x79, 0xfd, 0x33, 0x47, - 0x87, 0xd5, 0xe7, 0xbb, 0x0c, 0x6c, 0xb7, 0x04, 0xdc, 0x4e, 0xdd, 0x3a, 0xeb, 0xe7, 0x4a, 0x7e, - 0x12, 0xa6, 0x2c, 0xbf, 0x17, 0x79, 0x9d, 0xdd, 0x46, 0x14, 0x38, 0x11, 0xdd, 0xe5, 0x8a, 0x3c, - 0x89, 0x22, 0x4b, 0x95, 0x72, 0xc7, 0x74, 0xc0, 0x81, 0x76, 0x28, 0xa0, 0x9a, 0x26, 0xd5, 0x09, - 0xcc, 0x5f, 0xcb, 0xc1, 0x8c, 0x18, 0x06, 0x8b, 0x36, 0xfd, 0xc0, 0x7d, 0xf6, 0xa7, 0xfd, 0xa2, - 0x36, 0xed, 0x5f, 0x8c, 0x63, 0x94, 0xb2, 0x1a, 0x79, 0xcc, 0xac, 0xff, 0x7d, 0x03, 0xae, 0x1c, - 0x47, 0xc4, 0x7a, 0x27, 0x8e, 0xeb, 0x2b, 0xf5, 0xc5, 0xef, 0x75, 0xe1, 0x2c, 0x8e, 0x27, 0x3a, - 0x8e, 0xc3, 0x7b, 0x7e, 0x18, 0xa1, 0xf7, 0x2e, 0xa7, 0x05, 0x12, 0xd4, 0x7d, 0xbf, 0x85, 0x7a, - 0xbe, 0xfe, 0x1a, 0x53, 0xe7, 0x7f, 0x7a, 0x58, 0x05, 0x06, 0xe2, 0x91, 0x78, 0x6c, 0xcd, 0xe7, - 0x12, 0x83, 0x7e, 0xe9, 0xd0, 0xc6, 0xe8, 0x8f, 0x7d, 0x7a, 0x10, 0x5a, 0x59, 0xac, 0xd1, 0x43, - 0x53, 0xeb, 0x45, 0x7b, 0x6b, 0x01, 0xdd, 0xa1, 0x01, 0xed, 0x34, 0xe9, 0xa7, 0xcc, 0x43, 0xa3, - 0x37, 0x6e, 0xa8, 0xed, 0xc9, 0x5f, 0x8c, 0xc1, 0xb9, 0x2c, 0x32, 0xd6, 0x2f, 0x8a, 0x45, 0x9c, - 0xbe, 0xa2, 0xfc, 0xff, 0x1a, 0x50, 0x6e, 0xd0, 0xa6, 0xdf, 0x71, 0xef, 0x38, 0xcd, 0xc8, 0x97, - 0x21, 0x19, 0x36, 0xd7, 0x6c, 0x0c, 0x6e, 0xef, 0x60, 0x81, 0xe6, 0x19, 0xf8, 0xd2, 0x70, 0x86, - 0x68, 0xd3, 0xc7, 0x40, 0xd8, 0x88, 0xc9, 0x64, 0xf2, 0x09, 0x3c, 0xd5, 0xd0, 0x3e, 0x4a, 0xea, - 0x30, 0x31, 0xef, 0x77, 0x3a, 0x94, 0xfd, 0x50, 0xc2, 0x3a, 0x31, 0x10, 0xb3, 0x29, 0x0b, 0xd2, - 0x1e, 0x02, 0x9d, 0x84, 0xdc, 0x86, 0xfc, 0xc6, 0xdc, 0x1d, 0x31, 0x06, 0x32, 0x58, 0x6d, 0x63, - 0xee, 0x0e, 0xee, 0x75, 0x99, 0xfd, 0x30, 0xd1, 0x9b, 0xdb, 0x51, 0x7d, 0xa0, 0x1b, 0x73, 0x77, - 0xc8, 0x2a, 0x4c, 0x5b, 0xf4, 0x1b, 0x3d, 0x2f, 0xa0, 0x62, 0x02, 0x3c, 0xb8, 0x53, 0xc3, 0xb1, - 0x28, 0x72, 0x3d, 0x16, 0xf0, 0x42, 0x69, 0xdb, 0xdb, 0xed, 0x1d, 0xf5, 0x5a, 0x5e, 0x3f, 0x2d, - 0xf9, 0x59, 0x38, 0xbf, 0xe0, 0x85, 0xa2, 0xce, 0xdc, 0xf9, 0xe8, 0xe2, 0x39, 0xe4, 0xe8, 0x80, - 0xe9, 0xf0, 0x85, 0xcc, 0xe9, 0xf0, 0x19, 0x37, 0x66, 0x62, 0x73, 0xcf, 0xa6, 0x9b, 0x8e, 0x87, - 0xcd, 0xfe, 0x0e, 0xf9, 0x08, 0x26, 0xd1, 0xdb, 0x83, 0xfe, 0x58, 0x0c, 0x91, 0x1e, 0x1b, 0xf0, - 0xe5, 0xcf, 0x65, 0x7e, 0xf9, 0x32, 0x3a, 0x8f, 0x6c, 0xf4, 0xea, 0x62, 0x38, 0xb5, 0xb6, 0x47, - 0xd0, 0x38, 0x93, 0x0f, 0x60, 0x4a, 0x2c, 0x3a, 0xab, 0x3b, 0xeb, 0x7b, 0x74, 0xc1, 0x39, 0x10, - 0x41, 0x08, 0x68, 0xff, 0x89, 0x95, 0xca, 0xf6, 0x77, 0xec, 0x68, 0x8f, 0xda, 0xae, 0xa3, 0xa9, - 0xe7, 0x14, 0x21, 0xf9, 0x69, 0x18, 0x5f, 0xf6, 0xf1, 0xe0, 0x09, 0x55, 0x4d, 0x09, 0xf9, 0x7c, - 0x05, 0xaf, 0xe5, 0x72, 0x70, 0x6a, 0x11, 0xf9, 0xd1, 0x61, 0xf5, 0xed, 0xd3, 0x4a, 0xa1, 0xf2, - 0x01, 0x4b, 0xfd, 0x1a, 0x99, 0x87, 0xe2, 0x16, 0xdd, 0x66, 0xad, 0x4d, 0x5f, 0x29, 0x93, 0x60, - 0xae, 0x2f, 0x1e, 0x89, 0x5f, 0xea, 0xa9, 0x8e, 0xc4, 0x20, 0x01, 0x4c, 0x63, 0xff, 0xac, 0x39, - 0x61, 0xf8, 0xc8, 0x0f, 0xdc, 0x16, 0x0d, 0xe5, 0xf1, 0x48, 0x7f, 0xe7, 0xcf, 0x65, 0x76, 0xfe, - 0x15, 0xde, 0xf9, 0x5d, 0x85, 0x83, 0x2a, 0x6e, 0x7d, 0xec, 0xcd, 0x7f, 0x6e, 0xa0, 0xd4, 0x93, - 0x1b, 0x18, 0x7c, 0x16, 0x47, 0xb5, 0xe3, 0x6e, 0xd6, 0xe9, 0x76, 0xf5, 0xb8, 0x74, 0x8e, 0xc2, - 0xb6, 0xbe, 0x77, 0x9c, 0x26, 0x8d, 0xa4, 0x8f, 0x14, 0x91, 0x77, 0x10, 0xa2, 0x6e, 0x7d, 0x39, - 0x0e, 0xf9, 0x32, 0x9c, 0x5b, 0xa0, 0x0f, 0xbd, 0x26, 0xad, 0x45, 0x11, 0x0d, 0x79, 0x0f, 0xcf, - 0xd7, 0xf8, 0x61, 0x62, 0xa9, 0xfe, 0xd2, 0xd1, 0x61, 0xf5, 0xaa, 0x8b, 0xe5, 0xb6, 0x93, 0x20, - 0xd8, 0x4d, 0x47, 0xe5, 0x95, 0xc9, 0xc1, 0xfc, 0x1f, 0x46, 0xd2, 0xeb, 0xe4, 0x15, 0x28, 0x58, - 0x6b, 0x71, 0xfd, 0xf9, 0x39, 0x61, 0xaa, 0xfa, 0x88, 0x40, 0xbe, 0x0a, 0xe7, 0x15, 0x3e, 0xd8, - 0x23, 0xd4, 0x65, 0x15, 0xe2, 0x8d, 0x79, 0x19, 0x0f, 0x86, 0x94, 0x9a, 0x38, 0x1c, 0x23, 0x55, - 0xa3, 0x6c, 0x1e, 0xac, 0xb1, 0x4a, 0xc1, 0x02, 0xed, 0x78, 0x9c, 0xb7, 0xd2, 0x58, 0x95, 0xb7, - 0x8b, 0x08, 0xe9, 0xc6, 0x66, 0x71, 0xf8, 0xa0, 0x50, 0x2c, 0x54, 0x46, 0xcc, 0xbf, 0x34, 0x94, - 0x9c, 0x0a, 0xcf, 0xe8, 0x8a, 0xf5, 0xa6, 0xb6, 0x62, 0x9d, 0x13, 0xa4, 0x71, 0xab, 0x58, 0x59, - 0xa6, 0x95, 0x31, 0x05, 0x13, 0x1a, 0x12, 0x86, 0xd9, 0x6e, 0x84, 0x34, 0xe0, 0x3e, 0xc9, 0x4f, - 0x57, 0x98, 0x6d, 0xdc, 0xae, 0xa1, 0xa2, 0x27, 0xff, 0xcc, 0x80, 0xa9, 0x14, 0x05, 0xeb, 0x0d, - 0x06, 0x52, 0x7b, 0xa3, 0x17, 0xd2, 0xc0, 0x42, 0x28, 0x0f, 0xca, 0x5b, 0xd6, 0x83, 0xf2, 0x5a, - 0x16, 0x83, 0x91, 0x2f, 0xc1, 0xc8, 0x06, 0xee, 0x20, 0xf4, 0xb8, 0x8e, 0x98, 0x3f, 0x16, 0xf2, - 0x19, 0xd6, 0x63, 0xff, 0xaa, 0x0a, 0x02, 0xcb, 0x48, 0x03, 0xc6, 0xe6, 0x03, 0x8a, 0xd9, 0x13, - 0x0a, 0xc3, 0x1f, 0xc0, 0x35, 0x39, 0x49, 0xfa, 0x00, 0x4e, 0x70, 0x32, 0x7f, 0x35, 0x07, 0x24, - 0x69, 0x23, 0x6d, 0x06, 0x34, 0x0a, 0x9f, 0xd9, 0x41, 0x7f, 0x5f, 0x1b, 0xf4, 0xe7, 0xfb, 0x06, - 0x9d, 0x37, 0x6f, 0xa8, 0xb1, 0xff, 0x43, 0x03, 0x2e, 0x64, 0x13, 0x92, 0x17, 0x61, 0x74, 0x75, - 0x7d, 0x4d, 0x86, 0x06, 0x89, 0xa6, 0xf8, 0x5d, 0xb4, 0x8c, 0x2d, 0x51, 0x44, 0x5e, 0x87, 0xd1, - 0x0f, 0xad, 0x79, 0xb6, 0x64, 0x2a, 0xb7, 0x67, 0xbe, 0x11, 0xd8, 0x4d, 0x7d, 0xcb, 0x25, 0x90, - 0xd4, 0xb1, 0xcd, 0x3f, 0xb5, 0xb1, 0xfd, 0x76, 0x0e, 0xa6, 0x6a, 0xcd, 0x26, 0x0d, 0x43, 0x66, - 0x10, 0xd1, 0x30, 0x7a, 0x66, 0x07, 0x36, 0x3b, 0xe8, 0x47, 0x6b, 0xdb, 0x50, 0xa3, 0xfa, 0x47, - 0x06, 0x9c, 0x97, 0x54, 0x0f, 0x3d, 0xfa, 0x68, 0x7d, 0x2f, 0xa0, 0xe1, 0x9e, 0xdf, 0x72, 0x87, - 0xbd, 0x07, 0x86, 0xab, 0xb4, 0xd7, 0x8a, 0x68, 0xa0, 0x3a, 0xa8, 0x77, 0x10, 0xa2, 0xad, 0xd2, - 0x08, 0x21, 0xb3, 0x30, 0x56, 0xeb, 0x76, 0x03, 0xff, 0x21, 0x9f, 0xf6, 0x13, 0xe2, 0x3c, 0x92, - 0x83, 0xb4, 0xf3, 0x4b, 0x0e, 0x62, 0xd5, 0x58, 0xa0, 0x1d, 0x1e, 0xd1, 0x3c, 0xc1, 0xab, 0xe1, - 0xd2, 0x8e, 0x6a, 0xa1, 0x61, 0xb9, 0xf9, 0xad, 0x02, 0x94, 0xd5, 0x86, 0x10, 0x13, 0x46, 0x79, - 0x78, 0x8a, 0x1a, 0x26, 0xe0, 0x20, 0xc4, 0x12, 0x25, 0x49, 0xd4, 0x4f, 0xee, 0xc4, 0xa8, 0x9f, - 0x2d, 0x98, 0x58, 0x0b, 0xfc, 0xae, 0x1f, 0x52, 0x97, 0x27, 0xc0, 0xe1, 0x5a, 0xeb, 0x6c, 0x1c, - 0x0a, 0xcb, 0xfb, 0x9c, 0x15, 0xf1, 0xed, 0x40, 0x57, 0x60, 0xdb, 0xe9, 0xf4, 0x38, 0x3a, 0x1f, - 0xee, 0xe0, 0x77, 0x42, 0x71, 0x5d, 0x20, 0x76, 0xf0, 0x33, 0x88, 0xee, 0xe0, 0x67, 0x10, 0x75, - 0x5a, 0x8c, 0x3c, 0xad, 0x69, 0x41, 0x7e, 0xd5, 0x80, 0xf1, 0x5a, 0xa7, 0x23, 0xa2, 0x7e, 0xe4, - 0x2d, 0xf2, 0xf3, 0x89, 0x93, 0x9f, 0x87, 0x85, 0x72, 0x1f, 0xff, 0xd7, 0x84, 0x8f, 0xff, 0xed, - 0x8f, 0xe5, 0xe3, 0x5f, 0x0f, 0x1c, 0x2f, 0x0a, 0xf1, 0x30, 0x37, 0xf9, 0xa0, 0x1a, 0xfa, 0xab, - 0xd4, 0x83, 0xbc, 0x0d, 0x95, 0x58, 0x1e, 0x97, 0x3a, 0x2e, 0x7d, 0x4c, 0x79, 0x90, 0xd4, 0x04, - 0xbf, 0x61, 0xa8, 0x1d, 0x5e, 0xa4, 0x11, 0xcd, 0x6f, 0x1b, 0x70, 0x41, 0x15, 0x88, 0x46, 0x6f, - 0xbb, 0xed, 0xe1, 0xf6, 0x87, 0xdc, 0x84, 0x92, 0x18, 0xaf, 0xd8, 0x90, 0xeb, 0xcf, 0x9a, 0x94, - 0xa0, 0x90, 0x45, 0x36, 0x44, 0x8c, 0x87, 0xf0, 0x15, 0x9c, 0x4d, 0x4d, 0x37, 0x56, 0x54, 0x9f, - 0x11, 0x9d, 0x5d, 0x09, 0xf0, 0xb7, 0x3e, 0x76, 0x0c, 0x62, 0xbe, 0x07, 0xd3, 0x7a, 0x2d, 0x1b, - 0x14, 0xaf, 0xa0, 0xc9, 0xa6, 0x19, 0xd9, 0x4d, 0x93, 0xe5, 0xe6, 0x16, 0x90, 0x3e, 0xfa, 0x10, - 0x0f, 0xaa, 0x68, 0x24, 0x0f, 0x52, 0xa5, 0xbb, 0xab, 0x0f, 0x31, 0xce, 0x1f, 0x36, 0xae, 0x76, - 0x37, 0x92, 0x9a, 0x7f, 0x0e, 0x70, 0x36, 0x43, 0x75, 0x9c, 0xb0, 0xb4, 0x57, 0xf5, 0xc9, 0x53, - 0x8a, 0x23, 0x02, 0xe4, 0x94, 0x79, 0x4f, 0xe6, 0x8a, 0x3a, 0x66, 0xaa, 0x1c, 0x97, 0x40, 0xea, - 0x93, 0x58, 0xde, 0xd5, 0xa0, 0x9d, 0x91, 0xa7, 0x16, 0xb4, 0x53, 0x87, 0x09, 0xd1, 0x2a, 0x31, - 0x95, 0x47, 0x13, 0xb7, 0x40, 0xc0, 0x0b, 0xec, 0xbe, 0x29, 0xad, 0x93, 0x70, 0x1e, 0xa1, 0xdf, - 0x7a, 0x48, 0x05, 0x8f, 0x31, 0x95, 0x07, 0x16, 0x64, 0xf2, 0x50, 0x48, 0xc8, 0x3f, 0x34, 0x80, - 0x08, 0x88, 0x3a, 0x9f, 0x8b, 0xc7, 0xcd, 0x67, 0xf7, 0xe9, 0xcc, 0xe7, 0xe7, 0x65, 0x1d, 0xb3, - 0xe7, 0x75, 0x46, 0xb5, 0xc8, 0xdf, 0x37, 0x60, 0x9a, 0x47, 0x8e, 0xa8, 0x95, 0x2d, 0x1d, 0x57, - 0xd9, 0xe6, 0xd3, 0xa9, 0xec, 0x95, 0x10, 0x3f, 0x3b, 0xa0, 0xae, 0xfd, 0x95, 0x22, 0x3f, 0x0e, - 0x10, 0xcf, 0x28, 0x19, 0xa1, 0x78, 0x25, 0x43, 0x0b, 0xc4, 0x48, 0xc9, 0x25, 0xcb, 0x28, 0xa6, - 0x53, 0x63, 0x7a, 0x12, 0x6e, 0xe4, 0x67, 0xe1, 0x1c, 0x9b, 0x2f, 0x31, 0x44, 0xc4, 0xb9, 0xcd, - 0x8c, 0xe3, 0x57, 0x3e, 0x3f, 0x78, 0x69, 0xbf, 0x99, 0x45, 0xc6, 0xef, 0x89, 0x24, 0xd7, 0xf8, - 0xa3, 0xb6, 0xba, 0xe5, 0xcb, 0xa2, 0xc0, 0x80, 0x56, 0xac, 0x7d, 0x38, 0x53, 0xc6, 0x6f, 0x66, - 0xea, 0xb7, 0x4b, 0x72, 0x2e, 0x70, 0xfd, 0x16, 0xea, 0x17, 0x3d, 0x10, 0x44, 0x3e, 0x04, 0xd2, - 0xe8, 0xed, 0xee, 0xd2, 0x30, 0xa2, 0x2e, 0x87, 0xd1, 0x20, 0x9c, 0x99, 0x40, 0xfd, 0x80, 0x6e, - 0xaa, 0x50, 0x96, 0xda, 0x81, 0x2c, 0x56, 0x85, 0xa4, 0x9f, 0x98, 0x50, 0x38, 0x27, 0x1a, 0xcd, - 0xa0, 0xf2, 0x66, 0x7d, 0x38, 0x33, 0xa9, 0x45, 0x11, 0x26, 0x25, 0xf5, 0x17, 0x64, 0x96, 0x34, - 0xe5, 0x7a, 0xbe, 0xb6, 0xed, 0xcd, 0x62, 0x77, 0x79, 0x1b, 0x2e, 0x0d, 0xec, 0xcd, 0x8c, 0xbb, - 0x22, 0xb3, 0xfa, 0x5d, 0x91, 0x4b, 0x83, 0xb4, 0x6e, 0xa8, 0xde, 0x17, 0xf9, 0x2d, 0x23, 0xa5, - 0x66, 0x85, 0x4d, 0xc4, 0xb3, 0xf7, 0x0d, 0x5a, 0x87, 0x72, 0x98, 0x47, 0x80, 0x2b, 0xe2, 0x5c, - 0x62, 0x8b, 0x31, 0x45, 0xac, 0x2a, 0x72, 0x54, 0xc9, 0x4f, 0xa8, 0x71, 0xcd, 0x7f, 0x62, 0x00, - 0xe1, 0x35, 0x9c, 0x77, 0xba, 0xce, 0xb6, 0xd7, 0xf2, 0x22, 0x8f, 0x86, 0xe4, 0x3e, 0x54, 0x04, - 0x0b, 0x67, 0xbb, 0x45, 0xd5, 0x30, 0x30, 0x71, 0x4e, 0x1c, 0x97, 0xd9, 0x69, 0xeb, 0xa9, 0x8f, - 0x70, 0x80, 0x8c, 0xe4, 0x9e, 0x40, 0x46, 0xcc, 0x1f, 0x1a, 0x70, 0xa9, 0xbf, 0xda, 0xe2, 0xcb, - 0x71, 0xe7, 0x19, 0x27, 0x74, 0x5e, 0x56, 0x2b, 0x73, 0xe8, 0x61, 0x7d, 0x6a, 0xad, 0xcc, 0x27, - 0x0e, 0xdb, 0xd3, 0xb7, 0xf2, 0x91, 0x9a, 0x87, 0x82, 0xbc, 0x9e, 0x15, 0xd0, 0xc3, 0x6f, 0xdd, - 0x70, 0xb0, 0x1e, 0xcb, 0x23, 0x77, 0x39, 0xb9, 0xcc, 0x5d, 0x8e, 0xbc, 0x40, 0x94, 0xcf, 0xba, - 0x40, 0x64, 0xfe, 0x62, 0x0e, 0xca, 0x6b, 0xad, 0xde, 0xae, 0xd7, 0x59, 0x70, 0x22, 0xe7, 0x99, - 0xdd, 0x32, 0xbd, 0xa5, 0x6d, 0x99, 0xe2, 0x88, 0xb3, 0xb8, 0x61, 0xc3, 0xa5, 0x70, 0x33, 0x60, - 0x2a, 0x21, 0xe1, 0xea, 0xe1, 0x1e, 0x14, 0xd8, 0x0f, 0x61, 0x81, 0x5d, 0xed, 0x63, 0x8c, 0x58, - 0x37, 0xe3, 0xff, 0xc4, 0x26, 0x46, 0x4f, 0x9c, 0x87, 0x1c, 0x2e, 0x7f, 0x81, 0xe7, 0xbd, 0x3a, - 0x7d, 0x8e, 0xce, 0x7f, 0x6c, 0x40, 0x25, 0xdd, 0x12, 0x72, 0x1f, 0xc6, 0x18, 0x27, 0x2f, 0xce, - 0xa1, 0xf5, 0xd2, 0x80, 0x36, 0xdf, 0x14, 0x68, 0xbc, 0x7a, 0xd8, 0xf9, 0x94, 0x43, 0x2c, 0xc9, - 0xe1, 0xb2, 0x05, 0x65, 0x15, 0x2b, 0xa3, 0x76, 0xaf, 0xe9, 0x3a, 0xf1, 0x42, 0x76, 0x3f, 0xa8, - 0xb5, 0xfe, 0x4d, 0xad, 0xd6, 0x42, 0x1b, 0x0e, 0x9b, 0x0c, 0x11, 0xaf, 0xdc, 0xf1, 0xe9, 0xa0, - 0xca, 0x99, 0xd4, 0xfa, 0xfa, 0x95, 0x3b, 0x0e, 0x63, 0x7b, 0x2d, 0xfe, 0x3d, 0x21, 0x67, 0xb8, - 0xd7, 0xea, 0x22, 0x44, 0xb5, 0xd7, 0x39, 0x8e, 0xf9, 0xb7, 0xf2, 0x70, 0x21, 0xa9, 0x1e, 0x4f, - 0x0d, 0xb9, 0xe6, 0x04, 0x4e, 0x3b, 0x3c, 0x61, 0x06, 0x5c, 0xef, 0xab, 0x1a, 0x5e, 0x29, 0x97, - 0x55, 0x53, 0x2a, 0x64, 0xa6, 0x2a, 0x84, 0x9b, 0x54, 0x5e, 0x21, 0x59, 0x0d, 0x72, 0x1f, 0xf2, - 0x0d, 0x1a, 0x89, 0x8b, 0xa7, 0xd7, 0xfa, 0x7a, 0x55, 0xad, 0xd7, 0xcd, 0x06, 0x8d, 0xf8, 0x20, - 0xf2, 0xd8, 0x7d, 0xaa, 0xc5, 0xd2, 0xb3, 0xed, 0xc6, 0x16, 0x8c, 0x2e, 0x3e, 0xee, 0xd2, 0x66, - 0x24, 0xee, 0x9b, 0xbe, 0x7a, 0x3c, 0x3f, 0x8e, 0xab, 0xdc, 0x6a, 0xa5, 0x08, 0x50, 0x3b, 0x8b, - 0xa3, 0x5c, 0x7e, 0x13, 0x8a, 0xf2, 0xe3, 0xa7, 0xba, 0x9d, 0xf9, 0x16, 0x8c, 0x2b, 0x1f, 0x39, - 0x95, 0xd0, 0xff, 0x95, 0x01, 0xa3, 0x4c, 0xdb, 0x6e, 0xbe, 0xf1, 0x8c, 0x6a, 0xa4, 0xdb, 0x9a, - 0x46, 0x9a, 0x56, 0xae, 0x11, 0xe1, 0xbc, 0x7c, 0xe3, 0x04, 0x5d, 0x74, 0x68, 0x00, 0x24, 0xc8, - 0xe4, 0x2e, 0x8c, 0x89, 0x7c, 0x31, 0x22, 0xef, 0xaa, 0x7a, 0x2f, 0x49, 0xe6, 0xa5, 0x8a, 0xad, - 0x38, 0xbf, 0x9b, 0x36, 0x7b, 0x25, 0x35, 0x59, 0x48, 0x62, 0xb7, 0xd5, 0x8b, 0xb0, 0x8c, 0xcd, - 0xbc, 0xdf, 0xe1, 0xf7, 0x54, 0x94, 0x0c, 0x57, 0x03, 0x82, 0xb8, 0x6b, 0xc2, 0x71, 0x93, 0x3f, - 0x8e, 0xc9, 0x05, 0xc1, 0x24, 0xdb, 0xa7, 0xf3, 0x3f, 0xc7, 0xf9, 0xcd, 0x0f, 0x59, 0xb1, 0x77, - 0xa1, 0x7c, 0xc7, 0x0f, 0x1e, 0x39, 0x81, 0x5b, 0xdb, 0xa5, 0x22, 0xea, 0xbe, 0x88, 0xa1, 0xf3, - 0x13, 0x3b, 0x1c, 0x6e, 0x3b, 0xac, 0xe0, 0x47, 0x87, 0xd5, 0x42, 0xdd, 0xf7, 0x5b, 0x96, 0x86, - 0x4e, 0x56, 0x61, 0xe2, 0x81, 0xf3, 0x58, 0x9c, 0x81, 0xae, 0xaf, 0x2f, 0x8b, 0xd8, 0x9d, 0x57, - 0x8f, 0x0e, 0xab, 0x97, 0xda, 0xce, 0xe3, 0xf8, 0xec, 0x74, 0x70, 0x78, 0xb9, 0x4e, 0x4f, 0x3c, - 0x98, 0x5c, 0xf3, 0x83, 0x48, 0x7c, 0x84, 0xd9, 0xec, 0xf9, 0x01, 0xa7, 0x68, 0xb3, 0x99, 0xa7, - 0x68, 0x97, 0xd8, 0x46, 0xc5, 0xde, 0x89, 0xc9, 0xb5, 0xeb, 0x8a, 0x1a, 0x63, 0xf2, 0x2e, 0x4c, - 0xcf, 0xd3, 0x20, 0xf2, 0x76, 0xbc, 0xa6, 0x13, 0xd1, 0x3b, 0x7e, 0xd0, 0x76, 0x22, 0xe1, 0x30, - 0x42, 0x87, 0x41, 0x93, 0x72, 0x4e, 0x6d, 0x27, 0xb2, 0xfa, 0x31, 0xc9, 0x57, 0xb3, 0xa2, 0xa1, - 0x46, 0xb0, 0xf9, 0xaf, 0x33, 0x6b, 0x24, 0x23, 0x1a, 0x6a, 0x40, 0x17, 0x64, 0xc4, 0x45, 0xed, - 0x1e, 0x77, 0x94, 0x5c, 0xac, 0xdf, 0x12, 0xc7, 0xda, 0x27, 0x1f, 0x15, 0xc7, 0xe3, 0x36, 0xe0, - 0xc8, 0x78, 0x0e, 0xf2, 0xf5, 0xb5, 0x3b, 0xe8, 0x02, 0x12, 0x47, 0xb7, 0xb4, 0xb3, 0xe7, 0x74, - 0x9a, 0x68, 0x44, 0x89, 0x78, 0x10, 0x55, 0xe1, 0xd5, 0xd7, 0xee, 0x10, 0x07, 0xce, 0xae, 0xd1, - 0xa0, 0xed, 0x45, 0x5f, 0xbe, 0x75, 0x4b, 0x19, 0xa8, 0x22, 0x56, 0x6d, 0x56, 0x54, 0xad, 0xda, - 0x45, 0x14, 0xfb, 0xf1, 0xad, 0x5b, 0x99, 0xc3, 0x11, 0x57, 0x2c, 0x8b, 0x17, 0x59, 0x84, 0xc9, - 0x07, 0xce, 0x63, 0x71, 0xc8, 0x1f, 0xef, 0x61, 0xf3, 0x78, 0xdb, 0x00, 0x05, 0xab, 0x99, 0x14, - 0xa9, 0x43, 0xac, 0x13, 0x91, 0x77, 0x60, 0x3c, 0x11, 0xaf, 0x10, 0x8f, 0x77, 0xf3, 0x3c, 0xcc, - 0x54, 0x11, 0x4e, 0xcd, 0x57, 0xa6, 0xa0, 0x93, 0x8d, 0xd8, 0x05, 0xc1, 0x2d, 0x61, 0x3c, 0xd0, - 0x2d, 0xd5, 0x67, 0x55, 0x17, 0x84, 0x83, 0x25, 0x5a, 0xb3, 0xa6, 0xe2, 0xbd, 0x01, 0x8f, 0x3e, - 0xb2, 0x74, 0x2e, 0x8a, 0x67, 0x63, 0x2d, 0xf0, 0xdb, 0xdd, 0x08, 0xa3, 0x30, 0x53, 0x9e, 0x8d, - 0x2e, 0x96, 0x64, 0x78, 0x36, 0x38, 0x49, 0x76, 0xec, 0xc2, 0xc4, 0x13, 0xc4, 0x2e, 0x50, 0x28, - 0x2c, 0xfb, 0xcd, 0x7d, 0x0c, 0xbb, 0x2c, 0xd5, 0x3f, 0x64, 0xfa, 0xa3, 0xe5, 0x37, 0xf7, 0x9f, - 0xde, 0x99, 0x3b, 0xb2, 0x27, 0x2b, 0xac, 0xed, 0x4c, 0xac, 0xc4, 0xa7, 0x67, 0xa6, 0xb4, 0x93, - 0x44, 0xad, 0x8c, 0x1b, 0x2a, 0x5c, 0x0a, 0x65, 0x43, 0x2c, 0x9d, 0x9c, 0x50, 0xa8, 0x2c, 0xd0, - 0x70, 0x3f, 0xf2, 0xbb, 0xf3, 0x2d, 0xaf, 0xbb, 0xed, 0x3b, 0x81, 0x3b, 0x53, 0x19, 0xa0, 0x30, - 0x5e, 0xc9, 0x54, 0x18, 0xd3, 0x2e, 0xa7, 0xb7, 0x9b, 0x92, 0x81, 0xd5, 0xc7, 0x92, 0x7c, 0x15, - 0x26, 0xd9, 0x6c, 0x59, 0x7c, 0x1c, 0xd1, 0x0e, 0x17, 0xa5, 0x69, 0x5c, 0xea, 0xcf, 0x29, 0x17, - 0x37, 0xe3, 0x42, 0x2e, 0xa4, 0xa8, 0x3d, 0x68, 0x4c, 0xa0, 0x0a, 0xa9, 0xce, 0x8a, 0xb8, 0x30, - 0xf3, 0xc0, 0x79, 0xac, 0xa4, 0x39, 0x52, 0xa4, 0x9e, 0xa0, 0xc4, 0x5e, 0x3f, 0x3a, 0xac, 0xbe, - 0xc4, 0x24, 0x76, 0x3f, 0x46, 0x1a, 0x30, 0x01, 0x06, 0x72, 0x32, 0x7f, 0x3c, 0xd5, 0xf3, 0x64, - 0x09, 0xc6, 0x44, 0x3b, 0xc5, 0xda, 0xd6, 0xdf, 0x63, 0xcf, 0x67, 0xf6, 0xd8, 0x98, 0xe8, 0x31, - 0x4b, 0xd2, 0x9b, 0xff, 0xca, 0x80, 0x09, 0xad, 0x51, 0xe4, 0x4d, 0x25, 0xf0, 0x28, 0x09, 0x18, - 0xd4, 0x70, 0x32, 0x5f, 0x4d, 0x78, 0x53, 0x44, 0x9b, 0xe5, 0x06, 0xd3, 0x65, 0xe6, 0x91, 0x3b, - 0x76, 0xb7, 0x95, 0xa4, 0x6b, 0x28, 0x0c, 0x48, 0xd7, 0xf0, 0x2b, 0x13, 0x30, 0xa9, 0x2f, 0xa3, - 0xcc, 0xae, 0x5d, 0xf6, 0x77, 0xbd, 0x8e, 0xdc, 0x96, 0xf3, 0x04, 0x24, 0x08, 0xd1, 0x9e, 0x20, - 0x40, 0x08, 0x79, 0x19, 0x20, 0x3e, 0xe0, 0x96, 0x3b, 0x6f, 0xf1, 0x60, 0x82, 0x52, 0x40, 0x7e, - 0x02, 0x60, 0xc5, 0x77, 0x69, 0x9c, 0xc3, 0xe6, 0x18, 0xb7, 0xdc, 0x2b, 0xc2, 0x2d, 0x27, 0x1e, - 0x39, 0x38, 0x3a, 0xac, 0x9e, 0xef, 0xf8, 0x2e, 0xed, 0x4f, 0x5e, 0xa3, 0x70, 0x24, 0x5f, 0x84, - 0x11, 0xab, 0xd7, 0xa2, 0x32, 0xa5, 0xca, 0xb8, 0x9c, 0x56, 0xbd, 0x96, 0x92, 0xfc, 0x34, 0xe8, - 0xa5, 0x4f, 0x63, 0x18, 0x80, 0xbc, 0x0f, 0xc0, 0x24, 0xe7, 0x6e, 0xe0, 0xf7, 0xba, 0xf2, 0xce, - 0x36, 0xee, 0xd2, 0x15, 0xa1, 0xdb, 0xc5, 0x42, 0xf5, 0xe3, 0x09, 0x09, 0x59, 0x85, 0x31, 0xa1, - 0xa4, 0xc4, 0x69, 0xc7, 0x0b, 0x59, 0x7e, 0x36, 0xc5, 0x52, 0x11, 0x39, 0x4e, 0x10, 0xac, 0xbb, - 0xbe, 0xb8, 0x97, 0xe1, 0x1d, 0x28, 0x31, 0xf6, 0x1b, 0x21, 0x15, 0x37, 0xb9, 0x4b, 0x3c, 0xf2, - 0x53, 0xa9, 0x50, 0x2f, 0xd4, 0x37, 0xf9, 0x09, 0x01, 0xf9, 0x2a, 0x66, 0x25, 0x12, 0x5d, 0x7d, - 0xac, 0xbb, 0xf6, 0x5a, 0x5f, 0x57, 0x9f, 0x73, 0xba, 0xdd, 0x8c, 0x34, 0x6e, 0x31, 0x3f, 0xb2, - 0x1b, 0xdf, 0x8e, 0x8a, 0x33, 0x60, 0x1f, 0xf3, 0x81, 0x1b, 0x7d, 0x1f, 0x98, 0x91, 0x17, 0x7e, - 0xfa, 0x73, 0x11, 0x69, 0x7c, 0x49, 0x17, 0x2a, 0xc9, 0x7c, 0x16, 0xdf, 0x82, 0xe3, 0xbe, 0xf5, - 0x7a, 0xdf, 0xb7, 0xd4, 0x01, 0xec, 0xfb, 0x5c, 0x1f, 0x77, 0xe2, 0x26, 0xd9, 0x8a, 0xc5, 0xf7, - 0xc6, 0x8f, 0xfb, 0xde, 0xcb, 0x7d, 0xdf, 0x3b, 0xeb, 0x6e, 0xf7, 0x7f, 0x27, 0xc5, 0x93, 0xbc, - 0x03, 0x13, 0x12, 0x82, 0xf3, 0x03, 0xdd, 0xa4, 0x62, 0x17, 0xe1, 0x6e, 0x63, 0xb8, 0x9f, 0x9e, - 0x88, 0x47, 0x45, 0x56, 0xa9, 0xb9, 0x74, 0x4c, 0x68, 0xd4, 0x69, 0xa9, 0xd0, 0x91, 0xc9, 0x57, - 0x60, 0x7c, 0xa9, 0xcd, 0x1a, 0xe2, 0x77, 0x9c, 0x88, 0xe2, 0x92, 0x97, 0xb8, 0x9e, 0x95, 0x12, - 0x45, 0x54, 0x79, 0xc6, 0xcf, 0xa4, 0x48, 0x35, 0x19, 0x14, 0x0a, 0xd6, 0x79, 0xdc, 0xbb, 0x24, - 0x64, 0x38, 0x14, 0x0b, 0xdc, 0xf3, 0x19, 0xee, 0x5f, 0x85, 0x3d, 0xae, 0x18, 0xdc, 0x69, 0x65, - 0x8b, 0x09, 0xa1, 0x75, 0x9e, 0xce, 0x93, 0xbc, 0x0b, 0xe3, 0xe2, 0x2e, 0x6a, 0xcd, 0x5a, 0x09, - 0x67, 0x2a, 0xd8, 0x78, 0xcc, 0xa2, 0x27, 0xaf, 0xad, 0xda, 0x4e, 0x90, 0x3a, 0x03, 0x4c, 0xf0, - 0xc9, 0x97, 0xe1, 0xdc, 0x96, 0xd7, 0x71, 0xfd, 0x47, 0xa1, 0x50, 0xe0, 0x42, 0xd1, 0x4d, 0x27, - 0x91, 0x4e, 0x8f, 0x78, 0xb9, 0x2d, 0x17, 0xc7, 0x3e, 0xc5, 0x97, 0xc9, 0x81, 0xfc, 0x4c, 0x1f, - 0x67, 0x2e, 0x41, 0xe4, 0x38, 0x09, 0x9a, 0xeb, 0x93, 0xa0, 0xfe, 0xcf, 0xa7, 0xc5, 0x29, 0xf3, - 0x33, 0xc4, 0x07, 0xa2, 0x5b, 0x36, 0x1f, 0xf8, 0x5e, 0x67, 0xe6, 0xac, 0xf6, 0xbe, 0x4c, 0x1c, - 0xec, 0x8c, 0x78, 0x6b, 0x7e, 0xcb, 0x6b, 0x1e, 0xd4, 0xcd, 0xa3, 0xc3, 0xea, 0x0b, 0x69, 0x9b, - 0xe9, 0x23, 0x5f, 0x73, 0x61, 0x64, 0xb0, 0x26, 0x5f, 0x81, 0x32, 0xfb, 0x1b, 0x1b, 0x98, 0xe7, - 0xb4, 0x03, 0x43, 0x05, 0x53, 0x7c, 0x07, 0xc7, 0x08, 0x2f, 0xcb, 0x66, 0xd8, 0x9e, 0x1a, 0x2b, - 0xf3, 0x87, 0x06, 0x9c, 0xcb, 0xaa, 0xeb, 0x09, 0x99, 0x89, 0xcc, 0x54, 0xe8, 0x00, 0x7a, 0x3f, - 0x78, 0xe8, 0x40, 0x1c, 0x30, 0x50, 0x85, 0x11, 0xb6, 0x23, 0x97, 0xa1, 0x6d, 0xb8, 0x1c, 0xb2, - 0x5d, 0x7b, 0x68, 0x71, 0x38, 0x43, 0xc0, 0x6b, 0x10, 0xb8, 0x5e, 0x8e, 0x70, 0x04, 0xbc, 0x2b, - 0x61, 0x71, 0x38, 0x43, 0x60, 0xcb, 0xae, 0x5c, 0x26, 0x10, 0x81, 0xad, 0xc6, 0xa1, 0xc5, 0xe1, - 0xe4, 0x1a, 0x8c, 0xad, 0x76, 0x96, 0xa9, 0xf3, 0x90, 0x8a, 0x73, 0x3b, 0xf4, 0xd6, 0xf8, 0x1d, - 0xbb, 0xc5, 0x60, 0x96, 0x2c, 0x34, 0xbf, 0x6b, 0xc0, 0x74, 0x5f, 0x37, 0x9d, 0x9c, 0x7c, 0xe9, - 0xf8, 0x43, 0xd2, 0x61, 0xda, 0xc7, 0xab, 0x5f, 0xc8, 0xae, 0xbe, 0xf9, 0xfb, 0x05, 0xb8, 0x38, - 0x60, 0xd5, 0x4a, 0x02, 0x1c, 0x8c, 0x13, 0x03, 0x1c, 0xbe, 0xc6, 0x56, 0x09, 0xc7, 0x6b, 0x87, - 0xeb, 0x7e, 0x52, 0xe3, 0xe4, 0x2c, 0x08, 0xcb, 0x64, 0x76, 0x13, 0x99, 0x89, 0xe3, 0x52, 0x13, - 0x29, 0xec, 0xc8, 0xef, 0x73, 0x89, 0xeb, 0xcc, 0xfa, 0x42, 0x0c, 0xf2, 0x7f, 0x4d, 0x42, 0x0c, - 0xf4, 0x83, 0xbd, 0xc2, 0x53, 0x3d, 0xd8, 0xcb, 0x3e, 0x03, 0x18, 0x79, 0x92, 0xd3, 0xb0, 0x79, - 0x98, 0x68, 0x50, 0x27, 0x68, 0xee, 0xd5, 0x42, 0x3e, 0x48, 0xa3, 0xc8, 0x0d, 0x55, 0x72, 0x88, - 0x05, 0xb6, 0x13, 0xf6, 0x8f, 0x85, 0x46, 0x63, 0xfe, 0xdb, 0x54, 0x64, 0xc4, 0x5f, 0x47, 0x79, - 0x79, 0x15, 0x46, 0xb6, 0xf6, 0x68, 0x20, 0x8d, 0x64, 0xac, 0xc8, 0x23, 0x06, 0x50, 0x2b, 0x82, - 0x18, 0xe6, 0x4f, 0x43, 0x59, 0xfd, 0x18, 0x2a, 0x04, 0xf6, 0x5b, 0xcc, 0x48, 0xae, 0x10, 0x18, - 0xc0, 0xe2, 0xf0, 0x13, 0x13, 0xa2, 0x25, 0xbd, 0x90, 0x3f, 0xa9, 0x17, 0xd8, 0xc7, 0x51, 0xde, - 0x94, 0x8f, 0xe3, 0x6f, 0xf5, 0xe3, 0x11, 0x03, 0x58, 0x1c, 0xfe, 0x54, 0x3f, 0xfe, 0x6f, 0x0c, - 0x28, 0x60, 0x32, 0x8a, 0x37, 0xa0, 0x24, 0x5d, 0xca, 0x6a, 0x82, 0x86, 0xb3, 0xd2, 0xe3, 0x1c, - 0xea, 0x71, 0x2d, 0x02, 0xc8, 0x3e, 0xb5, 0x49, 0x83, 0x6d, 0x2d, 0xfc, 0xe9, 0x21, 0x03, 0xa8, - 0x9f, 0x42, 0x8c, 0x53, 0x8c, 0x07, 0x86, 0x78, 0x89, 0x1d, 0x21, 0x57, 0x59, 0x3c, 0xc4, 0xab, - 0x6f, 0xfb, 0x27, 0xb1, 0xcc, 0x5f, 0x37, 0xe0, 0x7c, 0xa6, 0x25, 0xc3, 0xbe, 0xca, 0x4d, 0x26, - 0x45, 0x1c, 0xd3, 0xf6, 0x12, 0xc7, 0x38, 0x4d, 0x28, 0xd7, 0x29, 0x64, 0xeb, 0x33, 0x50, 0x8a, - 0x77, 0x98, 0xe4, 0x9c, 0x1c, 0x3a, 0xf4, 0x3b, 0xca, 0xed, 0xd8, 0x5f, 0x19, 0x30, 0xca, 0xaa, - 0xf0, 0xcc, 0xde, 0xec, 0xc9, 0xf6, 0x42, 0xb3, 0x26, 0x0d, 0x75, 0x9f, 0xe7, 0x77, 0x46, 0x01, - 0x12, 0x64, 0xb2, 0x0d, 0x93, 0xab, 0x4b, 0x0b, 0xf3, 0x4b, 0x2e, 0xed, 0x44, 0x78, 0x0c, 0x9b, - 0xca, 0xf0, 0xc0, 0xb6, 0xc6, 0x41, 0xc7, 0x69, 0x09, 0x84, 0x83, 0x44, 0x37, 0xf8, 0x9e, 0xdb, - 0xb4, 0xbd, 0x98, 0x4e, 0x35, 0x29, 0x75, 0x8e, 0xec, 0x1b, 0x8d, 0xda, 0x83, 0x65, 0xe5, 0x1b, - 0xb9, 0x21, 0xbf, 0x11, 0x3a, 0xed, 0xd6, 0x80, 0x6f, 0xe8, 0x1c, 0xc9, 0x1e, 0x54, 0xee, 0xe2, - 0xea, 0xa3, 0x7c, 0x25, 0x7f, 0xfc, 0x57, 0x5e, 0x14, 0x5f, 0x79, 0x8e, 0x2f, 0x5b, 0xd9, 0xdf, - 0xe9, 0xe3, 0x9a, 0x48, 0x6e, 0xe1, 0x44, 0xc9, 0xfd, 0xff, 0x0c, 0x18, 0xe5, 0xcb, 0x5b, 0xfc, - 0x48, 0x4c, 0xe6, 0x02, 0xba, 0xf5, 0x74, 0x16, 0xd0, 0x0a, 0x6a, 0x2e, 0xcd, 0x85, 0xc0, 0xcb, - 0xc8, 0x42, 0xea, 0xc5, 0x19, 0x79, 0xd4, 0x80, 0xa6, 0x35, 0x2f, 0x49, 0x02, 0xe2, 0xf8, 0x63, - 0x33, 0x2a, 0x17, 0x8e, 0xa1, 0xbe, 0x7f, 0x39, 0xf6, 0x84, 0xef, 0x5f, 0x2e, 0x43, 0x49, 0x44, - 0x78, 0xd5, 0x0f, 0xc4, 0x06, 0x5a, 0xba, 0x88, 0x62, 0xb8, 0x92, 0xf8, 0x9c, 0x83, 0xec, 0x6d, - 0x2d, 0x6d, 0x61, 0x8c, 0x48, 0x56, 0xa1, 0x94, 0x5c, 0x4b, 0x2a, 0x69, 0xe7, 0xc5, 0x31, 0x5c, - 0x84, 0x40, 0xf3, 0x9b, 0xaf, 0x99, 0xb7, 0x90, 0x12, 0x1e, 0xe6, 0xb7, 0x0c, 0xa8, 0xa4, 0xe5, - 0x85, 0xbc, 0x03, 0xe3, 0xf1, 0xcd, 0xb0, 0x38, 0x00, 0x04, 0x1d, 0xbe, 0xc9, 0x55, 0x32, 0x2d, - 0x14, 0x44, 0x45, 0x27, 0x73, 0x50, 0x64, 0xd3, 0x4e, 0xc9, 0x5b, 0x8d, 0xfa, 0xa4, 0x27, 0x60, - 0xea, 0xf9, 0xa7, 0xc4, 0x53, 0x66, 0xed, 0xbf, 0xcf, 0xc3, 0xb8, 0x32, 0x58, 0xe4, 0x55, 0x28, - 0x2e, 0x85, 0xcb, 0x7e, 0x73, 0x9f, 0xba, 0xe2, 0x58, 0x05, 0x9f, 0x37, 0xf5, 0x42, 0xbb, 0x85, - 0x40, 0x2b, 0x2e, 0x26, 0x75, 0x98, 0xe0, 0xff, 0xc9, 0x1b, 0xc0, 0xb9, 0xc4, 0x25, 0xcc, 0x91, - 0xe5, 0xdd, 0x5f, 0x75, 0x79, 0xd7, 0x48, 0xc8, 0xd7, 0x01, 0x38, 0x80, 0x8d, 0xef, 0x10, 0x01, - 0xde, 0x72, 0x02, 0x9f, 0x17, 0x1f, 0x88, 0x3c, 0xb5, 0x85, 0x28, 0x0a, 0x0a, 0x43, 0x7c, 0x5a, - 0xd1, 0x6f, 0xee, 0x0f, 0xff, 0xb8, 0x6a, 0xf2, 0xb4, 0xa2, 0xdf, 0xdc, 0xb7, 0xb3, 0xa3, 0xfd, - 0x54, 0x96, 0xe4, 0xdb, 0x06, 0x5c, 0xb6, 0x68, 0xd3, 0x7f, 0x48, 0x83, 0x83, 0x5a, 0x84, 0x58, - 0xea, 0x17, 0x4f, 0x0e, 0x2d, 0xbc, 0x2d, 0xbe, 0xf8, 0x4a, 0x20, 0xb8, 0xe0, 0xb5, 0xa4, 0x76, - 0x37, 0xb2, 0x8f, 0xa9, 0xc2, 0x31, 0x9f, 0x34, 0xff, 0xc4, 0x50, 0xa6, 0x00, 0x59, 0x81, 0x52, - 0x2c, 0x2c, 0xc2, 0x65, 0x1a, 0x5b, 0x66, 0x12, 0x6e, 0xd1, 0x9d, 0xfa, 0x73, 0xe2, 0x04, 0xe4, - 0x6c, 0x2c, 0x72, 0xda, 0x8c, 0x90, 0x40, 0xf2, 0x25, 0x28, 0xe0, 0x50, 0x9d, 0x9c, 0xe8, 0x4c, - 0x2e, 0x35, 0x05, 0x36, 0x46, 0x58, 0x6b, 0xa4, 0x24, 0x9f, 0x13, 0x61, 0x38, 0x79, 0x2d, 0x85, - 0x30, 0x03, 0xb1, 0x7a, 0xc4, 0x6b, 0x4c, 0x12, 0x60, 0xaa, 0x48, 0xeb, 0xdf, 0xc8, 0x41, 0x25, - 0x3d, 0xf1, 0xc8, 0xfb, 0x50, 0x96, 0x57, 0xcc, 0xee, 0x39, 0xe1, 0x9e, 0x48, 0x4b, 0x8a, 0xbb, - 0x56, 0x79, 0x2f, 0xcd, 0xde, 0x73, 0xb4, 0xf4, 0x75, 0x1a, 0x01, 0x5b, 0x90, 0xd7, 0xc5, 0xbd, - 0x05, 0x65, 0x02, 0x45, 0x7e, 0xd4, 0x4d, 0xa5, 0x25, 0x95, 0x68, 0xe4, 0x0d, 0xc8, 0xf3, 0x7b, - 0x97, 0x6a, 0x4e, 0xab, 0x07, 0x77, 0x6a, 0xfc, 0xda, 0x18, 0x3f, 0x74, 0xd7, 0x4f, 0x2f, 0x18, - 0x3e, 0x59, 0x56, 0x6e, 0xed, 0x8d, 0x6a, 0xb9, 0x7d, 0x24, 0x38, 0x6e, 0xdc, 0xc9, 0xd7, 0xf7, - 0x3e, 0x28, 0x14, 0xf3, 0x95, 0x82, 0xb8, 0xa7, 0xf5, 0x7b, 0x79, 0x28, 0xc5, 0xdf, 0x27, 0x04, - 0xd0, 0xde, 0x10, 0xa7, 0xe7, 0xf8, 0x3f, 0xb9, 0x04, 0x45, 0x69, 0x62, 0x88, 0x13, 0xf4, 0xb1, - 0x50, 0x98, 0x17, 0x33, 0x20, 0x6d, 0x09, 0x6e, 0x5e, 0x58, 0xf2, 0x27, 0xb9, 0x05, 0xb1, 0xa1, - 0x30, 0xc8, 0xa2, 0x28, 0xb0, 0x01, 0xb3, 0x62, 0x34, 0x32, 0x09, 0x39, 0x8f, 0xc7, 0xa4, 0x97, - 0xac, 0x9c, 0xe7, 0x92, 0xf7, 0xa1, 0xe8, 0xb8, 0x2e, 0x75, 0x6d, 0x27, 0x1a, 0xe2, 0xa1, 0xdb, - 0x22, 0xe3, 0xc6, 0x35, 0x3a, 0x52, 0xd5, 0x22, 0x52, 0x83, 0x12, 0xbe, 0x73, 0xda, 0x0b, 0x87, - 0x7a, 0x1c, 0x35, 0xe1, 0x50, 0x64, 0x64, 0x1b, 0x21, 0x75, 0xc9, 0x2b, 0x50, 0x60, 0xa3, 0x29, - 0xd6, 0x83, 0x38, 0x53, 0xe1, 0xea, 0xfa, 0x1a, 0xef, 0xb0, 0x7b, 0x67, 0x2c, 0x44, 0x20, 0x2f, - 0x41, 0xbe, 0x37, 0xb7, 0x23, 0x34, 0x7d, 0x25, 0xb9, 0x92, 0x1b, 0xa3, 0xb1, 0x62, 0x72, 0x1b, - 0x8a, 0x8f, 0xf4, 0xcb, 0x97, 0xe7, 0x53, 0xc3, 0x18, 0xe3, 0xc7, 0x88, 0xf5, 0x22, 0x8c, 0xf2, - 0x6b, 0x87, 0xe6, 0x0b, 0x00, 0xc9, 0xa7, 0xfb, 0x03, 0x1d, 0xcc, 0xaf, 0x43, 0x29, 0xfe, 0x24, - 0x79, 0x1e, 0x60, 0x9f, 0x1e, 0xd8, 0x7b, 0x4e, 0xc7, 0x15, 0xcf, 0xea, 0x94, 0xad, 0xd2, 0x3e, - 0x3d, 0xb8, 0x87, 0x00, 0x72, 0x11, 0xc6, 0xba, 0x6c, 0x54, 0x65, 0x52, 0x5d, 0x6b, 0xb4, 0xdb, - 0xdb, 0x66, 0x12, 0x3a, 0x03, 0x63, 0xe8, 0xfc, 0x10, 0x13, 0x6d, 0xc2, 0x92, 0x3f, 0xcd, 0xdf, - 0xca, 0x61, 0xba, 0x05, 0xa5, 0x9e, 0xe4, 0x45, 0x98, 0x68, 0x06, 0x14, 0x97, 0x23, 0x87, 0x99, - 0x45, 0xe2, 0x3b, 0xe5, 0x04, 0xb8, 0xe4, 0x92, 0x6b, 0x30, 0x95, 0x64, 0xf9, 0xb5, 0x9b, 0xdb, - 0xe2, 0xea, 0x75, 0xd9, 0x9a, 0xe8, 0xca, 0x34, 0xbf, 0xf3, 0xdb, 0x78, 0x97, 0xa2, 0xa2, 0x5e, - 0x39, 0x8c, 0x64, 0xc6, 0xde, 0x92, 0x35, 0xa5, 0xc0, 0xf1, 0xe0, 0xe4, 0x02, 0x8c, 0x3a, 0xce, - 0x6e, 0xcf, 0xe3, 0x71, 0xdd, 0x65, 0x4b, 0xfc, 0x22, 0x9f, 0x85, 0xe9, 0xd0, 0xdb, 0xed, 0x38, - 0x51, 0x2f, 0x10, 0xf9, 0x2e, 0x68, 0x80, 0x22, 0x35, 0x61, 0x55, 0xe2, 0x82, 0x79, 0x0e, 0x27, - 0xaf, 0x03, 0x51, 0xbf, 0xe7, 0x6f, 0x7f, 0x44, 0x9b, 0x5c, 0xd4, 0xca, 0xd6, 0xb4, 0x52, 0xb2, - 0x8a, 0x05, 0xe4, 0x33, 0x50, 0x0e, 0x68, 0x88, 0x26, 0x19, 0x76, 0x1b, 0x66, 0xf1, 0xb1, 0xc6, - 0x25, 0xec, 0x3e, 0x3d, 0x30, 0xeb, 0x30, 0xdd, 0x37, 0x1f, 0xc9, 0xeb, 0xdc, 0xba, 0x17, 0xeb, - 0x73, 0x99, 0x6f, 0x66, 0x98, 0x92, 0x4a, 0x3d, 0x8d, 0xcd, 0x91, 0xcc, 0x0e, 0x94, 0x55, 0xfd, - 0x7a, 0xc2, 0xa5, 0xf6, 0x0b, 0x18, 0xf9, 0xc9, 0x95, 0xcf, 0xe8, 0xd1, 0x61, 0x35, 0xe7, 0xb9, - 0x18, 0xef, 0x79, 0x1d, 0x8a, 0xd2, 0x4a, 0x50, 0x9f, 0x80, 0x11, 0x06, 0xe5, 0x81, 0x15, 0x97, - 0x9a, 0xaf, 0xc0, 0x98, 0x50, 0xa1, 0xc7, 0x3b, 0xa2, 0xcc, 0x6f, 0xe6, 0x60, 0xca, 0xa2, 0x6c, - 0x82, 0x8b, 0xc7, 0x55, 0x3e, 0x65, 0xf9, 0x8e, 0xb5, 0xb6, 0x1d, 0x93, 0x43, 0xe2, 0x7b, 0x06, - 0x9c, 0xcd, 0xc0, 0xfd, 0x58, 0x09, 0xd2, 0xde, 0x84, 0xd2, 0x82, 0xe7, 0xb4, 0x6a, 0xae, 0x1b, - 0x47, 0xb0, 0xa2, 0x35, 0xe8, 0xb2, 0xe9, 0xe4, 0x30, 0xa8, 0xba, 0x98, 0xc6, 0xa8, 0xe4, 0x86, - 0x10, 0x8a, 0x24, 0x85, 0xa3, 0xcc, 0xa8, 0x0c, 0xbc, 0x4e, 0x49, 0x3e, 0x65, 0xbc, 0x8e, 0xc8, - 0x81, 0xc9, 0x01, 0xe9, 0x33, 0x3b, 0x74, 0xd9, 0xd7, 0x11, 0xd3, 0xcd, 0x1b, 0x6a, 0xdb, 0xf9, - 0xad, 0x1c, 0x5c, 0xc8, 0x26, 0xfc, 0xb8, 0xb9, 0xee, 0x30, 0x81, 0x87, 0x92, 0xb4, 0x1a, 0x73, - 0xdd, 0xf1, 0x6c, 0x1f, 0x88, 0x9f, 0x20, 0x90, 0x1d, 0x98, 0x58, 0x76, 0xc2, 0xe8, 0x1e, 0x75, - 0x82, 0x68, 0x9b, 0x3a, 0xd1, 0x10, 0x16, 0x6c, 0xfc, 0x00, 0x35, 0x2e, 0x6a, 0x7b, 0x92, 0x32, - 0xfd, 0x00, 0xb5, 0xc6, 0x36, 0x16, 0x94, 0xc2, 0x10, 0x82, 0xf2, 0x0d, 0x98, 0x6a, 0xd0, 0xb6, - 0xd3, 0xdd, 0xf3, 0x03, 0x2a, 0x7c, 0xe7, 0x37, 0x61, 0x22, 0x06, 0x65, 0x4a, 0x8b, 0x5e, 0xac, - 0xe1, 0x2b, 0x1d, 0x91, 0xa8, 0x12, 0xbd, 0xd8, 0xfc, 0x8d, 0x1c, 0x5c, 0xac, 0x35, 0xc5, 0x41, - 0x83, 0x28, 0x90, 0xe7, 0xa1, 0x9f, 0xf0, 0xb7, 0xc9, 0x2c, 0x94, 0x1e, 0x38, 0x8f, 0x97, 0x29, - 0x3e, 0x11, 0xcb, 0x33, 0x26, 0x71, 0xf3, 0xcb, 0x79, 0x6c, 0xc7, 0x6e, 0x2f, 0x2b, 0xc1, 0x51, - 0x37, 0x9b, 0x85, 0x27, 0xdc, 0x6c, 0x9a, 0x30, 0x7a, 0xcf, 0x6f, 0xb9, 0x62, 0x71, 0x12, 0xe7, - 0x16, 0x7b, 0x08, 0xb1, 0x44, 0x89, 0xf9, 0x43, 0x03, 0x26, 0xe3, 0x1a, 0x63, 0x15, 0x3e, 0xf1, - 0x2e, 0xb9, 0x06, 0x63, 0xf8, 0xa1, 0xf8, 0x81, 0x22, 0x5c, 0x34, 0x5a, 0x0c, 0x64, 0x7b, 0xae, - 0x25, 0x0b, 0xd5, 0x9e, 0x18, 0x79, 0xb2, 0x9e, 0x30, 0xff, 0x01, 0x1e, 0x89, 0xa8, 0xad, 0x64, - 0x2b, 0x91, 0x52, 0x11, 0x63, 0xc8, 0x8a, 0xe4, 0x9e, 0xda, 0x90, 0xe4, 0x07, 0x0e, 0xc9, 0x2f, - 0xe4, 0x60, 0x3c, 0xae, 0xec, 0xa7, 0xec, 0x1e, 0x7f, 0xdc, 0xae, 0xa1, 0xa2, 0xd8, 0x1b, 0x8a, - 0xae, 0x10, 0xc1, 0xe2, 0x5f, 0x82, 0x51, 0x31, 0x99, 0x8c, 0xd4, 0xb9, 0x60, 0x6a, 0x74, 0x93, - 0x47, 0x84, 0x71, 0x40, 0x43, 0x4b, 0xd0, 0xe1, 0x35, 0x81, 0x2d, 0xba, 0x2d, 0x4e, 0xc8, 0x9e, - 0xd9, 0x35, 0x2a, 0xfb, 0x9a, 0x40, 0xd2, 0xb0, 0xa1, 0x56, 0xa7, 0xbf, 0x53, 0x80, 0x4a, 0x9a, - 0xe4, 0xe4, 0x4c, 0x09, 0x6b, 0xbd, 0x6d, 0xf1, 0x46, 0x06, 0x66, 0x4a, 0xe8, 0xf6, 0xb6, 0x2d, - 0x06, 0x23, 0xd7, 0xa0, 0xb0, 0x16, 0x78, 0x0f, 0xb1, 0xd5, 0xe2, 0x89, 0x90, 0x6e, 0xe0, 0x3d, - 0x54, 0xe3, 0x65, 0x59, 0x39, 0x6e, 0x68, 0x97, 0x1b, 0xca, 0xfb, 0xed, 0x7c, 0x43, 0xdb, 0x0a, - 0xd3, 0x29, 0x79, 0x24, 0x1a, 0x5b, 0x2a, 0xeb, 0xd4, 0x09, 0xc4, 0xad, 0x7e, 0xa1, 0xce, 0x70, - 0xa9, 0xdc, 0x46, 0x30, 0xcf, 0xb7, 0x6b, 0xa9, 0x48, 0xa4, 0x05, 0x44, 0xf9, 0x29, 0x27, 0xf0, - 0xc9, 0x7b, 0x3c, 0xf9, 0xb4, 0xd5, 0x39, 0x95, 0xb5, 0xad, 0xce, 0xe6, 0x0c, 0xbe, 0x4f, 0xd3, - 0x47, 0xb8, 0x06, 0x25, 0x74, 0x79, 0xa1, 0x23, 0xa3, 0x78, 0x22, 0x33, 0x19, 0x9b, 0x0c, 0x18, - 0x4f, 0x60, 0xc7, 0xee, 0x8c, 0x84, 0x09, 0x79, 0x0f, 0xc6, 0xd5, 0x80, 0x5a, 0x1e, 0xf6, 0x79, - 0x85, 0x5f, 0xe1, 0x1a, 0x90, 0xba, 0x4e, 0x25, 0x30, 0x3f, 0xa7, 0x4a, 0x89, 0x58, 0xb4, 0x8f, - 0x95, 0x12, 0xf3, 0xd7, 0xd0, 0x8c, 0x6f, 0xfb, 0x11, 0x15, 0xd6, 0xcb, 0x33, 0xab, 0xc7, 0x12, - 0x17, 0xf2, 0x88, 0x16, 0xd3, 0xa2, 0xb5, 0xee, 0x14, 0x2f, 0x97, 0xff, 0xae, 0x01, 0xe7, 0x33, - 0x69, 0xc9, 0x4d, 0x80, 0xc4, 0x46, 0x14, 0xbd, 0xc4, 0x13, 0x19, 0xc7, 0x50, 0x4b, 0xc1, 0x20, - 0x5f, 0x4b, 0x5b, 0x77, 0x27, 0x2f, 0x4e, 0xf2, 0xb9, 0x8f, 0x49, 0xdd, 0xba, 0xcb, 0xb0, 0xe9, - 0xcc, 0xef, 0xe5, 0x61, 0xba, 0xef, 0x99, 0xc8, 0x13, 0xa2, 0x08, 0xf6, 0x53, 0x8f, 0x90, 0xf1, - 0xe3, 0x8e, 0x1b, 0x83, 0x1e, 0xa9, 0xcc, 0x78, 0x92, 0x0c, 0xdd, 0x62, 0x22, 0x87, 0xf6, 0x09, - 0x2f, 0x93, 0x85, 0xd9, 0xcf, 0xd7, 0x7d, 0x76, 0xe0, 0xd7, 0x9e, 0xc2, 0x33, 0x76, 0x7f, 0x8d, - 0x5f, 0xf9, 0xfa, 0xb5, 0x1c, 0x9c, 0xed, 0x6b, 0xf3, 0x33, 0x3b, 0xeb, 0xbe, 0xa4, 0xad, 0x6e, - 0x2f, 0x0c, 0x1a, 0xd3, 0xa1, 0xac, 0x88, 0xff, 0x6e, 0xc0, 0xc5, 0x01, 0x94, 0xe4, 0x20, 0x2d, - 0x44, 0xdc, 0xaa, 0xb8, 0x75, 0xfc, 0x07, 0x9f, 0x8a, 0x28, 0x7d, 0x62, 0x92, 0xf0, 0xcd, 0x1c, - 0xc0, 0x16, 0xdd, 0x7e, 0xb6, 0xd3, 0x40, 0x7d, 0x41, 0x13, 0x00, 0xc5, 0x81, 0x39, 0x7c, 0x16, - 0xa8, 0x55, 0x74, 0x24, 0x0e, 0x9f, 0x03, 0x2a, 0x7e, 0xd2, 0x24, 0x97, 0xfd, 0xa4, 0x89, 0xb9, - 0x0d, 0xe7, 0xee, 0xd2, 0x28, 0x59, 0x09, 0xe5, 0x1e, 0xf2, 0x78, 0xb6, 0xaf, 0x41, 0x49, 0xe0, - 0xeb, 0xe9, 0xe9, 0x65, 0x48, 0x9c, 0xe7, 0x5a, 0x09, 0x82, 0x49, 0xe1, 0xe2, 0x02, 0x6d, 0xd1, - 0x88, 0x7e, 0xb2, 0x9f, 0x69, 0x00, 0xe1, 0x4d, 0xe1, 0x2f, 0x5d, 0x0c, 0xf5, 0x85, 0x13, 0xfb, - 0x67, 0x13, 0xce, 0xc7, 0x75, 0x7f, 0x9a, 0x7c, 0x67, 0x99, 0x2d, 0x21, 0xee, 0x24, 0x26, 0x1c, - 0x8f, 0x71, 0x22, 0x3e, 0x86, 0xcb, 0x92, 0x60, 0xcb, 0x8b, 0x4f, 0x62, 0x86, 0xa2, 0x25, 0xef, - 0xc0, 0xb8, 0x42, 0x23, 0x6e, 0x56, 0xe3, 0x69, 0xe7, 0x23, 0x2f, 0xda, 0xb3, 0x43, 0x0e, 0x57, - 0x4f, 0x3b, 0x15, 0x74, 0xf3, 0xab, 0xf0, 0x5c, 0x1c, 0xb7, 0x92, 0xf1, 0xe9, 0x14, 0x73, 0xe3, - 0x74, 0xcc, 0x57, 0x92, 0x66, 0x2d, 0x75, 0xe2, 0x08, 0x78, 0xc9, 0x9b, 0xa8, 0xcd, 0x12, 0x8d, - 0xb9, 0xa2, 0xa4, 0xc7, 0x13, 0x6b, 0x51, 0x02, 0x30, 0xdf, 0x56, 0x2a, 0x9b, 0xc1, 0x50, 0x23, - 0x36, 0xd2, 0xc4, 0xdf, 0xcc, 0xc1, 0xd4, 0xea, 0xd2, 0xc2, 0x7c, 0xec, 0x46, 0xfe, 0x94, 0xe5, - 0xa8, 0xd2, 0xda, 0x36, 0x58, 0xdf, 0x98, 0x1b, 0x70, 0x36, 0xd5, 0x0d, 0xf8, 0x90, 0xcf, 0x7b, - 0x3c, 0xbe, 0x24, 0x06, 0xcb, 0x95, 0xe5, 0x42, 0x16, 0xfb, 0xcd, 0xdb, 0x56, 0x0a, 0xdb, 0xfc, - 0xde, 0x68, 0x8a, 0xaf, 0x50, 0x61, 0xaf, 0x41, 0x69, 0x29, 0x0c, 0x7b, 0x34, 0xd8, 0xb0, 0x96, - 0x55, 0x1b, 0xd1, 0x43, 0xa0, 0xdd, 0x0b, 0x5a, 0x56, 0x82, 0x40, 0x5e, 0x85, 0xa2, 0xb8, 0x07, - 0x27, 0x75, 0x02, 0x1e, 0x97, 0xc7, 0xd7, 0xe8, 0xac, 0xb8, 0x98, 0xbc, 0x01, 0x65, 0xfe, 0x3f, - 0x97, 0x36, 0xd1, 0xe1, 0xe8, 0xab, 0x12, 0xe8, 0x5c, 0x3a, 0x2d, 0x0d, 0x8d, 0xed, 0xcc, 0xe4, - 0x4b, 0xa1, 0xac, 0x46, 0x85, 0x64, 0x67, 0x26, 0x1f, 0x15, 0xc5, 0x3a, 0xa9, 0x48, 0xe4, 0x06, - 0xe4, 0x6b, 0xf3, 0x96, 0x9a, 0x91, 0xdb, 0x69, 0x06, 0x3c, 0xa3, 0xbd, 0xf6, 0x18, 0x57, 0x6d, - 0xde, 0x22, 0x73, 0x50, 0xc4, 0xc7, 0x56, 0x5c, 0x1a, 0x88, 0xa8, 0x57, 0x94, 0x9a, 0xae, 0x80, - 0xa9, 0x27, 0x8f, 0x12, 0x8f, 0xcc, 0xc2, 0xd8, 0x82, 0x17, 0x76, 0x5b, 0xce, 0x81, 0x48, 0x4e, - 0x83, 0x87, 0x21, 0x2e, 0x07, 0xa9, 0x72, 0x26, 0xb0, 0xc8, 0xab, 0x30, 0xd2, 0x68, 0xfa, 0x5d, - 0xb6, 0xdb, 0x8a, 0x43, 0x5b, 0x42, 0x06, 0xd0, 0x52, 0x4f, 0x30, 0x00, 0x5e, 0xcd, 0xe6, 0x37, - 0xcc, 0x4a, 0xca, 0xd5, 0xec, 0xf4, 0xcd, 0x32, 0x81, 0xd3, 0x1f, 0x7c, 0x08, 0x4f, 0x33, 0xf8, - 0x70, 0x1b, 0x2e, 0xde, 0x45, 0x53, 0xbf, 0x41, 0x03, 0xcc, 0x07, 0xca, 0x1f, 0x6e, 0xda, 0xb0, - 0x96, 0xc4, 0xad, 0x3a, 0xbc, 0xe3, 0xc4, 0x77, 0x03, 0x76, 0xc8, 0x71, 0xe4, 0x9b, 0x4f, 0xa9, - 0xd7, 0x2a, 0x06, 0x31, 0x22, 0x5f, 0x86, 0x73, 0x59, 0x45, 0xe2, 0x7e, 0x1d, 0xc6, 0xb5, 0x67, - 0x7f, 0x40, 0x0d, 0x2c, 0xcf, 0xe2, 0x40, 0x96, 0xa1, 0xc2, 0xe1, 0x35, 0xb7, 0xed, 0x75, 0x16, - 0xdb, 0x8e, 0xd7, 0xc2, 0xdb, 0x76, 0xe2, 0xca, 0xa4, 0xe0, 0xea, 0xb0, 0x42, 0x9b, 0xb2, 0x52, - 0x2d, 0x3a, 0x29, 0x45, 0x89, 0xea, 0xa8, 0x51, 0x7b, 0xb0, 0x9c, 0xcc, 0xa9, 0x4f, 0xd7, 0xb9, - 0x91, 0xd6, 0xb6, 0x63, 0xce, 0x8d, 0x36, 0xe0, 0x6c, 0xaa, 0x1b, 0xa4, 0x3a, 0xd2, 0xc0, 0x69, - 0x75, 0x94, 0xa2, 0xb1, 0x52, 0xd8, 0xe6, 0x7f, 0x1c, 0x4d, 0xf1, 0x15, 0xbe, 0x22, 0x13, 0x46, - 0xb9, 0xb6, 0x51, 0xb3, 0xd7, 0x71, 0x5d, 0x64, 0x89, 0x12, 0x72, 0x09, 0xf2, 0x8d, 0xc6, 0xaa, - 0x9a, 0x5b, 0x33, 0x0c, 0x7d, 0x8b, 0xc1, 0xd8, 0x08, 0xa1, 0x1b, 0x48, 0xb9, 0x62, 0xd6, 0xa4, - 0x41, 0x24, 0x9e, 0x92, 0x7d, 0x39, 0x99, 0xc7, 0x85, 0xa4, 0xbf, 0xc5, 0x3c, 0x4e, 0x66, 0xef, - 0x3c, 0xcc, 0xd4, 0xc2, 0x90, 0x06, 0x11, 0x7f, 0x10, 0x20, 0xec, 0xb5, 0x69, 0x20, 0x64, 0x4d, - 0xe8, 0x18, 0xfe, 0x10, 0x7d, 0x33, 0xb4, 0x06, 0x22, 0x92, 0xeb, 0x50, 0xac, 0xf5, 0x5c, 0x8f, - 0x76, 0x9a, 0x5a, 0x74, 0xbd, 0x23, 0x60, 0x56, 0x5c, 0x4a, 0x3e, 0x84, 0xf3, 0x82, 0x48, 0x2a, - 0x1c, 0xd1, 0x03, 0x5c, 0xd7, 0xf0, 0x1d, 0xac, 0x98, 0x0b, 0x52, 0x4d, 0xd9, 0xa2, 0x4b, 0xb2, - 0x29, 0x49, 0x0d, 0x2a, 0x8b, 0x78, 0x4e, 0x2a, 0x1f, 0x94, 0xf6, 0x03, 0x91, 0xf8, 0x19, 0x35, - 0x17, 0x3f, 0x43, 0xb5, 0xdd, 0xb8, 0xd0, 0xea, 0x43, 0x27, 0xf7, 0xe1, 0x6c, 0x1a, 0xc6, 0xf4, - 0x71, 0x29, 0x79, 0xf0, 0xad, 0x8f, 0x0b, 0x2a, 0xe6, 0x2c, 0x2a, 0xb2, 0x0d, 0xd3, 0xb5, 0x28, - 0x0a, 0xbc, 0xed, 0x5e, 0x44, 0x53, 0xaa, 0x4b, 0x3a, 0x1a, 0xe3, 0x72, 0xa9, 0xbe, 0x9e, 0x13, - 0xc2, 0x78, 0xd6, 0x89, 0x29, 0x63, 0x15, 0x66, 0xf5, 0xb3, 0x23, 0x6e, 0xfc, 0x66, 0xa4, 0x78, - 0x57, 0x51, 0x5c, 0x89, 0x92, 0x0e, 0xdd, 0x5a, 0x78, 0xd0, 0x6e, 0xd3, 0x28, 0xc0, 0x93, 0x7b, - 0x7c, 0x77, 0xd1, 0x14, 0x31, 0x40, 0x97, 0x95, 0xa7, 0x52, 0xf1, 0x6d, 0x4d, 0x2d, 0x3c, 0x52, - 0xe3, 0xa9, 0x2d, 0x1f, 0xe5, 0x21, 0x97, 0x8f, 0x16, 0x4c, 0x2f, 0x76, 0x9a, 0xc1, 0x01, 0xde, - 0xcd, 0x94, 0x95, 0x9b, 0x38, 0xa1, 0x72, 0xf2, 0x51, 0x95, 0x2b, 0x8e, 0x94, 0xb0, 0xac, 0xea, - 0xf5, 0x33, 0x36, 0xff, 0x1f, 0xa8, 0xa4, 0xfb, 0xf2, 0x09, 0x1f, 0xca, 0x3e, 0x4d, 0x68, 0x36, - 0x1b, 0xe9, 0x74, 0x5b, 0xc8, 0xac, 0xf6, 0x1a, 0xb2, 0x91, 0xdc, 0xde, 0x57, 0xde, 0x2d, 0xd6, - 0xde, 0x40, 0x96, 0xd3, 0x38, 0x97, 0x35, 0x8d, 0xcd, 0x5f, 0xcc, 0xc1, 0x34, 0x8f, 0x26, 0x7d, - 0xf6, 0x6d, 0xc5, 0xf7, 0x34, 0xe5, 0x2c, 0x7d, 0x81, 0xa9, 0xd6, 0x1d, 0x63, 0x2d, 0x7e, 0x1d, - 0xce, 0xf7, 0x75, 0x05, 0x2a, 0xe8, 0x05, 0x19, 0xc7, 0xdb, 0xa7, 0xa2, 0x67, 0xb2, 0x3f, 0xb2, - 0x79, 0xdb, 0xea, 0xa3, 0x30, 0xff, 0x5e, 0xae, 0x8f, 0xbf, 0xb0, 0x1b, 0x55, 0x4b, 0xd0, 0x38, - 0x9d, 0x25, 0x98, 0xfb, 0x58, 0x96, 0x60, 0x7e, 0x18, 0x4b, 0xf0, 0x43, 0x98, 0x58, 0xa7, 0x0e, - 0xb3, 0x68, 0xc4, 0x75, 0xb9, 0x82, 0xf6, 0x52, 0x31, 0x2b, 0x93, 0xfa, 0x25, 0xbe, 0x6a, 0x1b, - 0x31, 0x02, 0xa6, 0x5a, 0xf8, 0xfd, 0x39, 0x4b, 0xe7, 0xa0, 0x2e, 0x1a, 0x23, 0x83, 0x17, 0x0d, - 0x33, 0x80, 0xf1, 0x46, 0x63, 0x75, 0xcb, 0x09, 0x98, 0xb6, 0x08, 0x99, 0xc9, 0x28, 0xc3, 0x44, - 0x8d, 0x44, 0xf1, 0xf6, 0xc7, 0x87, 0x4a, 0x2c, 0xa6, 0x58, 0x24, 0xb1, 0x08, 0xa9, 0xe0, 0x11, - 0x71, 0x02, 0xa6, 0x45, 0xc4, 0x09, 0x98, 0xf9, 0x77, 0x0b, 0x50, 0xe1, 0xa1, 0x8f, 0x6c, 0xdf, - 0x2b, 0x52, 0xf4, 0xf4, 0x3d, 0xd5, 0x60, 0x9c, 0xfe, 0xa9, 0x86, 0x8f, 0x11, 0x63, 0xab, 0xdc, - 0xc5, 0xce, 0x0f, 0x71, 0x17, 0xfb, 0x2d, 0xed, 0x22, 0x73, 0x21, 0x79, 0x0b, 0x74, 0xbf, 0xb7, - 0x4d, 0x8f, 0xbf, 0xc2, 0xfc, 0xa6, 0x7a, 0xe3, 0x78, 0x24, 0x89, 0x3e, 0x41, 0xca, 0x63, 0xee, - 0x1a, 0xc7, 0x5a, 0x6c, 0xf4, 0x34, 0xf1, 0xe6, 0x63, 0xff, 0x57, 0xe3, 0xcd, 0x17, 0x01, 0x94, - 0xbc, 0x2d, 0xc5, 0xe4, 0x49, 0xd0, 0x93, 0x73, 0xb6, 0x28, 0x84, 0xe6, 0x7f, 0x28, 0xc2, 0x74, - 0xa3, 0xb1, 0xba, 0xe0, 0x39, 0xbb, 0x1d, 0x3f, 0x8c, 0xbc, 0xe6, 0x52, 0x67, 0xc7, 0x67, 0x53, - 0x78, 0x9d, 0x86, 0xd1, 0x9d, 0x96, 0xff, 0x48, 0x8d, 0x7d, 0x8e, 0x68, 0x18, 0xd9, 0x3b, 0x2d, - 0xff, 0x91, 0x15, 0x17, 0xb3, 0x25, 0x62, 0x31, 0x08, 0xe2, 0xd7, 0x47, 0x70, 0x89, 0xa0, 0x0c, - 0x60, 0x71, 0x38, 0x9b, 0x25, 0x8d, 0x1e, 0x4f, 0xc0, 0xc1, 0x93, 0xbd, 0xe1, 0x2c, 0x09, 0x39, - 0xc8, 0x92, 0x65, 0x84, 0xf6, 0x0b, 0xac, 0xd0, 0x9a, 0x17, 0xb5, 0xa8, 0xf5, 0xa4, 0x58, 0x3c, - 0x63, 0x87, 0x50, 0x1c, 0x5d, 0xbb, 0x8b, 0x70, 0xd5, 0x78, 0xef, 0x9b, 0x03, 0x11, 0x9c, 0x67, - 0xc6, 0x65, 0xbf, 0xcd, 0x31, 0x72, 0xbc, 0xcd, 0xf1, 0xb2, 0xd0, 0x09, 0xcf, 0x67, 0xd8, 0x1c, - 0xea, 0xe3, 0x04, 0x99, 0xcc, 0xc9, 0x2f, 0x1a, 0xf0, 0x7c, 0x66, 0x49, 0x3c, 0xb1, 0xf5, 0x4b, - 0x03, 0x8a, 0xbe, 0xc0, 0x7c, 0x25, 0x9f, 0xc5, 0x5b, 0x1a, 0x19, 0x9f, 0xb6, 0x33, 0xb4, 0xc0, - 0xf1, 0x5f, 0x22, 0xff, 0xc2, 0x80, 0x8b, 0x1a, 0x06, 0x26, 0x3a, 0x6c, 0xd3, 0xce, 0x49, 0x22, - 0xfd, 0xd1, 0xd3, 0x11, 0xe9, 0x17, 0xf5, 0xb6, 0xf0, 0x64, 0xd0, 0xf8, 0x79, 0x75, 0x93, 0x38, - 0xa0, 0x86, 0xe4, 0x27, 0x61, 0x1a, 0x8b, 0xa4, 0xe9, 0xc3, 0xc4, 0x15, 0xa5, 0xbf, 0x5c, 0x9f, - 0xfb, 0xd3, 0xc3, 0xea, 0x84, 0x56, 0x80, 0x37, 0x0a, 0xf1, 0x6b, 0xb1, 0xa5, 0xe4, 0x75, 0x76, - 0x7c, 0x2d, 0xb1, 0x69, 0x9a, 0x19, 0xf9, 0xd7, 0x06, 0xcc, 0x30, 0x28, 0xaf, 0xf0, 0x9d, 0xc0, - 0x6f, 0xc7, 0xe5, 0x27, 0xe4, 0x09, 0x68, 0x3d, 0x9d, 0x0e, 0x7a, 0x19, 0xab, 0xcc, 0x27, 0xbe, - 0xbd, 0x13, 0xf8, 0xed, 0xa4, 0xfa, 0x5a, 0xae, 0x90, 0x41, 0x95, 0x24, 0x3f, 0x6f, 0xc0, 0x25, - 0x6d, 0x07, 0xa5, 0xde, 0xc7, 0x4b, 0xf9, 0x05, 0xd4, 0xa2, 0xfa, 0x4d, 0x21, 0xe4, 0xd7, 0xb0, - 0x06, 0xc9, 0x92, 0x80, 0x75, 0xb1, 0xdb, 0x1c, 0x4b, 0xa9, 0xc2, 0xe0, 0xaf, 0x98, 0xdf, 0xca, - 0xc1, 0xb8, 0xb2, 0xa6, 0x92, 0xcf, 0x43, 0x79, 0x35, 0xd8, 0x75, 0x3a, 0xde, 0x4f, 0x39, 0xca, - 0x99, 0x23, 0xae, 0xd9, 0xbe, 0x02, 0xb7, 0x34, 0x2c, 0x8c, 0x15, 0xa5, 0x4e, 0x5b, 0xb5, 0xf6, - 0xd8, 0x9a, 0x6c, 0x21, 0xf4, 0x94, 0xeb, 0xca, 0xfb, 0x19, 0xeb, 0xca, 0xa9, 0x12, 0x64, 0xbc, - 0xd3, 0xbf, 0xba, 0x0c, 0x9f, 0xcf, 0xc2, 0xfc, 0xe5, 0x1c, 0x54, 0xc4, 0x43, 0xf6, 0xf2, 0xc4, - 0xec, 0xd3, 0xf5, 0xf0, 0x95, 0xde, 0xb8, 0x63, 0x62, 0x42, 0x0a, 0xbf, 0xfe, 0xdb, 0x55, 0x7c, - 0x96, 0x3c, 0xdd, 0x1d, 0xf2, 0x59, 0x72, 0x1d, 0x9e, 0xbe, 0x2e, 0x97, 0xa6, 0xb2, 0xd2, 0xf8, - 0xe6, 0x1f, 0xe7, 0xd2, 0xbc, 0x85, 0x0b, 0xe1, 0x65, 0x18, 0xe3, 0xef, 0x90, 0xca, 0x1b, 0x3d, - 0x22, 0xb1, 0x23, 0x82, 0x2c, 0x59, 0x76, 0x9a, 0x8b, 0x93, 0x27, 0xbd, 0x4d, 0x4f, 0xde, 0x84, - 0x32, 0x06, 0x49, 0xd6, 0x5c, 0x37, 0x60, 0x4b, 0x60, 0x21, 0xc9, 0xe1, 0xf8, 0x88, 0x6e, 0xdb, - 0x3c, 0x98, 0xd2, 0x71, 0xdd, 0xc0, 0xd2, 0xf0, 0xc8, 0x3c, 0x9c, 0xd3, 0x62, 0x72, 0x25, 0xfd, - 0x48, 0xb2, 0x45, 0x8a, 0xb0, 0x80, 0x13, 0x67, 0x22, 0x63, 0x1a, 0x63, 0xbf, 0xc5, 0xd6, 0x30, - 0xb4, 0x6c, 0xf4, 0xfc, 0x77, 0x72, 0xd2, 0xcb, 0x83, 0x7a, 0x82, 0x89, 0x27, 0xda, 0x4e, 0x57, - 0xcb, 0xe5, 0xc2, 0x11, 0xcd, 0xbf, 0x30, 0xd8, 0x5c, 0x6b, 0xee, 0x7f, 0xca, 0xae, 0x74, 0xb2, - 0x26, 0x1d, 0xe3, 0xe1, 0xfa, 0x77, 0x06, 0xbf, 0x94, 0x25, 0xc4, 0xe7, 0x2d, 0x18, 0xe5, 0xaf, - 0x9e, 0x8a, 0xeb, 0x43, 0x2a, 0x17, 0x5e, 0x90, 0x04, 0x65, 0xf0, 0xb7, 0x53, 0x2d, 0x41, 0xa0, - 0x1a, 0xfd, 0xb9, 0xa1, 0x8c, 0x7e, 0x25, 0x29, 0xfb, 0x70, 0x8f, 0x7d, 0x18, 0x27, 0x27, 0x65, - 0x37, 0xff, 0x77, 0x8e, 0xb7, 0x47, 0x54, 0x6a, 0xd8, 0x34, 0xc0, 0xd7, 0xa0, 0x80, 0xef, 0xeb, - 0x2b, 0xb9, 0x96, 0x53, 0x6f, 0xeb, 0x63, 0x39, 0x9b, 0x37, 0xa8, 0x6b, 0xd5, 0x5b, 0xc4, 0xa8, - 0x8e, 0xd5, 0x79, 0x83, 0x18, 0xf8, 0x94, 0x86, 0xef, 0x52, 0x75, 0x3a, 0x74, 0xf4, 0x57, 0x4f, - 0xb0, 0x9c, 0x59, 0xf4, 0xf1, 0x65, 0x1e, 0xd5, 0x8b, 0xdf, 0xde, 0x71, 0x6c, 0x7e, 0x89, 0x44, - 0xd5, 0xb6, 0xc9, 0xbd, 0x9f, 0x45, 0x98, 0xd4, 0x53, 0x8c, 0x08, 0x4f, 0x1b, 0xa6, 0x05, 0x48, - 0xa5, 0x27, 0x51, 0x7d, 0x3a, 0x3a, 0x11, 0xdb, 0x31, 0x69, 0x79, 0x24, 0xd4, 0x0c, 0xf4, 0x3c, - 0x75, 0x9c, 0xdd, 0x9f, 0x00, 0x49, 0x27, 0x51, 0x4e, 0x89, 0x3f, 0x07, 0x15, 0x31, 0x33, 0xe3, - 0x0b, 0xdd, 0xe8, 0xcf, 0x58, 0x5a, 0xb0, 0xd4, 0xd9, 0xd4, 0xf4, 0xdc, 0xc0, 0x42, 0xa8, 0xf9, - 0x5d, 0x03, 0x2e, 0x89, 0xd7, 0x5c, 0x2d, 0x1a, 0x46, 0x81, 0xc7, 0xef, 0x87, 0xa3, 0x3c, 0x7e, - 0x9e, 0xbc, 0x23, 0xb3, 0x52, 0xea, 0x0a, 0x32, 0xfd, 0x8d, 0xfa, 0x84, 0x10, 0xca, 0x11, 0xcc, - 0x4b, 0x29, 0xb3, 0x51, 0xbe, 0x25, 0xb2, 0x51, 0xe6, 0x8e, 0x27, 0x8e, 0xe7, 0x85, 0x4b, 0x3b, - 0x32, 0x0b, 0xe5, 0x77, 0x72, 0x70, 0x3e, 0xa3, 0x5a, 0x9b, 0x9f, 0x7f, 0x46, 0x95, 0x43, 0x5d, - 0x53, 0x0e, 0x32, 0x5d, 0xf1, 0xc0, 0x8e, 0xcf, 0xd4, 0x15, 0xbf, 0x69, 0xc0, 0x45, 0x5d, 0x7a, - 0x84, 0x03, 0x76, 0xf3, 0x36, 0x79, 0x1b, 0x46, 0xef, 0x51, 0xc7, 0xa5, 0xf2, 0xde, 0xe1, 0xf9, - 0x54, 0x8e, 0x76, 0x5e, 0xc8, 0xd9, 0xfe, 0x31, 0x9f, 0xca, 0x67, 0x2c, 0x41, 0x42, 0x16, 0x44, - 0xe5, 0x78, 0x4c, 0x86, 0x29, 0xc3, 0x13, 0xb2, 0x3e, 0x75, 0x8c, 0x37, 0xe8, 0x77, 0x0d, 0x78, - 0xee, 0x18, 0x1a, 0x36, 0x70, 0x6c, 0xe8, 0xd5, 0x81, 0xc3, 0x85, 0x05, 0xa1, 0xe4, 0x3d, 0x98, - 0x5a, 0x17, 0xa6, 0xab, 0x1c, 0x0e, 0xe5, 0x69, 0x1b, 0x69, 0xd5, 0xda, 0x72, 0x5c, 0xd2, 0xc8, - 0xe4, 0x3a, 0x14, 0xef, 0xf9, 0x61, 0xd4, 0x49, 0x72, 0xbc, 0xa1, 0xcb, 0x7b, 0x4f, 0xc0, 0xac, - 0xb8, 0x94, 0x99, 0x05, 0x7a, 0x35, 0x45, 0x0c, 0xe0, 0x8b, 0x30, 0xca, 0x70, 0x62, 0x97, 0x12, - 0xca, 0x01, 0xbe, 0x35, 0xea, 0xb9, 0x96, 0x28, 0x8a, 0x9d, 0x99, 0xb9, 0xcc, 0xa3, 0xfa, 0x6f, - 0x19, 0x50, 0xd1, 0x79, 0x3f, 0xe9, 0xd0, 0xbc, 0xab, 0x0d, 0xcd, 0x73, 0xd9, 0x43, 0x33, 0x78, - 0x4c, 0xfa, 0xd2, 0x2d, 0x0d, 0x35, 0x16, 0x26, 0x8c, 0x2e, 0xf8, 0x6d, 0xc7, 0xeb, 0xa8, 0x29, - 0x82, 0x5c, 0x84, 0x58, 0xa2, 0x44, 0xe9, 0xad, 0xfc, 0xc0, 0xde, 0x32, 0x7f, 0xa5, 0x00, 0x97, - 0x2c, 0xba, 0xeb, 0x31, 0x03, 0x69, 0x23, 0xf4, 0x3a, 0xbb, 0x5a, 0x20, 0x85, 0x99, 0xea, 0x70, - 0x11, 0x3e, 0xce, 0x20, 0x71, 0x7f, 0xbf, 0x0a, 0x45, 0xa6, 0xa5, 0x95, 0x3e, 0x47, 0x37, 0x01, - 0x26, 0xba, 0xe3, 0xe3, 0x2a, 0x8b, 0xc9, 0x0d, 0xb1, 0x86, 0x28, 0x17, 0x7c, 0xd8, 0x1a, 0xf2, - 0xa3, 0xc3, 0x2a, 0xf0, 0xb7, 0x25, 0x58, 0xa9, 0x58, 0x47, 0x62, 0xa3, 0xaa, 0x30, 0xc0, 0xa8, - 0x7a, 0x00, 0xe7, 0x6a, 0x2e, 0xd7, 0x4f, 0x4e, 0x6b, 0x2d, 0xf0, 0x3a, 0x4d, 0xaf, 0xeb, 0xb4, - 0xa4, 0x51, 0x8e, 0xce, 0x22, 0x27, 0x2e, 0xb7, 0xbb, 0x31, 0x82, 0x95, 0x49, 0xc6, 0x9a, 0xb1, - 0xb0, 0xd2, 0xe0, 0x79, 0xcc, 0xb8, 0x07, 0x08, 0x9b, 0xe1, 0x76, 0x42, 0x9e, 0xc8, 0xcc, 0x8a, - 0x8b, 0xd1, 0x9c, 0xc3, 0x3b, 0x7e, 0xeb, 0xcb, 0x8d, 0xfb, 0xe2, 0xce, 0x9c, 0x8c, 0x3f, 0xe6, - 0x57, 0x02, 0xa3, 0x56, 0x88, 0x4e, 0x6b, 0x0d, 0x2f, 0xa1, 0x6b, 0x34, 0xee, 0x31, 0xba, 0x62, - 0x1f, 0x5d, 0x18, 0xee, 0xa9, 0x74, 0x1c, 0x8f, 0xcc, 0x02, 0xf0, 0x08, 0x4e, 0x14, 0x88, 0x52, - 0x62, 0xfc, 0x05, 0x08, 0xe5, 0xc6, 0x9f, 0x82, 0x42, 0xde, 0x81, 0xb3, 0x8b, 0xf3, 0x73, 0xf2, - 0x32, 0xdc, 0x82, 0xdf, 0xec, 0xb1, 0x7d, 0x33, 0x5e, 0xce, 0x2c, 0xf3, 0x31, 0xa4, 0xcd, 0x39, - 0x26, 0x05, 0x59, 0x68, 0xe2, 0x4a, 0x1c, 0xbf, 0x50, 0x3d, 0xef, 0xbb, 0x34, 0xdc, 0xbc, 0xf5, - 0x29, 0xbb, 0x12, 0xa7, 0xb4, 0x0d, 0x67, 0xdb, 0xad, 0xcc, 0x99, 0xf9, 0x37, 0xf1, 0x4a, 0x5c, - 0x1f, 0x2e, 0xf9, 0x31, 0x18, 0xc1, 0x9f, 0x62, 0xc5, 0x3d, 0x9b, 0xc1, 0x36, 0x59, 0x6d, 0x9b, - 0x3c, 0x25, 0x15, 0x12, 0x90, 0xa5, 0xe4, 0xe5, 0x9e, 0x53, 0x5c, 0xec, 0x10, 0x59, 0x19, 0xf4, - 0x27, 0xdb, 0x5c, 0x28, 0xab, 0x1f, 0x64, 0x32, 0x72, 0xcf, 0x09, 0xf7, 0xa8, 0x3b, 0x2f, 0x1f, - 0x7a, 0x2e, 0x73, 0x19, 0xd9, 0x43, 0x28, 0x3e, 0x27, 0x67, 0x29, 0x28, 0x4c, 0x3b, 0x2c, 0x85, - 0x1b, 0xa1, 0xa8, 0x8a, 0xd8, 0x05, 0x79, 0xb8, 0x7b, 0x75, 0x2d, 0x51, 0x84, 0xda, 0x52, 0xfa, - 0x09, 0x03, 0xa7, 0xb9, 0x4f, 0x83, 0xcd, 0x5b, 0x9f, 0x84, 0xb6, 0xd4, 0xbf, 0x71, 0xcc, 0x98, - 0x7c, 0x13, 0xe2, 0x8c, 0x6a, 0x1a, 0x32, 0xb3, 0x11, 0x93, 0x70, 0x34, 0x23, 0xb1, 0x11, 0x93, - 0x70, 0x34, 0xd5, 0x46, 0x8c, 0x51, 0xe3, 0xb4, 0xfa, 0xb9, 0x13, 0xd2, 0xea, 0x0f, 0x78, 0x42, - 0x44, 0xde, 0x64, 0xf8, 0x14, 0x3d, 0xda, 0xf4, 0x45, 0x28, 0xd7, 0xa2, 0xc8, 0x69, 0xee, 0x51, - 0x17, 0x9f, 0x6f, 0x50, 0xa2, 0x60, 0x1c, 0x01, 0x57, 0x63, 0xa4, 0x55, 0x5c, 0xe5, 0xd1, 0xb6, - 0xb1, 0x21, 0x1e, 0x6d, 0x9b, 0x85, 0xb1, 0xa5, 0xce, 0x43, 0x8f, 0xf5, 0x49, 0x31, 0xc9, 0x88, - 0xe4, 0x71, 0x90, 0xfe, 0xd2, 0x17, 0x82, 0xc8, 0x5b, 0x8a, 0x05, 0x51, 0x4a, 0x4c, 0x79, 0xbe, - 0xcd, 0xb2, 0xa5, 0x21, 0xa1, 0x1e, 0x3f, 0x48, 0x74, 0xf2, 0x26, 0x8c, 0xc9, 0xdd, 0x33, 0x24, - 0xe6, 0xbb, 0xa0, 0x74, 0x78, 0x89, 0x96, 0x84, 0x49, 0xec, 0x9e, 0xdf, 0xd1, 0x2f, 0x4d, 0x8e, - 0x2b, 0xc9, 0x48, 0x94, 0x4b, 0x93, 0x5a, 0x32, 0x12, 0xe5, 0xfa, 0x64, 0xbc, 0x19, 0x2a, 0x9f, - 0xb8, 0x19, 0xda, 0x84, 0xf2, 0x9a, 0x13, 0x44, 0x1e, 0x5b, 0x8e, 0x3a, 0x11, 0xcf, 0x86, 0x99, - 0xec, 0xd5, 0x95, 0xa2, 0xe4, 0x25, 0x9f, 0xae, 0x82, 0xaf, 0x67, 0x73, 0x48, 0xe0, 0x64, 0x25, - 0x23, 0xac, 0x5e, 0x64, 0x88, 0x46, 0xd7, 0xb9, 0x9a, 0x8e, 0x98, 0x97, 0xaa, 0x9e, 0xd1, 0xfe, - 0x88, 0xfc, 0xdb, 0x7c, 0x0c, 0x70, 0xcf, 0x38, 0x85, 0x6c, 0x30, 0xa5, 0x16, 0xda, 0x15, 0xa9, - 0x8d, 0x63, 0x8c, 0x48, 0xbe, 0x06, 0x65, 0xf6, 0x3f, 0xa6, 0x06, 0xf4, 0x28, 0xcf, 0x76, 0x99, - 0x84, 0x59, 0xeb, 0x13, 0x9a, 0xe7, 0x0f, 0x6c, 0xd0, 0x88, 0x4f, 0x60, 0x64, 0x9c, 0x76, 0xbc, - 0x68, 0xdc, 0xc8, 0xfb, 0x50, 0x56, 0x53, 0x8b, 0xce, 0x4c, 0x27, 0x81, 0x11, 0xae, 0x80, 0xa7, - 0x47, 0x49, 0x23, 0x60, 0xeb, 0x57, 0xad, 0xdb, 0x45, 0x5a, 0xa2, 0x48, 0x7b, 0xb7, 0x9b, 0x26, - 0x93, 0x68, 0xe4, 0x4b, 0x50, 0xae, 0x75, 0xbb, 0x89, 0xc6, 0x39, 0xab, 0x6c, 0x09, 0xbb, 0x5d, - 0x3b, 0x53, 0xeb, 0x68, 0x14, 0x4c, 0xb0, 0x84, 0xc1, 0x87, 0xdf, 0x3d, 0x97, 0x08, 0x96, 0x4c, - 0x98, 0x99, 0x16, 0x2c, 0x05, 0xdd, 0xfc, 0xa1, 0x01, 0x17, 0x07, 0x74, 0xdb, 0xd0, 0x2f, 0x54, - 0xce, 0x26, 0x6b, 0xb0, 0xe2, 0x8e, 0x10, 0x6b, 0xb0, 0xda, 0x68, 0xb9, 0x1a, 0x67, 0xa7, 0xe6, - 0xcc, 0x7f, 0x62, 0xa9, 0x39, 0xcd, 0x43, 0x03, 0xc6, 0x15, 0x61, 0x7e, 0x8a, 0x2f, 0x42, 0x5d, - 0x13, 0x39, 0xaa, 0xf3, 0x09, 0x5e, 0x3b, 0xe5, 0x7a, 0xc0, 0x9c, 0xd4, 0x5f, 0x07, 0x58, 0x76, - 0xc2, 0xa8, 0xd6, 0x8c, 0xbc, 0x87, 0x74, 0x08, 0xcd, 0x9d, 0x24, 0xe4, 0x71, 0x30, 0xb1, 0x3c, - 0x23, 0xeb, 0x4b, 0xc8, 0x13, 0x33, 0x34, 0x57, 0x60, 0xb4, 0xe1, 0x07, 0x51, 0xfd, 0x80, 0x2f, - 0xc7, 0x0b, 0x34, 0x6c, 0xaa, 0x4e, 0x49, 0x0f, 0xdd, 0x13, 0x4d, 0x4b, 0x14, 0x31, 0x9b, 0xf8, - 0x8e, 0x47, 0x5b, 0xae, 0x7a, 0xcc, 0xb6, 0xc3, 0x00, 0x16, 0x87, 0xdf, 0x78, 0x1f, 0xa6, 0xa4, - 0x60, 0xaf, 0x2f, 0x37, 0xb0, 0x05, 0x53, 0x30, 0xbe, 0xb9, 0x68, 0x2d, 0xdd, 0xf9, 0x8a, 0x7d, - 0x67, 0x63, 0x79, 0xb9, 0x72, 0x86, 0x4c, 0x40, 0x49, 0x00, 0xe6, 0x6b, 0x15, 0x83, 0x94, 0xa1, - 0xb8, 0xb4, 0xd2, 0x58, 0x9c, 0xdf, 0xb0, 0x16, 0x2b, 0xb9, 0x1b, 0x2f, 0xc3, 0x64, 0x12, 0x67, - 0x81, 0xb9, 0x18, 0xc6, 0x20, 0x6f, 0xd5, 0xb6, 0x2a, 0x67, 0x08, 0xc0, 0xe8, 0xda, 0xfd, 0xf9, - 0xc6, 0xad, 0x5b, 0x15, 0xe3, 0xc6, 0xe7, 0x60, 0x1a, 0x1d, 0x95, 0xcb, 0x6c, 0xdf, 0xd0, 0xa1, - 0x01, 0x7e, 0xa9, 0x0c, 0xc5, 0x06, 0xed, 0x3a, 0x81, 0x13, 0x51, 0xfe, 0x99, 0x07, 0xbd, 0x56, - 0xe4, 0x75, 0x5b, 0xf4, 0x71, 0xc5, 0xb8, 0xf1, 0x16, 0x4c, 0x59, 0x7e, 0x2f, 0xf2, 0x3a, 0xbb, - 0x32, 0xa5, 0x3e, 0x39, 0x0f, 0xd3, 0x1b, 0x2b, 0xb5, 0x07, 0xf5, 0xa5, 0xbb, 0x1b, 0xab, 0x1b, - 0x0d, 0xfb, 0x41, 0x6d, 0x7d, 0xfe, 0x5e, 0xe5, 0x0c, 0xab, 0xf0, 0x83, 0xd5, 0xc6, 0xba, 0x6d, - 0x2d, 0xce, 0x2f, 0xae, 0xac, 0x57, 0x8c, 0x1b, 0xbf, 0x64, 0xc0, 0xa4, 0xfe, 0xfa, 0x31, 0xb9, - 0x0a, 0x57, 0x36, 0x1a, 0x8b, 0x96, 0xbd, 0xbe, 0x7a, 0x7f, 0x71, 0xc5, 0xde, 0x68, 0xd4, 0xee, - 0x2e, 0xda, 0x1b, 0x2b, 0x8d, 0xb5, 0xc5, 0xf9, 0xa5, 0x3b, 0x4b, 0x8b, 0x0b, 0x95, 0x33, 0xa4, - 0x0a, 0xcf, 0x29, 0x18, 0xd6, 0xe2, 0xfc, 0xea, 0xe6, 0xa2, 0x65, 0xaf, 0xd5, 0x1a, 0x8d, 0xad, - 0x55, 0x6b, 0xa1, 0x62, 0x90, 0xcb, 0x70, 0x21, 0x03, 0xe1, 0xc1, 0x9d, 0x5a, 0x25, 0xd7, 0x57, - 0xb6, 0xb2, 0xb8, 0x55, 0x5b, 0xb6, 0xeb, 0xab, 0xeb, 0x95, 0xfc, 0x8d, 0xf7, 0x99, 0xe1, 0x95, - 0xbc, 0x1b, 0x46, 0x8a, 0x50, 0x58, 0x59, 0x5d, 0x59, 0xac, 0x9c, 0x21, 0xe3, 0x30, 0xb6, 0xb6, - 0xb8, 0xb2, 0xb0, 0xb4, 0x72, 0x97, 0x77, 0x6b, 0x6d, 0x6d, 0xcd, 0x5a, 0xdd, 0x5c, 0x5c, 0xa8, - 0xe4, 0x58, 0xdf, 0x2d, 0x2c, 0xae, 0xb0, 0x9a, 0xe5, 0x6f, 0x98, 0xfc, 0xc9, 0x0a, 0x2d, 0x17, - 0x3a, 0xeb, 0xad, 0xc5, 0x2f, 0xaf, 0x2f, 0xae, 0x34, 0x96, 0x56, 0x57, 0x2a, 0x67, 0x6e, 0x5c, - 0x49, 0xe1, 0xc8, 0x91, 0x68, 0x34, 0xee, 0x55, 0xce, 0xdc, 0xf8, 0x1a, 0x94, 0x55, 0xbb, 0x83, - 0x5c, 0x84, 0xb3, 0xea, 0xef, 0x35, 0xda, 0x71, 0xbd, 0xce, 0x6e, 0xe5, 0x4c, 0xba, 0xc0, 0xea, - 0x75, 0x3a, 0xac, 0x00, 0x1b, 0xaf, 0x16, 0xac, 0xd3, 0xa0, 0xed, 0x75, 0x98, 0x49, 0x51, 0xc9, - 0xd5, 0x2b, 0xdf, 0xff, 0xb3, 0x17, 0xce, 0x7c, 0xff, 0x07, 0x2f, 0x18, 0x7f, 0xfc, 0x83, 0x17, - 0x8c, 0xff, 0xfa, 0x83, 0x17, 0x8c, 0xed, 0x51, 0x14, 0xf4, 0xdb, 0xff, 0x27, 0x00, 0x00, 0xff, - 0xff, 0x11, 0x37, 0xc5, 0x3a, 0xb0, 0xc0, 0x00, 0x00, + 0x5a, 0xb7, 0x2b, 0xf7, 0xde, 0xb1, 0x79, 0xd5, 0xed, 0xa2, 0xc1, 0x33, 0xe9, 0x74, 0xbb, 0xfa, + 0x4e, 0x1a, 0xb1, 0x09, 0x05, 0x72, 0xbf, 0xb7, 0x4d, 0x83, 0x0e, 0x8d, 0x68, 0x28, 0xd6, 0xce, + 0x70, 0x06, 0x90, 0xc7, 0x8c, 0x3c, 0xe2, 0x48, 0x23, 0x70, 0xad, 0xbe, 0xdf, 0xdb, 0xa6, 0xb6, + 0x58, 0x84, 0xd5, 0xbe, 0xcb, 0x60, 0x78, 0xb9, 0x01, 0x93, 0x7a, 0xff, 0x3f, 0x01, 0x9b, 0xf4, + 0xfd, 0x42, 0xb1, 0x58, 0x29, 0x99, 0xbf, 0x90, 0x83, 0xf1, 0x5a, 0xb7, 0xfb, 0x94, 0x3b, 0xc0, + 0x7e, 0x4c, 0x9b, 0xd5, 0x17, 0x92, 0xd1, 0x3b, 0x85, 0xef, 0xeb, 0xaf, 0x0c, 0x98, 0x4a, 0x51, + 0xa8, 0xb5, 0x37, 0x86, 0x74, 0x08, 0xe5, 0x86, 0x74, 0x08, 0xe5, 0x07, 0x3b, 0x84, 0xd4, 0x39, + 0x53, 0xf8, 0x38, 0x73, 0xe6, 0x25, 0xc8, 0xd7, 0xba, 0x5d, 0xd1, 0x2b, 0xe5, 0xa4, 0x57, 0x36, + 0x6f, 0xf3, 0xc5, 0xcd, 0xe9, 0x76, 0x2d, 0x86, 0x61, 0xbe, 0x0a, 0x25, 0x04, 0xa3, 0x46, 0xbb, + 0x2a, 0xa6, 0x02, 0x57, 0x67, 0x1a, 0x19, 0x17, 0x7b, 0xf3, 0x7f, 0x1b, 0x30, 0x82, 0xbf, 0x9f, + 0x52, 0x71, 0x99, 0xd3, 0xc4, 0xa5, 0xa2, 0x88, 0xcb, 0x30, 0x82, 0xf2, 0x07, 0x79, 0xec, 0x2d, + 0x21, 0x22, 0xc2, 0xa5, 0x60, 0x64, 0xb8, 0x14, 0x3e, 0x86, 0x02, 0xdf, 0x4f, 0x3b, 0x17, 0xf2, + 0x38, 0x18, 0xcf, 0xa7, 0xab, 0xfa, 0x44, 0xfc, 0x0a, 0xf7, 0x80, 0x2c, 0x75, 0x42, 0xda, 0xec, + 0x05, 0xb4, 0xb1, 0xef, 0x75, 0x37, 0x69, 0xe0, 0xed, 0x1c, 0x08, 0xd3, 0x1d, 0x75, 0xac, 0x27, + 0x4a, 0xed, 0x70, 0xdf, 0xeb, 0x32, 0x33, 0xc1, 0xdb, 0x39, 0xb0, 0x32, 0x68, 0xc8, 0xbb, 0x30, + 0x66, 0xd1, 0x47, 0x81, 0x17, 0xc9, 0x4d, 0xd4, 0x64, 0xbc, 0xfb, 0x43, 0x28, 0xb7, 0x77, 0x02, + 0xfe, 0x43, 0x1d, 0x7f, 0x51, 0xfe, 0xc9, 0xed, 0xc0, 0xbf, 0x33, 0x82, 0x73, 0xe1, 0x84, 0x83, + 0xda, 0x63, 0xfc, 0x43, 0xfa, 0x60, 0xe6, 0x4f, 0x33, 0x98, 0x9b, 0x50, 0x66, 0x9b, 0xfe, 0x94, + 0xa3, 0xe8, 0x4a, 0x32, 0x96, 0x37, 0xd5, 0xe2, 0xe3, 0xce, 0x68, 0x35, 0x3e, 0xc4, 0x4e, 0x0b, + 0x09, 0x3f, 0xfb, 0x7d, 0x56, 0x61, 0x9c, 0x21, 0x1e, 0xb1, 0xea, 0x68, 0xf2, 0xce, 0x3a, 0xb5, + 0x60, 0x8c, 0x7e, 0x3c, 0xc1, 0x18, 0xfb, 0x28, 0x82, 0x91, 0x3e, 0x1d, 0x2f, 0x9e, 0xe6, 0x74, + 0xfc, 0xf2, 0xbb, 0x30, 0xdd, 0xd7, 0xc3, 0xa7, 0x39, 0x61, 0xfe, 0xe4, 0xc4, 0xf2, 0x67, 0xe2, + 0x7e, 0x21, 0x73, 0xe8, 0x2f, 0xf0, 0x02, 0xda, 0x8c, 0x50, 0xf5, 0x0a, 0x6d, 0x19, 0x08, 0x58, + 0xca, 0x4b, 0x82, 0x30, 0xf2, 0x0e, 0x8c, 0xf1, 0x13, 0x3a, 0xbe, 0xb1, 0x1d, 0x9f, 0x9b, 0x10, + 0x5f, 0xe4, 0x50, 0x11, 0x26, 0xc1, 0x31, 0xd4, 0x5e, 0x15, 0x44, 0xe6, 0x5d, 0x18, 0x15, 0x27, + 0x7c, 0xc7, 0xcf, 0x8b, 0x2a, 0x8c, 0x6c, 0x26, 0x3d, 0x83, 0xa7, 0x32, 0xbc, 0x11, 0x16, 0x87, + 0x9b, 0xbf, 0x64, 0xc0, 0xa4, 0xde, 0x4a, 0x72, 0x13, 0x46, 0xc5, 0x11, 0xb4, 0x81, 0x47, 0xd0, + 0xac, 0x35, 0xa3, 0xfc, 0xf0, 0x59, 0x3b, 0x72, 0x16, 0x58, 0x4c, 0xf5, 0x0b, 0x0e, 0x62, 0x93, + 0x8e, 0xaa, 0x5f, 0x08, 0xa9, 0x25, 0xcb, 0xd8, 0x36, 0xce, 0xa2, 0x61, 0xaf, 0x15, 0xa9, 0xdb, + 0xb8, 0x00, 0x21, 0x96, 0x28, 0x31, 0x0f, 0x0d, 0x80, 0x46, 0xe3, 0xde, 0x7d, 0x7a, 0xb0, 0xe6, + 0x78, 0x01, 0x6e, 0x85, 0x71, 0x36, 0xde, 0x17, 0xa3, 0x55, 0x16, 0x5b, 0x61, 0x3e, 0x73, 0xf7, + 0xe9, 0x81, 0xb6, 0x15, 0x96, 0xa8, 0x38, 0xe5, 0x03, 0xef, 0xa1, 0x13, 0x51, 0x46, 0x98, 0x43, + 0x42, 0x3e, 0xe5, 0x39, 0x34, 0x45, 0xa9, 0x20, 0x93, 0xaf, 0xc1, 0x64, 0xf2, 0x0b, 0x37, 0xf4, + 0x79, 0xdc, 0x27, 0x4a, 0x89, 0xd0, 0x0b, 0xeb, 0xcf, 0x1d, 0x1d, 0x56, 0x2f, 0x2b, 0x5c, 0xd3, + 0x5b, 0xfd, 0x14, 0x33, 0xf3, 0x77, 0x0c, 0x80, 0xf5, 0xe5, 0x86, 0x6c, 0xe0, 0x35, 0x28, 0xc4, + 0x7e, 0xc4, 0x32, 0xdf, 0x6f, 0xa7, 0x36, 0x94, 0x58, 0x4e, 0x9e, 0x87, 0x7c, 0xd2, 0x92, 0xe9, + 0xa3, 0xc3, 0xea, 0x84, 0xde, 0x02, 0x56, 0x4a, 0xee, 0xc2, 0xd8, 0x50, 0x75, 0x46, 0xe9, 0xcc, + 0xa8, 0xab, 0xa4, 0xc6, 0x51, 0x78, 0x7f, 0x6b, 0xfd, 0xd3, 0x3b, 0x0a, 0xdf, 0xca, 0xc1, 0x14, + 0xeb, 0xd7, 0x5a, 0x2f, 0xda, 0xf3, 0x03, 0x2f, 0x3a, 0x78, 0x6a, 0x77, 0xc5, 0x6f, 0x69, 0x06, + 0xd1, 0x65, 0xa9, 0xb6, 0xd4, 0xb6, 0x0d, 0xb5, 0x39, 0xfe, 0xf3, 0x31, 0x38, 0x9b, 0x41, 0x45, + 0x5e, 0x11, 0xc1, 0x5f, 0x89, 0x1f, 0x0a, 0x83, 0xbb, 0x7e, 0x78, 0x58, 0x2d, 0x4b, 0xf4, 0xf5, + 0x24, 0xd8, 0x6b, 0x0e, 0xc6, 0xc5, 0xd6, 0x67, 0x25, 0xb1, 0xa8, 0x31, 0x6a, 0x48, 0x3a, 0x2d, + 0x51, 0x35, 0xa9, 0x48, 0xa4, 0x06, 0xe5, 0xf9, 0x3d, 0xda, 0xdc, 0xf7, 0x3a, 0xbb, 0xf7, 0xe9, + 0x01, 0xb7, 0x97, 0xca, 0xf5, 0x67, 0xd9, 0x4e, 0xab, 0x29, 0xe0, 0x6c, 0x48, 0xf5, 0x4d, 0x9c, + 0x46, 0x42, 0xde, 0x81, 0xf1, 0x86, 0xb7, 0xdb, 0x91, 0x1c, 0x0a, 0xc8, 0xe1, 0xca, 0xd1, 0x61, + 0xf5, 0x42, 0xc8, 0xc1, 0xfd, 0x0c, 0x54, 0x02, 0xf2, 0x32, 0x8c, 0x58, 0x7e, 0x8b, 0xf2, 0x65, + 0x58, 0x84, 0x13, 0x05, 0x0c, 0xa0, 0x3a, 0xd7, 0x11, 0x83, 0xdc, 0x83, 0x31, 0xf6, 0xcf, 0x03, + 0xa7, 0x3b, 0x33, 0x8a, 0x7a, 0x9b, 0xc4, 0x06, 0x3e, 0x42, 0xbb, 0x5e, 0x67, 0x57, 0xb5, 0xf1, + 0x5b, 0xd4, 0x6e, 0x3b, 0x5d, 0x6d, 0x5d, 0xe4, 0x88, 0x64, 0x13, 0xc6, 0x13, 0x45, 0x10, 0xce, + 0x8c, 0x69, 0x47, 0x91, 0x49, 0x49, 0xfd, 0x33, 0x82, 0xd9, 0xc5, 0xa8, 0x15, 0xa2, 0x6c, 0x77, + 0x19, 0xbe, 0xde, 0x18, 0x85, 0x91, 0xb6, 0x07, 0x29, 0x0e, 0xde, 0x83, 0x18, 0x27, 0xee, 0x41, + 0x5c, 0x00, 0xd1, 0x49, 0xb5, 0xd6, 0xae, 0x88, 0xfe, 0x7b, 0x79, 0xb0, 0x80, 0xdd, 0x4c, 0x90, + 0x71, 0x4e, 0x72, 0x6f, 0x97, 0xe8, 0x7f, 0xa7, 0xb5, 0xab, 0x79, 0xbb, 0x62, 0x54, 0xd6, 0x0d, + 0x89, 0xaa, 0x91, 0x3b, 0x70, 0xd9, 0x0d, 0x49, 0x49, 0xd2, 0x0d, 0x1f, 0x3e, 0x8a, 0x06, 0x75, + 0x83, 0xc2, 0x88, 0xac, 0x00, 0xd4, 0x9a, 0x91, 0xf7, 0x90, 0xa2, 0x48, 0x8c, 0x6b, 0x1d, 0x31, + 0x5f, 0xbb, 0x4f, 0x0f, 0x1a, 0x34, 0x4a, 0x4e, 0x05, 0x1c, 0x44, 0x4d, 0x89, 0x89, 0xa5, 0x70, + 0x20, 0x5d, 0x38, 0x5f, 0x73, 0x5d, 0x8f, 0x47, 0x84, 0xae, 0x07, 0x4c, 0x7e, 0x5d, 0x64, 0x5d, + 0xce, 0x66, 0xfd, 0xb2, 0x60, 0xfd, 0x19, 0x27, 0xa6, 0xb2, 0x23, 0x4e, 0x96, 0xfe, 0x4c, 0x36, + 0x63, 0x73, 0x15, 0x26, 0xf5, 0x2e, 0xd5, 0x63, 0x21, 0xcb, 0x50, 0xb4, 0x1a, 0x35, 0xbb, 0x71, + 0xaf, 0x76, 0xab, 0x62, 0x90, 0x0a, 0x94, 0xc5, 0xaf, 0x39, 0x7b, 0xee, 0xb5, 0xd7, 0x2b, 0x39, + 0x0d, 0xf2, 0xda, 0xad, 0xb9, 0x4a, 0xde, 0xfc, 0x03, 0x03, 0x8a, 0xb2, 0x7e, 0xe4, 0x75, 0xc8, + 0x37, 0x1a, 0xf7, 0x52, 0x27, 0xe0, 0xc9, 0xd2, 0xcb, 0x17, 0x99, 0x30, 0xdc, 0x53, 0x17, 0x99, + 0x46, 0xe3, 0x1e, 0xa3, 0x5b, 0x5f, 0x6e, 0x08, 0xa3, 0x25, 0x43, 0x5c, 0xa7, 0x07, 0x1c, 0x0b, + 0xbe, 0x0e, 0xf9, 0xf7, 0xb7, 0xd6, 0xc5, 0x6e, 0x28, 0x63, 0x7c, 0x91, 0xee, 0xc3, 0x47, 0xea, + 0xd2, 0xc7, 0x08, 0x4c, 0x0b, 0xc6, 0x95, 0xa9, 0xc5, 0x8d, 0x88, 0xb6, 0x1f, 0x47, 0x09, 0x0a, + 0x23, 0x82, 0x41, 0x2c, 0x51, 0xc2, 0x6c, 0x9e, 0x65, 0xbf, 0xe9, 0xb4, 0x84, 0x35, 0x82, 0x36, + 0x4f, 0x8b, 0x01, 0x2c, 0x0e, 0x37, 0xff, 0xc8, 0x80, 0xca, 0x5a, 0xe0, 0x3f, 0xf4, 0x98, 0x06, + 0x5e, 0xf7, 0xf7, 0x69, 0x67, 0xf3, 0x16, 0x79, 0x55, 0x2a, 0x01, 0x6e, 0xc2, 0x5d, 0x64, 0x54, + 0xa8, 0x04, 0x7e, 0x78, 0x58, 0x85, 0xc6, 0x41, 0x18, 0xd1, 0x36, 0x2b, 0x97, 0x8a, 0x40, 0x09, + 0xb6, 0xcc, 0x0d, 0x1f, 0xc0, 0x75, 0x42, 0xb0, 0x65, 0x15, 0x46, 0xb0, 0x3a, 0x4a, 0x0c, 0xcd, + 0x48, 0xc4, 0x00, 0x16, 0x87, 0x2b, 0x0a, 0xfb, 0xdb, 0xb9, 0xbe, 0x36, 0xcc, 0x7d, 0xaa, 0x82, + 0xa0, 0xf4, 0xc6, 0x0d, 0xb5, 0x88, 0x7d, 0x19, 0xce, 0xa5, 0xbb, 0x04, 0xfd, 0x22, 0x35, 0x98, + 0xd2, 0xe1, 0xd2, 0x45, 0x72, 0x31, 0xf3, 0x5b, 0x9b, 0x73, 0x56, 0x1a, 0xdf, 0xfc, 0xbe, 0x01, + 0x25, 0xfc, 0xd7, 0xea, 0xb5, 0x28, 0xb3, 0x6c, 0x6a, 0x5b, 0x0d, 0x71, 0x0c, 0xa9, 0x9e, 0xea, + 0x39, 0x8f, 0x42, 0x5b, 0x9c, 0x59, 0x6a, 0x7a, 0x24, 0x46, 0x16, 0xa4, 0xfc, 0xd0, 0x55, 0x1e, + 0x6a, 0xc5, 0xa4, 0xfc, 0x74, 0x36, 0x4c, 0x91, 0x0a, 0x64, 0x36, 0x7e, 0xec, 0x97, 0xdf, 0x92, + 0xae, 0x61, 0x1c, 0x3f, 0xa4, 0xf3, 0xb5, 0xa3, 0x13, 0x89, 0x46, 0x5e, 0x85, 0x51, 0xf6, 0x69, + 0x4b, 0x1e, 0x8c, 0xe0, 0xae, 0x02, 0xeb, 0x18, 0x68, 0x67, 0xc0, 0x1c, 0xc9, 0xfc, 0x17, 0xb9, + 0x74, 0x07, 0x0a, 0x2b, 0xe0, 0x94, 0x73, 0xe3, 0x4d, 0x18, 0xa9, 0xb5, 0x5a, 0xfe, 0x23, 0xa1, + 0x25, 0xa4, 0x9b, 0x26, 0xee, 0x3f, 0xbe, 0xc2, 0x3a, 0x0c, 0x45, 0x0b, 0x3e, 0x60, 0x00, 0x32, + 0x0f, 0xa5, 0xda, 0x56, 0x63, 0x69, 0x69, 0x61, 0x7d, 0x7d, 0x59, 0xc4, 0xb8, 0xbf, 0x28, 0xfb, + 0xc7, 0xf3, 0x5c, 0x3b, 0x8a, 0x5a, 0x03, 0x42, 0x60, 0x13, 0x3a, 0xf2, 0x36, 0xc0, 0xfb, 0xbe, + 0xd7, 0x79, 0x40, 0xa3, 0x3d, 0xdf, 0x15, 0x8d, 0x67, 0x26, 0xc5, 0xf8, 0x87, 0xbe, 0xd7, 0xb1, + 0xdb, 0x08, 0x66, 0x75, 0x4f, 0x90, 0x2c, 0xe5, 0x7f, 0xd6, 0xd3, 0x75, 0x3f, 0x42, 0x1b, 0x66, + 0x24, 0xe9, 0xe9, 0x6d, 0x3f, 0x4a, 0x9f, 0xdb, 0x48, 0x34, 0xf3, 0x97, 0x73, 0x30, 0xc9, 0x77, + 0xaa, 0x5c, 0x60, 0x9e, 0xda, 0xc9, 0xf8, 0xa6, 0x36, 0x19, 0x2f, 0xc9, 0x85, 0x41, 0x69, 0xda, + 0x50, 0x53, 0x71, 0x0f, 0x48, 0x3f, 0x0d, 0xb1, 0xa4, 0x3f, 0x65, 0x98, 0x59, 0x78, 0x2b, 0x89, + 0x18, 0x08, 0x91, 0xc8, 0x46, 0x55, 0x18, 0x5a, 0x1a, 0x0f, 0xf3, 0x97, 0x72, 0x30, 0xa1, 0xd8, + 0x93, 0x4f, 0x6d, 0xc7, 0x7f, 0x51, 0xeb, 0x78, 0x79, 0x06, 0xa1, 0xb4, 0x6c, 0xa8, 0x7e, 0xef, + 0xc1, 0x74, 0x1f, 0x49, 0xda, 0x2c, 0x37, 0x86, 0x31, 0xcb, 0x5f, 0xe9, 0x8f, 0x3e, 0xe0, 0xf1, + 0xf0, 0x71, 0xf4, 0x81, 0x1a, 0xee, 0xf0, 0xad, 0x1c, 0x9c, 0x13, 0xbf, 0x6a, 0x3d, 0xd7, 0x8b, + 0xe6, 0xfd, 0xce, 0x8e, 0xb7, 0xfb, 0xd4, 0x8e, 0x45, 0x4d, 0x1b, 0x8b, 0xaa, 0x3e, 0x16, 0x4a, + 0x03, 0x07, 0x0f, 0x89, 0xf9, 0xaf, 0x8b, 0x30, 0x33, 0x88, 0x80, 0x6d, 0xfb, 0x95, 0x5d, 0x15, + 0x6e, 0xfb, 0x53, 0x3b, 0x56, 0xbe, 0x9f, 0x4a, 0x42, 0x78, 0x72, 0x43, 0x84, 0xf0, 0x2c, 0x43, + 0x05, 0x3f, 0xd5, 0xa0, 0x21, 0xeb, 0x84, 0x30, 0x09, 0xc6, 0xbd, 0x7a, 0x74, 0x58, 0xbd, 0xe2, + 0xb0, 0x32, 0x3b, 0x14, 0x85, 0x76, 0x2f, 0xf0, 0x14, 0x1e, 0x7d, 0x94, 0xe4, 0x77, 0x0c, 0x98, + 0x44, 0xe0, 0xe2, 0x43, 0xda, 0x89, 0x90, 0x59, 0x41, 0x1c, 0xd2, 0xc4, 0x77, 0x9e, 0x1a, 0x51, + 0xe0, 0x75, 0x76, 0xd1, 0x91, 0x14, 0xd6, 0xb7, 0x59, 0x2f, 0xfc, 0xd9, 0x61, 0xf5, 0xad, 0x8f, + 0x72, 0x8f, 0x4a, 0xb0, 0x0a, 0xd9, 0x46, 0x9e, 0x57, 0x94, 0xe2, 0x67, 0x53, 0xd5, 0x4c, 0xd5, + 0x88, 0xfc, 0x38, 0x5c, 0xe4, 0x71, 0x18, 0xf3, 0x7e, 0x27, 0xf2, 0x3a, 0x3d, 0xbf, 0x17, 0xd6, + 0x9d, 0xe6, 0x7e, 0xaf, 0x1b, 0x0a, 0x67, 0x27, 0xb6, 0xbc, 0x19, 0x17, 0xda, 0xdb, 0xbc, 0x54, + 0x61, 0x39, 0x88, 0x01, 0xb9, 0x07, 0xd3, 0xbc, 0xa8, 0xd6, 0x8b, 0xfc, 0x46, 0xd3, 0x69, 0x79, + 0x9d, 0x5d, 0xf4, 0x81, 0x16, 0xeb, 0x97, 0xd9, 0xde, 0xd2, 0xe9, 0x45, 0xbe, 0x1d, 0x72, 0xb8, + 0xc2, 0xaf, 0x9f, 0x88, 0x2c, 0xc1, 0x94, 0x45, 0x1d, 0xf7, 0x81, 0xf3, 0x78, 0xde, 0xe9, 0x3a, + 0x4d, 0x2f, 0x3a, 0xc0, 0x9d, 0x59, 0xbe, 0x5e, 0x3d, 0x3a, 0xac, 0x3e, 0x13, 0x50, 0xc7, 0xb5, + 0xdb, 0xce, 0x63, 0xbb, 0x29, 0x0a, 0x15, 0x66, 0x69, 0xba, 0x98, 0x95, 0xd7, 0x89, 0x59, 0x95, + 0xd2, 0xac, 0xbc, 0xce, 0x60, 0x56, 0x09, 0x9d, 0x64, 0xb5, 0xee, 0x04, 0xbb, 0x34, 0xe2, 0x4e, + 0x42, 0xb8, 0x6a, 0x5c, 0x37, 0x14, 0x56, 0x11, 0x96, 0xd9, 0xe8, 0x30, 0x4c, 0xb3, 0x52, 0xe8, + 0x98, 0xe4, 0x6d, 0x05, 0x5e, 0x44, 0xd5, 0x16, 0x8e, 0x63, 0xb5, 0xb0, 0xff, 0xd1, 0x4d, 0x3a, + 0xa8, 0x89, 0x7d, 0x94, 0x09, 0x37, 0xa5, 0x91, 0xe5, 0x3e, 0x6e, 0xd9, 0xad, 0xec, 0xa3, 0x8c, + 0xb9, 0xa9, 0xed, 0x9c, 0xc0, 0x76, 0x2a, 0xdc, 0x06, 0x34, 0xb4, 0x8f, 0x92, 0xac, 0xb0, 0x4e, + 0x8b, 0x68, 0x87, 0x49, 0xb4, 0x70, 0x92, 0x4e, 0x62, 0xd5, 0x5e, 0x10, 0x7b, 0xea, 0x4a, 0x20, + 0x8b, 0xed, 0x0c, 0x97, 0x69, 0x9a, 0xf8, 0xfd, 0x42, 0x71, 0xa4, 0x32, 0x6a, 0x55, 0xb8, 0xc8, + 0x47, 0x4c, 0x70, 0x50, 0x17, 0x9b, 0xbf, 0x91, 0x83, 0x4b, 0x52, 0x1d, 0xd3, 0xe8, 0x91, 0x1f, + 0xec, 0x7b, 0x9d, 0xdd, 0xa7, 0x5c, 0xab, 0xde, 0xd1, 0xb4, 0xea, 0x0b, 0xa9, 0x15, 0x2e, 0xd5, + 0xca, 0x63, 0x54, 0xeb, 0x9f, 0x8e, 0xc0, 0xb3, 0xc7, 0x52, 0x91, 0x0f, 0xd8, 0x2a, 0xe8, 0xd1, + 0x4e, 0xb4, 0xe4, 0xb6, 0x28, 0xdb, 0x86, 0xf9, 0xbd, 0x48, 0x38, 0xb3, 0x9f, 0x3f, 0x3a, 0xac, + 0x9e, 0xe5, 0x57, 0x81, 0x6c, 0xcf, 0x6d, 0x51, 0x3b, 0xe2, 0xc5, 0xda, 0x30, 0xf5, 0x53, 0x33, + 0x96, 0xf1, 0xc5, 0xc4, 0xa5, 0x4e, 0x44, 0x83, 0x87, 0x0e, 0xbf, 0x11, 0x21, 0x58, 0xee, 0x53, + 0xda, 0xb5, 0x1d, 0x56, 0x6a, 0x7b, 0xa2, 0x58, 0x67, 0xd9, 0x47, 0x4d, 0xee, 0x28, 0x2c, 0xe7, + 0xd9, 0xe6, 0xe0, 0x81, 0xf3, 0x58, 0x58, 0xbc, 0xe8, 0x5f, 0x55, 0x58, 0xf2, 0x28, 0xc8, 0xb6, + 0xf3, 0xd8, 0xea, 0x27, 0x21, 0x5f, 0x83, 0xf3, 0x42, 0x71, 0x33, 0x25, 0x16, 0xf8, 0x2d, 0xd9, + 0xe2, 0x02, 0xf2, 0x7a, 0xe9, 0xe8, 0xb0, 0x7a, 0x51, 0xa8, 0x7d, 0xbb, 0xc9, 0x31, 0x32, 0x5b, + 0x9d, 0xcd, 0x85, 0xac, 0xb3, 0x85, 0x2c, 0xd5, 0x1d, 0x0f, 0x68, 0x18, 0x3a, 0xbb, 0xd2, 0x3a, + 0xe6, 0x27, 0x4a, 0x4a, 0x67, 0xda, 0x6d, 0x5e, 0x6e, 0x0d, 0xa4, 0x24, 0xf7, 0x60, 0x72, 0x8b, + 0x6e, 0xab, 0xe3, 0x33, 0x1a, 0x4f, 0xf1, 0xca, 0x23, 0xba, 0x3d, 0x78, 0x70, 0x52, 0x74, 0xc4, + 0x83, 0xe9, 0xb5, 0xc0, 0x7f, 0x7c, 0xc0, 0xb6, 0x7a, 0xb4, 0x43, 0x03, 0x0c, 0xee, 0x1a, 0x43, + 0x77, 0xd5, 0x4c, 0x62, 0x59, 0xea, 0xe5, 0xf5, 0xcf, 0x1c, 0x1d, 0x56, 0x9f, 0xed, 0x32, 0xb0, + 0xdd, 0x12, 0x70, 0x3b, 0x75, 0x2f, 0xb0, 0x9f, 0x2b, 0xf9, 0x49, 0x98, 0xb2, 0xfc, 0x5e, 0xe4, + 0x75, 0x76, 0x1b, 0x51, 0xe0, 0x44, 0x74, 0x97, 0x2b, 0xf2, 0x24, 0x8a, 0x2c, 0x55, 0xca, 0x1d, + 0xd3, 0x01, 0x07, 0xda, 0xa1, 0x80, 0x6a, 0x9a, 0x54, 0x27, 0x30, 0x7f, 0x2d, 0x07, 0x33, 0x62, + 0x18, 0x2c, 0xda, 0xf4, 0x03, 0xf7, 0xe9, 0x9f, 0xf6, 0x8b, 0xda, 0xb4, 0x7f, 0x3e, 0x8e, 0x51, + 0xca, 0x6a, 0xe4, 0x31, 0xb3, 0xfe, 0xf7, 0x0d, 0xb8, 0x72, 0x1c, 0x11, 0xeb, 0x9d, 0x38, 0xae, + 0xaf, 0xd4, 0x17, 0xbf, 0xd7, 0x85, 0xb3, 0x38, 0x9e, 0xe8, 0x38, 0x0e, 0xef, 0xf9, 0x61, 0x84, + 0xde, 0xbb, 0x9c, 0x16, 0x48, 0x50, 0xf7, 0xfd, 0x16, 0xea, 0xf9, 0xfa, 0x2b, 0x4c, 0x9d, 0xff, + 0xd9, 0x61, 0x15, 0x18, 0x88, 0x47, 0xe2, 0xb1, 0x35, 0x9f, 0x4b, 0x0c, 0xfa, 0xa5, 0x43, 0x1b, + 0xa3, 0x3f, 0xf6, 0xe9, 0x41, 0x68, 0x65, 0xb1, 0x46, 0x0f, 0x4d, 0xad, 0x17, 0xed, 0xad, 0x05, + 0x74, 0x87, 0x06, 0xb4, 0xd3, 0xa4, 0x9f, 0x32, 0x0f, 0x8d, 0xde, 0xb8, 0xa1, 0xb6, 0x27, 0x7f, + 0x39, 0x06, 0xe7, 0xb2, 0xc8, 0x58, 0xbf, 0x28, 0x16, 0x71, 0xfa, 0x12, 0xf9, 0xff, 0x6f, 0x40, + 0xb9, 0x41, 0x9b, 0x7e, 0xc7, 0xbd, 0xe3, 0x34, 0x23, 0x5f, 0x86, 0x64, 0xd8, 0x5c, 0xb3, 0x31, + 0xb8, 0xbd, 0x83, 0x05, 0x9a, 0x67, 0xe0, 0xbd, 0xe1, 0x0c, 0xd1, 0xa6, 0x8f, 0x81, 0xb0, 0x11, + 0x93, 0xc9, 0xe4, 0x13, 0x78, 0xaa, 0xa1, 0x7d, 0x94, 0xd4, 0x61, 0x62, 0xde, 0xef, 0x74, 0x28, + 0xfb, 0xa1, 0x84, 0x75, 0x62, 0x20, 0x66, 0x53, 0x16, 0xa4, 0x3d, 0x04, 0x3a, 0x09, 0xb9, 0x0d, + 0xf9, 0x8d, 0xb9, 0x3b, 0x62, 0x0c, 0x64, 0xb0, 0xda, 0xc6, 0xdc, 0x1d, 0xdc, 0xeb, 0x32, 0xfb, + 0x61, 0xa2, 0x37, 0xb7, 0xa3, 0xfa, 0x40, 0x37, 0xe6, 0xee, 0x90, 0x55, 0x98, 0xb6, 0xe8, 0xd7, + 0x7b, 0x5e, 0x40, 0xc5, 0x04, 0x78, 0x70, 0xa7, 0x86, 0x63, 0x51, 0xe4, 0x7a, 0x2c, 0xe0, 0x85, + 0xd2, 0xb6, 0xb7, 0xdb, 0x3b, 0xea, 0xc5, 0xc9, 0x7e, 0x5a, 0xf2, 0xb3, 0x70, 0x7e, 0xc1, 0x0b, + 0x45, 0x9d, 0xb9, 0xf3, 0xd1, 0xc5, 0x73, 0xc8, 0xd1, 0x01, 0xd3, 0xe1, 0x0b, 0x99, 0xd3, 0xe1, + 0x33, 0x6e, 0xcc, 0xc4, 0xe6, 0x9e, 0x4d, 0x37, 0x1d, 0x0f, 0x9b, 0xfd, 0x1d, 0xf2, 0x21, 0x4c, + 0xa2, 0xb7, 0x07, 0xfd, 0xb1, 0x18, 0x6f, 0x3e, 0x36, 0xe0, 0xcb, 0x9f, 0xcb, 0xfc, 0xf2, 0x65, + 0x74, 0x1e, 0xd9, 0xe8, 0xd5, 0xc5, 0xd8, 0x74, 0x6d, 0x8f, 0xa0, 0x71, 0x26, 0xef, 0xc3, 0x94, + 0x58, 0x74, 0x56, 0x77, 0xd6, 0xf7, 0xe8, 0x82, 0x73, 0x20, 0x82, 0x10, 0xd0, 0xfe, 0x13, 0x2b, + 0x95, 0xed, 0xef, 0xd8, 0xd1, 0x1e, 0xb5, 0x5d, 0x47, 0x53, 0xcf, 0x29, 0x42, 0xf2, 0xd3, 0x30, + 0xbe, 0xec, 0xe3, 0xc1, 0x13, 0xaa, 0x9a, 0x12, 0xf2, 0xf9, 0x32, 0x5e, 0x9c, 0xe6, 0xe0, 0xd4, + 0x22, 0xf2, 0xc3, 0xc3, 0xea, 0x9b, 0xa7, 0x95, 0x42, 0xe5, 0x03, 0x96, 0xfa, 0x35, 0x32, 0x0f, + 0xc5, 0x2d, 0xba, 0xcd, 0x5a, 0x9b, 0xbe, 0xf4, 0x27, 0xc1, 0x5c, 0x5f, 0x3c, 0x12, 0xbf, 0xd4, + 0x53, 0x1d, 0x89, 0x41, 0x02, 0x98, 0xc6, 0xfe, 0x59, 0x73, 0xc2, 0xf0, 0x91, 0x1f, 0xb8, 0x2d, + 0x1a, 0xca, 0xe3, 0x91, 0xfe, 0xce, 0x9f, 0xcb, 0xec, 0xfc, 0x2b, 0xbc, 0xf3, 0xbb, 0x0a, 0x07, + 0x55, 0xdc, 0xfa, 0xd8, 0x9b, 0xff, 0xd2, 0x40, 0xa9, 0x27, 0x37, 0x30, 0xf8, 0x2c, 0x8e, 0x6a, + 0xc7, 0xdd, 0xac, 0xd3, 0x4d, 0xdd, 0x05, 0xe0, 0x28, 0x6c, 0xeb, 0x7b, 0xc7, 0x69, 0xd2, 0x48, + 0xfa, 0x48, 0x11, 0x79, 0x07, 0x21, 0xea, 0xd6, 0x97, 0xe3, 0x90, 0x2f, 0xc1, 0xb9, 0x05, 0xfa, + 0xd0, 0x6b, 0xd2, 0x5a, 0x14, 0xd1, 0x90, 0xf7, 0xf0, 0x7c, 0x8d, 0x1f, 0x26, 0x96, 0xea, 0x2f, + 0x1c, 0x1d, 0x56, 0xaf, 0xba, 0x58, 0x6e, 0x3b, 0x09, 0x82, 0xdd, 0x74, 0x54, 0x5e, 0x99, 0x1c, + 0xcc, 0xff, 0x69, 0x24, 0xbd, 0x4e, 0x5e, 0x82, 0x82, 0xb5, 0x16, 0xd7, 0x9f, 0x9f, 0x13, 0xa6, + 0xaa, 0x8f, 0x08, 0xe4, 0x2b, 0x70, 0x5e, 0xe1, 0x83, 0x3d, 0x42, 0x5d, 0x56, 0x21, 0xde, 0x98, + 0x17, 0xf1, 0x60, 0x48, 0xa9, 0x89, 0xc3, 0x31, 0x52, 0x35, 0xca, 0xe6, 0xc1, 0x1a, 0xab, 0x14, + 0x2c, 0xd0, 0x8e, 0xc7, 0x79, 0x2b, 0x8d, 0x55, 0x79, 0xbb, 0x88, 0x90, 0x6e, 0x6c, 0x16, 0x87, + 0xf7, 0x0b, 0xc5, 0x42, 0x65, 0xc4, 0xfc, 0x2b, 0x43, 0xc9, 0x7a, 0xf1, 0x94, 0xae, 0x58, 0xaf, + 0x6b, 0x2b, 0xd6, 0x39, 0x41, 0x1a, 0xb7, 0x8a, 0x95, 0x65, 0x5a, 0x19, 0x53, 0x30, 0xa1, 0x21, + 0x61, 0x98, 0xed, 0x46, 0x48, 0x03, 0xee, 0x93, 0xfc, 0x74, 0x85, 0xd9, 0xc6, 0xed, 0x1a, 0x2a, + 0x7a, 0xf2, 0xcf, 0x0d, 0x98, 0x4a, 0x51, 0xb0, 0xde, 0x60, 0x20, 0xb5, 0x37, 0x7a, 0x21, 0x0d, + 0x2c, 0x84, 0xf2, 0xa0, 0xbc, 0x65, 0x3d, 0x28, 0xaf, 0x65, 0x31, 0x18, 0x79, 0x0f, 0x46, 0x36, + 0x70, 0x07, 0xa1, 0xc7, 0x75, 0xc4, 0xfc, 0xb1, 0x90, 0xcf, 0xb0, 0x1e, 0xfb, 0x57, 0x55, 0x10, + 0x58, 0x46, 0x1a, 0x30, 0x36, 0x1f, 0x50, 0xcc, 0x6f, 0x51, 0x18, 0xfe, 0x00, 0xae, 0xc9, 0x49, + 0xd2, 0x07, 0x70, 0x82, 0x93, 0xf9, 0xab, 0x39, 0x20, 0x49, 0x1b, 0x69, 0x33, 0xa0, 0x51, 0xf8, + 0xd4, 0x0e, 0xfa, 0xbb, 0xda, 0xa0, 0x3f, 0xdb, 0x37, 0xe8, 0xbc, 0x79, 0x43, 0x8d, 0xfd, 0x1f, + 0x19, 0x70, 0x21, 0x9b, 0x90, 0x3c, 0x0f, 0xa3, 0xab, 0xeb, 0x6b, 0x32, 0x34, 0x48, 0x34, 0xc5, + 0xef, 0xa2, 0x65, 0x6c, 0x89, 0x22, 0xf2, 0x2a, 0x8c, 0x7e, 0x60, 0xcd, 0xb3, 0x25, 0x53, 0xb9, + 0x3d, 0xf3, 0xf5, 0xc0, 0x6e, 0xea, 0x5b, 0x2e, 0x81, 0xa4, 0x8e, 0x6d, 0xfe, 0x89, 0x8d, 0xed, + 0xb7, 0x72, 0x30, 0x55, 0x6b, 0x36, 0x69, 0x18, 0x32, 0x83, 0x88, 0x86, 0xd1, 0x53, 0x3b, 0xb0, + 0xd9, 0x41, 0x3f, 0x5a, 0xdb, 0x86, 0x1a, 0xd5, 0x3f, 0x36, 0xe0, 0xbc, 0xa4, 0x7a, 0xe8, 0xd1, + 0x47, 0xeb, 0x7b, 0x01, 0x0d, 0xf7, 0xfc, 0x96, 0x3b, 0xec, 0x3d, 0x30, 0x5c, 0xa5, 0xbd, 0x56, + 0x44, 0x03, 0xd5, 0x41, 0xbd, 0x83, 0x10, 0x6d, 0x95, 0x46, 0x08, 0x99, 0x85, 0xb1, 0x5a, 0xb7, + 0x1b, 0xf8, 0x0f, 0xf9, 0xb4, 0x9f, 0x10, 0xe7, 0x91, 0x1c, 0xa4, 0x9d, 0x5f, 0x72, 0x10, 0xab, + 0xc6, 0x02, 0xed, 0xf0, 0x88, 0xe6, 0x09, 0x5e, 0x0d, 0x97, 0x76, 0x54, 0x0b, 0x0d, 0xcb, 0xcd, + 0x6f, 0x16, 0xa0, 0xac, 0x36, 0x84, 0x98, 0x30, 0xca, 0xc3, 0x53, 0xd4, 0x30, 0x01, 0x07, 0x21, + 0x96, 0x28, 0x49, 0xa2, 0x7e, 0x72, 0x27, 0x46, 0xfd, 0x6c, 0xc1, 0xc4, 0x5a, 0xe0, 0x77, 0xfd, + 0x90, 0xba, 0x3c, 0x45, 0x11, 0xd7, 0x5a, 0x67, 0xe3, 0x50, 0x58, 0xde, 0xe7, 0xac, 0x88, 0x6f, + 0x07, 0xba, 0x02, 0xdb, 0x4e, 0x27, 0x30, 0xd2, 0xf9, 0x70, 0x07, 0xbf, 0x13, 0x8a, 0xeb, 0x02, + 0xb1, 0x83, 0x9f, 0x41, 0x74, 0x07, 0x3f, 0x83, 0xa8, 0xd3, 0x62, 0xe4, 0x49, 0x4d, 0x0b, 0xf2, + 0xab, 0x06, 0x8c, 0xd7, 0x3a, 0x1d, 0x11, 0xf5, 0x23, 0xef, 0xf9, 0x9f, 0x4f, 0x9c, 0xfc, 0x3c, + 0x2c, 0x94, 0xfb, 0xf8, 0xbf, 0x2a, 0x7c, 0xfc, 0x6f, 0x7e, 0x24, 0x1f, 0xff, 0x7a, 0xe0, 0x78, + 0x51, 0x88, 0x87, 0xb9, 0xc9, 0x07, 0xd5, 0xd0, 0x5f, 0xa5, 0x1e, 0xe4, 0x4d, 0xa8, 0xc4, 0xf2, + 0xb8, 0xd4, 0x71, 0xe9, 0x63, 0xca, 0x83, 0xa4, 0x26, 0xf8, 0x0d, 0x43, 0xed, 0xf0, 0x22, 0x8d, + 0x68, 0x7e, 0xcb, 0x80, 0x0b, 0xaa, 0x40, 0x34, 0x7a, 0xdb, 0x6d, 0x0f, 0xb7, 0x3f, 0xe4, 0x26, + 0x94, 0xc4, 0x78, 0xc5, 0x86, 0x5c, 0x7f, 0x5e, 0xab, 0x04, 0x85, 0x2c, 0xb2, 0x21, 0x62, 0x3c, + 0x84, 0xaf, 0xe0, 0x6c, 0x6a, 0xba, 0xb1, 0xa2, 0xfa, 0x8c, 0xe8, 0xec, 0x4a, 0x80, 0xbf, 0xf5, + 0xb1, 0x63, 0x10, 0xf3, 0x1d, 0x98, 0xd6, 0x6b, 0xd9, 0xa0, 0x78, 0x05, 0x4d, 0x36, 0xcd, 0xc8, + 0x6e, 0x9a, 0x2c, 0x37, 0xb7, 0x80, 0xf4, 0xd1, 0x87, 0x78, 0x50, 0x45, 0x23, 0x79, 0x90, 0x2a, + 0xdd, 0x5d, 0x7d, 0x88, 0x71, 0x86, 0xb7, 0x71, 0xb5, 0xbb, 0x91, 0xd4, 0xfc, 0x0b, 0x80, 0xb3, + 0x19, 0xaa, 0xe3, 0x84, 0xa5, 0xbd, 0xaa, 0x4f, 0x9e, 0x52, 0x1c, 0x11, 0x20, 0xa7, 0xcc, 0x3b, + 0x32, 0x9b, 0xd7, 0x31, 0x53, 0xe5, 0xb8, 0x14, 0x5f, 0x9f, 0xc4, 0xf2, 0xae, 0x06, 0xed, 0x8c, + 0x3c, 0xb1, 0xa0, 0x9d, 0x3a, 0x4c, 0x88, 0x56, 0x89, 0xa9, 0x3c, 0x9a, 0xb8, 0x05, 0x02, 0x5e, + 0x60, 0xf7, 0x4d, 0x69, 0x9d, 0x84, 0xf3, 0x08, 0xfd, 0xd6, 0x43, 0x2a, 0x78, 0x8c, 0xa9, 0x3c, + 0xb0, 0x20, 0x93, 0x87, 0x42, 0x42, 0xfe, 0xb1, 0x01, 0x44, 0x40, 0xd4, 0xf9, 0x5c, 0x3c, 0x6e, + 0x3e, 0xbb, 0x4f, 0x66, 0x3e, 0x3f, 0x2b, 0xeb, 0x98, 0x3d, 0xaf, 0x33, 0xaa, 0x45, 0xfe, 0xa1, + 0x01, 0xd3, 0x3c, 0x72, 0x44, 0xad, 0x6c, 0xe9, 0xb8, 0xca, 0x36, 0x9f, 0x4c, 0x65, 0xaf, 0x84, + 0xf8, 0xd9, 0x01, 0x75, 0xed, 0xaf, 0x14, 0xf9, 0x71, 0x80, 0x78, 0x46, 0xc9, 0x08, 0xc5, 0x2b, + 0x19, 0x5a, 0x20, 0x46, 0x4a, 0x2e, 0x59, 0x46, 0x31, 0x9d, 0x1a, 0xd3, 0x93, 0x70, 0x23, 0x3f, + 0x0b, 0xe7, 0xd8, 0x7c, 0x89, 0x21, 0x22, 0xce, 0x6d, 0x66, 0x1c, 0xbf, 0xf2, 0xf9, 0xc1, 0x4b, + 0xfb, 0xcd, 0x2c, 0x32, 0x7e, 0x4f, 0x24, 0x49, 0xb4, 0x10, 0xb5, 0xd5, 0x2d, 0x5f, 0x16, 0x05, + 0x06, 0xb4, 0x62, 0xed, 0xc3, 0x99, 0x32, 0x7e, 0x33, 0x53, 0xbf, 0x5d, 0x92, 0x73, 0x81, 0xeb, + 0xb7, 0x50, 0xbf, 0xe8, 0x81, 0x20, 0xf2, 0x01, 0x90, 0x46, 0x6f, 0x77, 0x97, 0x86, 0x11, 0x75, + 0x39, 0x8c, 0x06, 0xe1, 0xcc, 0x04, 0xea, 0x07, 0x74, 0x53, 0x85, 0xb2, 0xd4, 0x0e, 0x64, 0xb1, + 0x2a, 0x24, 0xfd, 0xc4, 0x84, 0xc2, 0x39, 0xd1, 0x68, 0x06, 0x95, 0x69, 0x0a, 0xc2, 0x99, 0x49, + 0x2d, 0x8a, 0x30, 0x29, 0xa9, 0x3f, 0x27, 0xf3, 0xd8, 0x29, 0xb9, 0x0e, 0xb4, 0x6d, 0x6f, 0x16, + 0xbb, 0xcb, 0xdb, 0x70, 0x69, 0x60, 0x6f, 0x66, 0xdc, 0x15, 0x99, 0xd5, 0xef, 0x8a, 0x5c, 0x1a, + 0xa4, 0x75, 0x43, 0xf5, 0xbe, 0xc8, 0x6f, 0x19, 0x29, 0x35, 0x2b, 0x6c, 0x22, 0x9e, 0x5f, 0x71, + 0xd0, 0x3a, 0x94, 0xc3, 0xa4, 0x0c, 0x5c, 0x11, 0xe7, 0x12, 0x5b, 0x8c, 0x29, 0x62, 0x55, 0x91, + 0xa3, 0x4a, 0xfe, 0x98, 0x1a, 0xd7, 0xfc, 0x67, 0x06, 0x10, 0x5e, 0xc3, 0x79, 0xa7, 0xeb, 0x6c, + 0x7b, 0x2d, 0x2f, 0xf2, 0x68, 0x48, 0xee, 0x43, 0x45, 0xb0, 0x70, 0xb6, 0x5b, 0x54, 0x0d, 0x03, + 0x13, 0xe7, 0xc4, 0x71, 0x99, 0x9d, 0xb6, 0x9e, 0xfa, 0x08, 0x07, 0xc8, 0x48, 0xee, 0x63, 0xc8, + 0x88, 0xf9, 0x03, 0x03, 0x2e, 0xf5, 0x57, 0x5b, 0x7c, 0x39, 0xee, 0x3c, 0xe3, 0x84, 0xce, 0xcb, + 0x6a, 0x65, 0x0e, 0x3d, 0xac, 0x4f, 0xac, 0x95, 0xf9, 0xc4, 0x61, 0x7b, 0xfa, 0x56, 0x3e, 0x52, + 0x93, 0x7a, 0x90, 0x57, 0xb3, 0x02, 0x7a, 0xf8, 0xad, 0x1b, 0x0e, 0xd6, 0x63, 0x79, 0xe4, 0x2e, + 0x27, 0x97, 0xb9, 0xcb, 0x91, 0x17, 0x88, 0xf2, 0x59, 0x17, 0x88, 0xcc, 0x5f, 0xcc, 0x41, 0x79, + 0xad, 0xd5, 0xdb, 0xf5, 0x3a, 0x0b, 0x4e, 0xe4, 0x3c, 0xb5, 0x5b, 0xa6, 0x37, 0xb4, 0x2d, 0x53, + 0x1c, 0x71, 0x16, 0x37, 0x6c, 0xb8, 0x24, 0x7b, 0x06, 0x4c, 0x25, 0x24, 0x5c, 0x3d, 0xdc, 0x83, + 0x02, 0xfb, 0x21, 0x2c, 0xb0, 0xab, 0x7d, 0x8c, 0x11, 0xeb, 0x66, 0xfc, 0x9f, 0xd8, 0xc4, 0xe8, + 0xa9, 0x0d, 0x91, 0xc3, 0xe5, 0x2f, 0xf0, 0xcc, 0x64, 0xa7, 0xcf, 0xa2, 0xfa, 0x4f, 0x0d, 0xa8, + 0xa4, 0x5b, 0x42, 0xee, 0xc3, 0x18, 0xe3, 0xe4, 0xc5, 0x59, 0xce, 0x5e, 0x18, 0xd0, 0xe6, 0x9b, + 0x02, 0x8d, 0x57, 0x0f, 0x3b, 0x9f, 0x72, 0x88, 0x25, 0x39, 0x5c, 0xb6, 0xa0, 0xac, 0x62, 0x65, + 0xd4, 0xee, 0x15, 0x5d, 0x27, 0x5e, 0xc8, 0xee, 0x07, 0xb5, 0xd6, 0xbf, 0xa9, 0xd5, 0x5a, 0x68, + 0xc3, 0x61, 0xd3, 0x55, 0xe2, 0x95, 0x3b, 0x3e, 0x1d, 0x54, 0x39, 0x93, 0x5a, 0x5f, 0xbf, 0x72, + 0xc7, 0x61, 0x6c, 0xaf, 0xc5, 0xbf, 0x27, 0xe4, 0x0c, 0xf7, 0x5a, 0x5d, 0x84, 0xa8, 0xf6, 0x3a, + 0xc7, 0x31, 0xff, 0x4e, 0x1e, 0x2e, 0x24, 0xd5, 0xe3, 0xc9, 0x3b, 0xd7, 0x9c, 0xc0, 0x69, 0x87, + 0x27, 0xcc, 0x80, 0xeb, 0x7d, 0x55, 0xc3, 0x2b, 0xe5, 0xb2, 0x6a, 0x4a, 0x85, 0xcc, 0x54, 0x85, + 0x70, 0x93, 0xca, 0x2b, 0x24, 0xab, 0x41, 0xee, 0x43, 0xbe, 0x41, 0x23, 0x71, 0xf1, 0xf4, 0x5a, + 0x5f, 0xaf, 0xaa, 0xf5, 0xba, 0xd9, 0xa0, 0x11, 0x1f, 0x44, 0x1e, 0xbb, 0x4f, 0xb5, 0x58, 0x7a, + 0xb6, 0xdd, 0xd8, 0x82, 0xd1, 0xc5, 0xc7, 0x5d, 0xda, 0x8c, 0xc4, 0x7d, 0xd3, 0x97, 0x8f, 0xe7, + 0xc7, 0x71, 0x95, 0x5b, 0xad, 0x14, 0x01, 0x6a, 0x67, 0x71, 0x94, 0xcb, 0xaf, 0x43, 0x51, 0x7e, + 0xfc, 0x54, 0xb7, 0x33, 0xdf, 0x80, 0x71, 0xe5, 0x23, 0xa7, 0x12, 0xfa, 0xbf, 0x36, 0x60, 0x94, + 0x69, 0xdb, 0xcd, 0xd7, 0x9e, 0x52, 0x8d, 0x74, 0x5b, 0xd3, 0x48, 0xd3, 0xca, 0x35, 0x22, 0x9c, + 0x97, 0xaf, 0x9d, 0xa0, 0x8b, 0x0e, 0x0d, 0x80, 0x04, 0x99, 0xdc, 0x85, 0x31, 0x91, 0x2f, 0x46, + 0x64, 0xc6, 0x55, 0xef, 0x25, 0xc9, 0xcc, 0x61, 0xb1, 0x15, 0xe7, 0x77, 0xd3, 0x66, 0xaf, 0xa4, + 0x26, 0x0b, 0x49, 0xec, 0xb6, 0x7a, 0x11, 0x96, 0xb1, 0x99, 0xf7, 0x3b, 0xfc, 0x9e, 0x8a, 0x92, + 0x83, 0x6c, 0x40, 0x10, 0x77, 0x4d, 0x38, 0x6e, 0xf2, 0xc7, 0x31, 0xb9, 0x20, 0x98, 0x64, 0xfb, + 0x74, 0xfe, 0xd7, 0x38, 0xbf, 0xf9, 0x21, 0x2b, 0xf6, 0x36, 0x94, 0xef, 0xf8, 0xc1, 0x23, 0x27, + 0x70, 0x6b, 0xbb, 0x54, 0x44, 0xdd, 0x17, 0x31, 0x74, 0x7e, 0x62, 0x87, 0xc3, 0x6d, 0x87, 0x15, + 0xfc, 0xf0, 0xb0, 0x5a, 0xa8, 0xfb, 0x7e, 0xcb, 0xd2, 0xd0, 0xc9, 0x2a, 0x4c, 0x3c, 0x70, 0x1e, + 0x8b, 0x33, 0xd0, 0xf5, 0xf5, 0x65, 0x11, 0xbb, 0xf3, 0xf2, 0xd1, 0x61, 0xf5, 0x52, 0xdb, 0x79, + 0x1c, 0x9f, 0x9d, 0x0e, 0x0e, 0x2f, 0xd7, 0xe9, 0x89, 0x07, 0x93, 0x6b, 0x7e, 0x10, 0x89, 0x8f, + 0x30, 0x9b, 0x3d, 0x3f, 0xe0, 0x14, 0x6d, 0x36, 0xf3, 0x14, 0xed, 0x12, 0xdb, 0xa8, 0xd8, 0x3b, + 0x31, 0xb9, 0x76, 0x5d, 0x51, 0x63, 0x4c, 0xde, 0x86, 0xe9, 0x79, 0x1a, 0x44, 0xde, 0x8e, 0xd7, + 0x74, 0x22, 0x7a, 0xc7, 0x0f, 0xda, 0x4e, 0x24, 0x1c, 0x46, 0xe8, 0x30, 0x68, 0x52, 0xce, 0xa9, + 0xed, 0x44, 0x56, 0x3f, 0x26, 0xf9, 0x4a, 0x56, 0x34, 0xd4, 0x08, 0x36, 0xff, 0x55, 0x66, 0x8d, + 0x64, 0x44, 0x43, 0x0d, 0xe8, 0x82, 0x8c, 0xb8, 0xa8, 0xdd, 0xe3, 0x8e, 0x92, 0x8b, 0xf5, 0x5b, + 0xe2, 0x58, 0xfb, 0xe4, 0xa3, 0xe2, 0x78, 0xdc, 0x06, 0x1c, 0x19, 0xcf, 0x41, 0xbe, 0xbe, 0x76, + 0x07, 0x5d, 0x40, 0xe2, 0xe8, 0x96, 0x76, 0xf6, 0x9c, 0x4e, 0x13, 0x8d, 0x28, 0x11, 0x0f, 0xa2, + 0x2a, 0xbc, 0xfa, 0xda, 0x1d, 0xe2, 0xc0, 0xd9, 0x35, 0x1a, 0xb4, 0xbd, 0xe8, 0x4b, 0xb7, 0x6e, + 0x29, 0x03, 0x55, 0xc4, 0xaa, 0xcd, 0x8a, 0xaa, 0x55, 0xbb, 0x88, 0x62, 0x3f, 0xbe, 0x75, 0x2b, + 0x73, 0x38, 0xe2, 0x8a, 0x65, 0xf1, 0x22, 0x8b, 0x30, 0xf9, 0xc0, 0x79, 0x2c, 0x0e, 0xf9, 0xe3, + 0x3d, 0x6c, 0x1e, 0x6f, 0x1b, 0xa0, 0x60, 0x35, 0x93, 0x22, 0x75, 0x88, 0x75, 0x22, 0xf2, 0x16, + 0x8c, 0x27, 0xe2, 0x15, 0xe2, 0xf1, 0x6e, 0x9e, 0x87, 0x99, 0x2a, 0xc2, 0xa9, 0xf9, 0xca, 0x14, + 0x74, 0xb2, 0x11, 0xbb, 0x20, 0xb8, 0x25, 0x8c, 0x07, 0xba, 0xa5, 0xfa, 0xac, 0xea, 0x82, 0x70, + 0xb0, 0x44, 0x6b, 0xd6, 0x54, 0xbc, 0x37, 0xe0, 0xd1, 0x47, 0x96, 0xce, 0x45, 0xf1, 0x6c, 0xac, + 0x05, 0x7e, 0xbb, 0x1b, 0x61, 0x14, 0x66, 0xca, 0xb3, 0xd1, 0xc5, 0x92, 0x0c, 0xcf, 0x06, 0x27, + 0xc9, 0x8e, 0x5d, 0x98, 0xf8, 0x18, 0xb1, 0x0b, 0x14, 0x0a, 0xcb, 0x7e, 0x73, 0x1f, 0xc3, 0x2e, + 0x4b, 0xf5, 0x0f, 0x98, 0xfe, 0x68, 0xf9, 0xcd, 0xfd, 0x27, 0x77, 0xe6, 0x8e, 0xec, 0xc9, 0x0a, + 0x6b, 0x3b, 0x13, 0x2b, 0xf1, 0xe9, 0x99, 0x29, 0xed, 0x24, 0x51, 0x2b, 0xe3, 0x86, 0x0a, 0x97, + 0x42, 0xd9, 0x10, 0x4b, 0x27, 0x27, 0x14, 0x2a, 0x0b, 0x34, 0xdc, 0x8f, 0xfc, 0xee, 0x7c, 0xcb, + 0xeb, 0x6e, 0xfb, 0x4e, 0xe0, 0xce, 0x54, 0x06, 0x28, 0x8c, 0x97, 0x32, 0x15, 0xc6, 0xb4, 0xcb, + 0xe9, 0xed, 0xa6, 0x64, 0x60, 0xf5, 0xb1, 0x24, 0x5f, 0x81, 0x49, 0x36, 0x5b, 0x16, 0x1f, 0x47, + 0xb4, 0xc3, 0x45, 0x69, 0x1a, 0x97, 0xfa, 0x73, 0xca, 0xc5, 0xcd, 0xb8, 0x90, 0x0b, 0x29, 0x6a, + 0x0f, 0x1a, 0x13, 0xa8, 0x42, 0xaa, 0xb3, 0x22, 0x2e, 0xcc, 0x3c, 0x70, 0x1e, 0x2b, 0x69, 0x8e, + 0x14, 0xa9, 0x27, 0x28, 0xb1, 0x98, 0x50, 0x8f, 0x49, 0xec, 0x7e, 0x8c, 0x34, 0x60, 0x02, 0x0c, + 0xe4, 0x64, 0xfe, 0x78, 0xaa, 0xe7, 0xc9, 0x12, 0x8c, 0x89, 0x76, 0x8a, 0xb5, 0xad, 0xbf, 0xc7, + 0x9e, 0xcd, 0xec, 0xb1, 0x31, 0xd1, 0x63, 0x96, 0xa4, 0x37, 0xff, 0xd0, 0x80, 0x09, 0xad, 0x51, + 0xe4, 0x75, 0x25, 0xf0, 0x28, 0x09, 0x18, 0xd4, 0x70, 0x32, 0xdf, 0xb5, 0x78, 0x5d, 0x44, 0x9b, + 0xe5, 0x06, 0xd3, 0x65, 0xe6, 0x91, 0x3b, 0x76, 0xb7, 0x95, 0xa4, 0x6b, 0x28, 0x0c, 0x48, 0xd7, + 0xf0, 0x2b, 0x13, 0x30, 0xa9, 0x2f, 0xa3, 0xcc, 0xae, 0x5d, 0xf6, 0x77, 0xbd, 0x8e, 0xdc, 0x96, + 0xf3, 0x04, 0x24, 0x08, 0xd1, 0x1e, 0x89, 0x40, 0x08, 0x79, 0x11, 0x20, 0x3e, 0xe0, 0x96, 0x3b, + 0x6f, 0xf1, 0xa4, 0x85, 0x52, 0x40, 0x7e, 0x02, 0x60, 0xc5, 0x77, 0x69, 0x9c, 0xc3, 0xe6, 0x18, + 0xb7, 0xdc, 0x4b, 0xc2, 0x2d, 0x27, 0x9e, 0xa1, 0x38, 0x3a, 0xac, 0x9e, 0xef, 0xf8, 0x2e, 0xed, + 0x4f, 0x5e, 0xa3, 0x70, 0x24, 0x5f, 0x84, 0x11, 0xab, 0xd7, 0xa2, 0x32, 0xa5, 0xca, 0xb8, 0x9c, + 0x56, 0xbd, 0x96, 0x92, 0x9e, 0x36, 0xe8, 0xa5, 0x4f, 0x63, 0x18, 0x80, 0xbc, 0x0b, 0xc0, 0x24, + 0x07, 0xf3, 0x3c, 0xca, 0x3b, 0xdb, 0xb8, 0x4b, 0x57, 0x84, 0x0e, 0xb3, 0x43, 0x6a, 0x1f, 0x4f, + 0x48, 0xc8, 0x2a, 0x8c, 0x09, 0x25, 0x25, 0x4e, 0x3b, 0x9e, 0xcb, 0xf2, 0xb3, 0x29, 0x96, 0x8a, + 0xc8, 0x71, 0x82, 0x60, 0xdd, 0xf5, 0xc5, 0xbd, 0x0c, 0x6f, 0x41, 0x89, 0xb1, 0xdf, 0x08, 0xa9, + 0xb8, 0xc9, 0x5d, 0xe2, 0x91, 0x9f, 0x4a, 0x85, 0x7a, 0xa1, 0xbe, 0xc9, 0x4f, 0x08, 0xc8, 0x57, + 0x30, 0x2b, 0x91, 0xe8, 0xea, 0x63, 0xdd, 0xb5, 0xd7, 0xfa, 0xba, 0xfa, 0x9c, 0xd3, 0xed, 0x66, + 0xa4, 0x71, 0x8b, 0xf9, 0x91, 0xdd, 0xf8, 0x76, 0x54, 0x9c, 0xa3, 0xfc, 0x98, 0x0f, 0xdc, 0xe8, + 0xfb, 0xc0, 0x8c, 0xbc, 0xf0, 0xd3, 0x9f, 0x8b, 0x48, 0xe3, 0x4b, 0xba, 0x50, 0x49, 0xe6, 0xb3, + 0xf8, 0x16, 0x1c, 0xf7, 0xad, 0x57, 0xfb, 0xbe, 0xa5, 0x0e, 0x60, 0xdf, 0xe7, 0xfa, 0xb8, 0x13, + 0x37, 0xc9, 0x27, 0x2d, 0xbe, 0x37, 0x7e, 0xdc, 0xf7, 0x5e, 0xec, 0xfb, 0xde, 0x59, 0x77, 0xbb, + 0xff, 0x3b, 0x29, 0x9e, 0xe4, 0x2d, 0x98, 0x90, 0x10, 0x9c, 0x1f, 0xe8, 0x26, 0x15, 0xbb, 0x08, + 0x77, 0x1b, 0xc3, 0xfd, 0xf4, 0x44, 0x3c, 0x2a, 0xb2, 0x4a, 0xcd, 0xa5, 0x63, 0x42, 0xa3, 0x4e, + 0x4b, 0x85, 0x8e, 0x4c, 0xbe, 0x0c, 0xe3, 0x4b, 0x6d, 0xd6, 0x10, 0xbf, 0xe3, 0x44, 0x14, 0x97, + 0xbc, 0xc4, 0xf5, 0xac, 0x94, 0x28, 0xa2, 0xca, 0x33, 0x7e, 0x26, 0x45, 0xaa, 0xc9, 0xa0, 0x50, + 0xb0, 0xce, 0xe3, 0xde, 0x25, 0x21, 0xc3, 0xa1, 0x58, 0xe0, 0x9e, 0xcd, 0x70, 0xff, 0x2a, 0xec, + 0x71, 0xc5, 0xe0, 0x4e, 0x2b, 0x5b, 0x4c, 0x08, 0xad, 0xf3, 0x74, 0x9e, 0xe4, 0x6d, 0x18, 0x17, + 0x77, 0x51, 0x6b, 0xd6, 0x4a, 0x38, 0x53, 0xc1, 0xc6, 0x63, 0x16, 0x3d, 0x79, 0x6d, 0xd5, 0x76, + 0x82, 0xd4, 0x19, 0x60, 0x82, 0x4f, 0xbe, 0x04, 0xe7, 0xb6, 0xbc, 0x8e, 0xeb, 0x3f, 0x0a, 0x85, + 0x02, 0x17, 0x8a, 0x6e, 0x3a, 0x89, 0x74, 0x7a, 0xc4, 0xcb, 0x6d, 0xb9, 0x38, 0xf6, 0x29, 0xbe, + 0x4c, 0x0e, 0xe4, 0x67, 0xfa, 0x38, 0x73, 0x09, 0x22, 0xc7, 0x49, 0xd0, 0x5c, 0x9f, 0x04, 0xf5, + 0x7f, 0x3e, 0x2d, 0x4e, 0x99, 0x9f, 0x21, 0x3e, 0x10, 0xdd, 0xb2, 0x79, 0xdf, 0xf7, 0x3a, 0x33, + 0x67, 0xb5, 0x17, 0x80, 0xe2, 0x60, 0x67, 0xc4, 0x5b, 0xf3, 0x5b, 0x5e, 0xf3, 0x40, 0x66, 0xd3, + 0xd5, 0x6d, 0xa6, 0x0f, 0x7d, 0xcd, 0x85, 0x91, 0xc1, 0x9a, 0x7c, 0x19, 0xca, 0xec, 0x6f, 0x6c, + 0x60, 0x9e, 0xd3, 0x0e, 0x0c, 0x15, 0x4c, 0xf1, 0x1d, 0x1c, 0x23, 0xbc, 0x2c, 0x9b, 0x61, 0x7b, + 0x6a, 0xac, 0xcc, 0x1f, 0x18, 0x70, 0x2e, 0xab, 0xae, 0x27, 0x64, 0x26, 0x32, 0x53, 0xa1, 0x03, + 0xe8, 0xfd, 0xe0, 0xa1, 0x03, 0x71, 0xc0, 0x40, 0x15, 0x46, 0xd8, 0x8e, 0x5c, 0x86, 0xb6, 0xe1, + 0x72, 0xc8, 0x76, 0xed, 0xa1, 0xc5, 0xe1, 0x0c, 0x01, 0xaf, 0x41, 0xe0, 0x7a, 0x39, 0xc2, 0x11, + 0xf0, 0xae, 0x84, 0xc5, 0xe1, 0x0c, 0x81, 0x2d, 0xbb, 0x72, 0x99, 0x40, 0x04, 0xb6, 0x1a, 0x87, + 0x16, 0x87, 0x93, 0x6b, 0x30, 0xb6, 0xda, 0x59, 0xa6, 0xce, 0x43, 0x2a, 0xce, 0xed, 0xd0, 0x5b, + 0xe3, 0x77, 0xec, 0x16, 0x83, 0x59, 0xb2, 0xd0, 0xfc, 0x8e, 0x01, 0xd3, 0x7d, 0xdd, 0x74, 0x72, + 0xf2, 0xa5, 0xe3, 0x0f, 0x49, 0x87, 0x69, 0x1f, 0xaf, 0x7e, 0x21, 0xbb, 0xfa, 0xe6, 0xef, 0x17, + 0xe0, 0xe2, 0x80, 0x55, 0x2b, 0x09, 0x70, 0x30, 0x4e, 0x0c, 0x70, 0xf8, 0x2a, 0x5b, 0x25, 0x1c, + 0xaf, 0x1d, 0xae, 0xfb, 0x49, 0x8d, 0x93, 0xb3, 0x20, 0x2c, 0x93, 0xd9, 0x4d, 0x64, 0x26, 0x8e, + 0x4b, 0x4d, 0xa4, 0xb0, 0x23, 0xbf, 0xcf, 0x25, 0xae, 0x33, 0xeb, 0x0b, 0x31, 0xc8, 0xff, 0x88, + 0x84, 0x18, 0xe8, 0x07, 0x7b, 0x85, 0x27, 0x7a, 0xb0, 0x97, 0x7d, 0x06, 0x30, 0xf2, 0x71, 0x4e, + 0xc3, 0xe6, 0x61, 0xa2, 0x41, 0x9d, 0xa0, 0xb9, 0x57, 0x0b, 0xf9, 0x20, 0x8d, 0x22, 0x37, 0x54, + 0xc9, 0x21, 0x16, 0xd8, 0x4e, 0xd8, 0x3f, 0x16, 0x1a, 0x8d, 0xf9, 0xef, 0x53, 0x91, 0x11, 0x3f, + 0x8a, 0xf2, 0xf2, 0x32, 0x8c, 0x6c, 0xed, 0xd1, 0x40, 0x1a, 0xc9, 0x58, 0x91, 0x47, 0x0c, 0xa0, + 0x56, 0x04, 0x31, 0xcc, 0x9f, 0x86, 0xb2, 0xfa, 0x31, 0x54, 0x08, 0xec, 0xb7, 0x98, 0x91, 0x5c, + 0x21, 0x30, 0x80, 0xc5, 0xe1, 0x27, 0x26, 0x44, 0x4b, 0x7a, 0x21, 0x7f, 0x52, 0x2f, 0xb0, 0x8f, + 0xa3, 0xbc, 0x29, 0x1f, 0xc7, 0xdf, 0xea, 0xc7, 0x23, 0x06, 0xb0, 0x38, 0xfc, 0x89, 0x7e, 0xfc, + 0xdf, 0x1a, 0x50, 0xc0, 0x64, 0x14, 0xaf, 0x41, 0x49, 0xba, 0x94, 0xd5, 0x04, 0x0d, 0x67, 0xa5, + 0xc7, 0x39, 0xd4, 0xe3, 0x5a, 0x04, 0x90, 0x7d, 0x6a, 0x93, 0x06, 0xdb, 0x5a, 0xf8, 0xd3, 0x43, + 0x06, 0x50, 0x3f, 0x85, 0x18, 0xa7, 0x18, 0x0f, 0x0c, 0xf1, 0x12, 0x3b, 0x42, 0xae, 0xb2, 0x78, + 0x88, 0x57, 0xdf, 0xf6, 0x4f, 0x62, 0x99, 0xbf, 0x6e, 0xc0, 0xf9, 0x4c, 0x4b, 0x86, 0x7d, 0x95, + 0x9b, 0x4c, 0x8a, 0x38, 0xa6, 0xed, 0x25, 0x8e, 0x71, 0x9a, 0x50, 0xae, 0x53, 0xc8, 0xd6, 0x67, + 0xa0, 0x14, 0xef, 0x30, 0xc9, 0x39, 0x39, 0x74, 0xe8, 0x77, 0x94, 0xdb, 0xb1, 0xbf, 0x36, 0x60, + 0x94, 0x55, 0xe1, 0xa9, 0xbd, 0xd9, 0x93, 0xed, 0x85, 0x66, 0x4d, 0x1a, 0xea, 0x3e, 0xcf, 0xef, + 0x8c, 0x02, 0x24, 0xc8, 0x64, 0x1b, 0x26, 0x57, 0x97, 0x16, 0xe6, 0x97, 0x5c, 0xda, 0x89, 0xf0, + 0x18, 0x36, 0x95, 0xe1, 0x81, 0x6d, 0x8d, 0x83, 0x8e, 0xd3, 0x12, 0x08, 0x07, 0x89, 0x6e, 0xf0, + 0x3d, 0xb7, 0x69, 0x7b, 0x31, 0x9d, 0x6a, 0x52, 0xea, 0x1c, 0xd9, 0x37, 0x1a, 0xb5, 0x07, 0xcb, + 0xca, 0x37, 0x72, 0x43, 0x7e, 0x23, 0x74, 0xda, 0xad, 0x01, 0xdf, 0xd0, 0x39, 0x92, 0x3d, 0xa8, + 0xdc, 0xc5, 0xd5, 0x47, 0xf9, 0x4a, 0xfe, 0xf8, 0xaf, 0x3c, 0x2f, 0xbe, 0xf2, 0x0c, 0x5f, 0xb6, + 0xb2, 0xbf, 0xd3, 0xc7, 0x35, 0x91, 0xdc, 0xc2, 0x89, 0x92, 0xfb, 0x37, 0x0c, 0x18, 0xe5, 0xcb, + 0x5b, 0xfc, 0x8c, 0x4f, 0xe6, 0x02, 0xba, 0xf5, 0x64, 0x16, 0xd0, 0x0a, 0x6a, 0x2e, 0xcd, 0x85, + 0xc0, 0xcb, 0xc8, 0x42, 0xea, 0x4d, 0x20, 0x79, 0xd4, 0x80, 0xa6, 0x35, 0x2f, 0x49, 0x02, 0xe2, + 0xf8, 0x73, 0x40, 0x2a, 0x17, 0x8e, 0xa1, 0xbe, 0x50, 0x3a, 0xf6, 0x31, 0x5f, 0x28, 0x5d, 0x86, + 0x92, 0x88, 0xf0, 0xaa, 0x1f, 0x88, 0x0d, 0xb4, 0x74, 0x11, 0xc5, 0x70, 0x25, 0xf1, 0x39, 0x07, + 0xd9, 0xdb, 0x5a, 0xda, 0xc2, 0x18, 0x91, 0xac, 0x42, 0x29, 0xb9, 0x96, 0x54, 0xd2, 0xce, 0x8b, + 0x63, 0xb8, 0x08, 0x81, 0xe6, 0x37, 0x5f, 0x33, 0x6f, 0x21, 0x25, 0x3c, 0xcc, 0x6f, 0x1a, 0x50, + 0x49, 0xcb, 0x0b, 0x79, 0x0b, 0xc6, 0xe3, 0x9b, 0x61, 0x71, 0x00, 0x08, 0x3a, 0x7c, 0x93, 0xab, + 0x64, 0x5a, 0x28, 0x88, 0x8a, 0x4e, 0xe6, 0xa0, 0xc8, 0xa6, 0x9d, 0x92, 0xb7, 0x1a, 0xf5, 0x49, + 0x4f, 0xc0, 0xd4, 0xf3, 0x4f, 0x89, 0xa7, 0xcc, 0xda, 0xff, 0x98, 0x87, 0x71, 0x65, 0xb0, 0xc8, + 0xcb, 0x50, 0x5c, 0x0a, 0x97, 0xfd, 0xe6, 0x3e, 0x75, 0xc5, 0xb1, 0x0a, 0x3e, 0x40, 0xeb, 0x85, + 0x76, 0x0b, 0x81, 0x56, 0x5c, 0x4c, 0xea, 0x30, 0xc1, 0xff, 0x93, 0x37, 0x80, 0x73, 0x89, 0x4b, + 0x98, 0x23, 0xcb, 0xbb, 0xbf, 0xea, 0xf2, 0xae, 0x91, 0x90, 0xaf, 0x01, 0x70, 0x00, 0x1b, 0xdf, + 0x21, 0x02, 0xbc, 0xe5, 0x04, 0x3e, 0x2f, 0x3e, 0x10, 0x79, 0x6a, 0x0b, 0x51, 0x14, 0x14, 0x86, + 0xf8, 0xf8, 0xa5, 0xdf, 0xdc, 0x1f, 0xfe, 0xf9, 0xdb, 0xe4, 0xf1, 0x4b, 0xbf, 0xb9, 0x6f, 0x67, + 0x47, 0xfb, 0xa9, 0x2c, 0xc9, 0xb7, 0x0c, 0xb8, 0x6c, 0xd1, 0xa6, 0xff, 0x90, 0x06, 0x07, 0xb5, + 0x08, 0xb1, 0xd4, 0x2f, 0x9e, 0x1c, 0x5a, 0x78, 0x5b, 0x7c, 0xf1, 0xa5, 0x40, 0x70, 0xc1, 0x6b, + 0x49, 0xed, 0x6e, 0x64, 0x1f, 0x53, 0x85, 0x63, 0x3e, 0x69, 0xfe, 0xa9, 0xa1, 0x4c, 0x01, 0xb2, + 0x02, 0xa5, 0x58, 0x58, 0x84, 0xcb, 0x34, 0xb6, 0xcc, 0x24, 0xdc, 0xa2, 0x3b, 0xf5, 0x67, 0xc4, + 0x09, 0xc8, 0xd9, 0x58, 0xe4, 0xb4, 0x19, 0x21, 0x81, 0xe4, 0x3d, 0x28, 0xe0, 0x50, 0x9d, 0x9c, + 0xe8, 0x4c, 0x2e, 0x35, 0x05, 0x36, 0x46, 0x58, 0x6b, 0xa4, 0x24, 0x9f, 0x13, 0x61, 0x38, 0x79, + 0x2d, 0x85, 0x30, 0x03, 0xb1, 0x7a, 0xc4, 0x6b, 0x4c, 0x12, 0x60, 0xaa, 0x48, 0xeb, 0xdf, 0xca, + 0x41, 0x25, 0x3d, 0xf1, 0xc8, 0xbb, 0x50, 0x96, 0x57, 0xcc, 0xee, 0x39, 0xe1, 0x9e, 0x48, 0x4b, + 0x8a, 0xbb, 0x56, 0x79, 0x2f, 0xcd, 0xde, 0x73, 0xb4, 0xf4, 0x75, 0x1a, 0x01, 0x5b, 0x90, 0xd7, + 0xc5, 0xbd, 0x05, 0x65, 0x02, 0x45, 0x7e, 0xd4, 0x4d, 0xa5, 0x25, 0x95, 0x68, 0xe4, 0x35, 0xc8, + 0xf3, 0x7b, 0x97, 0x6a, 0x4e, 0xab, 0x07, 0x77, 0x6a, 0xfc, 0xda, 0x18, 0x3f, 0x74, 0xd7, 0x4f, + 0x2f, 0x18, 0x3e, 0x59, 0x56, 0x6e, 0xed, 0x8d, 0x6a, 0xb9, 0x7d, 0x24, 0x38, 0x6e, 0xdc, 0xc9, + 0xd7, 0xf7, 0xde, 0x2f, 0x14, 0xf3, 0x95, 0x82, 0xb8, 0xa7, 0xf5, 0x7b, 0x79, 0x28, 0xc5, 0xdf, + 0x27, 0x04, 0xd0, 0xde, 0x10, 0xa7, 0xe7, 0xf8, 0x3f, 0xb9, 0x04, 0x45, 0x69, 0x62, 0x88, 0x13, + 0xf4, 0xb1, 0x50, 0x98, 0x17, 0x33, 0x20, 0x6d, 0x09, 0x6e, 0x5e, 0x58, 0xf2, 0x27, 0xb9, 0x05, + 0xb1, 0xa1, 0x30, 0xc8, 0xa2, 0x28, 0xb0, 0x01, 0xb3, 0x62, 0x34, 0x32, 0x09, 0x39, 0x8f, 0xc7, + 0xa4, 0x97, 0xac, 0x9c, 0xe7, 0x92, 0x77, 0xa1, 0xe8, 0xb8, 0x2e, 0x75, 0x6d, 0x27, 0x1a, 0xe2, + 0x29, 0xe2, 0x22, 0xe3, 0xc6, 0x35, 0x3a, 0x52, 0xd5, 0x22, 0x52, 0x83, 0x12, 0xbe, 0x44, 0xdb, + 0x0b, 0x87, 0x7a, 0xbe, 0x36, 0xe1, 0x50, 0x64, 0x64, 0x1b, 0x21, 0x75, 0xc9, 0x4b, 0x50, 0x60, + 0xa3, 0x29, 0xd6, 0x83, 0x38, 0x53, 0xe1, 0xea, 0xfa, 0x1a, 0xef, 0xb0, 0x7b, 0x67, 0x2c, 0x44, + 0x20, 0x2f, 0x40, 0xbe, 0x37, 0xb7, 0x23, 0x34, 0x7d, 0x25, 0xb9, 0x92, 0x1b, 0xa3, 0xb1, 0x62, + 0x72, 0x1b, 0x8a, 0x8f, 0xf4, 0xcb, 0x97, 0xe7, 0x53, 0xc3, 0x18, 0xe3, 0xc7, 0x88, 0xf5, 0x22, + 0x8c, 0xf2, 0x6b, 0x87, 0xe6, 0x73, 0x00, 0xc9, 0xa7, 0xfb, 0x03, 0x1d, 0xcc, 0xaf, 0x41, 0x29, + 0xfe, 0x24, 0x79, 0x16, 0x60, 0x9f, 0x1e, 0xd8, 0x7b, 0x4e, 0xc7, 0x15, 0xcf, 0xea, 0x94, 0xad, + 0xd2, 0x3e, 0x3d, 0xb8, 0x87, 0x00, 0x72, 0x11, 0xc6, 0xba, 0x6c, 0x54, 0x65, 0x52, 0x5d, 0x6b, + 0xb4, 0xdb, 0xdb, 0x66, 0x12, 0x3a, 0x03, 0x63, 0xe8, 0xfc, 0x10, 0x13, 0x6d, 0xc2, 0x92, 0x3f, + 0xcd, 0xdf, 0xca, 0x61, 0xba, 0x05, 0xa5, 0x9e, 0xe4, 0x79, 0x98, 0x68, 0x06, 0x14, 0x97, 0x23, + 0x87, 0x99, 0x45, 0xe2, 0x3b, 0xe5, 0x04, 0xb8, 0xe4, 0x92, 0x6b, 0x30, 0x95, 0x64, 0xf9, 0xb5, + 0x9b, 0xdb, 0xe2, 0xea, 0x75, 0xd9, 0x9a, 0xe8, 0xca, 0x34, 0xbf, 0xf3, 0xdb, 0x78, 0x97, 0xa2, + 0xa2, 0x5e, 0x39, 0x8c, 0x64, 0xc6, 0xde, 0x92, 0x35, 0xa5, 0xc0, 0xf1, 0xe0, 0xe4, 0x02, 0x8c, + 0x3a, 0xce, 0x6e, 0xcf, 0xe3, 0x71, 0xdd, 0x65, 0x4b, 0xfc, 0x22, 0x9f, 0x85, 0xe9, 0xd0, 0xdb, + 0xed, 0x38, 0x51, 0x2f, 0x10, 0xf9, 0x2e, 0x68, 0x80, 0x22, 0x35, 0x61, 0x55, 0xe2, 0x82, 0x79, + 0x0e, 0x27, 0xaf, 0x02, 0x51, 0xbf, 0xe7, 0x6f, 0x7f, 0x48, 0x9b, 0x5c, 0xd4, 0xca, 0xd6, 0xb4, + 0x52, 0xb2, 0x8a, 0x05, 0xe4, 0x33, 0x50, 0x0e, 0x68, 0x88, 0x26, 0x19, 0x76, 0x1b, 0x66, 0xf1, + 0xb1, 0xc6, 0x25, 0xec, 0x3e, 0x3d, 0x30, 0xeb, 0x30, 0xdd, 0x37, 0x1f, 0xc9, 0xab, 0xdc, 0xba, + 0x17, 0xeb, 0x73, 0x99, 0x6f, 0x66, 0xf0, 0xf5, 0x29, 0xfd, 0xf1, 0x72, 0x8e, 0x64, 0x76, 0xa0, + 0xac, 0xea, 0xd7, 0x13, 0x2e, 0xb5, 0x5f, 0xc0, 0xc8, 0x4f, 0xae, 0x7c, 0x46, 0x8f, 0x0e, 0xab, + 0x39, 0xcf, 0xc5, 0x78, 0xcf, 0xeb, 0x50, 0x94, 0x56, 0x82, 0xfa, 0x04, 0x8c, 0x30, 0x28, 0x0f, + 0xac, 0xb8, 0xd4, 0x7c, 0x09, 0xc6, 0x84, 0x0a, 0x3d, 0xde, 0x11, 0x65, 0x7e, 0x23, 0x07, 0x53, + 0x16, 0x65, 0x13, 0x5c, 0x3c, 0xae, 0xf2, 0x29, 0xcb, 0x77, 0xac, 0xb5, 0xed, 0x98, 0x1c, 0x12, + 0xdf, 0x35, 0xe0, 0x6c, 0x06, 0xee, 0x47, 0x4a, 0x90, 0xf6, 0x3a, 0x94, 0x16, 0x3c, 0xa7, 0x55, + 0x73, 0xdd, 0x38, 0x82, 0x15, 0xad, 0x41, 0x97, 0x4d, 0x27, 0x87, 0x41, 0xd5, 0xc5, 0x34, 0x46, + 0x25, 0x37, 0x84, 0x50, 0x24, 0x29, 0x1c, 0x65, 0x46, 0x65, 0xe0, 0x75, 0x4a, 0xf2, 0x29, 0xe3, + 0x75, 0x44, 0x0e, 0x4c, 0x0e, 0x48, 0x9f, 0xda, 0xa1, 0xcb, 0xbe, 0x8e, 0x98, 0x6e, 0xde, 0x50, + 0xdb, 0xce, 0x6f, 0xe6, 0xe0, 0x42, 0x36, 0xe1, 0x47, 0xcd, 0x75, 0x87, 0x09, 0x3c, 0x94, 0xa4, + 0xd5, 0x98, 0xeb, 0x8e, 0x67, 0xfb, 0x40, 0xfc, 0x04, 0x81, 0xec, 0xc0, 0xc4, 0xb2, 0x13, 0x46, + 0xf7, 0xa8, 0x13, 0x44, 0xdb, 0xd4, 0x89, 0x86, 0xb0, 0x60, 0xe3, 0x27, 0xc2, 0x71, 0x51, 0xdb, + 0x93, 0x94, 0xe9, 0x27, 0xc2, 0x35, 0xb6, 0xb1, 0xa0, 0x14, 0x86, 0x10, 0x94, 0xaf, 0xc3, 0x54, + 0x83, 0xb6, 0x9d, 0xee, 0x9e, 0x1f, 0x50, 0xe1, 0x3b, 0xbf, 0x09, 0x13, 0x31, 0x28, 0x53, 0x5a, + 0xf4, 0x62, 0x0d, 0x5f, 0xe9, 0x88, 0x44, 0x95, 0xe8, 0xc5, 0xe6, 0x6f, 0xe4, 0xe0, 0x62, 0xad, + 0x29, 0x0e, 0x1a, 0x44, 0x81, 0x3c, 0x0f, 0xfd, 0x84, 0xbf, 0x4d, 0x66, 0xa1, 0xf4, 0xc0, 0x79, + 0xbc, 0x4c, 0xf1, 0x11, 0x5f, 0x9e, 0x31, 0x89, 0x9b, 0x5f, 0xce, 0x63, 0x3b, 0x76, 0x7b, 0x59, + 0x09, 0x8e, 0xba, 0xd9, 0x2c, 0x7c, 0xcc, 0xcd, 0xa6, 0x09, 0xa3, 0xf7, 0xfc, 0x96, 0x2b, 0x16, + 0x27, 0x71, 0x6e, 0xb1, 0x87, 0x10, 0x4b, 0x94, 0x98, 0x3f, 0x30, 0x60, 0x32, 0xae, 0x31, 0x56, + 0xe1, 0x13, 0xef, 0x92, 0x6b, 0x30, 0x86, 0x1f, 0x8a, 0x1f, 0x28, 0xc2, 0x45, 0xa3, 0xc5, 0x40, + 0xb6, 0xe7, 0x5a, 0xb2, 0x50, 0xed, 0x89, 0x91, 0x8f, 0xd7, 0x13, 0xe6, 0x3f, 0xc2, 0x23, 0x11, + 0xb5, 0x95, 0x6c, 0x25, 0x52, 0x2a, 0x62, 0x0c, 0x59, 0x91, 0xdc, 0x13, 0x1b, 0x92, 0xfc, 0xc0, + 0x21, 0xf9, 0x85, 0x1c, 0x8c, 0xc7, 0x95, 0xfd, 0x94, 0xdd, 0xe3, 0x8f, 0xdb, 0x35, 0x54, 0x14, + 0x7b, 0x43, 0xd1, 0x15, 0x22, 0x58, 0xfc, 0x3d, 0x18, 0x15, 0x93, 0xc9, 0x48, 0x9d, 0x0b, 0xa6, + 0x46, 0x37, 0x79, 0xe6, 0x19, 0x07, 0x34, 0xb4, 0x04, 0x1d, 0x5e, 0x13, 0xd8, 0xa2, 0xdb, 0xe2, + 0x84, 0xec, 0xa9, 0x5d, 0xa3, 0xb2, 0xaf, 0x09, 0x24, 0x0d, 0x1b, 0x6a, 0x75, 0xfa, 0x7b, 0x05, + 0xa8, 0xa4, 0x49, 0x4e, 0xce, 0x94, 0xb0, 0xd6, 0xdb, 0x16, 0x6f, 0x64, 0x60, 0xa6, 0x84, 0x6e, + 0x6f, 0xdb, 0x62, 0x30, 0x72, 0x0d, 0x0a, 0x6b, 0x81, 0xf7, 0x10, 0x5b, 0x2d, 0x9e, 0x08, 0xe9, + 0x06, 0xde, 0x43, 0x35, 0x5e, 0x96, 0x95, 0xe3, 0x86, 0x76, 0xb9, 0xa1, 0xbc, 0xb0, 0xcf, 0x37, + 0xb4, 0xad, 0x30, 0x9d, 0x92, 0x47, 0xa2, 0xb1, 0xa5, 0xb2, 0x4e, 0x9d, 0x40, 0xdc, 0xea, 0x17, + 0xea, 0x0c, 0x97, 0xca, 0x6d, 0x04, 0xf3, 0x7c, 0xbb, 0x96, 0x8a, 0x44, 0x5a, 0x40, 0x94, 0x9f, + 0x72, 0x02, 0x9f, 0xbc, 0xc7, 0x93, 0x4f, 0x5b, 0x9d, 0x53, 0x59, 0xdb, 0xea, 0x6c, 0xce, 0xe0, + 0xfb, 0x24, 0x7d, 0x84, 0x6b, 0x50, 0x42, 0x97, 0x17, 0x3a, 0x32, 0x8a, 0x27, 0x32, 0x93, 0xb1, + 0xc9, 0x80, 0xf1, 0x04, 0x76, 0xec, 0xce, 0x48, 0x98, 0x90, 0x77, 0x60, 0x5c, 0x0d, 0xa8, 0xe5, + 0x61, 0x9f, 0x57, 0xf8, 0x15, 0xae, 0x01, 0xa9, 0xeb, 0x54, 0x02, 0xf3, 0x73, 0xaa, 0x94, 0x88, + 0x45, 0xfb, 0x58, 0x29, 0x31, 0x7f, 0x0d, 0xcd, 0xf8, 0xb6, 0x1f, 0x51, 0x61, 0xbd, 0x3c, 0xb5, + 0x7a, 0x2c, 0x71, 0x21, 0x8f, 0x68, 0x31, 0x2d, 0x5a, 0xeb, 0x4e, 0xf1, 0xb6, 0xfc, 0xef, 0x1a, + 0x70, 0x3e, 0x93, 0x96, 0xdc, 0x04, 0x48, 0x6c, 0x44, 0xd1, 0x4b, 0x3c, 0x91, 0x71, 0x0c, 0xb5, + 0x14, 0x0c, 0xf2, 0xd5, 0xb4, 0x75, 0x77, 0xf2, 0xe2, 0x24, 0x9f, 0xfb, 0x98, 0xd4, 0xad, 0xbb, + 0x0c, 0x9b, 0xce, 0xfc, 0x6e, 0x1e, 0xa6, 0xfb, 0x9e, 0x89, 0x3c, 0x21, 0x8a, 0x60, 0x3f, 0xf5, + 0x08, 0x19, 0x3f, 0xee, 0xb8, 0x31, 0xe8, 0x91, 0xca, 0x8c, 0x27, 0xc9, 0xd0, 0x2d, 0x26, 0x72, + 0x68, 0x9f, 0xf0, 0x32, 0x59, 0x98, 0xfd, 0x7c, 0xdd, 0x67, 0x07, 0x7e, 0xed, 0x09, 0x3c, 0x63, + 0xf7, 0x23, 0xfc, 0xca, 0xd7, 0xaf, 0xe5, 0xe0, 0x6c, 0x5f, 0x9b, 0x9f, 0xda, 0x59, 0xf7, 0x9e, + 0xb6, 0xba, 0x3d, 0x37, 0x68, 0x4c, 0x87, 0xb2, 0x22, 0xfe, 0x87, 0x01, 0x17, 0x07, 0x50, 0x92, + 0x83, 0xb4, 0x10, 0x71, 0xab, 0xe2, 0xd6, 0xf1, 0x1f, 0x7c, 0x22, 0xa2, 0xf4, 0x89, 0x49, 0xc2, + 0x37, 0x72, 0x00, 0x5b, 0x74, 0xfb, 0xe9, 0x4e, 0x03, 0xf5, 0x05, 0x4d, 0x00, 0x14, 0x07, 0xe6, + 0xf0, 0x59, 0xa0, 0x56, 0xd1, 0x91, 0x38, 0x7c, 0x0e, 0xa8, 0xf8, 0x49, 0x93, 0x5c, 0xf6, 0x93, + 0x26, 0xe6, 0x36, 0x9c, 0xbb, 0x4b, 0xa3, 0x64, 0x25, 0x94, 0x7b, 0xc8, 0xe3, 0xd9, 0xbe, 0x02, + 0x25, 0x81, 0xaf, 0xa7, 0xa7, 0x97, 0x21, 0x71, 0x9e, 0x6b, 0x25, 0x08, 0x26, 0x85, 0x8b, 0x0b, + 0xb4, 0x45, 0x23, 0xfa, 0xc9, 0x7e, 0xa6, 0x01, 0x84, 0x37, 0x85, 0xbf, 0x74, 0x31, 0xd4, 0x17, + 0x4e, 0xec, 0x9f, 0x4d, 0x38, 0x1f, 0xd7, 0xfd, 0x49, 0xf2, 0x9d, 0x65, 0xb6, 0x84, 0xb8, 0x93, + 0x98, 0x70, 0x3c, 0xc6, 0x89, 0xf8, 0x18, 0x2e, 0x4b, 0x82, 0x2d, 0x2f, 0x3e, 0x89, 0x19, 0x8a, + 0x96, 0xbc, 0x05, 0xe3, 0x0a, 0x8d, 0xb8, 0x59, 0x8d, 0xa7, 0x9d, 0x8f, 0xbc, 0x68, 0xcf, 0x0e, + 0x39, 0x5c, 0x3d, 0xed, 0x54, 0xd0, 0xcd, 0xaf, 0xc0, 0x33, 0x71, 0xdc, 0x4a, 0xc6, 0xa7, 0x53, + 0xcc, 0x8d, 0xd3, 0x31, 0x5f, 0x49, 0x9a, 0xb5, 0xd4, 0x89, 0x23, 0xe0, 0x25, 0x6f, 0xa2, 0x36, + 0x4b, 0x34, 0xe6, 0x8a, 0x92, 0x1e, 0x4f, 0xac, 0x45, 0x09, 0xc0, 0x7c, 0x53, 0xa9, 0x6c, 0x06, + 0x43, 0x8d, 0xd8, 0x48, 0x13, 0x7f, 0x23, 0x07, 0x53, 0xab, 0x4b, 0x0b, 0xf3, 0xb1, 0x1b, 0xf9, + 0x53, 0x96, 0xa3, 0x4a, 0x6b, 0xdb, 0x60, 0x7d, 0x63, 0x6e, 0xc0, 0xd9, 0x54, 0x37, 0xe0, 0x43, + 0x3e, 0xef, 0xf0, 0xf8, 0x92, 0x18, 0x2c, 0x57, 0x96, 0x0b, 0x59, 0xec, 0x37, 0x6f, 0x5b, 0x29, + 0x6c, 0xf3, 0xbb, 0xa3, 0x29, 0xbe, 0x42, 0x85, 0xbd, 0x02, 0xa5, 0xa5, 0x30, 0xec, 0xd1, 0x60, + 0xc3, 0x5a, 0x56, 0x6d, 0x44, 0x0f, 0x81, 0x76, 0x2f, 0x68, 0x59, 0x09, 0x02, 0x79, 0x19, 0x8a, + 0xe2, 0x1e, 0x9c, 0xd4, 0x09, 0x78, 0x5c, 0x1e, 0x5f, 0xa3, 0xb3, 0xe2, 0x62, 0xf2, 0x1a, 0x94, + 0xf9, 0xff, 0x5c, 0xda, 0x44, 0x87, 0xa3, 0xaf, 0x4a, 0xa0, 0x73, 0xe9, 0xb4, 0x34, 0x34, 0xb6, + 0x33, 0x93, 0x2f, 0x85, 0xb2, 0x1a, 0x15, 0x92, 0x9d, 0x99, 0x7c, 0x54, 0x14, 0xeb, 0xa4, 0x22, + 0x91, 0x1b, 0x90, 0xaf, 0xcd, 0x5b, 0x6a, 0x46, 0x6e, 0xa7, 0x19, 0xf0, 0x8c, 0xf6, 0xda, 0x63, + 0x5c, 0xb5, 0x79, 0x8b, 0xcc, 0x41, 0x11, 0x1f, 0x5b, 0x71, 0x69, 0x20, 0xa2, 0x5e, 0x51, 0x6a, + 0xba, 0x02, 0xa6, 0x9e, 0x3c, 0x4a, 0x3c, 0x32, 0x0b, 0x63, 0x0b, 0x5e, 0xd8, 0x6d, 0x39, 0x07, + 0x22, 0x39, 0x0d, 0x1e, 0x86, 0xb8, 0x1c, 0xa4, 0xca, 0x99, 0xc0, 0x22, 0x2f, 0xc3, 0x48, 0xa3, + 0xe9, 0x77, 0xd9, 0x6e, 0x2b, 0x0e, 0x6d, 0x09, 0x19, 0x40, 0x4b, 0x3d, 0xc1, 0x00, 0x78, 0x35, + 0x9b, 0xdf, 0x30, 0x2b, 0x29, 0x57, 0xb3, 0xd3, 0x37, 0xcb, 0x04, 0x4e, 0x7f, 0xf0, 0x21, 0x3c, + 0xc9, 0xe0, 0xc3, 0x6d, 0xb8, 0x78, 0x17, 0x4d, 0xfd, 0x06, 0x0d, 0x30, 0x1f, 0x28, 0x7f, 0xb8, + 0x69, 0xc3, 0x5a, 0x12, 0xb7, 0xea, 0xf0, 0x8e, 0x13, 0xdf, 0x0d, 0xd8, 0x21, 0xc7, 0x91, 0x6f, + 0x3e, 0xa5, 0x5e, 0xab, 0x18, 0xc4, 0x88, 0x7c, 0x09, 0xce, 0x65, 0x15, 0x89, 0xfb, 0x75, 0x18, + 0xd7, 0x9e, 0xfd, 0x01, 0x35, 0xb0, 0x3c, 0x8b, 0x03, 0x59, 0x86, 0x0a, 0x87, 0xd7, 0xdc, 0xb6, + 0xd7, 0x59, 0x6c, 0x3b, 0x5e, 0x0b, 0x6f, 0xdb, 0x89, 0x2b, 0x93, 0x82, 0xab, 0xc3, 0x0a, 0x6d, + 0xca, 0x4a, 0xb5, 0xe8, 0xa4, 0x14, 0x25, 0xaa, 0xa3, 0x46, 0xed, 0xc1, 0x72, 0x32, 0xa7, 0x3e, + 0x5d, 0xe7, 0x46, 0x5a, 0xdb, 0x8e, 0x39, 0x37, 0xda, 0x80, 0xb3, 0xa9, 0x6e, 0x90, 0xea, 0x48, + 0x03, 0xa7, 0xd5, 0x51, 0x8a, 0xc6, 0x4a, 0x61, 0x9b, 0xff, 0x79, 0x34, 0xc5, 0x57, 0xf8, 0x8a, + 0x4c, 0x18, 0xe5, 0xda, 0x46, 0xcd, 0x5e, 0xc7, 0x75, 0x91, 0x25, 0x4a, 0xc8, 0x25, 0xc8, 0x37, + 0x1a, 0xab, 0x6a, 0x6e, 0xcd, 0x30, 0xf4, 0x2d, 0x06, 0x63, 0x23, 0x84, 0x6e, 0x20, 0xe5, 0x8a, + 0x59, 0x93, 0x06, 0x91, 0x78, 0x4a, 0xf6, 0xc5, 0x64, 0x1e, 0x17, 0x92, 0xfe, 0x16, 0xf3, 0x38, + 0x99, 0xbd, 0xf3, 0x30, 0x53, 0x0b, 0x43, 0x1a, 0x44, 0xfc, 0x41, 0x80, 0xb0, 0xd7, 0xa6, 0x81, + 0x90, 0x35, 0xa1, 0x63, 0xf8, 0x43, 0xf4, 0xcd, 0xd0, 0x1a, 0x88, 0x48, 0xae, 0x43, 0xb1, 0xd6, + 0x73, 0x3d, 0xda, 0x69, 0x6a, 0xd1, 0xf5, 0x8e, 0x80, 0x59, 0x71, 0x29, 0xf9, 0x00, 0xce, 0x0b, + 0x22, 0xa9, 0x70, 0x44, 0x0f, 0x70, 0x5d, 0xc3, 0x77, 0xb0, 0x62, 0x2e, 0x48, 0x35, 0x65, 0x8b, + 0x2e, 0xc9, 0xa6, 0x24, 0x35, 0xa8, 0x2c, 0xe2, 0x39, 0xa9, 0x7c, 0x50, 0xda, 0x0f, 0x44, 0xe2, + 0x67, 0xd4, 0x5c, 0xfc, 0x0c, 0xd5, 0x76, 0xe3, 0x42, 0xab, 0x0f, 0x9d, 0xdc, 0x87, 0xb3, 0x69, + 0x18, 0xd3, 0xc7, 0xa5, 0xe4, 0xc1, 0xb7, 0x3e, 0x2e, 0xa8, 0x98, 0xb3, 0xa8, 0xc8, 0x36, 0x4c, + 0xd7, 0xa2, 0x28, 0xf0, 0xb6, 0x7b, 0x11, 0x4d, 0xa9, 0x2e, 0xe9, 0x68, 0x8c, 0xcb, 0xa5, 0xfa, + 0x7a, 0x46, 0x08, 0xe3, 0x59, 0x27, 0xa6, 0x8c, 0x55, 0x98, 0xd5, 0xcf, 0x8e, 0xb8, 0xf1, 0x9b, + 0x91, 0xe2, 0x5d, 0x45, 0x71, 0x25, 0x4a, 0x3a, 0x74, 0x6b, 0xe1, 0x41, 0xbb, 0x4d, 0xa3, 0x00, + 0x4f, 0xee, 0xf1, 0xdd, 0x45, 0x53, 0xc4, 0x00, 0x5d, 0x56, 0x9e, 0x4a, 0xc5, 0xb7, 0x35, 0xb5, + 0xf0, 0x48, 0x8d, 0xa7, 0xb6, 0x7c, 0x94, 0x87, 0x5c, 0x3e, 0x5a, 0x30, 0xbd, 0xd8, 0x69, 0x06, + 0x07, 0x78, 0x37, 0x53, 0x56, 0x6e, 0xe2, 0x84, 0xca, 0xc9, 0x47, 0x55, 0xae, 0x38, 0x52, 0xc2, + 0xb2, 0xaa, 0xd7, 0xcf, 0xd8, 0xfc, 0xff, 0xa0, 0x92, 0xee, 0xcb, 0x8f, 0xf9, 0x50, 0xf6, 0x69, + 0x42, 0xb3, 0xd9, 0x48, 0xa7, 0xdb, 0x42, 0x66, 0xb5, 0xd7, 0x90, 0x8d, 0xe4, 0xf6, 0xbe, 0xf2, + 0x6e, 0xb1, 0xf6, 0x06, 0xb2, 0x9c, 0xc6, 0xb9, 0xac, 0x69, 0x6c, 0xfe, 0x62, 0x0e, 0xa6, 0x79, + 0x34, 0xe9, 0xd3, 0x6f, 0x2b, 0xbe, 0xa3, 0x29, 0x67, 0xe9, 0x0b, 0x4c, 0xb5, 0xee, 0x18, 0x6b, + 0xf1, 0x6b, 0x70, 0xbe, 0xaf, 0x2b, 0x50, 0x41, 0x2f, 0xc8, 0x38, 0xde, 0x3e, 0x15, 0x3d, 0x93, + 0xfd, 0x91, 0xcd, 0xdb, 0x56, 0x1f, 0x85, 0xf9, 0x0f, 0x72, 0x7d, 0xfc, 0x85, 0xdd, 0xa8, 0x5a, + 0x82, 0xc6, 0xe9, 0x2c, 0xc1, 0xdc, 0x47, 0xb2, 0x04, 0xf3, 0xc3, 0x58, 0x82, 0x1f, 0xc0, 0xc4, + 0x3a, 0x75, 0x98, 0x45, 0x23, 0xae, 0xcb, 0x15, 0xb4, 0x97, 0x8a, 0x59, 0x99, 0xd4, 0x2f, 0xf1, + 0x55, 0xdb, 0x88, 0x11, 0x30, 0xd5, 0xc2, 0xef, 0xcf, 0x59, 0x3a, 0x07, 0x75, 0xd1, 0x18, 0x19, + 0xbc, 0x68, 0x98, 0x01, 0x8c, 0x37, 0x1a, 0xab, 0x5b, 0x4e, 0xc0, 0xb4, 0x45, 0xc8, 0x4c, 0x46, + 0x19, 0x26, 0x6a, 0x24, 0x8a, 0xb7, 0x3f, 0x3e, 0x54, 0x62, 0x31, 0xc5, 0x22, 0x89, 0x45, 0x48, + 0x05, 0x8f, 0x88, 0x13, 0x30, 0x2d, 0x22, 0x4e, 0xc0, 0xcc, 0xbf, 0x5f, 0x80, 0x0a, 0x0f, 0x7d, + 0x64, 0xfb, 0x5e, 0x91, 0xa2, 0xa7, 0xef, 0xa9, 0x06, 0xe3, 0xf4, 0x4f, 0x35, 0x7c, 0x84, 0x18, + 0x5b, 0xe5, 0x2e, 0x76, 0x7e, 0x88, 0xbb, 0xd8, 0x6f, 0x68, 0x17, 0x99, 0x0b, 0xc9, 0x5b, 0xa0, + 0xfb, 0xbd, 0x6d, 0x7a, 0xfc, 0x15, 0xe6, 0xd7, 0xd5, 0x1b, 0xc7, 0x23, 0x49, 0xf4, 0x09, 0x52, + 0x1e, 0x73, 0xd7, 0x38, 0xd6, 0x62, 0xa3, 0xa7, 0x89, 0x37, 0x1f, 0xfb, 0x7f, 0x1a, 0x6f, 0xbe, + 0x08, 0xa0, 0xe4, 0x6d, 0x29, 0x26, 0x4f, 0x82, 0x9e, 0x9c, 0xb3, 0x45, 0x21, 0x34, 0xff, 0x53, + 0x11, 0xa6, 0x1b, 0x8d, 0xd5, 0x05, 0xcf, 0xd9, 0xed, 0xf8, 0x61, 0xe4, 0x35, 0x97, 0x3a, 0x3b, + 0x3e, 0x9b, 0xc2, 0xeb, 0x34, 0x8c, 0xee, 0xb4, 0xfc, 0x47, 0x6a, 0xec, 0x73, 0x44, 0xc3, 0xc8, + 0xde, 0x69, 0xf9, 0x8f, 0xac, 0xb8, 0x98, 0x2d, 0x11, 0x8b, 0x41, 0x10, 0xbf, 0x3e, 0x82, 0x4b, + 0x04, 0x65, 0x00, 0x8b, 0xc3, 0xd9, 0x2c, 0x69, 0xf4, 0x78, 0x02, 0x0e, 0x9e, 0xec, 0x0d, 0x67, + 0x49, 0xc8, 0x41, 0x96, 0x2c, 0x23, 0xb4, 0x5f, 0x60, 0x85, 0xd6, 0xbc, 0xa8, 0x45, 0xad, 0x27, + 0xc5, 0xe2, 0x19, 0x3b, 0x84, 0xe2, 0xe8, 0xda, 0x5d, 0x84, 0xab, 0xc6, 0x7b, 0xdf, 0x1c, 0x88, + 0xe0, 0x3c, 0x33, 0x2e, 0xfb, 0x6d, 0x8e, 0x91, 0xe3, 0x6d, 0x8e, 0x17, 0x85, 0x4e, 0x78, 0x36, + 0xc3, 0xe6, 0x50, 0x1f, 0x27, 0xc8, 0x64, 0x4e, 0x7e, 0xd1, 0x80, 0x67, 0x33, 0x4b, 0xe2, 0x89, + 0xad, 0x5f, 0x1a, 0x50, 0xf4, 0x05, 0xe6, 0x2b, 0xf9, 0x2c, 0xde, 0xd2, 0xc8, 0xf8, 0xb4, 0x9d, + 0xa1, 0x05, 0x8e, 0xff, 0x12, 0xf9, 0x57, 0x06, 0x5c, 0xd4, 0x30, 0x30, 0xd1, 0x61, 0x9b, 0x76, + 0x4e, 0x12, 0xe9, 0x0f, 0x9f, 0x8c, 0x48, 0x3f, 0xaf, 0xb7, 0x85, 0x27, 0x83, 0xc6, 0xcf, 0xab, + 0x9b, 0xc4, 0x01, 0x35, 0x24, 0x3f, 0x09, 0xd3, 0x58, 0x24, 0x4d, 0x1f, 0x26, 0xae, 0x28, 0xfd, + 0xe5, 0xfa, 0xdc, 0x9f, 0x1d, 0x56, 0x27, 0xb4, 0x02, 0xbc, 0x51, 0x88, 0x5f, 0x8b, 0x2d, 0x25, + 0xaf, 0xb3, 0xe3, 0x6b, 0x89, 0x4d, 0xd3, 0xcc, 0xc8, 0xbf, 0x31, 0x60, 0x86, 0x41, 0x79, 0x85, + 0xef, 0x04, 0x7e, 0x3b, 0x2e, 0x3f, 0x21, 0x4f, 0x40, 0xeb, 0xc9, 0x74, 0xd0, 0x8b, 0x58, 0x65, + 0x3e, 0xf1, 0xed, 0x9d, 0xc0, 0x6f, 0x27, 0xd5, 0xd7, 0x72, 0x85, 0x0c, 0xaa, 0x24, 0xf9, 0x79, + 0x03, 0x2e, 0x69, 0x3b, 0x28, 0xf5, 0x3e, 0x5e, 0xca, 0x2f, 0xa0, 0x16, 0xd5, 0x6f, 0x0a, 0x21, + 0xbf, 0x86, 0x35, 0x48, 0x96, 0x04, 0xac, 0x8b, 0xdd, 0xe6, 0x58, 0x4a, 0x15, 0x06, 0x7f, 0xc5, + 0xfc, 0x66, 0x0e, 0xc6, 0x95, 0x35, 0x95, 0x7c, 0x1e, 0xca, 0xab, 0xc1, 0xae, 0xd3, 0xf1, 0x7e, + 0xca, 0x51, 0xce, 0x1c, 0x71, 0xcd, 0xf6, 0x15, 0xb8, 0xa5, 0x61, 0x61, 0xac, 0x28, 0x75, 0xda, + 0xaa, 0xb5, 0xc7, 0xd6, 0x64, 0x0b, 0xa1, 0xa7, 0x5c, 0x57, 0xde, 0xcd, 0x58, 0x57, 0x4e, 0x95, + 0x20, 0xe3, 0xad, 0xfe, 0xd5, 0x65, 0xf8, 0x7c, 0x16, 0xe6, 0x2f, 0xe7, 0xa0, 0x22, 0x1e, 0xb2, + 0x97, 0x27, 0x66, 0x9f, 0xae, 0x87, 0xaf, 0xf4, 0xc6, 0x1d, 0x13, 0x13, 0x52, 0xf8, 0xf5, 0xdf, + 0xae, 0xe2, 0xb3, 0xe4, 0xe9, 0xee, 0x90, 0xcf, 0x92, 0xeb, 0xf0, 0xf4, 0x75, 0xb9, 0x34, 0x95, + 0x95, 0xc6, 0x37, 0xff, 0x24, 0x97, 0xe6, 0x2d, 0x5c, 0x08, 0x2f, 0xc2, 0x18, 0x7f, 0x87, 0x54, + 0xde, 0xe8, 0x11, 0x89, 0x1d, 0x11, 0x64, 0xc9, 0xb2, 0xd3, 0x5c, 0x9c, 0x3c, 0xe9, 0x6d, 0x7a, + 0xf2, 0x3a, 0x94, 0x31, 0x48, 0xb2, 0xe6, 0xba, 0x01, 0x5b, 0x02, 0x0b, 0x49, 0x0e, 0xc7, 0x47, + 0x74, 0xdb, 0xe6, 0xc1, 0x94, 0x8e, 0xeb, 0x06, 0x96, 0x86, 0x47, 0xe6, 0xe1, 0x9c, 0x16, 0x93, + 0x2b, 0xe9, 0x47, 0x92, 0x2d, 0x52, 0x84, 0x05, 0x9c, 0x38, 0x13, 0x19, 0xd3, 0x18, 0xfb, 0x2d, + 0xb6, 0x86, 0xa1, 0x65, 0xa3, 0xe7, 0xbf, 0x93, 0x93, 0x5e, 0x1e, 0xd4, 0x13, 0x4c, 0x3c, 0xd1, + 0x76, 0xba, 0x5a, 0x2e, 0x17, 0x8e, 0x68, 0xfe, 0xa5, 0xc1, 0xe6, 0x5a, 0x73, 0xff, 0x53, 0x76, + 0xa5, 0x93, 0x35, 0xe9, 0x18, 0x0f, 0xd7, 0x7f, 0x30, 0xf8, 0xa5, 0x2c, 0x21, 0x3e, 0x6f, 0xc0, + 0x28, 0x7f, 0xf5, 0x54, 0x5c, 0x1f, 0x52, 0xb9, 0xf0, 0x82, 0x24, 0x28, 0x83, 0xbf, 0x9d, 0x6a, + 0x09, 0x02, 0xd5, 0xe8, 0xcf, 0x0d, 0x65, 0xf4, 0x2b, 0x49, 0xd9, 0x87, 0x7b, 0xec, 0xc3, 0x38, + 0x39, 0x29, 0xbb, 0xf9, 0x7f, 0x72, 0xbc, 0x3d, 0xa2, 0x52, 0xc3, 0xa6, 0x01, 0xbe, 0x06, 0x05, + 0x7c, 0x5f, 0x5f, 0xc9, 0xb5, 0x9c, 0x7a, 0x5b, 0x1f, 0xcb, 0xd9, 0xbc, 0x41, 0x5d, 0xab, 0xde, + 0x22, 0x46, 0x75, 0xac, 0xce, 0x1b, 0xc4, 0xc0, 0xa7, 0x34, 0x7c, 0x97, 0xaa, 0xd3, 0xa1, 0xa3, + 0xbf, 0x7a, 0x82, 0xe5, 0xcc, 0xa2, 0x8f, 0x2f, 0xf3, 0xa8, 0x5e, 0xfc, 0xf6, 0x8e, 0x63, 0xf3, + 0x4b, 0x24, 0xaa, 0xb6, 0x4d, 0xee, 0xfd, 0x2c, 0xc2, 0xa4, 0x9e, 0x62, 0x44, 0x78, 0xda, 0x30, + 0x2d, 0x40, 0x2a, 0x3d, 0x89, 0xea, 0xd3, 0xd1, 0x89, 0xd8, 0x8e, 0x49, 0xcb, 0x23, 0xa1, 0x66, + 0xa0, 0xe7, 0xa9, 0xe3, 0xec, 0xfe, 0x04, 0x48, 0x3a, 0x89, 0x72, 0x4a, 0xfc, 0x39, 0xa8, 0x88, + 0x99, 0x19, 0x5f, 0xe8, 0x46, 0x7f, 0xc6, 0xd2, 0x82, 0xa5, 0xce, 0xa6, 0xa6, 0xe7, 0x06, 0x16, + 0x42, 0xcd, 0xef, 0x18, 0x70, 0x49, 0xbc, 0xe6, 0x6a, 0xd1, 0x30, 0x0a, 0x3c, 0x7e, 0x3f, 0x1c, + 0xe5, 0xf1, 0xf3, 0xe4, 0x2d, 0x99, 0x95, 0x52, 0x57, 0x90, 0xe9, 0x6f, 0xd4, 0x27, 0x84, 0x50, + 0x8e, 0x60, 0x5e, 0x4a, 0x99, 0x8d, 0xf2, 0x0d, 0x91, 0x8d, 0x32, 0x77, 0x3c, 0x71, 0x3c, 0x2f, + 0x5c, 0xda, 0x91, 0x59, 0x28, 0xbf, 0x9d, 0x83, 0xf3, 0x19, 0xd5, 0xda, 0xfc, 0xfc, 0x53, 0xaa, + 0x1c, 0xea, 0x9a, 0x72, 0x90, 0xe9, 0x8a, 0x07, 0x76, 0x7c, 0xa6, 0xae, 0xf8, 0x4d, 0x03, 0x2e, + 0xea, 0xd2, 0x23, 0x1c, 0xb0, 0x9b, 0xb7, 0xc9, 0x9b, 0x30, 0x7a, 0x8f, 0x3a, 0x2e, 0x95, 0xf7, + 0x0e, 0xcf, 0xa7, 0x72, 0xb4, 0xf3, 0x42, 0xce, 0xf6, 0x4f, 0xf8, 0x54, 0x3e, 0x63, 0x09, 0x12, + 0xb2, 0x20, 0x2a, 0xc7, 0x63, 0x32, 0x4c, 0x19, 0x9e, 0x90, 0xf5, 0xa9, 0x63, 0xbc, 0x41, 0xbf, + 0x6b, 0xc0, 0x33, 0xc7, 0xd0, 0xb0, 0x81, 0x63, 0x43, 0xaf, 0x0e, 0x1c, 0x2e, 0x2c, 0x08, 0x25, + 0xef, 0xc0, 0xd4, 0xba, 0x30, 0x5d, 0xe5, 0x70, 0x28, 0x4f, 0xdb, 0x48, 0xab, 0xd6, 0x96, 0xe3, + 0x92, 0x46, 0x26, 0xd7, 0xa1, 0x78, 0xcf, 0x0f, 0xa3, 0x4e, 0x92, 0xe3, 0x0d, 0x5d, 0xde, 0x7b, + 0x02, 0x66, 0xc5, 0xa5, 0xcc, 0x2c, 0xd0, 0xab, 0x29, 0x62, 0x00, 0x9f, 0x87, 0x51, 0x86, 0x13, + 0xbb, 0x94, 0x50, 0x0e, 0xf0, 0xad, 0x51, 0xcf, 0xb5, 0x44, 0x51, 0xec, 0xcc, 0xcc, 0x65, 0x1e, + 0xd5, 0x7f, 0xd3, 0x80, 0x8a, 0xce, 0xfb, 0xe3, 0x0e, 0xcd, 0xdb, 0xda, 0xd0, 0x3c, 0x93, 0x3d, + 0x34, 0x83, 0xc7, 0xa4, 0x2f, 0xdd, 0xd2, 0x50, 0x63, 0x61, 0xc2, 0xe8, 0x82, 0xdf, 0x76, 0xbc, + 0x8e, 0x9a, 0x22, 0xc8, 0x45, 0x88, 0x25, 0x4a, 0x94, 0xde, 0xca, 0x0f, 0xec, 0x2d, 0xf3, 0x57, + 0x0a, 0x70, 0xc9, 0xa2, 0xbb, 0x1e, 0x33, 0x90, 0x36, 0x42, 0xaf, 0xb3, 0xab, 0x05, 0x52, 0x98, + 0xa9, 0x0e, 0x17, 0xe1, 0xe3, 0x0c, 0x12, 0xf7, 0xf7, 0xcb, 0x50, 0x64, 0x5a, 0x5a, 0xe9, 0x73, + 0x74, 0x13, 0x60, 0xa2, 0x3b, 0x3e, 0xae, 0xb2, 0x98, 0xdc, 0x10, 0x6b, 0x88, 0x72, 0xc1, 0x87, + 0xad, 0x21, 0x3f, 0x3c, 0xac, 0x02, 0x7f, 0x5b, 0x82, 0x95, 0x8a, 0x75, 0x24, 0x36, 0xaa, 0x0a, + 0x03, 0x8c, 0xaa, 0x07, 0x70, 0xae, 0xe6, 0x72, 0xfd, 0xe4, 0xb4, 0xd6, 0x02, 0xaf, 0xd3, 0xf4, + 0xba, 0x4e, 0x4b, 0x1a, 0xe5, 0xe8, 0x2c, 0x72, 0xe2, 0x72, 0xbb, 0x1b, 0x23, 0x58, 0x99, 0x64, + 0xac, 0x19, 0x0b, 0x2b, 0x0d, 0x9e, 0xc7, 0x8c, 0x7b, 0x80, 0xb0, 0x19, 0x6e, 0x27, 0xe4, 0x89, + 0xcc, 0xac, 0xb8, 0x18, 0xcd, 0x39, 0xbc, 0xe3, 0xb7, 0xbe, 0xdc, 0xb8, 0x2f, 0xee, 0xcc, 0xc9, + 0xf8, 0x63, 0x7e, 0x25, 0x30, 0x6a, 0x85, 0xe8, 0xb4, 0xd6, 0xf0, 0x12, 0xba, 0x46, 0xe3, 0x1e, + 0xa3, 0x2b, 0xf6, 0xd1, 0x85, 0xe1, 0x9e, 0x4a, 0xc7, 0xf1, 0xc8, 0x2c, 0x00, 0x8f, 0xe0, 0x44, + 0x81, 0x28, 0x25, 0xc6, 0x5f, 0x80, 0x50, 0x6e, 0xfc, 0x29, 0x28, 0xe4, 0x2d, 0x38, 0xbb, 0x38, + 0x3f, 0x27, 0x2f, 0xc3, 0x2d, 0xf8, 0xcd, 0x1e, 0xdb, 0x37, 0xe3, 0xe5, 0xcc, 0x32, 0x1f, 0x43, + 0xda, 0x9c, 0x63, 0x52, 0x90, 0x85, 0x26, 0xae, 0xc4, 0xf1, 0x0b, 0xd5, 0xf3, 0xbe, 0x4b, 0xc3, + 0xcd, 0x5b, 0x9f, 0xb2, 0x2b, 0x71, 0x4a, 0xdb, 0x70, 0xb6, 0xdd, 0xca, 0x9c, 0x99, 0x7f, 0x1b, + 0xaf, 0xc4, 0xf5, 0xe1, 0x92, 0x1f, 0x83, 0x11, 0xfc, 0x29, 0x56, 0xdc, 0xb3, 0x19, 0x6c, 0x93, + 0xd5, 0xb6, 0xc9, 0x53, 0x52, 0x21, 0x01, 0x59, 0x4a, 0x5e, 0xee, 0x39, 0xc5, 0xc5, 0x0e, 0x91, + 0x95, 0x41, 0x7f, 0xb2, 0xcd, 0x85, 0xb2, 0xfa, 0x41, 0x26, 0x23, 0xf7, 0x9c, 0x70, 0x8f, 0xba, + 0xf3, 0xf2, 0xa1, 0xe7, 0x32, 0x97, 0x91, 0x3d, 0x84, 0xe2, 0x73, 0x72, 0x96, 0x82, 0xc2, 0xb4, + 0xc3, 0x52, 0xb8, 0x11, 0x8a, 0xaa, 0x88, 0x5d, 0x90, 0x87, 0xbb, 0x57, 0xd7, 0x12, 0x45, 0xa8, + 0x2d, 0xa5, 0x9f, 0x30, 0x70, 0x9a, 0xfb, 0x34, 0xd8, 0xbc, 0xf5, 0x49, 0x68, 0x4b, 0xfd, 0x1b, + 0xc7, 0x8c, 0xc9, 0x37, 0x20, 0xce, 0xa8, 0xa6, 0x21, 0x33, 0x1b, 0x31, 0x09, 0x47, 0x33, 0x12, + 0x1b, 0x31, 0x09, 0x47, 0x53, 0x6d, 0xc4, 0x18, 0x35, 0x4e, 0xab, 0x9f, 0x3b, 0x21, 0xad, 0xfe, + 0x80, 0x27, 0x44, 0xe4, 0x4d, 0x86, 0x4f, 0xd1, 0xa3, 0x4d, 0x5f, 0x84, 0x72, 0x2d, 0x8a, 0x9c, + 0xe6, 0x1e, 0x75, 0xf1, 0xf9, 0x06, 0x25, 0x0a, 0xc6, 0x11, 0x70, 0x35, 0x46, 0x5a, 0xc5, 0x55, + 0x1e, 0x6d, 0x1b, 0x1b, 0xe2, 0xd1, 0xb6, 0x59, 0x18, 0x5b, 0xea, 0x3c, 0xf4, 0x58, 0x9f, 0x14, + 0x93, 0x8c, 0x48, 0x1e, 0x07, 0xe9, 0x2f, 0x7d, 0x21, 0x88, 0xbc, 0xa1, 0x58, 0x10, 0xa5, 0xc4, + 0x94, 0xe7, 0xdb, 0x2c, 0x5b, 0x1a, 0x12, 0xea, 0xf1, 0x83, 0x44, 0x27, 0xaf, 0xc3, 0x98, 0xdc, + 0x3d, 0x43, 0x62, 0xbe, 0x0b, 0x4a, 0x87, 0x97, 0x68, 0x49, 0x98, 0xc4, 0xee, 0xf9, 0x2d, 0xfd, + 0xd2, 0xe4, 0xb8, 0x92, 0x8c, 0x44, 0xb9, 0x34, 0xa9, 0x25, 0x23, 0x51, 0xae, 0x4f, 0xc6, 0x9b, + 0xa1, 0xf2, 0x89, 0x9b, 0xa1, 0x4d, 0x28, 0xaf, 0x39, 0x41, 0xe4, 0xb1, 0xe5, 0xa8, 0x13, 0xf1, + 0x6c, 0x98, 0xc9, 0x5e, 0x5d, 0x29, 0x4a, 0x5e, 0xf2, 0xe9, 0x2a, 0xf8, 0x7a, 0x36, 0x87, 0x04, + 0x4e, 0x56, 0x32, 0xc2, 0xea, 0x45, 0x86, 0x68, 0x74, 0x9d, 0xab, 0xe9, 0x88, 0x79, 0xa9, 0xea, + 0x19, 0xed, 0x8f, 0xc8, 0xbf, 0xcd, 0xc7, 0x00, 0xf7, 0x8c, 0x53, 0xc8, 0x06, 0x53, 0x6a, 0xa1, + 0x5d, 0x91, 0xda, 0x38, 0xc6, 0x88, 0xe4, 0xab, 0x50, 0x66, 0xff, 0x63, 0x6a, 0x40, 0x8f, 0xf2, + 0x6c, 0x97, 0x49, 0x98, 0xb5, 0x3e, 0xa1, 0x79, 0xfe, 0xc0, 0x06, 0x8d, 0xf8, 0x04, 0x46, 0xc6, + 0x69, 0xc7, 0x8b, 0xc6, 0x8d, 0xbc, 0x0b, 0x65, 0x35, 0xb5, 0xe8, 0xcc, 0x74, 0x12, 0x18, 0xe1, + 0x0a, 0x78, 0x7a, 0x94, 0x34, 0x02, 0xb6, 0x7e, 0xd5, 0xba, 0x5d, 0xa4, 0x25, 0x8a, 0xb4, 0x77, + 0xbb, 0x69, 0x32, 0x89, 0x46, 0xde, 0x83, 0x72, 0xad, 0xdb, 0x4d, 0x34, 0xce, 0x59, 0x65, 0x4b, + 0xd8, 0xed, 0xda, 0x99, 0x5a, 0x47, 0xa3, 0x60, 0x82, 0x25, 0x0c, 0x3e, 0xfc, 0xee, 0xb9, 0x44, + 0xb0, 0x64, 0xc2, 0xcc, 0xb4, 0x60, 0x29, 0xe8, 0xe6, 0x0f, 0x0c, 0xb8, 0x38, 0xa0, 0xdb, 0x86, + 0x7e, 0xa1, 0x72, 0x36, 0x59, 0x83, 0x15, 0x77, 0x84, 0x58, 0x83, 0xd5, 0x46, 0xcb, 0xd5, 0x38, + 0x3b, 0x35, 0x67, 0xfe, 0x13, 0x4b, 0xcd, 0x69, 0x1e, 0x1a, 0x30, 0xae, 0x08, 0xf3, 0x13, 0x7c, + 0x11, 0xea, 0x9a, 0xc8, 0x51, 0x9d, 0x4f, 0xf0, 0xda, 0x29, 0xd7, 0x03, 0xe6, 0xa4, 0xfe, 0x1a, + 0xc0, 0xb2, 0x13, 0x46, 0xb5, 0x66, 0xe4, 0x3d, 0xa4, 0x43, 0x68, 0xee, 0x24, 0x21, 0x8f, 0x83, + 0x89, 0xe5, 0x19, 0x59, 0x5f, 0x42, 0x9e, 0x98, 0xa1, 0xb9, 0x02, 0xa3, 0x0d, 0x3f, 0x88, 0xea, + 0x07, 0x7c, 0x39, 0x5e, 0xa0, 0x61, 0x53, 0x75, 0x4a, 0x7a, 0xe8, 0x9e, 0x68, 0x5a, 0xa2, 0x88, + 0xd9, 0xc4, 0x77, 0x3c, 0xda, 0x72, 0xd5, 0x63, 0xb6, 0x1d, 0x06, 0xb0, 0x38, 0xfc, 0xc6, 0xbb, + 0x30, 0x25, 0x05, 0x7b, 0x7d, 0xb9, 0x81, 0x2d, 0x98, 0x82, 0xf1, 0xcd, 0x45, 0x6b, 0xe9, 0xce, + 0x97, 0xed, 0x3b, 0x1b, 0xcb, 0xcb, 0x95, 0x33, 0x64, 0x02, 0x4a, 0x02, 0x30, 0x5f, 0xab, 0x18, + 0xa4, 0x0c, 0xc5, 0xa5, 0x95, 0xc6, 0xe2, 0xfc, 0x86, 0xb5, 0x58, 0xc9, 0xdd, 0x78, 0x11, 0x26, + 0x93, 0x38, 0x0b, 0xcc, 0xc5, 0x30, 0x06, 0x79, 0xab, 0xb6, 0x55, 0x39, 0x43, 0x00, 0x46, 0xd7, + 0xee, 0xcf, 0x37, 0x6e, 0xdd, 0xaa, 0x18, 0x37, 0x3e, 0x07, 0xd3, 0xe8, 0xa8, 0x5c, 0x66, 0xfb, + 0x86, 0x0e, 0x0d, 0xf0, 0x4b, 0x65, 0x28, 0x36, 0x68, 0xd7, 0x09, 0x9c, 0x88, 0xf2, 0xcf, 0x3c, + 0xe8, 0xb5, 0x22, 0xaf, 0xdb, 0xa2, 0x8f, 0x2b, 0xc6, 0x8d, 0x37, 0x60, 0xca, 0xf2, 0x7b, 0x91, + 0xd7, 0xd9, 0x95, 0x29, 0xf5, 0xc9, 0x79, 0x98, 0xde, 0x58, 0xa9, 0x3d, 0xa8, 0x2f, 0xdd, 0xdd, + 0x58, 0xdd, 0x68, 0xd8, 0x0f, 0x6a, 0xeb, 0xf3, 0xf7, 0x2a, 0x67, 0x58, 0x85, 0x1f, 0xac, 0x36, + 0xd6, 0x6d, 0x6b, 0x71, 0x7e, 0x71, 0x65, 0xbd, 0x62, 0xdc, 0xf8, 0x25, 0x03, 0x26, 0xf5, 0xd7, + 0x8f, 0xc9, 0x55, 0xb8, 0xb2, 0xd1, 0x58, 0xb4, 0xec, 0xf5, 0xd5, 0xfb, 0x8b, 0x2b, 0xf6, 0x46, + 0xa3, 0x76, 0x77, 0xd1, 0xde, 0x58, 0x69, 0xac, 0x2d, 0xce, 0x2f, 0xdd, 0x59, 0x5a, 0x5c, 0xa8, + 0x9c, 0x21, 0x55, 0x78, 0x46, 0xc1, 0xb0, 0x16, 0xe7, 0x57, 0x37, 0x17, 0x2d, 0x7b, 0xad, 0xd6, + 0x68, 0x6c, 0xad, 0x5a, 0x0b, 0x15, 0x83, 0x5c, 0x86, 0x0b, 0x19, 0x08, 0x0f, 0xee, 0xd4, 0x2a, + 0xb9, 0xbe, 0xb2, 0x95, 0xc5, 0xad, 0xda, 0xb2, 0x5d, 0x5f, 0x5d, 0xaf, 0xe4, 0x6f, 0xbc, 0xcb, + 0x0c, 0xaf, 0xe4, 0xdd, 0x30, 0x52, 0x84, 0xc2, 0xca, 0xea, 0xca, 0x62, 0xe5, 0x0c, 0x19, 0x87, + 0xb1, 0xb5, 0xc5, 0x95, 0x85, 0xa5, 0x95, 0xbb, 0xbc, 0x5b, 0x6b, 0x6b, 0x6b, 0xd6, 0xea, 0xe6, + 0xe2, 0x42, 0x25, 0xc7, 0xfa, 0x6e, 0x61, 0x71, 0x85, 0xd5, 0x2c, 0x7f, 0xc3, 0xe4, 0x4f, 0x56, + 0x68, 0xb9, 0xd0, 0x59, 0x6f, 0x2d, 0x7e, 0x69, 0x7d, 0x71, 0xa5, 0xb1, 0xb4, 0xba, 0x52, 0x39, + 0x73, 0xe3, 0x4a, 0x0a, 0x47, 0x8e, 0x44, 0xa3, 0x71, 0xaf, 0x72, 0xe6, 0xc6, 0x57, 0xa1, 0xac, + 0xda, 0x1d, 0xe4, 0x22, 0x9c, 0x55, 0x7f, 0xaf, 0xd1, 0x8e, 0xeb, 0x75, 0x76, 0x2b, 0x67, 0xd2, + 0x05, 0x56, 0xaf, 0xd3, 0x61, 0x05, 0xd8, 0x78, 0xb5, 0x60, 0x9d, 0x06, 0x6d, 0xaf, 0xc3, 0x4c, + 0x8a, 0x4a, 0xae, 0x5e, 0xf9, 0xde, 0x9f, 0x3f, 0x77, 0xe6, 0x7b, 0xdf, 0x7f, 0xce, 0xf8, 0x93, + 0xef, 0x3f, 0x67, 0xfc, 0xf7, 0xef, 0x3f, 0x67, 0x6c, 0x8f, 0xa2, 0xa0, 0xdf, 0xfe, 0xbf, 0x01, + 0x00, 0x00, 0xff, 0xff, 0xb9, 0xfb, 0xd6, 0x1b, 0x52, 0xc2, 0x00, 0x00, } func (m *KeepAlive) Marshal() (dAtA []byte, err error) { @@ -10990,6 +11050,16 @@ func (m *AWS) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + { + size, err := m.ElastiCache.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a if len(m.AccountID) > 0 { i -= len(m.AccountID) copy(dAtA[i:], m.AccountID) @@ -11119,6 +11189,66 @@ func (m *RDS) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ElastiCache) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ElastiCache) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ElastiCache) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.EndpointType) > 0 { + i -= len(m.EndpointType) + copy(dAtA[i:], m.EndpointType) + i = encodeVarintTypes(dAtA, i, uint64(len(m.EndpointType))) + i-- + dAtA[i] = 0x22 + } + if m.TransitEncryptionEnabled { + i-- + if m.TransitEncryptionEnabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if len(m.UserGroupIDs) > 0 { + for iNdEx := len(m.UserGroupIDs) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.UserGroupIDs[iNdEx]) + copy(dAtA[i:], m.UserGroupIDs[iNdEx]) + i = encodeVarintTypes(dAtA, i, uint64(len(m.UserGroupIDs[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.ReplicationGroupID) > 0 { + i -= len(m.ReplicationGroupID) + copy(dAtA[i:], m.ReplicationGroupID) + i = encodeVarintTypes(dAtA, i, uint64(len(m.ReplicationGroupID))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *GCPCloudSQL) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -12654,12 +12784,12 @@ func (m *ProvisionTokenV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x1a } - n50, err50 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err50 != nil { - return 0, err50 + n51, err51 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err51 != nil { + return 0, err51 } - i -= n50 - i = encodeVarintTypes(dAtA, i, uint64(n50)) + i -= n51 + i = encodeVarintTypes(dAtA, i, uint64(n51)) i-- dAtA[i] = 0x12 if len(m.Roles) > 0 { @@ -14052,12 +14182,12 @@ func (m *UserTokenSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n76, err76 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err76 != nil { - return 0, err76 + n77, err77 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err77 != nil { + return 0, err77 } - i -= n76 - i = encodeVarintTypes(dAtA, i, uint64(n76)) + i -= n77 + i = encodeVarintTypes(dAtA, i, uint64(n77)) i-- dAtA[i] = 0x22 if m.Usage != 0 { @@ -14174,12 +14304,12 @@ func (m *UserTokenSecretsSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n79, err79 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err79 != nil { - return 0, err79 + n80, err80 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err80 != nil { + return 0, err80 } - i -= n79 - i = encodeVarintTypes(dAtA, i, uint64(n79)) + i -= n80 + i = encodeVarintTypes(dAtA, i, uint64(n80)) i-- dAtA[i] = 0x1a if len(m.QRCode) > 0 { @@ -14343,20 +14473,20 @@ func (m *AccessReview) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if len(m.ThresholdIndexes) > 0 { - dAtA83 := make([]byte, len(m.ThresholdIndexes)*10) - var j82 int + dAtA84 := make([]byte, len(m.ThresholdIndexes)*10) + var j83 int for _, num := range m.ThresholdIndexes { for num >= 1<<7 { - dAtA83[j82] = uint8(uint64(num)&0x7f | 0x80) + dAtA84[j83] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j82++ + j83++ } - dAtA83[j82] = uint8(num) - j82++ + dAtA84[j83] = uint8(num) + j83++ } - i -= j82 - copy(dAtA[i:], dAtA83[:j82]) - i = encodeVarintTypes(dAtA, i, uint64(j82)) + i -= j83 + copy(dAtA[i:], dAtA84[:j83]) + i = encodeVarintTypes(dAtA, i, uint64(j83)) i-- dAtA[i] = 0x3a } @@ -14370,12 +14500,12 @@ func (m *AccessReview) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x32 - n85, err85 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err85 != nil { - return 0, err85 + n86, err86 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err86 != nil { + return 0, err86 } - i -= n85 - i = encodeVarintTypes(dAtA, i, uint64(n85)) + i -= n86 + i = encodeVarintTypes(dAtA, i, uint64(n86)) i-- dAtA[i] = 0x2a if len(m.Reason) > 0 { @@ -14478,20 +14608,20 @@ func (m *ThresholdIndexSet) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Indexes) > 0 { - dAtA88 := make([]byte, len(m.Indexes)*10) - var j87 int + dAtA89 := make([]byte, len(m.Indexes)*10) + var j88 int for _, num := range m.Indexes { for num >= 1<<7 { - dAtA88[j87] = uint8(uint64(num)&0x7f | 0x80) + dAtA89[j88] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j87++ + j88++ } - dAtA88[j87] = uint8(num) - j87++ + dAtA89[j88] = uint8(num) + j88++ } - i -= j87 - copy(dAtA[i:], dAtA88[:j87]) - i = encodeVarintTypes(dAtA, i, uint64(j87)) + i -= j88 + copy(dAtA[i:], dAtA89[:j88]) + i = encodeVarintTypes(dAtA, i, uint64(j88)) i-- dAtA[i] = 0xa } @@ -14672,21 +14802,21 @@ func (m *AccessRequestSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x32 } - n92, err92 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err92 != nil { - return 0, err92 - } - i -= n92 - i = encodeVarintTypes(dAtA, i, uint64(n92)) - i-- - dAtA[i] = 0x2a - n93, err93 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + n93, err93 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) if err93 != nil { return 0, err93 } i -= n93 i = encodeVarintTypes(dAtA, i, uint64(n93)) i-- + dAtA[i] = 0x2a + n94, err94 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err94 != nil { + return 0, err94 + } + i -= n94 + i = encodeVarintTypes(dAtA, i, uint64(n94)) + i-- dAtA[i] = 0x22 if m.State != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.State)) @@ -16498,12 +16628,12 @@ func (m *UserSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x42 - n120, err120 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err120 != nil { - return 0, err120 + n121, err121 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err121 != nil { + return 0, err121 } - i -= n120 - i = encodeVarintTypes(dAtA, i, uint64(n120)) + i -= n121 + i = encodeVarintTypes(dAtA, i, uint64(n121)) i-- dAtA[i] = 0x3a { @@ -16645,29 +16775,29 @@ func (m *LoginStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n123, err123 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.RecoveryAttemptLockExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.RecoveryAttemptLockExpires):]) - if err123 != nil { - return 0, err123 - } - i -= n123 - i = encodeVarintTypes(dAtA, i, uint64(n123)) - i-- - dAtA[i] = 0x2a - n124, err124 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockExpires):]) + n124, err124 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.RecoveryAttemptLockExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.RecoveryAttemptLockExpires):]) if err124 != nil { return 0, err124 } i -= n124 i = encodeVarintTypes(dAtA, i, uint64(n124)) i-- - dAtA[i] = 0x22 - n125, err125 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockedTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockedTime):]) + dAtA[i] = 0x2a + n125, err125 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockExpires):]) if err125 != nil { return 0, err125 } i -= n125 i = encodeVarintTypes(dAtA, i, uint64(n125)) i-- + dAtA[i] = 0x22 + n126, err126 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockedTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockedTime):]) + if err126 != nil { + return 0, err126 + } + i -= n126 + i = encodeVarintTypes(dAtA, i, uint64(n126)) + i-- dAtA[i] = 0x1a if len(m.LockedMessage) > 0 { i -= len(m.LockedMessage) @@ -16723,12 +16853,12 @@ func (m *CreatedBy) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x1a - n127, err127 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) - if err127 != nil { - return 0, err127 + n128, err128 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) + if err128 != nil { + return 0, err128 } - i -= n127 - i = encodeVarintTypes(dAtA, i, uint64(n127)) + i -= n128 + i = encodeVarintTypes(dAtA, i, uint64(n128)) i-- dAtA[i] = 0x12 if m.Connector != nil { @@ -16846,21 +16976,21 @@ func (m *MFADevice) MarshalToSizedBuffer(dAtA []byte) (int, error) { } } } - n130, err130 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUsed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUsed):]) - if err130 != nil { - return 0, err130 - } - i -= n130 - i = encodeVarintTypes(dAtA, i, uint64(n130)) - i-- - dAtA[i] = 0x3a - n131, err131 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.AddedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.AddedAt):]) + n131, err131 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUsed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUsed):]) if err131 != nil { return 0, err131 } i -= n131 i = encodeVarintTypes(dAtA, i, uint64(n131)) i-- + dAtA[i] = 0x3a + n132, err132 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.AddedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.AddedAt):]) + if err132 != nil { + return 0, err132 + } + i -= n132 + i = encodeVarintTypes(dAtA, i, uint64(n132)) + i-- dAtA[i] = 0x32 if len(m.Id) > 0 { i -= len(m.Id) @@ -17456,12 +17586,12 @@ func (m *TunnelConnectionSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x22 } - n140, err140 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) - if err140 != nil { - return 0, err140 + n141, err141 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) + if err141 != nil { + return 0, err141 } - i -= n140 - i = encodeVarintTypes(dAtA, i, uint64(n140)) + i -= n141 + i = encodeVarintTypes(dAtA, i, uint64(n141)) i-- dAtA[i] = 0x1a if len(m.ProxyName) > 0 { @@ -17553,12 +17683,12 @@ func (m *AcquireSemaphoreRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x2a } - n141, err141 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err141 != nil { - return 0, err141 + n142, err142 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err142 != nil { + return 0, err142 } - i -= n141 - i = encodeVarintTypes(dAtA, i, uint64(n141)) + i -= n142 + i = encodeVarintTypes(dAtA, i, uint64(n142)) i-- dAtA[i] = 0x22 if m.MaxLeases != 0 { @@ -17607,12 +17737,12 @@ func (m *SemaphoreLease) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n142, err142 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err142 != nil { - return 0, err142 + n143, err143 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err143 != nil { + return 0, err143 } - i -= n142 - i = encodeVarintTypes(dAtA, i, uint64(n142)) + i -= n143 + i = encodeVarintTypes(dAtA, i, uint64(n143)) i-- dAtA[i] = 0x2a if len(m.LeaseID) > 0 { @@ -17670,12 +17800,12 @@ func (m *SemaphoreLeaseRef) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x1a } - n143, err143 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err143 != nil { - return 0, err143 + n144, err144 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err144 != nil { + return 0, err144 } - i -= n143 - i = encodeVarintTypes(dAtA, i, uint64(n143)) + i -= n144 + i = encodeVarintTypes(dAtA, i, uint64(n144)) i-- dAtA[i] = 0x12 if len(m.LeaseID) > 0 { @@ -17894,29 +18024,29 @@ func (m *WebSessionSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x48 } - n148, err148 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LoginTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LoginTime):]) - if err148 != nil { - return 0, err148 - } - i -= n148 - i = encodeVarintTypes(dAtA, i, uint64(n148)) - i-- - dAtA[i] = 0x42 - n149, err149 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + n149, err149 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LoginTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LoginTime):]) if err149 != nil { return 0, err149 } i -= n149 i = encodeVarintTypes(dAtA, i, uint64(n149)) i-- - dAtA[i] = 0x3a - n150, err150 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.BearerTokenExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.BearerTokenExpires):]) + dAtA[i] = 0x42 + n150, err150 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) if err150 != nil { return 0, err150 } i -= n150 i = encodeVarintTypes(dAtA, i, uint64(n150)) i-- + dAtA[i] = 0x3a + n151, err151 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.BearerTokenExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.BearerTokenExpires):]) + if err151 != nil { + return 0, err151 + } + i -= n151 + i = encodeVarintTypes(dAtA, i, uint64(n151)) + i-- dAtA[i] = 0x32 if len(m.BearerToken) > 0 { i -= len(m.BearerToken) @@ -18082,12 +18212,12 @@ func (m *RemoteClusterStatusV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n153, err153 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) - if err153 != nil { - return 0, err153 + n154, err154 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) + if err154 != nil { + return 0, err154 } - i -= n153 - i = encodeVarintTypes(dAtA, i, uint64(n153)) + i -= n154 + i = encodeVarintTypes(dAtA, i, uint64(n154)) i-- dAtA[i] = 0x12 if len(m.Connection) > 0 { @@ -20132,12 +20262,12 @@ func (m *LockSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if m.Expires != nil { - n177, err177 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) - if err177 != nil { - return 0, err177 + n178, err178 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) + if err178 != nil { + return 0, err178 } - i -= n177 - i = encodeVarintTypes(dAtA, i, uint64(n177)) + i -= n178 + i = encodeVarintTypes(dAtA, i, uint64(n178)) i-- dAtA[i] = 0x1a } @@ -20818,12 +20948,12 @@ func (m *RecoveryCodesSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n187, err187 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err187 != nil { - return 0, err187 + n188, err188 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err188 != nil { + return 0, err188 } - i -= n187 - i = encodeVarintTypes(dAtA, i, uint64(n187)) + i -= n188 + i = encodeVarintTypes(dAtA, i, uint64(n188)) i-- dAtA[i] = 0x12 if len(m.Codes) > 0 { @@ -21089,21 +21219,21 @@ func (m *SessionTrackerSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x32 } - n190, err190 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err190 != nil { - return 0, err190 - } - i -= n190 - i = encodeVarintTypes(dAtA, i, uint64(n190)) - i-- - dAtA[i] = 0x2a - n191, err191 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + n191, err191 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) if err191 != nil { return 0, err191 } i -= n191 i = encodeVarintTypes(dAtA, i, uint64(n191)) i-- + dAtA[i] = 0x2a + n192, err192 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err192 != nil { + return 0, err192 + } + i -= n192 + i = encodeVarintTypes(dAtA, i, uint64(n192)) + i-- dAtA[i] = 0x22 if m.State != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.State)) @@ -21206,12 +21336,12 @@ func (m *Participant) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n192, err192 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastActive, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastActive):]) - if err192 != nil { - return 0, err192 + n193, err193 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastActive, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastActive):]) + if err193 != nil { + return 0, err193 } - i -= n192 - i = encodeVarintTypes(dAtA, i, uint64(n192)) + i -= n193 + i = encodeVarintTypes(dAtA, i, uint64(n193)) i-- dAtA[i] = 0x22 if len(m.Mode) > 0 { @@ -21663,6 +21793,8 @@ func (m *AWS) Size() (n int) { if l > 0 { n += 1 + l + sovTypes(uint64(l)) } + l = m.ElastiCache.Size() + n += 1 + l + sovTypes(uint64(l)) if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -21712,6 +21844,35 @@ func (m *RDS) Size() (n int) { return n } +func (m *ElastiCache) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ReplicationGroupID) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if len(m.UserGroupIDs) > 0 { + for _, s := range m.UserGroupIDs { + l = len(s) + n += 1 + l + sovTypes(uint64(l)) + } + } + if m.TransitEncryptionEnabled { + n += 2 + } + l = len(m.EndpointType) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *GCPCloudSQL) Size() (n int) { if m == nil { return 0 @@ -29352,6 +29513,39 @@ func (m *AWS) Unmarshal(dAtA []byte) error { } m.AccountID = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ElastiCache", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ElastiCache.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -29624,6 +29818,173 @@ func (m *RDS) Unmarshal(dAtA []byte) error { } return nil } +func (m *ElastiCache) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ElastiCache: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ElastiCache: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ReplicationGroupID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ReplicationGroupID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserGroupIDs", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UserGroupIDs = append(m.UserGroupIDs, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TransitEncryptionEnabled", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.TransitEncryptionEnabled = bool(v != 0) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EndpointType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.EndpointType = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *GCPCloudSQL) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/api/types/types.proto b/api/types/types.proto index cdf603c6515..5c39a02ddc7 100644 --- a/api/types/types.proto +++ b/api/types/types.proto @@ -288,6 +288,9 @@ message AWS { RDS RDS = 3 [ (gogoproto.nullable) = false, (gogoproto.jsontag) = "rds,omitempty" ]; // AccountID is the AWS account ID this database belongs to. string AccountID = 4 [ (gogoproto.jsontag) = "account_id,omitempty" ]; + // ElastiCache contains AWS ElastiCache Redis specific metadata. + ElastiCache ElastiCache = 5 + [ (gogoproto.nullable) = false, (gogoproto.jsontag) = "elasticache,omitempty" ]; } // Redshift contains AWS Redshift specific database metadata. @@ -308,6 +311,19 @@ message RDS { bool IAMAuth = 4 [ (gogoproto.jsontag) = "iam_auth" ]; } +// ElastiCache contains AWS ElastiCache Redis specific metadata. +message ElastiCache { + // ReplicationGroupID is the Redis replication group ID. + string ReplicationGroupID = 1 [ (gogoproto.jsontag) = "replication_group_id,omitempty" ]; + // UserGroupIDs is a list of user group IDs. + repeated string UserGroupIDs = 2 [ (gogoproto.jsontag) = "user_group_ids,omitempty" ]; + // TransitEncryptionEnabled indicates whether in-transit encryption (TLS) is enabled. + bool TransitEncryptionEnabled = 3 + [ (gogoproto.jsontag) = "transit_encryption_enabled,omitempty" ]; + // EndpointType is the type of the endpoint. + string EndpointType = 4 [ (gogoproto.jsontag) = "endpoint_type,omitempty" ]; +} + // GCPCloudSQL contains parameters specific to GCP Cloud SQL databases. message GCPCloudSQL { // ProjectID is the GCP project ID the Cloud SQL instance resides in. diff --git a/api/utils/aws/endpoint.go b/api/utils/aws/endpoint.go index c99815d523e..b91942c738e 100644 --- a/api/utils/aws/endpoint.go +++ b/api/utils/aws/endpoint.go @@ -18,6 +18,8 @@ package aws import ( "net" + "net/url" + "strconv" "strings" "github.com/gravitational/trace" @@ -46,6 +48,13 @@ func IsRedshiftEndpoint(uri string) bool { IsAWSEndpoint(uri) } +// IsElastiCacheEndpoint returns true if the input URI is an ElastiCache +// endpoint. +func IsElastiCacheEndpoint(uri string) bool { + return strings.Contains(uri, ElastiCacheSubdomain) && + IsAWSEndpoint(uri) +} + // ParseRDSEndpoint extracts the identifier and region from the provided RDS // endpoint. func ParseRDSEndpoint(endpoint string) (id, region string, err error) { @@ -130,6 +139,210 @@ func parseRedshiftCNEndpoint(endpoint string) (clusterID, region string, err err return parts[0], parts[3], nil } +// RedisEndpointInfo describes details extracted from a ElastiCache or MemoryDB +// Redis endpoint. +type RedisEndpointInfo struct { + // ID is the identifier of the endpoint. + ID string + // Region is the AWS region for the endpoint. + Region string + // TransitEncryptionEnabled specifies if in-transit encryption (TLS) is + // enabled. + TransitEncryptionEnabled bool + // EndpointType specifies the type of the endpoint. + EndpointType string +} + +const ( + // ElastiCacheConfigurationEndpoint is the configuration endpoint that used + // for cluster mode connection. + ElastiCacheConfigurationEndpoint = "configuration" + // ElastiCachePrimaryEndpoint is the endpoint of the primary node in the + // node group. + ElastiCachePrimaryEndpoint = "primary" + // ElastiCachePrimaryEndpoint is the endpoint of the replica nodes in the + // node group. + ElastiCacheReaderEndpoint = "reader" + // ElastiCacheNodeEndpoint is the endpoint that used to connect to an + // individual node. + ElastiCacheNodeEndpoint = "node" +) + +// ParseElastiCacheEndpoint extracts the details from the provided +// ElastiCache Redis endpoint. +// +// https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/GettingStarted.ConnectToCacheNode.html +func ParseElastiCacheEndpoint(endpoint string) (*RedisEndpointInfo, error) { + // Remove schema and port. + if !strings.Contains(endpoint, "://") { + endpoint = "redis://" + endpoint + } + + parsedURL, err := url.Parse(endpoint) + if err != nil { + return nil, trace.Wrap(err) + } + endpoint = parsedURL.Hostname() + + // Remove partition suffix. Note that endpoints for CN regions use the same + // format except they end with AWSCNEndpointSuffix. + endpointWithoutSuffix := "" + switch { + case strings.HasSuffix(endpoint, AWSEndpointSuffix): + endpointWithoutSuffix = strings.TrimSuffix(endpoint, AWSEndpointSuffix) + + case strings.HasSuffix(endpoint, AWSCNEndpointSuffix): + endpointWithoutSuffix = strings.TrimSuffix(endpoint, AWSCNEndpointSuffix) + + default: + return nil, trace.BadParameter("%v is not a valid AWS endpoint", endpoint) + } + + // Split into parts to extract details. They look like this in general: + // ....cache + // + // Note that ElastiCache uses short region codes like "use1". + // + // For Redis with cluster mode enabled, users can connect through either + // "configuration" endpoint or individual "node" endpoints. + // For Redis with cluster mode disabled, users can connect through either + // "primary", "reader", or individual "node" endpoints. + parts := strings.Split(endpointWithoutSuffix, ".") + if len(parts) == 5 && parts[4] == ElastiCacheServiceName { + region, ok := ShortRegionToRegion(parts[3]) + if !ok { + return nil, trace.BadParameter("%v is not a valid region", parts[3]) + } + + // Configuration endpoint for Redis with TLS enabled looks like: + // clustercfg.my-redis-shards.xxxxxx.use1.cache.:6379 + if parts[0] == "clustercfg" { + return &RedisEndpointInfo{ + ID: parts[1], + Region: region, + TransitEncryptionEnabled: true, + EndpointType: ElastiCacheConfigurationEndpoint, + }, nil + } + + // Configuration endpoint for Redis with TLS disabled looks like: + // my-redis-shards.xxxxxx.clustercfg.use1.cache.:6379 + if parts[2] == "clustercfg" { + return &RedisEndpointInfo{ + ID: parts[0], + Region: region, + TransitEncryptionEnabled: false, + EndpointType: ElastiCacheConfigurationEndpoint, + }, nil + } + + // Node endpoint for Redis with TLS disabled looks like: + // my-redis-cluster-001.xxxxxx.0001.use0.cache.:6379 + // my-redis-shards-0001-001.xxxxxx.0001.use0.cache.:6379 + if isElasticCacheShardID(parts[2]) { + return &RedisEndpointInfo{ + ID: trimElastiCacheShardAndNodeID(parts[0]), + Region: region, + TransitEncryptionEnabled: false, + EndpointType: ElastiCacheNodeEndpoint, + }, nil + } + + // Node, primary, reader endpoints for Redis with TLS enabled look like: + // my-redis-cluster-001.my-redis-cluster.xxxxxx.use1.cache.:6379 + // my-redis-shards-0001-001.my-redis-shards.xxxxxx.use1.cache.:6379 + // master.my-redis-cluster.xxxxxx.use1.cache.:6379 + // replica.my-redis-cluster.xxxxxx.use1.cache.:6379 + var endpointType string + switch strings.ToLower(parts[0]) { + case "master": + endpointType = ElastiCachePrimaryEndpoint + case "replica": + endpointType = ElastiCacheReaderEndpoint + default: + endpointType = ElastiCacheNodeEndpoint + } + return &RedisEndpointInfo{ + ID: parts[1], + Region: region, + TransitEncryptionEnabled: true, + EndpointType: endpointType, + }, nil + } + + // Primary and reader endpoints for Redis with TLS disabled have an extra + // shard ID in the endpoints, and they look like: + // my-redis-cluster.xxxxxx.ng.0001.use1.cache.:6379 + // my-redis-cluster-ro.xxxxxx.ng.0001.use1.cache.:6379 + if len(parts) == 6 && parts[5] == ElastiCacheServiceName && isElasticCacheShardID(parts[3]) { + region, ok := ShortRegionToRegion(parts[4]) + if !ok { + return nil, trace.BadParameter("%v is not a valid region", parts[4]) + } + + // Remove "-ro" from reader endpoint. + if strings.HasSuffix(parts[0], "-ro") { + return &RedisEndpointInfo{ + ID: strings.TrimSuffix(parts[0], "-ro"), + Region: region, + TransitEncryptionEnabled: false, + EndpointType: ElastiCacheReaderEndpoint, + }, nil + } + + return &RedisEndpointInfo{ + ID: parts[0], + Region: region, + TransitEncryptionEnabled: false, + EndpointType: ElastiCachePrimaryEndpoint, + }, nil + } + + return nil, trace.BadParameter("unknown ElastiCache Redis endpoint format") +} + +// isElasticCacheShardID returns true if the input part is in shard ID format. +// The shard ID is a 4 character string of an integer left padded with zeros +// (e.g. 0001). +func isElasticCacheShardID(part string) bool { + if len(part) != 4 { + return false + } + _, err := strconv.Atoi(part) + return err == nil +} + +// isElasticCacheNodeID returns true if the input part is in node ID format. +// The node ID is a 3 character string of an integer left padded with zeros +// (e.g. 001). +func isElasticCacheNodeID(part string) bool { + if len(part) != 3 { + return false + } + _, err := strconv.Atoi(part) + return err == nil +} + +// trimElastiCacheShardAndNodeID trims shard and node ID suffix from input. +func trimElastiCacheShardAndNodeID(input string) string { + // input can be one of: + // + // - + // -- + parts := strings.Split(input, "-") + if len(parts) > 0 { + if isElasticCacheNodeID(parts[len(parts)-1]) { + parts = parts[:len(parts)-1] + } + } + if len(parts) > 0 { + if isElasticCacheShardID(parts[len(parts)-1]) { + parts = parts[:len(parts)-1] + } + } + return strings.Join(parts, "-") +} + const ( // AWSEndpointSuffix is the endpoint suffix for AWS Standard and AWS US // GovCloud regions. @@ -149,9 +362,15 @@ const ( // RedshiftServiceName is the service name for AWS Redshift. RedshiftServiceName = "redshift" + // ElastiCacheServiceName is the service name for AWS ElastiCache. + ElastiCacheServiceName = "cache" + // RDSEndpointSubdomain is the RDS/Aurora subdomain. RDSEndpointSubdomain = "." + RDSServiceName + "." // RedshiftEndpointSubdomain is the Redshift endpoint subdomain. RedshiftEndpointSubdomain = "." + RedshiftServiceName + "." + + // ElastiCacheSubdomain is the ElastiCache endpoint subdomain. + ElastiCacheSubdomain = "." + ElastiCacheServiceName + "." ) diff --git a/api/utils/aws/endpoint_test.go b/api/utils/aws/endpoint_test.go index 0b4bad00bb6..03dbde678c2 100644 --- a/api/utils/aws/endpoint_test.go +++ b/api/utils/aws/endpoint_test.go @@ -136,3 +136,135 @@ func TestParseRedshiftEndpoint(t *testing.T) { }) } } + +func TestParseElastiCacheEndpoint(t *testing.T) { + tests := []struct { + name string + inputURI string + expectInfo *RedisEndpointInfo + expectError bool + }{ + { + name: "configuration endpoint, TLS enabled", + inputURI: "clustercfg.my-redis-shards.xxxxxx.use1.cache.amazonaws.com:6379", + expectInfo: &RedisEndpointInfo{ + ID: "my-redis-shards", + Region: "us-east-1", + TransitEncryptionEnabled: true, + EndpointType: ElastiCacheConfigurationEndpoint, + }, + }, + { + name: "primary endpoint, TLS enabled", + inputURI: "master.my-redis-cluster.xxxxxx.cac1.cache.amazonaws.com:6379", + expectInfo: &RedisEndpointInfo{ + ID: "my-redis-cluster", + Region: "ca-central-1", + TransitEncryptionEnabled: true, + EndpointType: ElastiCachePrimaryEndpoint, + }, + }, + { + name: "reader endpoint, TLS enabled", + inputURI: "replica.my-redis-cluster.xxxxxx.cac1.cache.amazonaws.com:6379", + expectInfo: &RedisEndpointInfo{ + ID: "my-redis-cluster", + Region: "ca-central-1", + TransitEncryptionEnabled: true, + EndpointType: ElastiCacheReaderEndpoint, + }, + }, + { + name: "node endpoint, TLS enabled", + inputURI: "my-redis-shards-0002-001.my-redis-shards.xxxxxx.cac1.cache.amazonaws.com:6379", + expectInfo: &RedisEndpointInfo{ + ID: "my-redis-shards", + Region: "ca-central-1", + TransitEncryptionEnabled: true, + EndpointType: ElastiCacheNodeEndpoint, + }, + }, + { + name: "configuration endpoint, TLS disabled", + inputURI: "my-redis-shards.xxxxxx.clustercfg.use1.cache.amazonaws.com:6379", + expectInfo: &RedisEndpointInfo{ + ID: "my-redis-shards", + Region: "us-east-1", + EndpointType: ElastiCacheConfigurationEndpoint, + }, + }, + { + name: "primary endpiont, TLS disabled", + inputURI: "my-redis-cluster.xxxxxx.ng.0001.cac1.cache.amazonaws.com:6379", + expectInfo: &RedisEndpointInfo{ + ID: "my-redis-cluster", + Region: "ca-central-1", + EndpointType: ElastiCachePrimaryEndpoint, + }, + }, + { + name: "reader endpiont, TLS disabled", + inputURI: "my-redis-cluster-ro.xxxxxx.ng.0001.cac1.cache.amazonaws.com:6379", + expectInfo: &RedisEndpointInfo{ + ID: "my-redis-cluster", + Region: "ca-central-1", + EndpointType: ElastiCacheReaderEndpoint, + }, + }, + { + name: "node endpoint, TLS disabled", + inputURI: "my-redis-shards-0001-001.xxxxxx.0001.cac1.cache.amazonaws.com:6379", + expectInfo: &RedisEndpointInfo{ + ID: "my-redis-shards", + Region: "ca-central-1", + EndpointType: ElastiCacheNodeEndpoint, + }, + }, + { + name: "CN endpoint", + inputURI: "replica.my-redis-cluster.xxxxxx.cnn1.cache.amazonaws.com.cn:6379", + expectInfo: &RedisEndpointInfo{ + ID: "my-redis-cluster", + Region: "cn-north-1", + TransitEncryptionEnabled: true, + EndpointType: ElastiCacheReaderEndpoint, + }, + }, + { + name: "endpoint with schema and parameters", + inputURI: "redis://my-redis-cluster.xxxxxx.ng.0001.cac1.cache.amazonaws.com:6379?a=b&c=d", + expectInfo: &RedisEndpointInfo{ + ID: "my-redis-cluster", + Region: "ca-central-1", + EndpointType: ElastiCachePrimaryEndpoint, + }, + }, + { + name: "invalid suffix", + inputURI: "replica.my-redis-cluster.xxxxxx.cac1.cache.amazonaws.ca:6379", + expectError: true, + }, + { + name: "invalid url", + inputURI: "://replica.my-redis-cluster.xxxxxx.cac1.cache.amazonaws.com:6379", + expectError: true, + }, + { + name: "invalid format", + inputURI: "my-redis-cluster.cac1.cache.amazonaws.com:6379", + expectError: true, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + actualInfo, err := ParseElastiCacheEndpoint(test.inputURI) + if test.expectError { + require.Error(t, err) + } else { + require.NoError(t, err) + require.Equal(t, test.expectInfo, actualInfo) + } + }) + } +} diff --git a/api/utils/aws/region.go b/api/utils/aws/region.go index b439812ba23..16ec91fdb5f 100644 --- a/api/utils/aws/region.go +++ b/api/utils/aws/region.go @@ -16,7 +16,11 @@ limitations under the License. package aws -import "strings" +import ( + "fmt" + "strconv" + "strings" +) // IsCNRegion returns true if the region is an AWS China region. func IsCNRegion(region string) bool { @@ -28,6 +32,80 @@ func IsUSGovRegion(region string) bool { return strings.HasPrefix(region, USGovRegionPrefix) } +// ShortRegionToRegion converts short region codes to regular region names. For +// example, a short region "use1" maps to region "us-east-1". +// +// There is no official documentation on this mapping. Here is gist of others +// collecting these naming schemes: +// https://gist.github.com/colinvh/14e4b7fb6b66c29f79d3 +// +// This function currently does not support regions in secert partitions. +func ShortRegionToRegion(shortRegion string) (string, bool) { + var prefix, direction string + + // Determine region prefix. + remain := strings.ToLower(shortRegion) + switch { + case strings.HasPrefix(remain, "usg"): + prefix = USGovRegionPrefix + remain = remain[3:] + + case strings.HasPrefix(remain, "cn"): + prefix = CNRegionPrefix + remain = remain[2:] + + default: + // For regions in standard partition, the first two letters is the + // continent or country code (e.g. "eu" for Europe, "us" for US). + if len(remain) < 2 { + return "", false + } + + prefix = remain[:2] + "-" + remain = remain[2:] + } + + // Map direction codes. + switch { + case strings.HasPrefix(remain, "nw"): + direction = "northwest" + remain = remain[2:] + case strings.HasPrefix(remain, "ne"): + direction = "northeast" + remain = remain[2:] + case strings.HasPrefix(remain, "se"): + direction = "southeast" + remain = remain[2:] + case strings.HasPrefix(remain, "sw"): + direction = "southwest" + remain = remain[2:] + case strings.HasPrefix(remain, "n"): + direction = "north" + remain = remain[1:] + case strings.HasPrefix(remain, "e"): + direction = "east" + remain = remain[1:] + case strings.HasPrefix(remain, "w"): + direction = "west" + remain = remain[1:] + case strings.HasPrefix(remain, "s"): + direction = "south" + remain = remain[1:] + case strings.HasPrefix(remain, "c"): + direction = "central" + remain = remain[1:] + default: + return "", false + } + + // Remain should be a number. + if _, err := strconv.Atoi(remain); err != nil { + return "", false + } + + return fmt.Sprintf("%s%s-%s", prefix, direction, remain), true +} + const ( // CNRegionPrefix is the prefix for all AWS China regions. CNRegionPrefix = "cn-" diff --git a/api/utils/aws/region_test.go b/api/utils/aws/region_test.go new file mode 100644 index 00000000000..654d2a80868 --- /dev/null +++ b/api/utils/aws/region_test.go @@ -0,0 +1,88 @@ +/* +Copyright 2022 Gravitational, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package aws + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestShortRegionToRegion(t *testing.T) { + t.Run("valid regions", func(t *testing.T) { + t.Parallel() + + validRegionMap := map[string]string{ + "use1": "us-east-1", + "use2": "us-east-2", + "usw1": "us-west-1", + "usw2": "us-west-2", + "cac1": "ca-central-1", + "euw1": "eu-west-1", + "euw2": "eu-west-2", + "euw3": "eu-west-3", + "euc1": "eu-central-1", + "eus1": "eu-south-1", + "eun1": "eu-north-1", + "apse1": "ap-southeast-1", + "apse2": "ap-southeast-2", + "aps1": "ap-south-1", + "apne1": "ap-northeast-1", + "apne2": "ap-northeast-2", + "ape1": "ap-east-1", + "sae1": "sa-east-1", + "afs1": "af-south-1", + "usgw1": "us-gov-west-1", + "usge1": "us-gov-east-1", + "cnn1": "cn-north-1", + "cnnw1": "cn-northwest-1", + } + + for shortRegion, expectRegion := range validRegionMap { + actualRegion, ok := ShortRegionToRegion(shortRegion) + require.True(t, ok) + require.Equal(t, expectRegion, actualRegion) + } + }) + + invalidTests := []struct { + name string + input string + }{ + { + name: "invalid prefix", + input: "u", + }, + { + name: "not ended in number", + input: "use1b", + }, + { + name: "invalid direction", + input: "usx1", + }, + } + for _, test := range invalidTests { + test := test + t.Run(test.name, func(t *testing.T) { + t.Parallel() + + _, ok := ShortRegionToRegion(test.input) + require.False(t, ok) + }) + } +} diff --git a/lib/config/configuration.go b/lib/config/configuration.go index 54332c4b061..fa608ecee86 100644 --- a/lib/config/configuration.go +++ b/lib/config/configuration.go @@ -133,7 +133,7 @@ type CommandLineFlags struct { DatabaseAWSRegion string // DatabaseAWSRedshiftClusterID is Redshift cluster identifier. DatabaseAWSRedshiftClusterID string - // DatabaseAWSRDSClusterID is RDS instance identifier. + // DatabaseAWSRDSInstanceID is RDS instance identifier. DatabaseAWSRDSInstanceID string // DatabaseAWSRDSClusterID is RDS cluster (Aurora) cluster identifier. DatabaseAWSRDSClusterID string @@ -1133,6 +1133,9 @@ func applyDatabasesConfig(fc *FileConfig, cfg *service.Config) error { InstanceID: database.AWS.RDS.InstanceID, ClusterID: database.AWS.RDS.ClusterID, }, + ElastiCache: service.DatabaseAWSElastiCache{ + ReplicationGroupID: database.AWS.ElastiCache.ReplicationGroupID, + }, }, GCP: service.DatabaseGCP{ ProjectID: database.GCP.ProjectID, diff --git a/lib/config/database.go b/lib/config/database.go index d358b466c27..c96e864e71c 100644 --- a/lib/config/database.go +++ b/lib/config/database.go @@ -34,6 +34,7 @@ var databaseConfigTemplateFuncs = template.FuncMap{ } // databaseAgentConfigurationTemplate database configuration template. +// TODO(greedy52) add documentation link to ElastiCache page. var databaseAgentConfigurationTemplate = template.Must(template.New("").Funcs(databaseConfigTemplateFuncs).Parse(`# # Teleport database agent configuration file. # Configuration reference: https://goteleport.com/docs/database-access/reference/configuration/ @@ -89,6 +90,18 @@ db_service: tags: "*": "*" {{- end }} + {{- if .ElastiCacheDiscoveryRegions }} + # ElastiCache databases auto-discovery. + - types: ["elasticache"] + # AWS regions to register databases from. + regions: + {{- range .ElastiCacheDiscoveryRegions }} + - {{ . }} + {{- end }} + # AWS resource tags to match when registering databases. + tags: + "*": "*" + {{- end }} # Lists statically registered databases proxied by this agent. {{- if .StaticDatabaseName }} databases: @@ -162,6 +175,20 @@ db_service: # redshift: # # Redshift Cluster ID. # cluster_id: redshift-cluster-example-1 + # # ElastiCache database static configuration. + # - name: elasticache + # description: AWS ElastiCache cluster configuration example. + # protocol: redis + # # Database connection endpoint. Must be reachable from Database service. + # uri: master.redis-cluster-example.abcdef.usw1.cache.amazonaws.com:6379 + # # AWS specific configuration. + # aws: + # # Region the database is deployed in. + # region: us-west-1 + # # ElastiCache specific configuration. + # elasticache: + # # ElastiCache replication group ID. + # replication_group_id: redis-cluster-example # # Self-hosted static configuration. # - name: self-hosted # description: Self-hosted database configuration. @@ -205,13 +232,16 @@ type DatabaseSampleFlags struct { AuthToken string // CAPins are the SKPI hashes of the CAs used to verify the Auth Server. CAPins []string - // RDSDiscoveryRegions list of regions the RDS auto-discovery is + // RDSDiscoveryRegions is a list of regions the RDS auto-discovery is // configured. RDSDiscoveryRegions []string - // RedshiftDiscoveryRegions list of regions the Redshift auto-discovery is - // configured. + // RedshiftDiscoveryRegions is a list of regions the Redshift + // auto-discovery is configured. RedshiftDiscoveryRegions []string - // DatabaseProtocols list of database protocols supported. + // ElastiCacheDiscoveryRegions is a list of regions the ElastiCache + // auto-discovery is configured. + ElastiCacheDiscoveryRegions []string + // DatabaseProtocols is a list of database protocols supported. DatabaseProtocols []string } diff --git a/lib/config/fileconf.go b/lib/config/fileconf.go index d16ab98c385..d8b41d3aeef 100644 --- a/lib/config/fileconf.go +++ b/lib/config/fileconf.go @@ -1151,7 +1151,7 @@ type ResourceMatcher struct { // AWSMatcher matches AWS databases. type AWSMatcher struct { - // Types are AWS database types to match, "rds" or "redshift". + // Types are AWS database types to match, "rds", "redshift", or "elasticache". Types []string `yaml:"types,omitempty"` // Regions are AWS regions to query for databases. Regions []string `yaml:"regions,omitempty"` @@ -1226,6 +1226,8 @@ type DatabaseAWS struct { Redshift DatabaseAWSRedshift `yaml:"redshift"` // RDS contains RDS specific settings. RDS DatabaseAWSRDS `yaml:"rds"` + // ElastiCache contains ElastiCache specific settings. + ElastiCache DatabaseAWSElastiCache `yaml:"elasticache"` } // DatabaseAWSRedshift contains AWS Redshift specific settings. @@ -1242,6 +1244,12 @@ type DatabaseAWSRDS struct { ClusterID string `yaml:"cluster_id,omitempty"` } +// DatabaseAWSElastiCache contains settings for ElastiCache databases. +type DatabaseAWSElastiCache struct { + // ReplicationGroupID is the ElastiCache replication group ID. + ReplicationGroupID string `yaml:"replication_group_id,omitempty"` +} + // DatabaseGCP contains GCP specific settings for Cloud SQL databases. type DatabaseGCP struct { // ProjectID is the GCP project ID where the database is deployed. diff --git a/lib/configurators/databases/aws.go b/lib/configurators/databases/aws.go index ac1497f1766..c7e01dffa98 100644 --- a/lib/configurators/databases/aws.go +++ b/lib/configurators/databases/aws.go @@ -18,10 +18,10 @@ import ( "context" "fmt" - "github.com/gravitational/teleport/api/types" awsutils "github.com/gravitational/teleport/api/utils/aws" awslib "github.com/gravitational/teleport/lib/cloud/aws" "github.com/gravitational/teleport/lib/config" + "github.com/gravitational/teleport/lib/services" "github.com/gravitational/trace" "github.com/aws/aws-sdk-go/aws/arn" @@ -55,15 +55,23 @@ var ( roleBaseActions = []string{"iam:GetRolePolicy", "iam:PutRolePolicy", "iam:DeleteRolePolicy"} // rdsActions list of actions used when giving RDS permissions. rdsActions = []string{"rds:DescribeDBInstances", "rds:ModifyDBInstance"} - // auroraActions list of acions used when giving RDS Aurora permissions. + // auroraActions list of actions used when giving RDS Aurora permissions. auroraActions = []string{"rds:DescribeDBClusters", "rds:ModifyDBCluster"} // redshiftActions list of actions used when giving Redshift auto-discovery // permissions. redshiftActions = []string{"redshift:DescribeClusters"} - // boundaryRDSAuroraActions aditional actions added to the policy boundary + // elastiCacheActions is a list of actions used for ElastiCache + // auto-discovery and metadata update. + elastiCacheActions = []string{ + "elasticache:ListTagsForResource", + "elasticache:DescribeReplicationGroups", + "elasticache:DescribeCacheClusters", + "elasticache:DescribeCacheSubnetGroups", + } + // boundaryRDSAuroraActions additional actions added to the policy boundary // when policy has RDS auto-discovery. boundaryRDSAuroraActions = []string{"rds-db:connect"} - // boundaryRedshiftActions aditional actions added to the policy boundary + // boundaryRedshiftActions additional actions added to the policy boundary // when policy has Redshift auto-discovery. boundaryRedshiftActions = []string{"redshift:GetClusterCredentials"} ) @@ -154,7 +162,7 @@ func (a *awsConfigurator) IsEmpty() bool { return len(a.actions) == 0 } -// Name returns humam-readable configurator name. +// Name returns human-readable configurator name. func (a *awsConfigurator) Name() string { return "AWS" } @@ -182,7 +190,7 @@ func (a *awsPolicyCreator) Description() string { return fmt.Sprintf("Create IAM Policy %q", a.policy.Name) } -// Details returnst the policy document that will be created. +// Details returns the policy document that will be created. func (a *awsPolicyCreator) Details() string { return a.formattedPolicy } @@ -359,15 +367,20 @@ func buildPolicyDocument(flags BootstrapFlags, fileConfig *config.FileConfig, ta statements = append(statements, buildRedshiftStatements()...) } + // ElastiCache does not require permissions to edit user/role IAM policy. + if hasElastiCacheDatabases(flags, fileConfig) { + statements = append(statements, buildElastiCacheStatements()...) + } + // If RDS the auto discovery is enabled or there are Redshift databases, we // need permission to edit the target user/role. if rdsAutoDiscovery || redshiftDatabases { - targetStaments, err := buildIAMEditStatements(target) + targetStatements, err := buildIAMEditStatements(target) if err != nil { return nil, trace.Wrap(err) } - statements = append(statements, targetStaments...) + statements = append(statements, targetStatements...) } document := awslib.NewPolicyDocument() @@ -394,15 +407,20 @@ func buildPolicyBoundaryDocument(flags BootstrapFlags, fileConfig *config.FileCo statements = append(statements, buildRedshiftBoundaryStatements()...) } + // ElastiCache does not require permissions to edit user/role IAM policy. + if hasElastiCacheDatabases(flags, fileConfig) { + statements = append(statements, buildElastiCacheBoundaryStatements()...) + } + // If RDS the auto discovery is enabled or there are Redshift databases, we // need permission to edit the target user/role. if rdsAutoDiscovery || redshiftDatabases { - targetStaments, err := buildIAMEditStatements(target) + targetStatements, err := buildIAMEditStatements(target) if err != nil { return nil, trace.Wrap(err) } - statements = append(statements, targetStaments...) + statements = append(statements, targetStatements...) } document := awslib.NewPolicyDocument() @@ -422,15 +440,7 @@ func isRDSAutoDiscoveryEnabled(flags BootstrapFlags, fileConfig *config.FileConf return true } - for _, matcher := range fileConfig.Databases.AWSMatchers { - for _, databaseType := range matcher.Types { - if databaseType == types.DatabaseTypeRDS { - return true - } - } - } - - return false + return isAutoDiscoveryEnabledForMatcher(fileConfig, services.AWSMatcherRDS) } // hasRedshiftDatabases checks if the agent needs permission for @@ -440,22 +450,42 @@ func hasRedshiftDatabases(flags BootstrapFlags, fileConfig *config.FileConfig) b return true } - // Check if Redshift auto-discovery is enabled. + return isAutoDiscoveryEnabledForMatcher(fileConfig, services.AWSMatcherRedshift) || + findEndpointIs(fileConfig, awsutils.IsRedshiftEndpoint) +} + +// hasElastiCacheDatabases checks if the agent needs permission for +// ElastiCache databases. +func hasElastiCacheDatabases(flags BootstrapFlags, fileConfig *config.FileConfig) bool { + if flags.ForceElastiCachePermissions { + return true + } + + return isAutoDiscoveryEnabledForMatcher(fileConfig, services.AWSMatcherElastiCache) || + findEndpointIs(fileConfig, awsutils.IsElastiCacheEndpoint) +} + +// isAutoDiscoveryEnabledForMatcher returns true if provided AWS matcher type +// is found. +func isAutoDiscoveryEnabledForMatcher(fileConfig *config.FileConfig, matcherType string) bool { for _, matcher := range fileConfig.Databases.AWSMatchers { for _, databaseType := range matcher.Types { - if databaseType == types.DatabaseTypeRedshift { + if databaseType == matcherType { return true } } } + return false +} - // Check if there is any static Redshift database configured. +// findEndpointIs returns true if provided check returns true for any static +// endpoint. +func findEndpointIs(fileConfig *config.FileConfig, endpointIs func(string) bool) bool { for _, database := range fileConfig.Databases.Databases { - if awsutils.IsRedshiftEndpoint(database.URI) { + if endpointIs(database.URI) { return true } } - return false } @@ -526,3 +556,21 @@ func buildRedshiftBoundaryStatements() []*awslib.Statement { }, } } + +// buildElastiCacheStatements returns IAM statements necessary for ElastiCache +// databases. +func buildElastiCacheStatements() []*awslib.Statement { + return []*awslib.Statement{ + { + Effect: awslib.EffectAllow, + Actions: elastiCacheActions, + Resources: []string{"*"}, + }, + } +} + +// buildElastiCacheBoundaryStatements returns IAM boundary statements necessary +// for ElastiCache databases. +func buildElastiCacheBoundaryStatements() []*awslib.Statement { + return buildElastiCacheStatements() +} diff --git a/lib/configurators/databases/aws_test.go b/lib/configurators/databases/aws_test.go index 1f0cac73111..61264e46eba 100644 --- a/lib/configurators/databases/aws_test.go +++ b/lib/configurators/databases/aws_test.go @@ -190,6 +190,61 @@ func TestAWSIAMDocuments(t *testing.T) { }}, }, }, + "ElastiCache auto discovery": { + target: roleTarget, + fileConfig: &config.FileConfig{ + Databases: config.Databases{ + AWSMatchers: []config.AWSMatcher{ + {Types: []string{types.DatabaseTypeElastiCache}, Regions: []string{"us-west-2"}}, + }, + }, + }, + statements: []*awslib.Statement{ + {Effect: awslib.EffectAllow, Resources: []string{"*"}, Actions: []string{ + "elasticache:ListTagsForResource", + "elasticache:DescribeReplicationGroups", + "elasticache:DescribeCacheClusters", + "elasticache:DescribeCacheSubnetGroups", + }}, + }, + boundaryStatements: []*awslib.Statement{ + {Effect: awslib.EffectAllow, Resources: []string{"*"}, Actions: []string{ + "elasticache:ListTagsForResource", + "elasticache:DescribeReplicationGroups", + "elasticache:DescribeCacheClusters", + "elasticache:DescribeCacheSubnetGroups", + }}, + }, + }, + "ElastiCache static database": { + target: roleTarget, + fileConfig: &config.FileConfig{ + Databases: config.Databases{ + Databases: []*config.Database{ + { + Name: "redis-1", + URI: "clustercfg.redis1.xxxxxx.usw2.cache.amazonaws.com:6379", + }, + }, + }, + }, + statements: []*awslib.Statement{ + {Effect: awslib.EffectAllow, Resources: []string{"*"}, Actions: []string{ + "elasticache:ListTagsForResource", + "elasticache:DescribeReplicationGroups", + "elasticache:DescribeCacheClusters", + "elasticache:DescribeCacheSubnetGroups", + }}, + }, + boundaryStatements: []*awslib.Statement{ + {Effect: awslib.EffectAllow, Resources: []string{"*"}, Actions: []string{ + "elasticache:ListTagsForResource", + "elasticache:DescribeReplicationGroups", + "elasticache:DescribeCacheClusters", + "elasticache:DescribeCacheSubnetGroups", + }}, + }, + }, "AutoDiscoveryUnknownIdentity": { returnError: true, target: unknownIdentity, diff --git a/lib/configurators/databases/databases.go b/lib/configurators/databases/databases.go index 7d0d7a1a277..8e271d0f426 100644 --- a/lib/configurators/databases/databases.go +++ b/lib/configurators/databases/databases.go @@ -38,8 +38,10 @@ type BootstrapFlags struct { AttachToRole string // ForceRDSPermissions forces the presence of RDS permissions. ForceRDSPermissions bool - // ForceAuroraPermissions forces the presence of Redshift permissions. + // ForceRedshiftPermissions forces the presence of Redshift permissions. ForceRedshiftPermissions bool + // ForceElastiCachePermissions forces the presence of ElastiCache permissions. + ForceElastiCachePermissions bool } // Configurator responsible for generating a list of actions that needs to be diff --git a/lib/service/cfg.go b/lib/service/cfg.go index 86d98b12d08..c41d66a21e4 100644 --- a/lib/service/cfg.go +++ b/lib/service/cfg.go @@ -704,6 +704,8 @@ type DatabaseAWS struct { Redshift DatabaseAWSRedshift // RDS contains RDS specific settings. RDS DatabaseAWSRDS + // ElastiCache contains ElastiCache specific settings. + ElastiCache DatabaseAWSElastiCache } // DatabaseAWSRedshift contains AWS Redshift specific settings. @@ -720,6 +722,12 @@ type DatabaseAWSRDS struct { ClusterID string } +// DatabaseAWSElastiCache contains settings for ElastiCache databases. +type DatabaseAWSElastiCache struct { + // ReplicationGroupID is the ElastiCache replication group ID. + ReplicationGroupID string +} + // DatabaseGCP contains GCP specific settings for Cloud SQL databases. type DatabaseGCP struct { // ProjectID is the GCP project ID where the database is deployed. diff --git a/lib/service/db.go b/lib/service/db.go index 9c869a8cec4..c99233c4b85 100644 --- a/lib/service/db.go +++ b/lib/service/db.go @@ -119,6 +119,9 @@ func (process *TeleportProcess) initDatabaseService() (retErr error) { InstanceID: db.AWS.RDS.InstanceID, ClusterID: db.AWS.RDS.ClusterID, }, + ElastiCache: types.ElastiCache{ + ReplicationGroupID: db.AWS.ElastiCache.ReplicationGroupID, + }, }, GCP: types.GCPCloudSQL{ ProjectID: db.GCP.ProjectID, diff --git a/lib/services/database.go b/lib/services/database.go index e5e539d7739..067f17aa899 100644 --- a/lib/services/database.go +++ b/lib/services/database.go @@ -29,6 +29,7 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/arn" + "github.com/aws/aws-sdk-go/service/elasticache" "github.com/aws/aws-sdk-go/service/rds" "github.com/aws/aws-sdk-go/service/redshift" @@ -239,6 +240,63 @@ func NewDatabaseFromRedshiftCluster(cluster *redshift.Cluster) (types.Database, }) } +// NewDatabaseFromElastiCacheConfigurationEndpoint creates a database resource +// from ElastiCache configuration endpoint. +func NewDatabaseFromElastiCacheConfigurationEndpoint(cluster *elasticache.ReplicationGroup, extraLabels map[string]string) (types.Database, error) { + if cluster.ConfigurationEndpoint == nil { + return nil, trace.BadParameter("missing configuration endpoint") + } + + return newElastiCacheDatabase(cluster, cluster.ConfigurationEndpoint, awsutils.ElastiCacheConfigurationEndpoint, extraLabels) +} + +// NewDatabasesFromElastiCacheNodeGroups creates database resources from +// ElastiCache node groups. +func NewDatabasesFromElastiCacheNodeGroups(cluster *elasticache.ReplicationGroup, extraLabels map[string]string) (types.Databases, error) { + var databases types.Databases + for _, nodeGroup := range cluster.NodeGroups { + if nodeGroup.PrimaryEndpoint != nil { + database, err := newElastiCacheDatabase(cluster, nodeGroup.PrimaryEndpoint, awsutils.ElastiCachePrimaryEndpoint, extraLabels) + if err != nil { + return nil, trace.Wrap(err) + } + databases = append(databases, database) + } + + if nodeGroup.ReaderEndpoint != nil { + database, err := newElastiCacheDatabase(cluster, nodeGroup.ReaderEndpoint, awsutils.ElastiCacheReaderEndpoint, extraLabels) + if err != nil { + return nil, trace.Wrap(err) + } + databases = append(databases, database) + } + } + return databases, nil +} + +// newElastiCacheDatabase returns a new ElastiCache database. +func newElastiCacheDatabase(cluster *elasticache.ReplicationGroup, endpoint *elasticache.Endpoint, endpointType string, extraLabels map[string]string) (types.Database, error) { + metadata, err := MetadataFromElastiCacheCluster(cluster, endpointType) + if err != nil { + return nil, trace.Wrap(err) + } + + name := aws.StringValue(cluster.ReplicationGroupId) + if endpointType == awsutils.ElastiCacheReaderEndpoint { + name = fmt.Sprintf("%s-%s", name, endpointType) + } + + return types.NewDatabaseV3(types.Metadata{ + Name: name, + Description: fmt.Sprintf("ElastiCache cluster in %v (%v endpoint)", metadata.Region, endpointType), + Labels: labelsFromElastiCacheCluster(metadata, endpointType, extraLabels), + }, types.DatabaseSpecV3{ + Protocol: defaults.ProtocolRedis, + URI: fmt.Sprintf("%v:%v", aws.StringValue(endpoint.Address), aws.Int64Value(endpoint.Port)), + AWS: *metadata, + }) +} + // MetadataFromRDSInstance creates AWS metadata from the provided RDS instance. func MetadataFromRDSInstance(rdsInstance *rds.DBInstance) (*types.AWS, error) { parsedARN, err := arn.Parse(aws.StringValue(rdsInstance.DBInstanceArn)) @@ -289,6 +347,67 @@ func MetadataFromRedshiftCluster(cluster *redshift.Cluster) (*types.AWS, error) }, nil } +// MetadataFromElastiCacheCluster creates AWS metadata for the provided +// ElastiCache cluster. +func MetadataFromElastiCacheCluster(cluster *elasticache.ReplicationGroup, endpointType string) (*types.AWS, error) { + parsedARN, err := arn.Parse(aws.StringValue(cluster.ARN)) + if err != nil { + return nil, trace.Wrap(err) + } + + return &types.AWS{ + Region: parsedARN.Region, + AccountID: parsedARN.AccountID, + ElastiCache: types.ElastiCache{ + ReplicationGroupID: aws.StringValue(cluster.ReplicationGroupId), + UserGroupIDs: aws.StringValueSlice(cluster.UserGroupIds), + TransitEncryptionEnabled: aws.BoolValue(cluster.TransitEncryptionEnabled), + EndpointType: endpointType, + }, + }, nil +} + +// ExtraElastiCacheLabels returns a list of extra labels for provided +// ElastiCache cluster. +func ExtraElastiCacheLabels(cluster *elasticache.ReplicationGroup, tags []*elasticache.Tag, allNodes []*elasticache.CacheCluster, allSubnetGroups []*elasticache.CacheSubnetGroup) map[string]string { + replicationGroupID := aws.StringValue(cluster.ReplicationGroupId) + subnetGroupName := "" + labels := make(map[string]string) + + // Add AWS resource tags. + for _, tag := range tags { + key := aws.StringValue(tag.Key) + if types.IsValidLabelKey(key) { + labels[key] = aws.StringValue(tag.Value) + } else { + log.Debugf("Skipping ElastiCache tag %q, not a valid label key.", key) + } + } + + // Find any node belongs to this cluster and set engine version label. + for _, node := range allNodes { + if aws.StringValue(node.ReplicationGroupId) == replicationGroupID { + subnetGroupName = aws.StringValue(node.CacheSubnetGroupName) + labels[labelEngineVersion] = aws.StringValue(node.EngineVersion) + break + } + } + + // Find the subnet group used by this cluster and set VPC ID label. + // + // ElastiCache servers do not have public IPs so they are usually only + // accessible within the same VPC. Having a VPC ID label can be very useful + // for filtering. + for _, subnetGroup := range allSubnetGroups { + if aws.StringValue(subnetGroup.CacheSubnetGroupName) == subnetGroupName { + labels[labelVPCID] = aws.StringValue(subnetGroup.VpcId) + break + } + } + + return labels +} + // engineToProtocol converts RDS instance engine to the database protocol. func engineToProtocol(engine string) string { switch engine { @@ -331,6 +450,8 @@ func labelsFromRedshiftCluster(cluster *redshift.Cluster, meta *types.AWS) map[s key := aws.StringValue(tag.Key) if types.IsValidLabelKey(key) { labels[key] = aws.StringValue(tag.Value) + } else { + log.Debugf("Skipping Redshift tag %q, not a valid label key.", key) } } labels[types.OriginLabel] = types.OriginCloud @@ -339,6 +460,20 @@ func labelsFromRedshiftCluster(cluster *redshift.Cluster, meta *types.AWS) map[s return labels } +// labelsFromElastiCacheCluster creates database labels for the provided +// ElastiCache cluster. +func labelsFromElastiCacheCluster(meta *types.AWS, endpointType string, extraLabels map[string]string) map[string]string { + labels := make(map[string]string) + for key, value := range extraLabels { + labels[key] = value + } + labels[types.OriginLabel] = types.OriginCloud + labels[labelAccountID] = meta.AccountID + labels[labelRegion] = meta.Region + labels[labelEndpointType] = endpointType + return labels +} + // rdsTagsToLabels converts RDS tags to a labels map. func rdsTagsToLabels(tags []*rds.Tag) map[string]string { labels := make(map[string]string) @@ -379,8 +514,7 @@ func IsRDSInstanceSupported(instance *rds.DBInstance) bool { return !ver.LessThan(*minIAMSupportedVer) } -// IsRDSClusterSupported checks whether the aurora cluster is supported and logs -// related info if not. +// IsRDSClusterSupported checks whether the Aurora cluster is supported. func IsRDSClusterSupported(cluster *rds.DBCluster) bool { switch aws.StringValue(cluster.EngineMode) { // Aurora Serverless (v1 and v2) does not support IAM authentication @@ -400,6 +534,12 @@ func IsRDSClusterSupported(cluster *rds.DBCluster) bool { return true } +// IsElastiCacheClusterSupported checks whether the ElastiCache cluster is +// supported. +func IsElastiCacheClusterSupported(cluster *elasticache.ReplicationGroup) bool { + return aws.BoolValue(cluster.TransitEncryptionEnabled) +} + // IsRDSInstanceAvailable checks if the RDS instance is available. func IsRDSInstanceAvailable(instance *rds.DBInstance) bool { // For a full list of status values, see: @@ -501,6 +641,26 @@ func IsRedshiftClusterAvailable(cluster *redshift.Cluster) bool { } } +// IsElastiCacheClusterAvailable checks if the ElastiCache cluster is +// available. +func IsElastiCacheClusterAvailable(cluster *elasticache.ReplicationGroup) bool { + switch aws.StringValue(cluster.Status) { + case "available", "modifying", "snapshotting": + return true + + case "creating", "deleting", "create-failed": + return false + + default: + log.Warnf("Unknown status type: %q. Assuming ElastiCache %q is available.", + aws.StringValue(cluster.Status), + aws.StringValue(cluster.ReplicationGroupId), + ) + return true + + } +} + // auroraMySQLVersion extracts aurora mysql version from engine version func auroraMySQLVersion(cluster *rds.DBCluster) string { // version guide: https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Updates.Versions.html @@ -548,6 +708,8 @@ const ( labelEngineVersion = "engine-version" // labelEndpointType is the label key containing the RDS endpoint type. labelEndpointType = "endpoint-type" + // labelVPCID is the label key containing the VPC ID. + labelVPCID = "vpc-id" ) const ( @@ -565,7 +727,7 @@ const ( RDSEngineAuroraPostgres = "aurora-postgresql" ) -// RDSEndpointType specifies the endpoint type +// RDSEndpointType specifies the endpoint type for RDS clusters. type RDSEndpointType string const ( diff --git a/lib/services/database_test.go b/lib/services/database_test.go index b107c189c04..97ea9d4b3be 100644 --- a/lib/services/database_test.go +++ b/lib/services/database_test.go @@ -24,12 +24,14 @@ import ( "github.com/google/uuid" "github.com/gravitational/teleport/api/types" + awsutils "github.com/gravitational/teleport/api/utils/aws" "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/fixtures" "github.com/gravitational/teleport/lib/utils" "github.com/gravitational/trace" "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/elasticache" "github.com/aws/aws-sdk-go/service/rds" "github.com/aws/aws-sdk-go/service/redshift" "github.com/stretchr/testify/require" @@ -486,6 +488,252 @@ func TestDatabaseFromRedshiftCluster(t *testing.T) { }) } +func TestDatabaseFromElastiCacheConfigurationEndpoint(t *testing.T) { + cluster := &elasticache.ReplicationGroup{ + ARN: aws.String("arn:aws:elasticache:us-east-1:1234567890:replicationgroup:my-cluster"), + ReplicationGroupId: aws.String("my-cluster"), + Status: aws.String("available"), + TransitEncryptionEnabled: aws.Bool(true), + ClusterEnabled: aws.Bool(true), + ConfigurationEndpoint: &elasticache.Endpoint{ + Address: aws.String("configuration.localhost"), + Port: aws.Int64(6379), + }, + UserGroupIds: []*string{aws.String("my-user-group")}, + NodeGroups: []*elasticache.NodeGroup{ + { + NodeGroupId: aws.String("0001"), + NodeGroupMembers: []*elasticache.NodeGroupMember{ + { + CacheClusterId: aws.String("my-cluster-0001-001"), + }, + { + CacheClusterId: aws.String("my-cluster-0001-002"), + }, + }, + }, + { + NodeGroupId: aws.String("0002"), + NodeGroupMembers: []*elasticache.NodeGroupMember{ + { + CacheClusterId: aws.String("my-cluster-0002-001"), + }, + { + CacheClusterId: aws.String("my-cluster-0002-002"), + }, + }, + }, + }, + } + extraLabels := map[string]string{"key": "value"} + + expected, err := types.NewDatabaseV3(types.Metadata{ + Name: "my-cluster", + Description: "ElastiCache cluster in us-east-1 (configuration endpoint)", + Labels: map[string]string{ + types.OriginLabel: types.OriginCloud, + labelAccountID: "1234567890", + labelRegion: "us-east-1", + labelEndpointType: "configuration", + "key": "value", + }, + }, types.DatabaseSpecV3{ + Protocol: defaults.ProtocolRedis, + URI: "configuration.localhost:6379", + AWS: types.AWS{ + AccountID: "1234567890", + Region: "us-east-1", + ElastiCache: types.ElastiCache{ + ReplicationGroupID: "my-cluster", + UserGroupIDs: []string{"my-user-group"}, + TransitEncryptionEnabled: true, + EndpointType: awsutils.ElastiCacheConfigurationEndpoint, + }, + }, + }) + require.NoError(t, err) + + actual, err := NewDatabaseFromElastiCacheConfigurationEndpoint(cluster, extraLabels) + require.NoError(t, err) + require.Equal(t, expected, actual) +} + +func TestDatabaseFromElastiCacheNodeGroups(t *testing.T) { + cluster := &elasticache.ReplicationGroup{ + ARN: aws.String("arn:aws:elasticache:us-east-1:1234567890:replicationgroup:my-cluster"), + ReplicationGroupId: aws.String("my-cluster"), + Status: aws.String("available"), + TransitEncryptionEnabled: aws.Bool(true), + ClusterEnabled: aws.Bool(false), + UserGroupIds: []*string{aws.String("my-user-group")}, + NodeGroups: []*elasticache.NodeGroup{ + { + NodeGroupId: aws.String("0001"), + PrimaryEndpoint: &elasticache.Endpoint{ + Address: aws.String("primary.localhost"), + Port: aws.Int64(6379), + }, + ReaderEndpoint: &elasticache.Endpoint{ + Address: aws.String("reader.localhost"), + Port: aws.Int64(6379), + }, + }, + }, + } + extraLabels := map[string]string{"key": "value"} + + expectedPrimary, err := types.NewDatabaseV3(types.Metadata{ + Name: "my-cluster", + Description: "ElastiCache cluster in us-east-1 (primary endpoint)", + Labels: map[string]string{ + types.OriginLabel: types.OriginCloud, + labelAccountID: "1234567890", + labelRegion: "us-east-1", + labelEndpointType: "primary", + "key": "value", + }, + }, types.DatabaseSpecV3{ + Protocol: defaults.ProtocolRedis, + URI: "primary.localhost:6379", + AWS: types.AWS{ + AccountID: "1234567890", + Region: "us-east-1", + ElastiCache: types.ElastiCache{ + ReplicationGroupID: "my-cluster", + UserGroupIDs: []string{"my-user-group"}, + TransitEncryptionEnabled: true, + EndpointType: awsutils.ElastiCachePrimaryEndpoint, + }, + }, + }) + require.NoError(t, err) + + expectedReader, err := types.NewDatabaseV3(types.Metadata{ + Name: "my-cluster-reader", + Description: "ElastiCache cluster in us-east-1 (reader endpoint)", + Labels: map[string]string{ + types.OriginLabel: types.OriginCloud, + labelAccountID: "1234567890", + labelRegion: "us-east-1", + labelEndpointType: "reader", + "key": "value", + }, + }, types.DatabaseSpecV3{ + Protocol: defaults.ProtocolRedis, + URI: "reader.localhost:6379", + AWS: types.AWS{ + AccountID: "1234567890", + Region: "us-east-1", + ElastiCache: types.ElastiCache{ + ReplicationGroupID: "my-cluster", + UserGroupIDs: []string{"my-user-group"}, + TransitEncryptionEnabled: true, + EndpointType: awsutils.ElastiCacheReaderEndpoint, + }, + }, + }) + require.NoError(t, err) + + actual, err := NewDatabasesFromElastiCacheNodeGroups(cluster, extraLabels) + require.NoError(t, err) + require.Equal(t, types.Databases{expectedPrimary, expectedReader}, actual) +} + +func TestExtraElastiCacheLabels(t *testing.T) { + cluster := &elasticache.ReplicationGroup{ + ReplicationGroupId: aws.String("my-redis"), + } + tags := []*elasticache.Tag{ + {Key: aws.String("key1"), Value: aws.String("value1")}, + {Key: aws.String("key2"), Value: aws.String("value2")}, + } + + nodes := []*elasticache.CacheCluster{ + { + ReplicationGroupId: aws.String("some-other-redis"), + EngineVersion: aws.String("8.8.8"), + CacheSubnetGroupName: aws.String("some-other-subnet-group"), + }, + { + ReplicationGroupId: aws.String("my-redis"), + EngineVersion: aws.String("6.6.6"), + CacheSubnetGroupName: aws.String("my-subnet-group"), + }, + } + + subnetGroups := []*elasticache.CacheSubnetGroup{ + { + CacheSubnetGroupName: aws.String("some-other-subnet-group"), + VpcId: aws.String("some-other-vpc"), + }, + { + CacheSubnetGroupName: aws.String("my-subnet-group"), + VpcId: aws.String("my-vpc"), + }, + } + + tests := []struct { + name string + inputTags []*elasticache.Tag + inputNodes []*elasticache.CacheCluster + inputSubnetGroups []*elasticache.CacheSubnetGroup + expectLabels map[string]string + }{ + { + name: "all tags", + inputTags: tags, + inputNodes: nodes, + inputSubnetGroups: subnetGroups, + expectLabels: map[string]string{ + "key1": "value1", + "key2": "value2", + "engine-version": "6.6.6", + "vpc-id": "my-vpc", + }, + }, + { + name: "no resource tags", + inputTags: nil, + inputNodes: nodes, + inputSubnetGroups: subnetGroups, + expectLabels: map[string]string{ + "engine-version": "6.6.6", + "vpc-id": "my-vpc", + }, + }, + { + name: "no nodes", + inputTags: tags, + inputNodes: nil, + inputSubnetGroups: subnetGroups, + + // Without subnet group name from nodes, VPC ID cannot be found. + expectLabels: map[string]string{ + "key1": "value1", + "key2": "value2", + }, + }, + { + name: "no subnet groups", + inputTags: tags, + inputNodes: nodes, + inputSubnetGroups: nil, + expectLabels: map[string]string{ + "key1": "value1", + "key2": "value2", + "engine-version": "6.6.6", + }, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + actualLabels := ExtraElastiCacheLabels(cluster, test.inputTags, test.inputNodes, test.inputSubnetGroups) + require.Equal(t, test.expectLabels, actualLabels) + }) + } +} + func TestGetLabelEngineVersion(t *testing.T) { t.Parallel() diff --git a/lib/services/matchers.go b/lib/services/matchers.go index 4614a6815ea..4c80cd09736 100644 --- a/lib/services/matchers.go +++ b/lib/services/matchers.go @@ -180,4 +180,6 @@ const ( AWSMatcherRDS = "rds" // AWSMatcherRedshift is the AWS matcher type for Redshift databases. AWSMatcherRedshift = "redshift" + // AWSMatcherElastiCache is the AWS matcher type for ElastiCache databases. + AWSMatcherElastiCache = "elasticache" ) diff --git a/lib/srv/db/ca.go b/lib/srv/db/ca.go index fce6763a64d..86a143d875a 100644 --- a/lib/srv/db/ca.go +++ b/lib/srv/db/ca.go @@ -45,6 +45,7 @@ func (s *Server) initCACert(ctx context.Context, database types.Database) error switch database.GetType() { case types.DatabaseTypeRDS, types.DatabaseTypeRedshift, + types.DatabaseTypeElastiCache, types.DatabaseTypeCloudSQL, types.DatabaseTypeAzure: default: @@ -103,16 +104,30 @@ func (s *Server) getCACert(ctx context.Context, database types.Database) ([]byte // getCACertPath returns the path where automatically downloaded root certificate // for the provided database is stored in the filesystem. func (s *Server) getCACertPath(database types.Database) (string, error) { - // All RDS and Redshift instances share the same root CA which can be - // downloaded from a well-known URL (sometimes region-specific). Each - // Cloud SQL instance has its own CA. switch database.GetType() { + // All RDS instances share the same root CA (per AWS region) which can be + // downloaded from a well-known URL. case types.DatabaseTypeRDS: return filepath.Join(s.cfg.DataDir, filepath.Base(rdsCAURLForDatabase(database))), nil + + // All Redshift instances share the same root CA which can be downloaded + // from a well-known URL. case types.DatabaseTypeRedshift: return filepath.Join(s.cfg.DataDir, filepath.Base(redshiftCAURLForDatabase(database))), nil + + // ElastiCache databases are signed with Amazon root CA. In most cases, + // x509.SystemCertPool should be sufficient to verify ElastiCache servers. + // However, x509.SystemCertPool does not support windows for go versions + // older than 1.18. In addition, system cert path can be overridden by + // environment variables on many OSes. Therefore, Amazon root CA is + // downloaded here to be safe. + case types.DatabaseTypeElastiCache: + return filepath.Join(s.cfg.DataDir, filepath.Base(amazonRootCA1URL)), nil + + // Each Cloud SQL instance has its own CA. case types.DatabaseTypeCloudSQL: return filepath.Join(s.cfg.DataDir, fmt.Sprintf("%v-root.pem", database.GetName())), nil + case types.DatabaseTypeAzure: return filepath.Join(s.cfg.DataDir, filepath.Base(azureCAURL)), nil } @@ -141,6 +156,8 @@ func (d *realDownloader) Download(ctx context.Context, database types.Database) return d.downloadFromURL(rdsCAURLForDatabase(database)) case types.DatabaseTypeRedshift: return d.downloadFromURL(redshiftCAURLForDatabase(database)) + case types.DatabaseTypeElastiCache: + return d.downloadFromURL(amazonRootCA1URL) case types.DatabaseTypeCloudSQL: return d.downloadForCloudSQL(ctx, database) case types.DatabaseTypeAzure: @@ -243,6 +260,10 @@ const ( // // https://docs.amazonaws.cn/redshift/latest/mgmt/connecting-ssl-support.html redshiftCNRegionCAURL = "https://s3.cn-north-1.amazonaws.com.cn/redshift-downloads-cn/amazon-trust-ca-bundle.crt" + // amazonRootCA1URL is the root CA for many Amazon websites and services. + // + // https://www.amazontrust.com/repository/ + amazonRootCA1URL = "https://www.amazontrust.com/repository/AmazonRootCA1.pem" // azureCAURL is the URL of the CA certificate for validating certificates // presented by Azure hosted databases. See: diff --git a/lib/srv/db/cloud/meta.go b/lib/srv/db/cloud/meta.go index 47ba9073e03..a0c5a525bc3 100644 --- a/lib/srv/db/cloud/meta.go +++ b/lib/srv/db/cloud/meta.go @@ -25,6 +25,8 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/arn" + "github.com/aws/aws-sdk-go/service/elasticache" + "github.com/aws/aws-sdk-go/service/elasticache/elasticacheiface" "github.com/aws/aws-sdk-go/service/rds" "github.com/aws/aws-sdk-go/service/rds/rdsiface" "github.com/aws/aws-sdk-go/service/redshift" @@ -68,31 +70,31 @@ func NewMetadata(config MetadataConfig) (*Metadata, error) { // Update updates cloud metadata of the provided database. func (m *Metadata) Update(ctx context.Context, database types.Database) error { if database.IsRDS() { - metadata, err := m.fetchRDSMetadata(ctx, database) - if err != nil { - if trace.IsAccessDenied(err) { // Permission errors are expected. - m.log.Debugf("No permissions to fetch RDS metadata for %q: %v.", database.GetName(), err) - return nil - } - return trace.Wrap(err) - } - m.log.Debugf("Fetched RDS metadata for %q: %v.", database.GetName(), metadata) - database.SetStatusAWS(*metadata) + return m.updateAWS(ctx, database, m.fetchRDSMetadata) } else if database.IsRedshift() { - metadata, err := m.fetchRedshiftMetadata(ctx, database) - if err != nil { - if trace.IsAccessDenied(err) { // Permission errros are expected. - m.log.Debugf("No permissions to fetch Redshift metadata for %q: %v.", database.GetName(), err) - return nil - } - return trace.Wrap(err) - } - m.log.Debugf("Fetched Redshift metadata for %q: %v.", database.GetName(), metadata) - database.SetStatusAWS(*metadata) + return m.updateAWS(ctx, database, m.fetchRedshiftMetadata) + } else if database.IsElastiCache() { + return m.updateAWS(ctx, database, m.fetchElastiCacheMetadata) } return nil } +// updateAWS updates cloud metadata of the provided AWS database. +func (m *Metadata) updateAWS(ctx context.Context, database types.Database, fetchFn func(context.Context, types.Database) (*types.AWS, error)) error { + metadata, err := fetchFn(ctx, database) + if err != nil { + if trace.IsAccessDenied(err) { // Permission errors are expected. + m.log.WithError(err).Debugf("No permissions to fetch metadata for %q.", database) + return nil + } + return trace.Wrap(err) + } + + m.log.Debugf("Fetched metadata for %q: %v.", database, metadata) + database.SetStatusAWS(*metadata) + return nil +} + // fetchRDSMetadata fetches metadata for the provided RDS or Aurora database. func (m *Metadata) fetchRDSMetadata(ctx context.Context, database types.Database) (*types.AWS, error) { rds, err := m.cfg.Clients.GetAWSRDSClient(database.GetAWS().Region) @@ -144,6 +146,22 @@ func (m *Metadata) fetchRedshiftMetadata(ctx context.Context, database types.Dat }, nil } +// fetchElastiCacheMetadata fetches metadata for the provided ElastiCache database. +func (m *Metadata) fetchElastiCacheMetadata(ctx context.Context, database types.Database) (*types.AWS, error) { + elastiCacheClient, err := m.cfg.Clients.GetAWSElastiCacheClient(database.GetAWS().Region) + if err != nil { + return nil, trace.Wrap(err) + } + cluster, err := describeElastiCacheCluster(ctx, elastiCacheClient, database.GetAWS().ElastiCache.ReplicationGroupID) + if err != nil { + return nil, trace.Wrap(err) + } + + // Endpoint type does not change. + endpointType := database.GetAWS().ElastiCache.EndpointType + return services.MetadataFromElastiCacheCluster(cluster, endpointType) +} + // fetchRDSInstanceMetadata fetches metadata about specified RDS instance. func fetchRDSInstanceMetadata(ctx context.Context, rdsClient rdsiface.RDSAPI, instanceID string) (*types.AWS, error) { rdsInstance, err := describeRDSInstance(ctx, rdsClient, instanceID) @@ -162,7 +180,7 @@ func describeRDSInstance(ctx context.Context, rdsClient rdsiface.RDSAPI, instanc return nil, common.ConvertError(err) } if len(out.DBInstances) != 1 { - return nil, trace.BadParameter("expected 1 RDS instance for %v, got %s", instanceID, out.DBInstances) + return nil, trace.BadParameter("expected 1 RDS instance for %v, got %+v", instanceID, out.DBInstances) } return out.DBInstances[0], nil } @@ -185,7 +203,7 @@ func describeRDSCluster(ctx context.Context, rdsClient rdsiface.RDSAPI, clusterI return nil, common.ConvertError(err) } if len(out.DBClusters) != 1 { - return nil, trace.BadParameter("expected 1 RDS cluster for %v, got %s", clusterID, out.DBClusters) + return nil, trace.BadParameter("expected 1 RDS cluster for %v, got %+v", clusterID, out.DBClusters) } return out.DBClusters[0], nil } @@ -199,7 +217,22 @@ func describeRedshiftCluster(ctx context.Context, redshiftClient redshiftiface.R return nil, common.ConvertError(err) } if len(out.Clusters) != 1 { - return nil, trace.BadParameter("expected 1 Redshift cluster for %v, got %s", clusterID, out.Clusters) + return nil, trace.BadParameter("expected 1 Redshift cluster for %v, got %+v", clusterID, out.Clusters) } return out.Clusters[0], nil } + +// describeElastiCacheCluster returns AWS ElastiCache Redis cluster for the +// specified ID. +func describeElastiCacheCluster(ctx context.Context, elastiCacheClient elasticacheiface.ElastiCacheAPI, replicationGroupID string) (*elasticache.ReplicationGroup, error) { + out, err := elastiCacheClient.DescribeReplicationGroupsWithContext(ctx, &elasticache.DescribeReplicationGroupsInput{ + ReplicationGroupId: aws.String(replicationGroupID), + }) + if err != nil { + return nil, common.ConvertError(err) + } + if len(out.ReplicationGroups) != 1 { + return nil, trace.BadParameter("expected 1 ElastiCache cluster for %v, got %+v", replicationGroupID, out.ReplicationGroups) + } + return out.ReplicationGroups[0], nil +} diff --git a/lib/srv/db/cloud/meta_test.go b/lib/srv/db/cloud/meta_test.go index 5d8801461bc..9729cf985a0 100644 --- a/lib/srv/db/cloud/meta_test.go +++ b/lib/srv/db/cloud/meta_test.go @@ -25,6 +25,7 @@ import ( "github.com/gravitational/teleport/lib/srv/db/common" "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/elasticache" "github.com/aws/aws-sdk-go/service/rds" "github.com/aws/aws-sdk-go/service/redshift" "github.com/stretchr/testify/require" @@ -73,11 +74,25 @@ func TestAWSMetadata(t *testing.T) { }, } + // Configure ElastiCache API mock. + elasticache := &ElastiCacheMock{ + ReplicationGroups: []*elasticache.ReplicationGroup{ + { + ARN: aws.String("arn:aws:elasticache:us-west-1:123456789:replicationgroup:my-redis"), + ReplicationGroupId: aws.String("my-redis"), + ClusterEnabled: aws.Bool(true), + TransitEncryptionEnabled: aws.Bool(true), + UserGroupIds: []*string{aws.String("my-user-group")}, + }, + }, + } + // Create metadata fetcher. metadata, err := NewMetadata(MetadataConfig{ Clients: &common.TestCloudClients{ - RDS: rds, - Redshift: redshift, + RDS: rds, + Redshift: redshift, + ElastiCache: elasticache, }, }) require.NoError(t, err) @@ -166,6 +181,25 @@ func TestAWSMetadata(t *testing.T) { }, }, }, + { + name: "ElastiCache", + inAWS: types.AWS{ + ElastiCache: types.ElastiCache{ + ReplicationGroupID: "my-redis", + EndpointType: "configuration", + }, + }, + outAWS: types.AWS{ + AccountID: "123456789", + Region: "us-west-1", + ElastiCache: types.ElastiCache{ + ReplicationGroupID: "my-redis", + UserGroupIDs: []string{"my-user-group"}, + TransitEncryptionEnabled: true, + EndpointType: "configuration", + }, + }, + }, } ctx := context.Background() diff --git a/lib/srv/db/cloud/mocks.go b/lib/srv/db/cloud/mocks.go index 71d3587749c..77b223da478 100644 --- a/lib/srv/db/cloud/mocks.go +++ b/lib/srv/db/cloud/mocks.go @@ -23,6 +23,8 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/request" + "github.com/aws/aws-sdk-go/service/elasticache" + "github.com/aws/aws-sdk-go/service/elasticache/elasticacheiface" "github.com/aws/aws-sdk-go/service/iam" "github.com/aws/aws-sdk-go/service/iam/iamiface" "github.com/aws/aws-sdk-go/service/rds" @@ -353,3 +355,49 @@ func (g *GCPSQLAdminClientMock) GetDatabaseInstance(ctx context.Context, session func (g *GCPSQLAdminClientMock) GenerateEphemeralCert(ctx context.Context, sessionCtx *common.Session) (*tls.Certificate, error) { return g.EphemeralCert, nil } + +// ElastiCache mocks AWS ElastiCache API. +type ElastiCacheMock struct { + elasticacheiface.ElastiCacheAPI + + ReplicationGroups []*elasticache.ReplicationGroup + TagsByARN map[string][]*elasticache.Tag +} + +func (m *ElastiCacheMock) DescribeReplicationGroupsWithContext(_ aws.Context, input *elasticache.DescribeReplicationGroupsInput, opts ...request.Option) (*elasticache.DescribeReplicationGroupsOutput, error) { + for _, replicationGroup := range m.ReplicationGroups { + if aws.StringValue(replicationGroup.ReplicationGroupId) == aws.StringValue(input.ReplicationGroupId) { + return &elasticache.DescribeReplicationGroupsOutput{ + ReplicationGroups: []*elasticache.ReplicationGroup{replicationGroup}, + }, nil + } + } + return nil, trace.NotFound("ElastiCache %v not found", aws.StringValue(input.ReplicationGroupId)) +} +func (m *ElastiCacheMock) DescribeReplicationGroupsPagesWithContext(_ aws.Context, _ *elasticache.DescribeReplicationGroupsInput, fn func(*elasticache.DescribeReplicationGroupsOutput, bool) bool, _ ...request.Option) error { + fn(&elasticache.DescribeReplicationGroupsOutput{ + ReplicationGroups: m.ReplicationGroups, + }, true) + return nil +} + +func (m *ElastiCacheMock) DescribeCacheClustersPagesWithContext(aws.Context, *elasticache.DescribeCacheClustersInput, func(*elasticache.DescribeCacheClustersOutput, bool) bool, ...request.Option) error { + return trace.AccessDenied("unauthorized") +} +func (m *ElastiCacheMock) DescribeCacheSubnetGroupsPagesWithContext(aws.Context, *elasticache.DescribeCacheSubnetGroupsInput, func(*elasticache.DescribeCacheSubnetGroupsOutput, bool) bool, ...request.Option) error { + return trace.AccessDenied("unauthorized") +} +func (m *ElastiCacheMock) ListTagsForResourceWithContext(_ aws.Context, input *elasticache.ListTagsForResourceInput, _ ...request.Option) (*elasticache.TagListMessage, error) { + if m.TagsByARN == nil { + return nil, trace.NotFound("no tags") + } + + tags, ok := m.TagsByARN[aws.StringValue(input.ResourceName)] + if !ok { + return nil, trace.NotFound("no tags") + } + + return &elasticache.TagListMessage{ + TagList: tags, + }, nil +} diff --git a/lib/srv/db/cloud/watchers/elasticache.go b/lib/srv/db/cloud/watchers/elasticache.go new file mode 100644 index 00000000000..dd3b1bd9a1a --- /dev/null +++ b/lib/srv/db/cloud/watchers/elasticache.go @@ -0,0 +1,252 @@ +/* +Copyright 2022 Gravitational, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package watchers + +import ( + "context" + "fmt" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/elasticache" + "github.com/aws/aws-sdk-go/service/elasticache/elasticacheiface" + + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/services" + "github.com/gravitational/teleport/lib/srv/db/common" + "github.com/gravitational/trace" + + "github.com/sirupsen/logrus" +) + +// elastiCacheFetcherConfig is the ElastiCache databases fetcher configuration. +type elastiCacheFetcherConfig struct { + // Labels is a selector to match cloud databases. + Labels types.Labels + // ElastiCache is the ElastiCache API client. + ElastiCache elasticacheiface.ElastiCacheAPI + // Region is the AWS region to query databases in. + Region string +} + +// CheckAndSetDefaults validates the config and sets defaults. +func (c *elastiCacheFetcherConfig) CheckAndSetDefaults() error { + if len(c.Labels) == 0 { + return trace.BadParameter("missing parameter Labels") + } + if c.ElastiCache == nil { + return trace.BadParameter("missing parameter ElastiCache") + } + if c.Region == "" { + return trace.BadParameter("missing parameter Region") + } + return nil +} + +// elastiCacheFetcher retrieves ElastiCache Redis databases. +type elastiCacheFetcher struct { + cfg elastiCacheFetcherConfig + log logrus.FieldLogger +} + +// newElastiCacheFetcher returns a new ElastiCache databases fetcher instance. +func newElastiCacheFetcher(config elastiCacheFetcherConfig) (Fetcher, error) { + if err := config.CheckAndSetDefaults(); err != nil { + return nil, trace.Wrap(err) + } + return &elastiCacheFetcher{ + cfg: config, + log: logrus.WithFields(logrus.Fields{ + trace.Component: "watch:elasticache", + "labels": config.Labels, + "region": config.Region, + }), + }, nil +} + +// Get returns ElastiCache Redis databases matching the watcher's selectors. +// +// TODO(greedy52) support ElastiCache global datastore. +func (f *elastiCacheFetcher) Get(ctx context.Context) (types.Databases, error) { + clusters, err := getElastiCacheClusters(ctx, f.cfg.ElastiCache) + if err != nil { + return nil, trace.Wrap(err) + } + + var eligibleClusters []*elasticache.ReplicationGroup + for _, cluster := range clusters { + if !services.IsElastiCacheClusterSupported(cluster) { + f.log.Debugf("ElastiCache cluster %q is not supported. Skipping.", aws.StringValue(cluster.ReplicationGroupId)) + continue + } + + if !services.IsElastiCacheClusterAvailable(cluster) { + f.log.Debugf("The current status of ElastiCache cluster %q is %q. Skipping.", + aws.StringValue(cluster.ReplicationGroupId), + aws.StringValue(cluster.Status)) + continue + } + + eligibleClusters = append(eligibleClusters, cluster) + } + + if len(eligibleClusters) == 0 { + return types.Databases{}, nil + } + + // Fetch more information to provide extra labels. Do not fail because some + // of these labels are missing. + allNodes, err := getElastiCacheNodes(ctx, f.cfg.ElastiCache) + if err != nil { + if trace.IsAccessDenied(err) { + f.log.WithError(err).Debug("No permissions to describe nodes") + } else { + f.log.WithError(err).Info("Failed to describe nodes.") + } + } + allSubnetGroups, err := getElastiCacheSubnetGroups(ctx, f.cfg.ElastiCache) + if err != nil { + if trace.IsAccessDenied(err) { + f.log.WithError(err).Debug("No permissions to describe subnet groups") + } else { + f.log.WithError(err).Info("Failed to describe subnet groups.") + } + } + + var databases types.Databases + for _, cluster := range eligibleClusters { + // Resource tags are not found in elasticache.ReplicationGroup but can + // be on obtained by elasticache.ListTagsForResource (one call per + // resource). + tags, err := getElastiCacheResourceTags(ctx, f.cfg.ElastiCache, cluster.ARN) + if err != nil { + if trace.IsAccessDenied(err) { + f.log.WithError(err).Debug("No permissions to list resource tags") + } else { + f.log.WithError(err).Infof("Failed to list resource tags for ElastiCache cluster %q.", aws.StringValue(cluster.ReplicationGroupId)) + } + } + + extraLabels := services.ExtraElastiCacheLabels(cluster, tags, allNodes, allSubnetGroups) + + // Create database using configuration endpoint for Redis with cluster + // mode enabled. + if aws.BoolValue(cluster.ClusterEnabled) { + if database, err := services.NewDatabaseFromElastiCacheConfigurationEndpoint(cluster, extraLabels); err != nil { + f.log.Infof("Could not convert ElastiCache cluster %q configuration endpoint to database resource: %v.", + aws.StringValue(cluster.ReplicationGroupId), err) + } else { + databases = append(databases, database) + } + + continue + } + + // Create databases using primary and reader endpoints for Redis with + // cluster mode disabled. When cluster mode is disabled, it is expected + // there is only one node group (aka shard) with one primary endpoint + // and one reader endpoint. + if databasesFromNodeGroups, err := services.NewDatabasesFromElastiCacheNodeGroups(cluster, extraLabels); err != nil { + f.log.Infof("Could not convert ElastiCache cluster %q node groups to database resources: %v.", + aws.StringValue(cluster.ReplicationGroupId), err) + } else { + databases = append(databases, databasesFromNodeGroups...) + } + } + + return filterDatabasesByLabels(databases, f.cfg.Labels, f.log), nil +} + +// String returns the fetcher's string description. +func (f *elastiCacheFetcher) String() string { + return fmt.Sprintf("elastiCacheFetcher(Region=%v, Labels=%v)", + f.cfg.Region, f.cfg.Labels) +} + +// getElastiCacheClusters fetches all ElastiCache replication groups. +func getElastiCacheClusters(ctx context.Context, client elasticacheiface.ElastiCacheAPI) ([]*elasticache.ReplicationGroup, error) { + var clusters []*elasticache.ReplicationGroup + var pageNum int + + err := client.DescribeReplicationGroupsPagesWithContext( + ctx, + &elasticache.DescribeReplicationGroupsInput{}, + func(page *elasticache.DescribeReplicationGroupsOutput, lastPage bool) bool { + pageNum++ + clusters = append(clusters, page.ReplicationGroups...) + return pageNum <= maxPages + }, + ) + return clusters, common.ConvertError(err) +} + +// getElastiCacheNodes fetches all ElastiCache nodes that associated with a +// replication group. +func getElastiCacheNodes(ctx context.Context, client elasticacheiface.ElastiCacheAPI) ([]*elasticache.CacheCluster, error) { + var nodes []*elasticache.CacheCluster + var pageNum int + + err := client.DescribeCacheClustersPagesWithContext( + ctx, + &elasticache.DescribeCacheClustersInput{}, + func(page *elasticache.DescribeCacheClustersOutput, lastPage bool) bool { + pageNum++ + + // There are three types of elasticache.CacheCluster: + // 1) a Memcache cluster. + // 2) a Redis node belongs to a single node deployment (legacy, no TLS support). + // 3) a Redis node belongs to a Redis replication group. + // Only the ones belong to replication groups are wanted. + for _, cacheCluster := range page.CacheClusters { + if cacheCluster.ReplicationGroupId != nil { + nodes = append(nodes, cacheCluster) + } + } + return pageNum <= maxPages + }, + ) + return nodes, common.ConvertError(err) +} + +// getElastiCacheSubnetGroups fetches all ElastiCache subnet groups. +func getElastiCacheSubnetGroups(ctx context.Context, client elasticacheiface.ElastiCacheAPI) ([]*elasticache.CacheSubnetGroup, error) { + var subnetGroups []*elasticache.CacheSubnetGroup + var pageNum int + + err := client.DescribeCacheSubnetGroupsPagesWithContext( + ctx, + &elasticache.DescribeCacheSubnetGroupsInput{}, + func(page *elasticache.DescribeCacheSubnetGroupsOutput, lastPage bool) bool { + pageNum++ + subnetGroups = append(subnetGroups, page.CacheSubnetGroups...) + return pageNum <= maxPages + }, + ) + return subnetGroups, common.ConvertError(err) +} + +// getElastiCacheResourceTags fetches resource tags for provided ElastiCache +// replication group. +func getElastiCacheResourceTags(ctx context.Context, client elasticacheiface.ElastiCacheAPI, resourceName *string) ([]*elasticache.Tag, error) { + input := &elasticache.ListTagsForResourceInput{ + ResourceName: resourceName, + } + output, err := client.ListTagsForResourceWithContext(ctx, input) + if err != nil { + return nil, common.ConvertError(err) + } + + return output.TagList, nil +} diff --git a/lib/srv/db/cloud/watchers/rds.go b/lib/srv/db/cloud/watchers/rds.go index 17fa187f678..4a1e6f16c73 100644 --- a/lib/srv/db/cloud/watchers/rds.go +++ b/lib/srv/db/cloud/watchers/rds.go @@ -84,18 +84,7 @@ func (f *rdsDBInstancesFetcher) Get(ctx context.Context) (types.Databases, error return nil, trace.Wrap(err) } - var result types.Databases - for _, database := range rdsDatabases { - match, _, err := services.MatchLabels(f.cfg.Labels, database.GetAllLabels()) - if err != nil { - f.log.Warnf("Failed to match %v against selector: %v.", database, err) - } else if match { - result = append(result, database) - } else { - f.log.Debugf("%v doesn't match selector.", database) - } - } - return result, nil + return filterDatabasesByLabels(rdsDatabases, f.cfg.Labels, f.log), nil } // getRDSDatabases returns a list of database resources representing RDS instances. @@ -180,18 +169,7 @@ func (f *rdsAuroraClustersFetcher) Get(ctx context.Context) (types.Databases, er return nil, trace.Wrap(err) } - var result types.Databases - for _, database := range auroraDatabases { - match, _, err := services.MatchLabels(f.cfg.Labels, database.GetAllLabels()) - if err != nil { - f.log.Warnf("Failed to match %v against selector: %v.", database, err) - } else if match { - result = append(result, database) - } else { - f.log.Debugf("%v doesn't match selector.", database) - } - } - return result, nil + return filterDatabasesByLabels(auroraDatabases, f.cfg.Labels, f.log), nil } // getAuroraDatabases returns a list of database resources representing RDS clusters. @@ -302,3 +280,19 @@ func auroraFilters() []*rds.Filter { // maxPages is the maximum number of pages to iterate over when fetching databases. const maxPages = 10 + +// filterDatabasesByLabels filters input databases with provided labels. +func filterDatabasesByLabels(databases types.Databases, labels types.Labels, log logrus.FieldLogger) types.Databases { + var matchedDatabases types.Databases + for _, database := range databases { + match, _, err := services.MatchLabels(labels, database.GetAllLabels()) + if err != nil { + log.Warnf("Failed to match %v against selector: %v.", database, err) + } else if match { + matchedDatabases = append(matchedDatabases, database) + } else { + log.Debugf("%v doesn't match selector.", database) + } + } + return matchedDatabases +} diff --git a/lib/srv/db/cloud/watchers/redshift.go b/lib/srv/db/cloud/watchers/redshift.go index 33baed41304..06200372647 100644 --- a/lib/srv/db/cloud/watchers/redshift.go +++ b/lib/srv/db/cloud/watchers/redshift.go @@ -100,16 +100,9 @@ func (f *redshiftFetcher) Get(ctx context.Context) (types.Databases, error) { continue } - match, _, err := services.MatchLabels(f.cfg.Labels, database.GetAllLabels()) - if err != nil { - f.log.Warnf("Failed to match %v against selector: %v.", database, err) - } else if match { - databases = append(databases, database) - } else { - f.log.Debugf("%v doesn't match selector.", database) - } + databases = append(databases, database) } - return databases, nil + return filterDatabasesByLabels(databases, f.cfg.Labels, f.log), nil } // String returns the fetcher's string description. diff --git a/lib/srv/db/cloud/watchers/watcher.go b/lib/srv/db/cloud/watchers/watcher.go index 1d649388045..62c3759b24b 100644 --- a/lib/srv/db/cloud/watchers/watcher.go +++ b/lib/srv/db/cloud/watchers/watcher.go @@ -161,6 +161,14 @@ func makeFetchers(clients common.CloudClients, matchers []services.AWSMatcher) ( } result = append(result, fetcher) } + + if utils.SliceContainsStr(matcher.Types, services.AWSMatcherElastiCache) { + fetcher, err := makeElastiCacheFetcher(clients, region, matcher.Tags) + if err != nil { + return nil, trace.Wrap(err) + } + result = append(result, fetcher) + } } } return result, nil @@ -204,3 +212,16 @@ func makeRedshiftFetcher(clients common.CloudClients, region string, tags types. Redshift: redshift, }) } + +// makeElastiCacheFetcher returns ElastiCache fetcher for the provided region and tags. +func makeElastiCacheFetcher(clients common.CloudClients, region string, tags types.Labels) (Fetcher, error) { + elastiCache, err := clients.GetAWSElastiCacheClient(region) + if err != nil { + return nil, trace.Wrap(err) + } + return newElastiCacheFetcher(elastiCacheFetcherConfig{ + Region: region, + Labels: tags, + ElastiCache: elastiCache, + }) +} diff --git a/lib/srv/db/cloud/watchers/watcher_test.go b/lib/srv/db/cloud/watchers/watcher_test.go index bcb3ddb8fa7..980d52b67a5 100644 --- a/lib/srv/db/cloud/watchers/watcher_test.go +++ b/lib/srv/db/cloud/watchers/watcher_test.go @@ -28,6 +28,7 @@ import ( "github.com/gravitational/teleport/lib/srv/db/common" "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/elasticache" "github.com/aws/aws-sdk-go/service/rds" "github.com/aws/aws-sdk-go/service/rds/rdsiface" "github.com/aws/aws-sdk-go/service/redshift" @@ -59,6 +60,23 @@ func TestWatcher(t *testing.T) { redshiftUse1Unavailable, _ := makeRedshiftCluster(t, "us-east-1", "qa", withRedshiftStatus("paused")) redshiftUse1UnknownStatus, redshiftDatabaseUnknownStatus := makeRedshiftCluster(t, "us-east-1", "test", withRedshiftStatus("status-does-not-exist")) + elasticacheProd, elasticacheDatabaseProd, elasticacheProdTags := makeElastiCacheCluster(t, "ec1", "us-east-1", "prod") + elasticacheQA, elasticacheDatabaseQA, elasticacheQATags := makeElastiCacheCluster(t, "ec2", "us-east-1", "qa", withElastiCacheConfigurationEndpoint()) + elasticacheTest, _, elasticacheTestTags := makeElastiCacheCluster(t, "ec3", "us-east-1", "test") + elasticacheUnavailable, _, elasticacheUnavailableTags := makeElastiCacheCluster(t, "ec4", "us-east-1", "prod", func(cluster *elasticache.ReplicationGroup) { + cluster.Status = aws.String("deleting") + }) + elasticacheUnsupported, _, elasticacheUnsupportedTags := makeElastiCacheCluster(t, "ec5", "us-east-1", "prod", func(cluster *elasticache.ReplicationGroup) { + cluster.TransitEncryptionEnabled = aws.Bool(false) + }) + elasticacheTagsByARN := map[string][]*elasticache.Tag{ + aws.StringValue(elasticacheProd.ARN): elasticacheProdTags, + aws.StringValue(elasticacheQA.ARN): elasticacheQATags, + aws.StringValue(elasticacheTest.ARN): elasticacheTestTags, + aws.StringValue(elasticacheUnavailable.ARN): elasticacheUnavailableTags, + aws.StringValue(elasticacheUnsupported.ARN): elasticacheUnsupportedTags, + } + tests := []struct { name string awsMatchers []services.AWSMatcher @@ -178,11 +196,34 @@ func TestWatcher(t *testing.T) { }, expectedDatabases: types.Databases{redshiftDatabaseUse1Prod, redshiftDatabaseUnknownStatus}, }, + { + name: "ElastiCache", + awsMatchers: []services.AWSMatcher{ + { + Types: []string{services.AWSMatcherElastiCache}, + Regions: []string{"us-east-1"}, + Tags: types.Labels{"env": []string{"prod", "qa"}}, + }, + }, + clients: &common.TestCloudClients{ + ElastiCache: &cloud.ElastiCacheMock{ + ReplicationGroups: []*elasticache.ReplicationGroup{ + elasticacheProd, // labels match + elasticacheQA, // labels match + elasticacheTest, // labels do not match + elasticacheUnavailable, + elasticacheUnsupported, + }, + TagsByARN: elasticacheTagsByARN, + }, + }, + expectedDatabases: types.Databases{elasticacheDatabaseProd, elasticacheDatabaseQA}, + }, { name: "matcher with multiple types", awsMatchers: []services.AWSMatcher{ { - Types: []string{services.AWSMatcherRedshift, services.AWSMatcherRDS}, + Types: []string{services.AWSMatcherRedshift, services.AWSMatcherRDS, services.AWSMatcherElastiCache}, Regions: []string{"us-east-1"}, Tags: types.Labels{"env": []string{"prod"}}, }, @@ -194,8 +235,12 @@ func TestWatcher(t *testing.T) { Redshift: &cloud.RedshiftMock{ Clusters: []*redshift.Cluster{redshiftUse1Prod}, }, + ElastiCache: &cloud.ElastiCacheMock{ + ReplicationGroups: []*elasticache.ReplicationGroup{elasticacheProd}, + TagsByARN: elasticacheTagsByARN, + }, }, - expectedDatabases: types.Databases{auroraDatabase1, redshiftDatabaseUse1Prod}, + expectedDatabases: types.Databases{auroraDatabase1, redshiftDatabaseUse1Prod, elasticacheDatabaseProd}, }, } @@ -312,6 +357,44 @@ func makeRDSClusterWithExtraEndpoints(t *testing.T, name, region string, labels return cluster, append(types.Databases{primaryDatabase, readerDatabase}, customDatabases...) } +func makeElastiCacheCluster(t *testing.T, name, region, env string, opts ...func(*elasticache.ReplicationGroup)) (*elasticache.ReplicationGroup, types.Database, []*elasticache.Tag) { + cluster := &elasticache.ReplicationGroup{ + ARN: aws.String(fmt.Sprintf("arn:aws:elasticache:%s:123456789:replicationgroup:%s", region, name)), + ReplicationGroupId: aws.String(name), + Status: aws.String("available"), + TransitEncryptionEnabled: aws.Bool(true), + + // Default has one primary endpoint in the only node group. + NodeGroups: []*elasticache.NodeGroup{{ + PrimaryEndpoint: &elasticache.Endpoint{ + Address: aws.String("primary.localhost"), + Port: aws.Int64(6379), + }, + }}, + } + + for _, opt := range opts { + opt(cluster) + } + + tags := []*elasticache.Tag{{ + Key: aws.String("env"), + Value: aws.String(env), + }} + extraLabels := services.ExtraElastiCacheLabels(cluster, tags, nil, nil) + + if aws.BoolValue(cluster.ClusterEnabled) { + database, err := services.NewDatabaseFromElastiCacheConfigurationEndpoint(cluster, extraLabels) + require.NoError(t, err) + return cluster, database, tags + } + + databases, err := services.NewDatabasesFromElastiCacheNodeGroups(cluster, extraLabels) + require.NoError(t, err) + require.Len(t, databases, 1) + return cluster, databases[0], tags +} + // withRDSInstanceStatus returns an option function for makeRDSInstance to overwrite status. func withRDSInstanceStatus(status string) func(*rds.DBInstance) { return func(instance *rds.DBInstance) { @@ -340,6 +423,18 @@ func withRedshiftStatus(status string) func(*redshift.Cluster) { } } +// withElastiCacheConfigurationEndpoint returns an option function for +// makeElastiCacheCluster to set a configuration endpoint. +func withElastiCacheConfigurationEndpoint() func(*elasticache.ReplicationGroup) { + return func(cluster *elasticache.ReplicationGroup) { + cluster.ClusterEnabled = aws.Bool(true) + cluster.ConfigurationEndpoint = &elasticache.Endpoint{ + Address: aws.String("configuration.localhost"), + Port: aws.Int64(6379), + } + } +} + func labelsToTags(labels map[string]string) (tags []*rds.Tag) { for key, val := range labels { tags = append(tags, &rds.Tag{ diff --git a/lib/srv/db/common/auth.go b/lib/srv/db/common/auth.go index 837670237f6..f2d56f69776 100644 --- a/lib/srv/db/common/auth.go +++ b/lib/srv/db/common/auth.go @@ -367,8 +367,8 @@ func (a *dbAuth) getTLSConfigVerifyFull(ctx context.Context, sessionCtx *Session tlsConfig.ServerName = dbTLSConfig.ServerName } - // RDS/Aurora/Redshift and Cloud SQL auth is done with an auth token so - // don't generate a client certificate and exit here. + // RDS/Aurora/Redshift/ElastiCache and Cloud SQL auth is done with an auth + // token so don't generate a client certificate and exit here. if sessionCtx.Database.IsCloudHosted() { return tlsConfig, nil } @@ -438,6 +438,7 @@ func appendCAToRoot(tlsConfig *tls.Config, sessionCtx *Session) (*tls.Config, er return nil, trace.BadParameter("invalid server CA certificate") } } + return tlsConfig, nil } diff --git a/lib/srv/db/common/cloud.go b/lib/srv/db/common/cloud.go index 3eda03edea8..904489de8cd 100644 --- a/lib/srv/db/common/cloud.go +++ b/lib/srv/db/common/cloud.go @@ -26,6 +26,8 @@ import ( "github.com/Azure/azure-sdk-for-go/sdk/azidentity" "github.com/aws/aws-sdk-go/aws" awssession "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/elasticache" + "github.com/aws/aws-sdk-go/service/elasticache/elasticacheiface" "github.com/aws/aws-sdk-go/service/iam" "github.com/aws/aws-sdk-go/service/iam/iamiface" "github.com/aws/aws-sdk-go/service/rds" @@ -50,6 +52,8 @@ type CloudClients interface { GetAWSRDSClient(region string) (rdsiface.RDSAPI, error) // GetAWSRedshiftClient returns AWS Redshift client for the specified region. GetAWSRedshiftClient(region string) (redshiftiface.RedshiftAPI, error) + // GetAWSElastiCacheClient returns AWS ElastiCache client for the specified region. + GetAWSElastiCacheClient(region string) (elasticacheiface.ElastiCacheAPI, error) // GetAWSIAMClient returns AWS IAM client for the specified region. GetAWSIAMClient(region string) (iamiface.IAMAPI, error) // GetAWSSTSClient returns AWS STS client for the specified region. @@ -113,6 +117,15 @@ func (c *cloudClients) GetAWSRedshiftClient(region string) (redshiftiface.Redshi return redshift.New(session), nil } +// GetAWSElastiCacheClient returns AWS ElastiCache client for the specified region. +func (c *cloudClients) GetAWSElastiCacheClient(region string) (elasticacheiface.ElastiCacheAPI, error) { + session, err := c.GetAWSSession(region) + if err != nil { + return nil, trace.Wrap(err) + } + return elasticache.New(session), nil +} + // GetAWSIAMClient returns AWS IAM client for the specified region. func (c *cloudClients) GetAWSIAMClient(region string) (iamiface.IAMAPI, error) { session, err := c.GetAWSSession(region) @@ -164,7 +177,7 @@ func (c *cloudClients) GetAzureCredential() (azcore.TokenCredential, error) { return c.initAzureCredential() } -// Closes closes all initialized clients. +// Close closes all initialized clients. func (c *cloudClients) Close() (err error) { c.mtx.Lock() defer c.mtx.Unlock() @@ -245,6 +258,7 @@ type TestCloudClients struct { RDS rdsiface.RDSAPI RDSPerRegion map[string]rdsiface.RDSAPI Redshift redshiftiface.RedshiftAPI + ElastiCache elasticacheiface.ElastiCacheAPI IAM iamiface.IAMAPI STS stsiface.STSAPI GCPSQL GCPSQLAdminClient @@ -268,6 +282,11 @@ func (c *TestCloudClients) GetAWSRedshiftClient(region string) (redshiftiface.Re return c.Redshift, nil } +// GetAWSElastiCacheClient returns AWS ElastiCache client for the specified region. +func (c *TestCloudClients) GetAWSElastiCacheClient(region string) (elasticacheiface.ElastiCacheAPI, error) { + return c.ElastiCache, nil +} + // GetAWSIAMClient returns AWS IAM client for the specified region. func (c *TestCloudClients) GetAWSIAMClient(region string) (iamiface.IAMAPI, error) { return c.IAM, nil diff --git a/lib/srv/db/redis/client.go b/lib/srv/db/redis/client.go index de0bf1f7fdb..d1b57c69ca1 100644 --- a/lib/srv/db/redis/client.go +++ b/lib/srv/db/redis/client.go @@ -91,7 +91,6 @@ type clusterClient struct { // an error is returned. func newClient(ctx context.Context, connectionOptions *ConnectionOptions, tlsConfig *tls.Config, username, password string) (redis.UniversalClient, error) { connectionAddr := net.JoinHostPort(connectionOptions.address, connectionOptions.port) - // TODO(jakub): Use system CA bundle if connecting to AWS. // TODO(jakub): Investigate Redis Sentinel. switch connectionOptions.mode { case Standalone: diff --git a/lib/srv/db/redis/connection.go b/lib/srv/db/redis/connection.go index 18a0dd90381..335fe1a5586 100644 --- a/lib/srv/db/redis/connection.go +++ b/lib/srv/db/redis/connection.go @@ -69,6 +69,13 @@ type ConnectionOptions struct { // Incorrect input: // redis.example.com:6379?mode=cluster func ParseRedisAddress(addr string) (*ConnectionOptions, error) { + // Default to the single mode. + return ParseRedisAddressWithDefaultMode(addr, Standalone) +} + +// ParseRedisAddressWithDefaultMode parses a Redis connection string and uses +// the provided default mode if mode is not specified in the address. +func ParseRedisAddressWithDefaultMode(addr string, defaultMode ConnectionMode) (*ConnectionOptions, error) { if addr == "" { return nil, trace.BadParameter("Redis address is empty") } @@ -124,8 +131,7 @@ func ParseRedisAddress(addr string) (*ConnectionOptions, error) { values := redisURL.Query() // Get additional connections options - // Default to the single mode. - mode := Standalone + mode := defaultMode if values.Has("mode") { connMode := strings.ToLower(values.Get("mode")) switch ConnectionMode(connMode) { diff --git a/lib/srv/db/redis/engine.go b/lib/srv/db/redis/engine.go index 37a8fc5383d..2ef060a7fca 100644 --- a/lib/srv/db/redis/engine.go +++ b/lib/srv/db/redis/engine.go @@ -23,6 +23,7 @@ import ( "net" "github.com/go-redis/redis/v8" + apiawsutils "github.com/gravitational/teleport/api/utils/aws" "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/srv/db/common" @@ -167,7 +168,7 @@ func (e *Engine) HandleConnection(ctx context.Context, sessionCtx *common.Sessio e.Audit.OnSessionStart(e.Context, sessionCtx, nil) defer e.Audit.OnSessionEnd(e.Context, sessionCtx) - if err := e.process(ctx); err != nil { + if err := e.process(ctx, sessionCtx); err != nil { return trace.Wrap(err) } @@ -181,7 +182,14 @@ func (e *Engine) getNewClientFn(ctx context.Context, sessionCtx *common.Session) return nil, trace.Wrap(err) } - connectionOptions, err := ParseRedisAddress(sessionCtx.Database.GetURI()) + // Set default mode. Default mode can be overridden by URI parameters. + defaultMode := Standalone + if sessionCtx.Database.IsElastiCache() && + sessionCtx.Database.GetAWS().ElastiCache.EndpointType == apiawsutils.ElastiCacheConfigurationEndpoint { + defaultMode = Cluster + } + + connectionOptions, err := ParseRedisAddressWithDefaultMode(sessionCtx.Database.GetURI(), defaultMode) if err != nil { return nil, trace.BadParameter("Redis connection string is incorrect %q: %v", sessionCtx.Database.GetURI(), err) } @@ -214,7 +222,7 @@ func (e *Engine) reconnect(username, password string) (redis.UniversalClient, er // process is the main processing function for Redis. It reads commands from connected client and passes them to // a Redis instance. This function returns when a server closes a connection or in case of connection error. -func (e *Engine) process(ctx context.Context) error { +func (e *Engine) process(ctx context.Context, sessionCtx *common.Session) error { for { // Read commands from connected client. cmd, err := e.readClientCmd(ctx) @@ -228,8 +236,12 @@ func (e *Engine) process(ctx context.Context) error { // Function below maps errors that should be returned to the // client as value or return them as err if we should terminate // the session. - value, err := processSeverResponse(cmd, err) + value, err := processServerResponse(cmd, err, sessionCtx) if err != nil { + // Send server error to client before closing. + if sendError := e.sendToClient(err); sendError != nil { + return trace.NewAggregate(err, sendError) + } return trace.Wrap(err) } @@ -255,11 +267,11 @@ func (e *Engine) readClientCmd(ctx context.Context) (*redis.Cmd, error) { return redis.NewCmd(ctx, val...), nil } -// processSeverResponse takes server response and an error returned from go-redis and returns +// processServerResponse takes server response and an error returned from go-redis and returns // "terminal" errors as second value (connection should be terminated when this happens) // or returns error/value as the first value. Then value should be sent back to // the client without terminating the connection. -func processSeverResponse(cmd *redis.Cmd, err error) (interface{}, error) { +func processServerResponse(cmd *redis.Cmd, err error, sessionCtx *common.Session) (interface{}, error) { value, cmdErr := cmd.Result() if err == nil { // If the server didn't return any error use cmd.Err() as server error. @@ -274,6 +286,10 @@ func processSeverResponse(cmd *redis.Cmd, err error) (interface{}, error) { // Teleport errors should be returned to the client. return err, nil case errors.Is(err, context.DeadlineExceeded): + if sessionCtx.Database.IsElastiCache() && !sessionCtx.Database.GetAWS().ElastiCache.TransitEncryptionEnabled { + return nil, trace.ConnectionProblem(err, "Connection timeout on ElastiCache database. Please verify if in-transit encryption is enabled on the server.") + } + // Do not return Deadline Exceeded to the client as it's not very self-explanatory. // Return "connection timeout" as this is what most likely happened. return nil, trace.ConnectionProblem(err, "connection timeout") diff --git a/tool/teleport/common/configurator.go b/tool/teleport/common/configurator.go index 302de1429c8..cff439dc9f2 100644 --- a/tool/teleport/common/configurator.go +++ b/tool/teleport/common/configurator.go @@ -30,7 +30,7 @@ import ( ) // awsDatabaseTypes list of databases supported on the configurator. -var awsDatabaseTypes = []string{types.DatabaseTypeRDS, types.DatabaseTypeRedshift} +var awsDatabaseTypes = []string{types.DatabaseTypeRDS, types.DatabaseTypeRedshift, types.DatabaseTypeElastiCache} type createDatabaseConfigFlags struct { config.DatabaseSampleFlags @@ -83,7 +83,7 @@ func onConfigureDatabaseBootstrap(flags configureDatabaseBootstrapFlags) error { fmt.Printf("Reading configuration at %q...\n\n", flags.config.ConfigPath) if len(configurators) == 0 { - fmt.Println("The agent doesn’t require any extra configuration.") + fmt.Println("The agent doesn't require any extra configuration.") return nil } @@ -178,6 +178,10 @@ func buildAWSConfigurator(manual bool, flags configureDatabaseAWSFlags) (dbconfi switch dbType { case types.DatabaseTypeRDS: configuratorFlags.ForceRDSPermissions = true + case types.DatabaseTypeRedshift: + configuratorFlags.ForceRedshiftPermissions = true + case types.DatabaseTypeElastiCache: + configuratorFlags.ForceElastiCachePermissions = true } } @@ -202,7 +206,7 @@ func onConfigureDatabasesAWSPrint(flags configureDatabaseAWSPrintFlags) error { // Check if configurator actions is empty. if configurator.IsEmpty() { - fmt.Println("The agent doesn’t require any extra configuration.") + fmt.Println("The agent doesn't require any extra configuration.") return nil } @@ -257,7 +261,7 @@ func onConfigureDatabasesAWSCreate(flags configureDatabaseAWSCreateFlags) error // Check if configurator actions is empty. if configurator.IsEmpty() { - fmt.Println("The agent doesn’t require any extra configuration.") + fmt.Println("The agent doesn't require any extra configuration.") return nil } @@ -281,7 +285,7 @@ func printDBConfiguratorActions(actions []dbconfigurators.ConfiguratorAction) { } } -// executeDBConfiguratorActions iterate over all actions, executing and priting +// executeDBConfiguratorActions iterate over all actions, executing and printing // their results. func executeDBConfiguratorActions(ctx context.Context, configuratorName string, actions []dbconfigurators.ConfiguratorAction) error { actionContext := &dbconfigurators.ConfiguratorActionContext{} diff --git a/tool/teleport/common/teleport.go b/tool/teleport/common/teleport.go index 1c8af5b61f5..12a43a68d98 100644 --- a/tool/teleport/common/teleport.go +++ b/tool/teleport/common/teleport.go @@ -162,7 +162,7 @@ func Run(options Options) (app *kingpin.Application, executedCommand string, con "Database CA certificate path.").Hidden(). StringVar(&ccf.DatabaseCACertFile) start.Flag("db-aws-region", - "AWS region RDS, Aurora or Redshift database instance is running in.").Hidden(). + "AWS region RDS, Aurora, Redshift or ElastiCache database instance is running in.").Hidden(). StringVar(&ccf.DatabaseAWSRegion) // define start's usage info (we use kingpin's "alias" field for this) @@ -204,7 +204,7 @@ func Run(options Options) (app *kingpin.Application, executedCommand string, con dbStartCmd.Flag("protocol", fmt.Sprintf("Proxied database protocol. Supported are: %v.", defaults.DatabaseProtocols)).StringVar(&ccf.DatabaseProtocol) dbStartCmd.Flag("uri", "Address the proxied database is reachable at.").StringVar(&ccf.DatabaseURI) dbStartCmd.Flag("ca-cert", "Database CA certificate path.").StringVar(&ccf.DatabaseCACertFile) - dbStartCmd.Flag("aws-region", "(Only for RDS, Aurora or Redshift) AWS region RDS, Aurora or Redshift database instance is running in.").StringVar(&ccf.DatabaseAWSRegion) + dbStartCmd.Flag("aws-region", "(Only for RDS, Aurora, Redshift or ElastiCache) AWS region RDS, Aurora, Redshift or ElastiCache database instance is running in.").StringVar(&ccf.DatabaseAWSRegion) dbStartCmd.Flag("aws-redshift-cluster-id", "(Only for Redshift) Redshift database cluster identifier.").StringVar(&ccf.DatabaseAWSRedshiftClusterID) dbStartCmd.Flag("aws-rds-instance-id", "(Only for RDS) RDS instance identifier.").StringVar(&ccf.DatabaseAWSRDSInstanceID) dbStartCmd.Flag("aws-rds-cluster-id", "(Only for Aurora) Aurora cluster identifier.").StringVar(&ccf.DatabaseAWSRDSClusterID) @@ -226,6 +226,7 @@ func Run(options Options) (app *kingpin.Application, executedCommand string, con dbConfigureCreate.Flag("token", "Invitation token to register with an auth server [none].").Default("/tmp/token").StringVar(&dbConfigCreateFlags.AuthToken) dbConfigureCreate.Flag("rds-discovery", "List of AWS regions the agent will discover for RDS/Aurora instances.").StringsVar(&dbConfigCreateFlags.RDSDiscoveryRegions) dbConfigureCreate.Flag("redshift-discovery", "List of AWS regions the agent will discover for Redshift instances.").StringsVar(&dbConfigCreateFlags.RedshiftDiscoveryRegions) + dbConfigureCreate.Flag("elasticache-discovery", "List of AWS regions the agent will discover for ElastiCache Redis clusters.").StringsVar(&dbConfigCreateFlags.ElastiCacheDiscoveryRegions) dbConfigureCreate.Flag("ca-pin", "CA pin to validate the auth server (can be repeated for multiple pins).").StringsVar(&dbConfigCreateFlags.CAPins) dbConfigureCreate.Flag("name", "Name of the proxied database.").StringVar(&dbConfigCreateFlags.StaticDatabaseName) dbConfigureCreate.Flag("protocol", fmt.Sprintf("Proxied database protocol. Supported are: %v.", defaults.DatabaseProtocols)).StringVar(&dbConfigCreateFlags.StaticDatabaseProtocol) diff --git a/tool/tsh/tsh_test.go b/tool/tsh/tsh_test.go index 6d6fcbdc09f..0591ba1ce15 100644 --- a/tool/tsh/tsh_test.go +++ b/tool/tsh/tsh_test.go @@ -1613,7 +1613,8 @@ func TestSerializeDatabases(t *testing.T) { "redshift": {}, "rds": { "iam_auth": false - } + }, + "elasticache": {} }, "mysql": {}, "gcp": {}, @@ -1633,7 +1634,8 @@ func TestSerializeDatabases(t *testing.T) { "redshift": {}, "rds": { "iam_auth": false - } + }, + "elasticache": {} } } }]